@mysten-incubation/devstack 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (833) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +94 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  4. package/dist/api/define-capabilities.d.mts +25 -0
  5. package/dist/api/define-capabilities.mjs +19 -0
  6. package/dist/api/define-capabilities.mjs.map +1 -0
  7. package/dist/api/define-devstack-with.d.mts +41 -0
  8. package/dist/api/define-devstack-with.mjs +24 -0
  9. package/dist/api/define-devstack-with.mjs.map +1 -0
  10. package/dist/api/define-devstack.d.mts +62 -0
  11. package/dist/api/define-devstack.mjs +108 -0
  12. package/dist/api/define-devstack.mjs.map +1 -0
  13. package/dist/api/define-plugin.d.mts +1 -0
  14. package/dist/api/inference-network.mjs +122 -0
  15. package/dist/api/inference-network.mjs.map +1 -0
  16. package/dist/api/mode-narrowed-factory.d.mts +26 -0
  17. package/dist/api/mode-narrowed-factory.mjs +8 -0
  18. package/dist/api/mode-narrowed-factory.mjs.map +1 -0
  19. package/dist/api/plugin-errors.mjs +10 -0
  20. package/dist/api/plugin-errors.mjs.map +1 -0
  21. package/dist/api/run-stack.d.mts +82 -0
  22. package/dist/api/run-stack.mjs +127 -0
  23. package/dist/api/run-stack.mjs.map +1 -0
  24. package/dist/build-integrations/playwright/config.d.mts +92 -0
  25. package/dist/build-integrations/playwright/config.mjs +71 -0
  26. package/dist/build-integrations/playwright/config.mjs.map +1 -0
  27. package/dist/build-integrations/playwright/errors.d.mts +82 -0
  28. package/dist/build-integrations/playwright/errors.mjs +43 -0
  29. package/dist/build-integrations/playwright/errors.mjs.map +1 -0
  30. package/dist/build-integrations/playwright/global-setup.d.mts +64 -0
  31. package/dist/build-integrations/playwright/global-setup.mjs +44 -0
  32. package/dist/build-integrations/playwright/global-setup.mjs.map +1 -0
  33. package/dist/build-integrations/playwright/index.d.mts +6 -0
  34. package/dist/build-integrations/playwright/index.mjs +6 -0
  35. package/dist/build-integrations/playwright/stack-context.d.mts +95 -0
  36. package/dist/build-integrations/playwright/stack-context.mjs +277 -0
  37. package/dist/build-integrations/playwright/stack-context.mjs.map +1 -0
  38. package/dist/build-integrations/playwright/wallet-context.d.mts +87 -0
  39. package/dist/build-integrations/playwright/wallet-context.mjs +148 -0
  40. package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -0
  41. package/dist/build-integrations/runtime/cold-start-url.d.mts +67 -0
  42. package/dist/build-integrations/runtime/cold-start-url.mjs +56 -0
  43. package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -0
  44. package/dist/build-integrations/runtime/dapp-kit-slot.mjs +10 -0
  45. package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -0
  46. package/dist/build-integrations/runtime/discover.d.mts +78 -0
  47. package/dist/build-integrations/runtime/discover.mjs +124 -0
  48. package/dist/build-integrations/runtime/discover.mjs.map +1 -0
  49. package/dist/build-integrations/runtime/endpoint-registry.d.mts +26 -0
  50. package/dist/build-integrations/runtime/endpoint-registry.mjs +41 -0
  51. package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -0
  52. package/dist/build-integrations/runtime/errors.d.mts +64 -0
  53. package/dist/build-integrations/runtime/errors.mjs +51 -0
  54. package/dist/build-integrations/runtime/errors.mjs.map +1 -0
  55. package/dist/build-integrations/runtime/index.d.mts +7 -0
  56. package/dist/build-integrations/runtime/index.mjs +6 -0
  57. package/dist/build-integrations/runtime/read-stack-context.d.mts +38 -0
  58. package/dist/build-integrations/runtime/read-stack-context.mjs +130 -0
  59. package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -0
  60. package/dist/build-integrations/runtime/stack-context.d.mts +53 -0
  61. package/dist/build-integrations/vitest/config.d.mts +62 -0
  62. package/dist/build-integrations/vitest/config.mjs +80 -0
  63. package/dist/build-integrations/vitest/config.mjs.map +1 -0
  64. package/dist/build-integrations/vitest/env.d.mts +48 -0
  65. package/dist/build-integrations/vitest/env.mjs +50 -0
  66. package/dist/build-integrations/vitest/env.mjs.map +1 -0
  67. package/dist/build-integrations/vitest/errors.d.mts +44 -0
  68. package/dist/build-integrations/vitest/errors.mjs +18 -0
  69. package/dist/build-integrations/vitest/errors.mjs.map +1 -0
  70. package/dist/build-integrations/vitest/index.d.mts +6 -0
  71. package/dist/build-integrations/vitest/index.mjs +6 -0
  72. package/dist/build-integrations/vitest/setup.d.mts +53 -0
  73. package/dist/build-integrations/vitest/setup.mjs +56 -0
  74. package/dist/build-integrations/vitest/setup.mjs.map +1 -0
  75. package/dist/build-integrations/vitest/stack-context.d.mts +58 -0
  76. package/dist/build-integrations/vitest/stack-context.mjs +67 -0
  77. package/dist/build-integrations/vitest/stack-context.mjs.map +1 -0
  78. package/dist/cli/main.d.mts +5 -0
  79. package/dist/cli/main.mjs +586 -0
  80. package/dist/cli/main.mjs.map +1 -0
  81. package/dist/cli/prune-direct.mjs +216 -0
  82. package/dist/cli/prune-direct.mjs.map +1 -0
  83. package/dist/cli/snapshot-reader.mjs +73 -0
  84. package/dist/cli/snapshot-reader.mjs.map +1 -0
  85. package/dist/cli/up-lifecycle.mjs +28 -0
  86. package/dist/cli/up-lifecycle.mjs.map +1 -0
  87. package/dist/contracts/capability-decl.d.mts +42 -0
  88. package/dist/contracts/chain-probe.d.mts +26 -0
  89. package/dist/contracts/chain-probe.mjs +8 -0
  90. package/dist/contracts/chain-probe.mjs.map +1 -0
  91. package/dist/contracts/codegenable.d.mts +43 -0
  92. package/dist/contracts/container-runtime.d.mts +245 -0
  93. package/dist/contracts/liveness-classifier.d.mts +19 -0
  94. package/dist/contracts/network-resolver.d.mts +15 -0
  95. package/dist/contracts/network-resolver.mjs +7 -0
  96. package/dist/contracts/network-resolver.mjs.map +1 -0
  97. package/dist/contracts/projection.d.mts +15 -0
  98. package/dist/contracts/routable.d.mts +53 -0
  99. package/dist/contracts/snapshotable.d.mts +39 -0
  100. package/dist/contracts/strategy-contributor.d.mts +26 -0
  101. package/dist/index.d.mts +89 -0
  102. package/dist/index.mjs +37 -0
  103. package/dist/orchestrators/codegen/bindings.d.mts +2 -0
  104. package/dist/orchestrators/codegen/bindings.mjs +340 -0
  105. package/dist/orchestrators/codegen/bindings.mjs.map +1 -0
  106. package/dist/orchestrators/codegen/emit.mjs +56 -0
  107. package/dist/orchestrators/codegen/emit.mjs.map +1 -0
  108. package/dist/orchestrators/codegen/errors.d.mts +1 -0
  109. package/dist/orchestrators/codegen/errors.mjs +66 -0
  110. package/dist/orchestrators/codegen/errors.mjs.map +1 -0
  111. package/dist/orchestrators/codegen/extras.mjs +16 -0
  112. package/dist/orchestrators/codegen/extras.mjs.map +1 -0
  113. package/dist/orchestrators/codegen/format.mjs +109 -0
  114. package/dist/orchestrators/codegen/format.mjs.map +1 -0
  115. package/dist/orchestrators/codegen/gitignore.mjs +67 -0
  116. package/dist/orchestrators/codegen/gitignore.mjs.map +1 -0
  117. package/dist/orchestrators/codegen/paths.d.mts +1 -0
  118. package/dist/orchestrators/codegen/paths.mjs +33 -0
  119. package/dist/orchestrators/codegen/paths.mjs.map +1 -0
  120. package/dist/orchestrators/codegen/permissions.mjs +6 -0
  121. package/dist/orchestrators/codegen/permissions.mjs.map +1 -0
  122. package/dist/orchestrators/codegen/service.d.mts +1 -0
  123. package/dist/orchestrators/codegen/service.mjs +276 -0
  124. package/dist/orchestrators/codegen/service.mjs.map +1 -0
  125. package/dist/orchestrators/router/cleanup.mjs +58 -0
  126. package/dist/orchestrators/router/cleanup.mjs.map +1 -0
  127. package/dist/orchestrators/router/cors.mjs +31 -0
  128. package/dist/orchestrators/router/cors.mjs.map +1 -0
  129. package/dist/orchestrators/router/entrypoints.d.mts +1 -0
  130. package/dist/orchestrators/router/entrypoints.mjs +80 -0
  131. package/dist/orchestrators/router/entrypoints.mjs.map +1 -0
  132. package/dist/orchestrators/router/errors.d.mts +1 -0
  133. package/dist/orchestrators/router/errors.mjs +103 -0
  134. package/dist/orchestrators/router/errors.mjs.map +1 -0
  135. package/dist/orchestrators/router/file-provider.d.mts +1 -0
  136. package/dist/orchestrators/router/file-provider.mjs +320 -0
  137. package/dist/orchestrators/router/file-provider.mjs.map +1 -0
  138. package/dist/orchestrators/router/hostname.d.mts +1 -0
  139. package/dist/orchestrators/router/hostname.mjs +107 -0
  140. package/dist/orchestrators/router/hostname.mjs.map +1 -0
  141. package/dist/orchestrators/router/index.d.mts +1 -0
  142. package/dist/orchestrators/router/profile.d.mts +1 -0
  143. package/dist/orchestrators/router/profile.mjs +109 -0
  144. package/dist/orchestrators/router/profile.mjs.map +1 -0
  145. package/dist/orchestrators/router/service.d.mts +3 -0
  146. package/dist/orchestrators/router/service.mjs +421 -0
  147. package/dist/orchestrators/router/service.mjs.map +1 -0
  148. package/dist/orchestrators/router/traefik-container.d.mts +1 -0
  149. package/dist/orchestrators/router/traefik-container.mjs +229 -0
  150. package/dist/orchestrators/router/traefik-container.mjs.map +1 -0
  151. package/dist/orchestrators/runtime-composition.d.mts +10 -0
  152. package/dist/orchestrators/runtime-composition.mjs +168 -0
  153. package/dist/orchestrators/runtime-composition.mjs.map +1 -0
  154. package/dist/orchestrators/snapshot/capture.d.mts +1 -0
  155. package/dist/orchestrators/snapshot/capture.mjs +350 -0
  156. package/dist/orchestrators/snapshot/capture.mjs.map +1 -0
  157. package/dist/orchestrators/snapshot/descriptor.d.mts +1 -0
  158. package/dist/orchestrators/snapshot/descriptor.mjs +109 -0
  159. package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -0
  160. package/dist/orchestrators/snapshot/identity-guard.d.mts +1 -0
  161. package/dist/orchestrators/snapshot/identity-guard.mjs +132 -0
  162. package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -0
  163. package/dist/orchestrators/snapshot/image-bundle-tags.mjs +207 -0
  164. package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -0
  165. package/dist/orchestrators/snapshot/index.d.mts +1 -0
  166. package/dist/orchestrators/snapshot/integrity.d.mts +1 -0
  167. package/dist/orchestrators/snapshot/integrity.mjs +74 -0
  168. package/dist/orchestrators/snapshot/integrity.mjs.map +1 -0
  169. package/dist/orchestrators/snapshot/prune.d.mts +1 -0
  170. package/dist/orchestrators/snapshot/prune.mjs +110 -0
  171. package/dist/orchestrators/snapshot/prune.mjs.map +1 -0
  172. package/dist/orchestrators/snapshot/restore.d.mts +1 -0
  173. package/dist/orchestrators/snapshot/restore.mjs +404 -0
  174. package/dist/orchestrators/snapshot/restore.mjs.map +1 -0
  175. package/dist/orchestrators/snapshot/service.d.mts +1 -0
  176. package/dist/orchestrators/snapshot/service.mjs +296 -0
  177. package/dist/orchestrators/snapshot/service.mjs.map +1 -0
  178. package/dist/orchestrators/snapshot/state-document.mjs +18 -0
  179. package/dist/orchestrators/snapshot/state-document.mjs.map +1 -0
  180. package/dist/orchestrators/snapshot/wipe.d.mts +1 -0
  181. package/dist/orchestrators/snapshot/wipe.mjs +59 -0
  182. package/dist/orchestrators/snapshot/wipe.mjs.map +1 -0
  183. package/dist/plugins/account/codegen.d.mts +12 -0
  184. package/dist/plugins/account/codegen.mjs +22 -0
  185. package/dist/plugins/account/codegen.mjs.map +1 -0
  186. package/dist/plugins/account/errors.d.mts +44 -0
  187. package/dist/plugins/account/errors.mjs +16 -0
  188. package/dist/plugins/account/errors.mjs.map +1 -0
  189. package/dist/plugins/account/funding.d.mts +94 -0
  190. package/dist/plugins/account/funding.mjs +199 -0
  191. package/dist/plugins/account/funding.mjs.map +1 -0
  192. package/dist/plugins/account/index.d.mts +54 -0
  193. package/dist/plugins/account/index.mjs +151 -0
  194. package/dist/plugins/account/index.mjs.map +1 -0
  195. package/dist/plugins/account/keypair.d.mts +32 -0
  196. package/dist/plugins/account/keypair.mjs +99 -0
  197. package/dist/plugins/account/keypair.mjs.map +1 -0
  198. package/dist/plugins/account/lease.mjs +21 -0
  199. package/dist/plugins/account/lease.mjs.map +1 -0
  200. package/dist/plugins/account/registry.d.mts +33 -0
  201. package/dist/plugins/account/registry.mjs +36 -0
  202. package/dist/plugins/account/registry.mjs.map +1 -0
  203. package/dist/plugins/account/service.d.mts +104 -0
  204. package/dist/plugins/account/service.mjs +405 -0
  205. package/dist/plugins/account/service.mjs.map +1 -0
  206. package/dist/plugins/account/snapshot.mjs +33 -0
  207. package/dist/plugins/account/snapshot.mjs.map +1 -0
  208. package/dist/plugins/account/variants/env.mjs +24 -0
  209. package/dist/plugins/account/variants/env.mjs.map +1 -0
  210. package/dist/plugins/account/variants/ephemeral.mjs +72 -0
  211. package/dist/plugins/account/variants/ephemeral.mjs.map +1 -0
  212. package/dist/plugins/account/variants/impersonate.d.mts +16 -0
  213. package/dist/plugins/account/variants/impersonate.mjs +48 -0
  214. package/dist/plugins/account/variants/impersonate.mjs.map +1 -0
  215. package/dist/plugins/account/variants/inline.mjs +13 -0
  216. package/dist/plugins/account/variants/inline.mjs.map +1 -0
  217. package/dist/plugins/account/variants/keystore.mjs +93 -0
  218. package/dist/plugins/account/variants/keystore.mjs.map +1 -0
  219. package/dist/plugins/account/variants/signer.mjs +31 -0
  220. package/dist/plugins/account/variants/signer.mjs.map +1 -0
  221. package/dist/plugins/action/build-context.d.mts +41 -0
  222. package/dist/plugins/action/discriminator.d.mts +20 -0
  223. package/dist/plugins/action/discriminator.mjs +13 -0
  224. package/dist/plugins/action/discriminator.mjs.map +1 -0
  225. package/dist/plugins/action/errors.d.mts +31 -0
  226. package/dist/plugins/action/errors.mjs +13 -0
  227. package/dist/plugins/action/errors.mjs.map +1 -0
  228. package/dist/plugins/action/execute.d.mts +2 -0
  229. package/dist/plugins/action/execute.mjs +145 -0
  230. package/dist/plugins/action/execute.mjs.map +1 -0
  231. package/dist/plugins/action/index.d.mts +56 -0
  232. package/dist/plugins/action/index.mjs +82 -0
  233. package/dist/plugins/action/index.mjs.map +1 -0
  234. package/dist/plugins/action/service.d.mts +26 -0
  235. package/dist/plugins/action/service.mjs +84 -0
  236. package/dist/plugins/action/service.mjs.map +1 -0
  237. package/dist/plugins/coin/address-resolution.d.mts +34 -0
  238. package/dist/plugins/coin/address-resolution.mjs +80 -0
  239. package/dist/plugins/coin/address-resolution.mjs.map +1 -0
  240. package/dist/plugins/coin/codegen.d.mts +16 -0
  241. package/dist/plugins/coin/codegen.mjs +21 -0
  242. package/dist/plugins/coin/codegen.mjs.map +1 -0
  243. package/dist/plugins/coin/discovery.d.mts +26 -0
  244. package/dist/plugins/coin/discovery.mjs +112 -0
  245. package/dist/plugins/coin/discovery.mjs.map +1 -0
  246. package/dist/plugins/coin/errors.d.mts +48 -0
  247. package/dist/plugins/coin/errors.mjs +13 -0
  248. package/dist/plugins/coin/errors.mjs.map +1 -0
  249. package/dist/plugins/coin/index.d.mts +95 -0
  250. package/dist/plugins/coin/index.mjs +172 -0
  251. package/dist/plugins/coin/index.mjs.map +1 -0
  252. package/dist/plugins/coin/metadata.d.mts +15 -0
  253. package/dist/plugins/coin/metadata.mjs +99 -0
  254. package/dist/plugins/coin/metadata.mjs.map +1 -0
  255. package/dist/plugins/coin/mint.d.mts +34 -0
  256. package/dist/plugins/coin/mint.mjs +164 -0
  257. package/dist/plugins/coin/mint.mjs.map +1 -0
  258. package/dist/plugins/coin/registry.d.mts +1 -0
  259. package/dist/plugins/coin/registry.mjs +37 -0
  260. package/dist/plugins/coin/registry.mjs.map +1 -0
  261. package/dist/plugins/coin/service.d.mts +47 -0
  262. package/dist/plugins/coin/service.mjs +51 -0
  263. package/dist/plugins/coin/service.mjs.map +1 -0
  264. package/dist/plugins/coin/snapshot.mjs +19 -0
  265. package/dist/plugins/coin/snapshot.mjs.map +1 -0
  266. package/dist/plugins/coin/type-strings.mjs +49 -0
  267. package/dist/plugins/coin/type-strings.mjs.map +1 -0
  268. package/dist/plugins/deepbook/codegen.d.mts +39 -0
  269. package/dist/plugins/deepbook/codegen.mjs +15 -0
  270. package/dist/plugins/deepbook/codegen.mjs.map +1 -0
  271. package/dist/plugins/deepbook/deploy.mjs +437 -0
  272. package/dist/plugins/deepbook/deploy.mjs.map +1 -0
  273. package/dist/plugins/deepbook/errors.d.mts +29 -0
  274. package/dist/plugins/deepbook/errors.mjs +26 -0
  275. package/dist/plugins/deepbook/errors.mjs.map +1 -0
  276. package/dist/plugins/deepbook/faucet-strategy.d.mts +8 -0
  277. package/dist/plugins/deepbook/faucet-strategy.mjs +81 -0
  278. package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -0
  279. package/dist/plugins/deepbook/index.d.mts +171 -0
  280. package/dist/plugins/deepbook/index.mjs +359 -0
  281. package/dist/plugins/deepbook/index.mjs.map +1 -0
  282. package/dist/plugins/deepbook/plugin-key.mjs +7 -0
  283. package/dist/plugins/deepbook/plugin-key.mjs.map +1 -0
  284. package/dist/plugins/deepbook/pyth/index.mjs +226 -0
  285. package/dist/plugins/deepbook/pyth/index.mjs.map +1 -0
  286. package/dist/plugins/deepbook/routable.mjs +21 -0
  287. package/dist/plugins/deepbook/routable.mjs.map +1 -0
  288. package/dist/plugins/deepbook/snapshot.mjs +49 -0
  289. package/dist/plugins/deepbook/snapshot.mjs.map +1 -0
  290. package/dist/plugins/deepbook/types.d.mts +125 -0
  291. package/dist/plugins/deepbook/types.mjs +12 -0
  292. package/dist/plugins/deepbook/types.mjs.map +1 -0
  293. package/dist/plugins/faucet/dispatcher.d.mts +9 -0
  294. package/dist/plugins/faucet/dispatcher.mjs +13 -0
  295. package/dist/plugins/faucet/dispatcher.mjs.map +1 -0
  296. package/dist/plugins/faucet/errors.d.mts +86 -0
  297. package/dist/plugins/faucet/errors.mjs +19 -0
  298. package/dist/plugins/faucet/errors.mjs.map +1 -0
  299. package/dist/plugins/faucet/http.mjs +127 -0
  300. package/dist/plugins/faucet/http.mjs.map +1 -0
  301. package/dist/plugins/faucet/index.d.mts +43 -0
  302. package/dist/plugins/faucet/index.mjs +42 -0
  303. package/dist/plugins/faucet/index.mjs.map +1 -0
  304. package/dist/plugins/faucet/service.d.mts +20 -0
  305. package/dist/plugins/faucet/strategies/sui-local.d.mts +23 -0
  306. package/dist/plugins/faucet/strategies/sui-local.mjs +29 -0
  307. package/dist/plugins/faucet/strategies/sui-local.mjs.map +1 -0
  308. package/dist/plugins/host-service/errors.d.mts +27 -0
  309. package/dist/plugins/host-service/errors.mjs +14 -0
  310. package/dist/plugins/host-service/errors.mjs.map +1 -0
  311. package/dist/plugins/host-service/index.d.mts +10 -0
  312. package/dist/plugins/host-service/index.mjs +48 -0
  313. package/dist/plugins/host-service/index.mjs.map +1 -0
  314. package/dist/plugins/host-service/routable.mjs +24 -0
  315. package/dist/plugins/host-service/routable.mjs.map +1 -0
  316. package/dist/plugins/host-service/service.d.mts +49 -0
  317. package/dist/plugins/host-service/service.mjs +375 -0
  318. package/dist/plugins/host-service/service.mjs.map +1 -0
  319. package/dist/plugins/package/build.d.mts +1 -0
  320. package/dist/plugins/package/build.mjs +24 -0
  321. package/dist/plugins/package/build.mjs.map +1 -0
  322. package/dist/plugins/package/codegen.d.mts +19 -0
  323. package/dist/plugins/package/codegen.mjs +41 -0
  324. package/dist/plugins/package/codegen.mjs.map +1 -0
  325. package/dist/plugins/package/dep-resolution.mjs +10 -0
  326. package/dist/plugins/package/dep-resolution.mjs.map +1 -0
  327. package/dist/plugins/package/errors.d.mts +34 -0
  328. package/dist/plugins/package/errors.mjs +13 -0
  329. package/dist/plugins/package/errors.mjs.map +1 -0
  330. package/dist/plugins/package/index.d.mts +109 -0
  331. package/dist/plugins/package/index.mjs +207 -0
  332. package/dist/plugins/package/index.mjs.map +1 -0
  333. package/dist/plugins/package/mode-known.mjs +41 -0
  334. package/dist/plugins/package/mode-known.mjs.map +1 -0
  335. package/dist/plugins/package/mode-local.d.mts +1 -0
  336. package/dist/plugins/package/mode-local.mjs +183 -0
  337. package/dist/plugins/package/mode-local.mjs.map +1 -0
  338. package/dist/plugins/package/publish-executor.mjs +202 -0
  339. package/dist/plugins/package/publish-executor.mjs.map +1 -0
  340. package/dist/plugins/package/publish-output.d.mts +28 -0
  341. package/dist/plugins/package/publish-output.mjs +45 -0
  342. package/dist/plugins/package/publish-output.mjs.map +1 -0
  343. package/dist/plugins/package/registry.d.mts +25 -0
  344. package/dist/plugins/package/registry.mjs +30 -0
  345. package/dist/plugins/package/registry.mjs.map +1 -0
  346. package/dist/plugins/package/service.mjs +20 -0
  347. package/dist/plugins/package/service.mjs.map +1 -0
  348. package/dist/plugins/package/snapshot.mjs +25 -0
  349. package/dist/plugins/package/snapshot.mjs.map +1 -0
  350. package/dist/plugins/postgres/codegen.mjs +42 -0
  351. package/dist/plugins/postgres/codegen.mjs.map +1 -0
  352. package/dist/plugins/postgres/connection.d.mts +33 -0
  353. package/dist/plugins/postgres/connection.mjs +19 -0
  354. package/dist/plugins/postgres/connection.mjs.map +1 -0
  355. package/dist/plugins/postgres/db-ensure.mjs +100 -0
  356. package/dist/plugins/postgres/db-ensure.mjs.map +1 -0
  357. package/dist/plugins/postgres/errors.d.mts +55 -0
  358. package/dist/plugins/postgres/errors.mjs +29 -0
  359. package/dist/plugins/postgres/errors.mjs.map +1 -0
  360. package/dist/plugins/postgres/index.d.mts +37 -0
  361. package/dist/plugins/postgres/index.mjs +75 -0
  362. package/dist/plugins/postgres/index.mjs.map +1 -0
  363. package/dist/plugins/postgres/routable.mjs +33 -0
  364. package/dist/plugins/postgres/routable.mjs.map +1 -0
  365. package/dist/plugins/postgres/service.d.mts +50 -0
  366. package/dist/plugins/postgres/service.mjs +145 -0
  367. package/dist/plugins/postgres/service.mjs.map +1 -0
  368. package/dist/plugins/postgres/snapshot.d.mts +1 -0
  369. package/dist/plugins/postgres/snapshot.mjs +32 -0
  370. package/dist/plugins/postgres/snapshot.mjs.map +1 -0
  371. package/dist/plugins/router-entrypoints.mjs +21 -0
  372. package/dist/plugins/router-entrypoints.mjs.map +1 -0
  373. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +59 -0
  374. package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -0
  375. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +132 -0
  376. package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -0
  377. package/dist/plugins/seal/codegen.d.mts +19 -0
  378. package/dist/plugins/seal/codegen.mjs +16 -0
  379. package/dist/plugins/seal/codegen.mjs.map +1 -0
  380. package/dist/plugins/seal/config-render.mjs +82 -0
  381. package/dist/plugins/seal/config-render.mjs.map +1 -0
  382. package/dist/plugins/seal/deploy.mjs +198 -0
  383. package/dist/plugins/seal/deploy.mjs.map +1 -0
  384. package/dist/plugins/seal/errors.d.mts +52 -0
  385. package/dist/plugins/seal/errors.mjs +19 -0
  386. package/dist/plugins/seal/errors.mjs.map +1 -0
  387. package/dist/plugins/seal/index.d.mts +161 -0
  388. package/dist/plugins/seal/index.mjs +235 -0
  389. package/dist/plugins/seal/index.mjs.map +1 -0
  390. package/dist/plugins/seal/key-manager.d.mts +22 -0
  391. package/dist/plugins/seal/key-manager.mjs +22 -0
  392. package/dist/plugins/seal/key-manager.mjs.map +1 -0
  393. package/dist/plugins/seal/key-server.mjs +175 -0
  394. package/dist/plugins/seal/key-server.mjs.map +1 -0
  395. package/dist/plugins/seal/keygen.mjs +96 -0
  396. package/dist/plugins/seal/keygen.mjs.map +1 -0
  397. package/dist/plugins/seal/mode/fork-known.d.mts +8 -0
  398. package/dist/plugins/seal/mode/fork-known.mjs +23 -0
  399. package/dist/plugins/seal/mode/fork-known.mjs.map +1 -0
  400. package/dist/plugins/seal/mode/live.d.mts +18 -0
  401. package/dist/plugins/seal/mode/live.mjs +64 -0
  402. package/dist/plugins/seal/mode/live.mjs.map +1 -0
  403. package/dist/plugins/seal/mode/local-keygen.mjs +180 -0
  404. package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -0
  405. package/dist/plugins/seal/plugin-key.mjs +7 -0
  406. package/dist/plugins/seal/plugin-key.mjs.map +1 -0
  407. package/dist/plugins/seal/registry-publish.d.mts +43 -0
  408. package/dist/plugins/seal/registry-publish.mjs +9 -0
  409. package/dist/plugins/seal/registry-publish.mjs.map +1 -0
  410. package/dist/plugins/seal/routable.mjs +57 -0
  411. package/dist/plugins/seal/routable.mjs.map +1 -0
  412. package/dist/plugins/seal/service.mjs +17 -0
  413. package/dist/plugins/seal/service.mjs.map +1 -0
  414. package/dist/plugins/seal/snapshot.mjs +51 -0
  415. package/dist/plugins/seal/snapshot.mjs.map +1 -0
  416. package/dist/plugins/sui/auto-tick.mjs +45 -0
  417. package/dist/plugins/sui/auto-tick.mjs.map +1 -0
  418. package/dist/plugins/sui/chain-build-container.d.mts +1 -0
  419. package/dist/plugins/sui/chain-probe.d.mts +85 -0
  420. package/dist/plugins/sui/chain-probe.mjs +104 -0
  421. package/dist/plugins/sui/chain-probe.mjs.map +1 -0
  422. package/dist/plugins/sui/codegen.d.mts +14 -0
  423. package/dist/plugins/sui/codegen.mjs +26 -0
  424. package/dist/plugins/sui/codegen.mjs.map +1 -0
  425. package/dist/plugins/sui/errors.d.mts +74 -0
  426. package/dist/plugins/sui/errors.mjs +28 -0
  427. package/dist/plugins/sui/errors.mjs.map +1 -0
  428. package/dist/plugins/sui/fork-orchestration.mjs +24 -0
  429. package/dist/plugins/sui/fork-orchestration.mjs.map +1 -0
  430. package/dist/plugins/sui/fork-transaction.mjs +96 -0
  431. package/dist/plugins/sui/fork-transaction.mjs.map +1 -0
  432. package/dist/plugins/sui/index.d.mts +318 -0
  433. package/dist/plugins/sui/index.mjs +182 -0
  434. package/dist/plugins/sui/index.mjs.map +1 -0
  435. package/dist/plugins/sui/mode/external.mjs +60 -0
  436. package/dist/plugins/sui/mode/external.mjs.map +1 -0
  437. package/dist/plugins/sui/mode/fork.mjs +283 -0
  438. package/dist/plugins/sui/mode/fork.mjs.map +1 -0
  439. package/dist/plugins/sui/mode/live.mjs +103 -0
  440. package/dist/plugins/sui/mode/live.mjs.map +1 -0
  441. package/dist/plugins/sui/mode/local.mjs +293 -0
  442. package/dist/plugins/sui/mode/local.mjs.map +1 -0
  443. package/dist/plugins/sui/mode/shared-boot.mjs +254 -0
  444. package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -0
  445. package/dist/plugins/sui/mode/shared.d.mts +103 -0
  446. package/dist/plugins/sui/mode/shared.mjs +12 -0
  447. package/dist/plugins/sui/mode/shared.mjs.map +1 -0
  448. package/dist/plugins/sui/mode/spec.d.mts +94 -0
  449. package/dist/plugins/sui/network-resolver.d.mts +23 -0
  450. package/dist/plugins/sui/routable.mjs +88 -0
  451. package/dist/plugins/sui/routable.mjs.map +1 -0
  452. package/dist/plugins/sui/seed-objects.d.mts +18 -0
  453. package/dist/plugins/sui/seed-objects.mjs +25 -0
  454. package/dist/plugins/sui/seed-objects.mjs.map +1 -0
  455. package/dist/plugins/sui/service.mjs +38 -0
  456. package/dist/plugins/sui/service.mjs.map +1 -0
  457. package/dist/plugins/sui/snapshot.mjs +53 -0
  458. package/dist/plugins/sui/snapshot.mjs.map +1 -0
  459. package/dist/plugins/wallet/codegen.d.mts +33 -0
  460. package/dist/plugins/wallet/codegen.mjs +34 -0
  461. package/dist/plugins/wallet/codegen.mjs.map +1 -0
  462. package/dist/plugins/wallet/errors.d.mts +66 -0
  463. package/dist/plugins/wallet/errors.mjs +16 -0
  464. package/dist/plugins/wallet/errors.mjs.map +1 -0
  465. package/dist/plugins/wallet/index.d.mts +63 -0
  466. package/dist/plugins/wallet/index.mjs +126 -0
  467. package/dist/plugins/wallet/index.mjs.map +1 -0
  468. package/dist/plugins/wallet/origin-policy.d.mts +1 -0
  469. package/dist/plugins/wallet/origin-policy.mjs +65 -0
  470. package/dist/plugins/wallet/origin-policy.mjs.map +1 -0
  471. package/dist/plugins/wallet/pairing.d.mts +11 -0
  472. package/dist/plugins/wallet/pairing.mjs +125 -0
  473. package/dist/plugins/wallet/pairing.mjs.map +1 -0
  474. package/dist/plugins/wallet/protocol.d.mts +1 -0
  475. package/dist/plugins/wallet/protocol.mjs +96 -0
  476. package/dist/plugins/wallet/protocol.mjs.map +1 -0
  477. package/dist/plugins/wallet/routable.mjs +32 -0
  478. package/dist/plugins/wallet/routable.mjs.map +1 -0
  479. package/dist/plugins/wallet/server.d.mts +12 -0
  480. package/dist/plugins/wallet/server.mjs +317 -0
  481. package/dist/plugins/wallet/server.mjs.map +1 -0
  482. package/dist/plugins/wallet/service.d.mts +68 -0
  483. package/dist/plugins/wallet/service.mjs +97 -0
  484. package/dist/plugins/wallet/service.mjs.map +1 -0
  485. package/dist/plugins/wallet/snapshot.d.mts +1 -0
  486. package/dist/plugins/wallet/snapshot.mjs +14 -0
  487. package/dist/plugins/wallet/snapshot.mjs.map +1 -0
  488. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +42 -0
  489. package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -0
  490. package/dist/plugins/walrus/codegen.d.mts +38 -0
  491. package/dist/plugins/walrus/codegen.mjs +34 -0
  492. package/dist/plugins/walrus/codegen.mjs.map +1 -0
  493. package/dist/plugins/walrus/deploy-paths.mjs +14 -0
  494. package/dist/plugins/walrus/deploy-paths.mjs.map +1 -0
  495. package/dist/plugins/walrus/deploy.d.mts +1 -0
  496. package/dist/plugins/walrus/deploy.mjs +224 -0
  497. package/dist/plugins/walrus/deploy.mjs.map +1 -0
  498. package/dist/plugins/walrus/errors.d.mts +38 -0
  499. package/dist/plugins/walrus/errors.mjs +26 -0
  500. package/dist/plugins/walrus/errors.mjs.map +1 -0
  501. package/dist/plugins/walrus/faucet-strategy.d.mts +12 -0
  502. package/dist/plugins/walrus/faucet-strategy.mjs +62 -0
  503. package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -0
  504. package/dist/plugins/walrus/index.d.mts +177 -0
  505. package/dist/plugins/walrus/index.mjs +284 -0
  506. package/dist/plugins/walrus/index.mjs.map +1 -0
  507. package/dist/plugins/walrus/mode/known-deploy.d.mts +25 -0
  508. package/dist/plugins/walrus/mode/known-deploy.mjs +71 -0
  509. package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -0
  510. package/dist/plugins/walrus/mode/local-cluster.d.mts +34 -0
  511. package/dist/plugins/walrus/mode/local-cluster.mjs +153 -0
  512. package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -0
  513. package/dist/plugins/walrus/plugin-key.mjs +7 -0
  514. package/dist/plugins/walrus/plugin-key.mjs.map +1 -0
  515. package/dist/plugins/walrus/registry-publish.d.mts +24 -0
  516. package/dist/plugins/walrus/registry-publish.mjs +7 -0
  517. package/dist/plugins/walrus/registry-publish.mjs.map +1 -0
  518. package/dist/plugins/walrus/routable.mjs +99 -0
  519. package/dist/plugins/walrus/routable.mjs.map +1 -0
  520. package/dist/plugins/walrus/service.mjs +20 -0
  521. package/dist/plugins/walrus/service.mjs.map +1 -0
  522. package/dist/plugins/walrus/snapshot.mjs +53 -0
  523. package/dist/plugins/walrus/snapshot.mjs.map +1 -0
  524. package/dist/plugins/walrus/storage-nodes.d.mts +15 -0
  525. package/dist/plugins/walrus/storage-nodes.mjs +154 -0
  526. package/dist/plugins/walrus/storage-nodes.mjs.map +1 -0
  527. package/dist/plugins/walrus/wal-swap.d.mts +2 -0
  528. package/dist/plugins/walrus/wal-swap.mjs +58 -0
  529. package/dist/plugins/walrus/wal-swap.mjs.map +1 -0
  530. package/dist/primitives/artifact-publisher.d.mts +12 -0
  531. package/dist/primitives/cache.d.mts +1 -0
  532. package/dist/runtime/built-in-plugin-layers.mjs +49 -0
  533. package/dist/runtime/built-in-plugin-layers.mjs.map +1 -0
  534. package/dist/runtime/docker/client.d.mts +2 -0
  535. package/dist/runtime/docker/client.mjs +54 -0
  536. package/dist/runtime/docker/client.mjs.map +1 -0
  537. package/dist/runtime/docker/container.d.mts +1 -0
  538. package/dist/runtime/docker/container.mjs +562 -0
  539. package/dist/runtime/docker/container.mjs.map +1 -0
  540. package/dist/runtime/docker/errors.d.mts +1 -0
  541. package/dist/runtime/docker/errors.mjs +187 -0
  542. package/dist/runtime/docker/errors.mjs.map +1 -0
  543. package/dist/runtime/docker/exec.d.mts +1 -0
  544. package/dist/runtime/docker/exec.mjs +63 -0
  545. package/dist/runtime/docker/exec.mjs.map +1 -0
  546. package/dist/runtime/docker/image.d.mts +1 -0
  547. package/dist/runtime/docker/image.mjs +278 -0
  548. package/dist/runtime/docker/image.mjs.map +1 -0
  549. package/dist/runtime/docker/index.d.mts +1 -0
  550. package/dist/runtime/docker/inventory.d.mts +1 -0
  551. package/dist/runtime/docker/inventory.mjs +167 -0
  552. package/dist/runtime/docker/inventory.mjs.map +1 -0
  553. package/dist/runtime/docker/labels.d.mts +1 -0
  554. package/dist/runtime/docker/labels.mjs +97 -0
  555. package/dist/runtime/docker/labels.mjs.map +1 -0
  556. package/dist/runtime/docker/logs.d.mts +1 -0
  557. package/dist/runtime/docker/logs.mjs +34 -0
  558. package/dist/runtime/docker/logs.mjs.map +1 -0
  559. package/dist/runtime/docker/network.d.mts +1 -0
  560. package/dist/runtime/docker/network.mjs +168 -0
  561. package/dist/runtime/docker/network.mjs.map +1 -0
  562. package/dist/runtime/docker/service.d.mts +9 -0
  563. package/dist/runtime/docker/service.mjs +266 -0
  564. package/dist/runtime/docker/service.mjs.map +1 -0
  565. package/dist/runtime/docker/sweep.d.mts +1 -0
  566. package/dist/runtime/docker/sweep.mjs +220 -0
  567. package/dist/runtime/docker/sweep.mjs.map +1 -0
  568. package/dist/runtime/docker/volume.d.mts +1 -0
  569. package/dist/runtime/docker/volume.mjs +24 -0
  570. package/dist/runtime/docker/volume.mjs.map +1 -0
  571. package/dist/runtime/docker/wrap.d.mts +1 -0
  572. package/dist/runtime/docker/wrap.mjs +131 -0
  573. package/dist/runtime/docker/wrap.mjs.map +1 -0
  574. package/dist/substrate/brand.d.mts +24 -0
  575. package/dist/substrate/brand.mjs +14 -0
  576. package/dist/substrate/brand.mjs.map +1 -0
  577. package/dist/substrate/cross-process.d.mts +1 -0
  578. package/dist/substrate/cross-process.mjs +28 -0
  579. package/dist/substrate/cross-process.mjs.map +1 -0
  580. package/dist/substrate/events.d.mts +117 -0
  581. package/dist/substrate/identity.d.mts +13 -0
  582. package/dist/substrate/lifecycle.d.mts +12 -0
  583. package/dist/substrate/manifest.d.mts +39 -0
  584. package/dist/substrate/manifest.mjs +33 -0
  585. package/dist/substrate/manifest.mjs.map +1 -0
  586. package/dist/substrate/network.d.mts +34 -0
  587. package/dist/substrate/options.d.mts +23 -0
  588. package/dist/substrate/plugin.d.mts +101 -0
  589. package/dist/substrate/plugin.mjs +61 -0
  590. package/dist/substrate/plugin.mjs.map +1 -0
  591. package/dist/substrate/projection.d.mts +100 -0
  592. package/dist/substrate/runtime/artifact-publisher/index.mjs +76 -0
  593. package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -0
  594. package/dist/substrate/runtime/atomic-write.mjs +106 -0
  595. package/dist/substrate/runtime/atomic-write.mjs.map +1 -0
  596. package/dist/substrate/runtime/cache/index.d.mts +1 -0
  597. package/dist/substrate/runtime/cache/schema.d.mts +1 -0
  598. package/dist/substrate/runtime/cache/schema.mjs +22 -0
  599. package/dist/substrate/runtime/cache/schema.mjs.map +1 -0
  600. package/dist/substrate/runtime/cache/service.d.mts +1 -0
  601. package/dist/substrate/runtime/cache/service.mjs +89 -0
  602. package/dist/substrate/runtime/cache/service.mjs.map +1 -0
  603. package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -0
  604. package/dist/substrate/runtime/capability-sinks/layer.d.mts +1 -0
  605. package/dist/substrate/runtime/capability-sinks/layer.mjs +31 -0
  606. package/dist/substrate/runtime/capability-sinks/layer.mjs.map +1 -0
  607. package/dist/substrate/runtime/capability-sinks/service.d.mts +36 -0
  608. package/dist/substrate/runtime/capability-sinks/service.mjs +74 -0
  609. package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -0
  610. package/dist/substrate/runtime/config-validation.d.mts +38 -0
  611. package/dist/substrate/runtime/config-validation.mjs +137 -0
  612. package/dist/substrate/runtime/config-validation.mjs.map +1 -0
  613. package/dist/substrate/runtime/context-helpers.mjs +32 -0
  614. package/dist/substrate/runtime/context-helpers.mjs.map +1 -0
  615. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +128 -0
  616. package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -0
  617. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +136 -0
  618. package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -0
  619. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +49 -0
  620. package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -0
  621. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +9 -0
  622. package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -0
  623. package/dist/substrate/runtime/cross-process/liveness.mjs +119 -0
  624. package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -0
  625. package/dist/substrate/runtime/cross-process/roster.mjs +275 -0
  626. package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -0
  627. package/dist/substrate/runtime/cross-process/snapshot-reservation.d.mts +1 -0
  628. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +117 -0
  629. package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -0
  630. package/dist/substrate/runtime/cross-process/stack-lock.d.mts +1 -0
  631. package/dist/substrate/runtime/cross-process/stack-lock.mjs +142 -0
  632. package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -0
  633. package/dist/substrate/runtime/current-plugin.mjs +15 -0
  634. package/dist/substrate/runtime/current-plugin.mjs.map +1 -0
  635. package/dist/substrate/runtime/errors.d.mts +1 -0
  636. package/dist/substrate/runtime/errors.mjs +76 -0
  637. package/dist/substrate/runtime/errors.mjs.map +1 -0
  638. package/dist/substrate/runtime/host-tree-tar/index.mjs +364 -0
  639. package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -0
  640. package/dist/substrate/runtime/http-probe.d.mts +35 -0
  641. package/dist/substrate/runtime/http-probe.mjs +65 -0
  642. package/dist/substrate/runtime/http-probe.mjs.map +1 -0
  643. package/dist/substrate/runtime/lease-broker/index.d.mts +1 -0
  644. package/dist/substrate/runtime/lease-broker/service.d.mts +64 -0
  645. package/dist/substrate/runtime/lease-broker/service.mjs +155 -0
  646. package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -0
  647. package/dist/substrate/runtime/lifecycle/dep-graph.d.mts +1 -0
  648. package/dist/substrate/runtime/lifecycle/dep-graph.mjs +138 -0
  649. package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -0
  650. package/dist/substrate/runtime/lifecycle/index.d.mts +1 -0
  651. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +31 -0
  652. package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -0
  653. package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -0
  654. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +133 -0
  655. package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -0
  656. package/dist/substrate/runtime/lifecycle/ready-gate.d.mts +1 -0
  657. package/dist/substrate/runtime/lifecycle/ready-gate.mjs +34 -0
  658. package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -0
  659. package/dist/substrate/runtime/lifecycle/selective-restart.d.mts +1 -0
  660. package/dist/substrate/runtime/lifecycle/selective-restart.mjs +43 -0
  661. package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -0
  662. package/dist/substrate/runtime/lifecycle/signals.d.mts +1 -0
  663. package/dist/substrate/runtime/lifecycle/signals.mjs +64 -0
  664. package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -0
  665. package/dist/substrate/runtime/lifecycle/state-machine.d.mts +1 -0
  666. package/dist/substrate/runtime/lifecycle/state-machine.mjs +38 -0
  667. package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -0
  668. package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -0
  669. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +27 -0
  670. package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -0
  671. package/dist/substrate/runtime/managed-container.d.mts +30 -0
  672. package/dist/substrate/runtime/managed-container.mjs +32 -0
  673. package/dist/substrate/runtime/managed-container.mjs.map +1 -0
  674. package/dist/substrate/runtime/manifest/manifest.mjs +73 -0
  675. package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -0
  676. package/dist/substrate/runtime/mode-errors.d.mts +36 -0
  677. package/dist/substrate/runtime/observability/cascade-formatter.d.mts +1 -0
  678. package/dist/substrate/runtime/observability/cascade-formatter.mjs +135 -0
  679. package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -0
  680. package/dist/substrate/runtime/observability/formatter-registry.d.mts +1 -0
  681. package/dist/substrate/runtime/observability/formatter-registry.mjs +65 -0
  682. package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -0
  683. package/dist/substrate/runtime/observability/index.d.mts +3 -0
  684. package/dist/substrate/runtime/observability/logger.d.mts +58 -0
  685. package/dist/substrate/runtime/observability/logger.mjs +89 -0
  686. package/dist/substrate/runtime/observability/logger.mjs.map +1 -0
  687. package/dist/substrate/runtime/observability/pretty-error.d.mts +1 -0
  688. package/dist/substrate/runtime/observability/pretty-error.mjs +119 -0
  689. package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -0
  690. package/dist/substrate/runtime/observability/process-lines.d.mts +31 -0
  691. package/dist/substrate/runtime/observability/process-lines.mjs +40 -0
  692. package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -0
  693. package/dist/substrate/runtime/observability/redaction.d.mts +28 -0
  694. package/dist/substrate/runtime/observability/redaction.mjs +45 -0
  695. package/dist/substrate/runtime/observability/redaction.mjs.map +1 -0
  696. package/dist/substrate/runtime/observability/spans.d.mts +1 -0
  697. package/dist/substrate/runtime/observability/spans.mjs +87 -0
  698. package/dist/substrate/runtime/observability/spans.mjs.map +1 -0
  699. package/dist/substrate/runtime/observability/subprocess-capture.d.mts +2 -0
  700. package/dist/substrate/runtime/observability/subprocess-capture.mjs +82 -0
  701. package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -0
  702. package/dist/substrate/runtime/paths.d.mts +17 -0
  703. package/dist/substrate/runtime/paths.mjs +61 -0
  704. package/dist/substrate/runtime/paths.mjs.map +1 -0
  705. package/dist/substrate/runtime/port-broker/index.d.mts +1 -0
  706. package/dist/substrate/runtime/port-broker/service.d.mts +1 -0
  707. package/dist/substrate/runtime/port-broker/service.mjs +319 -0
  708. package/dist/substrate/runtime/port-broker/service.mjs.map +1 -0
  709. package/dist/substrate/runtime/post-acquire-tasks.d.mts +1 -0
  710. package/dist/substrate/runtime/post-acquire-tasks.mjs +34 -0
  711. package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -0
  712. package/dist/substrate/runtime/probes.d.mts +51 -0
  713. package/dist/substrate/runtime/probes.mjs +84 -0
  714. package/dist/substrate/runtime/probes.mjs.map +1 -0
  715. package/dist/substrate/runtime/process-supervisor.d.mts +57 -0
  716. package/dist/substrate/runtime/process-supervisor.mjs +73 -0
  717. package/dist/substrate/runtime/process-supervisor.mjs.map +1 -0
  718. package/dist/substrate/runtime/projection/operational-endpoints.mjs +44 -0
  719. package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -0
  720. package/dist/substrate/runtime/projection/persisted.mjs +195 -0
  721. package/dist/substrate/runtime/projection/persisted.mjs.map +1 -0
  722. package/dist/substrate/runtime/projection/state-ref.mjs +48 -0
  723. package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -0
  724. package/dist/substrate/runtime/projection/update.mjs +200 -0
  725. package/dist/substrate/runtime/projection/update.mjs.map +1 -0
  726. package/dist/substrate/runtime/retry-policy.d.mts +18 -0
  727. package/dist/substrate/runtime/retry-policy.mjs +16 -0
  728. package/dist/substrate/runtime/retry-policy.mjs.map +1 -0
  729. package/dist/substrate/runtime/run.mjs +86 -0
  730. package/dist/substrate/runtime/run.mjs.map +1 -0
  731. package/dist/substrate/runtime/runtime-decode.d.mts +32 -0
  732. package/dist/substrate/runtime/runtime-decode.mjs +53 -0
  733. package/dist/substrate/runtime/runtime-decode.mjs.map +1 -0
  734. package/dist/substrate/runtime/scoped-http-server.mjs +36 -0
  735. package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -0
  736. package/dist/substrate/runtime/scoped-ref-map/service.mjs +83 -0
  737. package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -0
  738. package/dist/substrate/runtime/stage-and-swap/index.d.mts +1 -0
  739. package/dist/substrate/runtime/stage-and-swap/index.mjs +131 -0
  740. package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -0
  741. package/dist/substrate/runtime/state-store/schema.mjs +36 -0
  742. package/dist/substrate/runtime/state-store/schema.mjs.map +1 -0
  743. package/dist/substrate/runtime/strategy-registry/chain-probe-for.d.mts +1 -0
  744. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +22 -0
  745. package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -0
  746. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.d.mts +1 -0
  747. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +30 -0
  748. package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +1 -0
  749. package/dist/substrate/runtime/strategy-registry/index.d.mts +1 -0
  750. package/dist/substrate/runtime/strategy-registry/service.d.mts +1 -0
  751. package/dist/substrate/runtime/strategy-registry/service.mjs +67 -0
  752. package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -0
  753. package/dist/substrate/runtime/sui-execute/index.d.mts +11 -0
  754. package/dist/substrate/runtime/sui-execute/index.mjs +144 -0
  755. package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -0
  756. package/dist/substrate/runtime/sui-move-build/index.d.mts +1 -0
  757. package/dist/substrate/runtime/sui-move-build/index.mjs +283 -0
  758. package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -0
  759. package/dist/substrate/runtime/supervisor.d.mts +1 -0
  760. package/dist/substrate/runtime/supervisor.mjs +831 -0
  761. package/dist/substrate/runtime/supervisor.mjs.map +1 -0
  762. package/dist/surfaces/cli/command-tree.mjs +276 -0
  763. package/dist/surfaces/cli/command-tree.mjs.map +1 -0
  764. package/dist/surfaces/cli/commands/config.mjs +31 -0
  765. package/dist/surfaces/cli/commands/config.mjs.map +1 -0
  766. package/dist/surfaces/cli/commands/confirm-node.mjs +26 -0
  767. package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -0
  768. package/dist/surfaces/cli/commands/confirm.mjs +26 -0
  769. package/dist/surfaces/cli/commands/confirm.mjs.map +1 -0
  770. package/dist/surfaces/cli/commands/doctor-probes.mjs +452 -0
  771. package/dist/surfaces/cli/commands/doctor-probes.mjs.map +1 -0
  772. package/dist/surfaces/cli/commands/doctor.mjs +38 -0
  773. package/dist/surfaces/cli/commands/doctor.mjs.map +1 -0
  774. package/dist/surfaces/cli/commands/prune-picker.mjs +347 -0
  775. package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -0
  776. package/dist/surfaces/cli/commands/prune.mjs +178 -0
  777. package/dist/surfaces/cli/commands/prune.mjs.map +1 -0
  778. package/dist/surfaces/cli/commands/snapshot.mjs +141 -0
  779. package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -0
  780. package/dist/surfaces/cli/commands/status.mjs +95 -0
  781. package/dist/surfaces/cli/commands/status.mjs.map +1 -0
  782. package/dist/surfaces/cli/commands/supervisor-presence.mjs +33 -0
  783. package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -0
  784. package/dist/surfaces/cli/commands/wipe.mjs +28 -0
  785. package/dist/surfaces/cli/commands/wipe.mjs.map +1 -0
  786. package/dist/surfaces/cli/envelope.mjs +43 -0
  787. package/dist/surfaces/cli/envelope.mjs.map +1 -0
  788. package/dist/surfaces/cli/errors.mjs +110 -0
  789. package/dist/surfaces/cli/errors.mjs.map +1 -0
  790. package/dist/surfaces/cli/flags.mjs +56 -0
  791. package/dist/surfaces/cli/flags.mjs.map +1 -0
  792. package/dist/surfaces/cli/index.mjs +418 -0
  793. package/dist/surfaces/cli/index.mjs.map +1 -0
  794. package/dist/surfaces/cli/output.mjs +115 -0
  795. package/dist/surfaces/cli/output.mjs.map +1 -0
  796. package/dist/surfaces/cli/sysexits.mjs +139 -0
  797. package/dist/surfaces/cli/sysexits.mjs.map +1 -0
  798. package/dist/surfaces/tui/app.mjs +104 -0
  799. package/dist/surfaces/tui/app.mjs.map +1 -0
  800. package/dist/surfaces/tui/dashboard.mjs +261 -0
  801. package/dist/surfaces/tui/dashboard.mjs.map +1 -0
  802. package/dist/surfaces/tui/display-derivation.mjs +395 -0
  803. package/dist/surfaces/tui/display-derivation.mjs.map +1 -0
  804. package/dist/surfaces/tui/errors.mjs +11 -0
  805. package/dist/surfaces/tui/errors.mjs.map +1 -0
  806. package/dist/surfaces/tui/event-log.mjs +155 -0
  807. package/dist/surfaces/tui/event-log.mjs.map +1 -0
  808. package/dist/surfaces/tui/heartbeat.mjs +33 -0
  809. package/dist/surfaces/tui/heartbeat.mjs.map +1 -0
  810. package/dist/surfaces/tui/index.mjs +50 -0
  811. package/dist/surfaces/tui/index.mjs.map +1 -0
  812. package/dist/surfaces/tui/input.mjs +104 -0
  813. package/dist/surfaces/tui/input.mjs.map +1 -0
  814. package/dist/surfaces/tui/mode-detect.mjs +32 -0
  815. package/dist/surfaces/tui/mode-detect.mjs.map +1 -0
  816. package/dist/surfaces/tui/mount-ink.mjs +31 -0
  817. package/dist/surfaces/tui/mount-ink.mjs.map +1 -0
  818. package/dist/surfaces/tui/plain-renderer.mjs +170 -0
  819. package/dist/surfaces/tui/plain-renderer.mjs.map +1 -0
  820. package/dist/surfaces/tui/resource-table.mjs +507 -0
  821. package/dist/surfaces/tui/resource-table.mjs.map +1 -0
  822. package/images/_shared/signal-forward.sh +77 -0
  823. package/images/postgres/Dockerfile +32 -0
  824. package/images/seal/Dockerfile +68 -0
  825. package/images/seal/entrypoint.sh +65 -0
  826. package/images/sui/Dockerfile +73 -0
  827. package/images/sui/entrypoint.sh +244 -0
  828. package/images/sui-fork/Dockerfile +53 -0
  829. package/images/sui-fork/entrypoint.sh +51 -0
  830. package/images/walrus/Dockerfile +122 -0
  831. package/images/walrus/deploy-walrus.sh +305 -0
  832. package/images/walrus/run-walrus.sh +53 -0
  833. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-log.mjs","names":[],"sources":["../../../src/surfaces/tui/event-log.ts"],"sourcesContent":["import type { EngineEvent } from '../../substrate/events.ts';\nimport { errorSummaryFor, labelForRow, type ColorToken } from './display-derivation.ts';\n\nexport interface EventLogLine {\n\treadonly id: string;\n\treadonly time: string;\n\treadonly scope: string;\n\treadonly scopeColor: ColorToken;\n\treadonly message: string;\n\treadonly text: string;\n\treadonly level: 'info' | 'warn' | 'error';\n}\n\nexport const MAX_EVENT_LOG_LINES = 200;\n\nexport const eventLogLineFromEvent = (event: EngineEvent, seq: number): EventLogLine | null => {\n\tconst at = eventAt(event);\n\tconst id = `${at}-${seq}-${event.tag}`;\n\tswitch (event.tag) {\n\t\tcase 'log.appended':\n\t\t\tif (event.level === 'info' || isRedundantPluginLog(event.line)) return null;\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tat,\n\t\t\t\tlevel: event.level,\n\t\t\t\tscope: labelForRow(event.pluginKey),\n\t\t\t\tscopeColor: colorForPluginKey(event.pluginKey),\n\t\t\t\tmessage: event.line,\n\t\t\t});\n\t\tcase 'error.reported':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: event.error.severity === 'warn' ? 'warn' : 'error',\n\t\t\t\tat,\n\t\t\t\tscope: event.error.pluginKey === null ? 'Stack' : labelForRow(event.error.pluginKey),\n\t\t\t\tscopeColor:\n\t\t\t\t\tevent.error.pluginKey === null ? 'white' : colorForPluginKey(event.error.pluginKey),\n\t\t\t\tmessage: `failed: ${errorSummaryFor(event.error)}`,\n\t\t\t});\n\t\tcase 'build.statusChanged':\n\t\tcase 'lifecycle.statusChanged':\n\t\tcase 'lifecycle.phaseSet':\n\t\tcase 'endpoint.registered':\n\t\tcase 'account.updated':\n\t\tcase 'package.updated':\n\t\t\treturn null;\n\t\tcase 'restart.requested':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'warn',\n\t\t\t\tat,\n\t\t\t\tscope: 'Stack',\n\t\t\t\tscopeColor: 'white',\n\t\t\t\tmessage: `restart requested for ${targetLabel(event.target)}`,\n\t\t\t});\n\t\tcase 'restart.completed':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'info',\n\t\t\t\tat,\n\t\t\t\tscope: 'Stack',\n\t\t\t\tscopeColor: 'white',\n\t\t\t\tmessage: `restart completed for ${targetLabel(event.target)}`,\n\t\t\t});\n\t\tcase 'shutdown.escalated':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'warn',\n\t\t\t\tat,\n\t\t\t\tscope: 'Stack',\n\t\t\t\tscopeColor: 'white',\n\t\t\t\tmessage: `shutdown hard-kill escalated by ${event.signal} (exit ${event.exitCode})`,\n\t\t\t});\n\t\tcase 'snapshot.captureStarted':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'info',\n\t\t\t\tat,\n\t\t\t\tscope: 'Snapshot',\n\t\t\t\tscopeColor: 'blueBright',\n\t\t\t\tmessage: event.name === undefined ? 'capture started' : `capture started for ${event.name}`,\n\t\t\t});\n\t\tcase 'snapshot.captureProgress':\n\t\t\treturn null;\n\t\tcase 'snapshot.captureSkipped':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'warn',\n\t\t\t\tat,\n\t\t\t\tscope: 'Snapshot',\n\t\t\t\tscopeColor: 'blueBright',\n\t\t\t\tmessage: 'capture already running',\n\t\t\t});\n\t\tcase 'snapshot.captureFailed':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'error',\n\t\t\t\tat,\n\t\t\t\tscope: 'Snapshot',\n\t\t\t\tscopeColor: 'blueBright',\n\t\t\t\tmessage:\n\t\t\t\t\tevent.name === undefined\n\t\t\t\t\t\t? `capture failed: ${event.summary}`\n\t\t\t\t\t\t: `capture failed for ${event.name}: ${event.summary}`,\n\t\t\t});\n\t\tcase 'snapshot.captured':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'info',\n\t\t\t\tat,\n\t\t\t\tscope: 'Snapshot',\n\t\t\t\tscopeColor: 'blueBright',\n\t\t\t\tmessage:\n\t\t\t\t\tevent.name === undefined\n\t\t\t\t\t\t? `captured ${event.snapshotId}`\n\t\t\t\t\t\t: `captured ${event.name} (${event.snapshotId})`,\n\t\t\t});\n\t\tcase 'snapshot.restored':\n\t\t\treturn line({\n\t\t\t\tid,\n\t\t\t\tlevel: 'info',\n\t\t\t\tat,\n\t\t\t\tscope: 'Snapshot',\n\t\t\t\tscopeColor: 'blueBright',\n\t\t\t\tmessage: `restored ${event.snapshotId}`,\n\t\t\t});\n\t\tcase 'endpoint.released':\n\t\tcase 'strategy.registered':\n\t\tcase 'strategy.unregistered':\n\t\tcase 'manifest.flushed':\n\t\tcase 'codegen.emitted':\n\t\t\treturn null;\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = event;\n\t\t\tvoid _exhaustive;\n\t\t\treturn null;\n\t\t}\n\t}\n};\n\nexport const shutdownRequestedLine = (at: number, seq: number): EventLogLine => ({\n\tid: `${at}-${seq}-shutdown.requested`,\n\ttime: time(at),\n\tscope: 'Stack',\n\tscopeColor: 'white',\n\tmessage: 'shutdown requested; waiting for graceful stop',\n\tlevel: 'warn',\n\ttext: `${time(at)} shutdown requested; waiting for graceful stop`,\n});\n\nexport const appendEventLogLine = (\n\tlines: ReadonlyArray<EventLogLine>,\n\tnext: EventLogLine | null,\n): ReadonlyArray<EventLogLine> => {\n\tif (next === null) return lines;\n\tconst appended = [...lines, next];\n\treturn appended.length > MAX_EVENT_LOG_LINES ? appended.slice(-MAX_EVENT_LOG_LINES) : appended;\n};\n\nconst eventAt = (event: EngineEvent): number => {\n\tif ('at' in event && typeof event.at === 'number') return event.at;\n\tswitch (event.tag) {\n\t\tcase 'endpoint.registered':\n\t\t\treturn event.endpoint.registeredAt;\n\t\tcase 'error.reported':\n\t\t\treturn event.error.at;\n\t\tcase 'build.statusChanged':\n\t\t\treturn event.entry.startedAt;\n\t\tdefault:\n\t\t\treturn Date.now();\n\t}\n};\n\nconst time = (at: number): string => new Date(at).toISOString().slice(11, 19);\n\nconst targetLabel = (target: 'stack' | { readonly pluginKey: string }): string =>\n\ttarget === 'stack' ? 'stack' : target.pluginKey;\n\nconst line = (input: {\n\treadonly id: string;\n\treadonly at: number;\n\treadonly level: EventLogLine['level'];\n\treadonly scope: string;\n\treadonly scopeColor: ColorToken;\n\treadonly message: string;\n}): EventLogLine => {\n\tconst renderedTime = time(input.at);\n\treturn {\n\t\tid: input.id,\n\t\ttime: renderedTime,\n\t\tscope: input.scope,\n\t\tscopeColor: input.scopeColor,\n\t\tmessage: input.message,\n\t\tlevel: input.level,\n\t\ttext: `${renderedTime} ${input.scope}: ${input.message}`,\n\t};\n};\n\nconst isRedundantPluginLog = (message: string): boolean => {\n\tconst normalized = message.trim().toLowerCase();\n\treturn (\n\t\tnormalized === 'plugin acquire start' ||\n\t\tnormalized === 'plugin ready' ||\n\t\tnormalized === 'plugin acquire failed'\n\t);\n};\n\nconst colorForPluginKey = (pluginKey: string): ColorToken => {\n\tconst normalized = pluginKey.toLowerCase();\n\tif (normalized.includes('account')) return 'magenta';\n\tif (normalized.includes('package')) return 'blueBright';\n\tif (normalized.includes('action')) return 'magenta';\n\tif (normalized.includes('app') || normalized.includes('frontend')) return 'white';\n\treturn 'cyan';\n};\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Text } from "ink";
2
+ import { useEffect, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/surfaces/tui/heartbeat.tsx
5
+ const FRAMES = [
6
+ "⠋",
7
+ "⠙",
8
+ "⠹",
9
+ "⠸",
10
+ "⠼",
11
+ "⠴",
12
+ "⠦",
13
+ "⠧",
14
+ "⠇",
15
+ "⠏"
16
+ ];
17
+ const Heartbeat = ({ intervalMs = 120, color = "white" }) => {
18
+ const [frame, setFrame] = useState(0);
19
+ useEffect(() => {
20
+ const id = setInterval(() => {
21
+ setFrame((f) => (f + 1) % FRAMES.length);
22
+ }, intervalMs);
23
+ return () => clearInterval(id);
24
+ }, [intervalMs]);
25
+ return /* @__PURE__ */ jsx(Text, {
26
+ color,
27
+ children: FRAMES[frame]
28
+ });
29
+ };
30
+ //#endregion
31
+ export { Heartbeat };
32
+
33
+ //# sourceMappingURL=heartbeat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.mjs","names":[],"sources":["../../../src/surfaces/tui/heartbeat.tsx"],"sourcesContent":["// Heartbeat indicator.\n//\n// Distilled/21-tui § Invariants: \"Frame stability: rendering must\n// short-circuit when nothing has changed.\" The heartbeat indicator\n// gives the operator a visible signal that the renderer is alive\n// even when the projection isn't ticking — without re-rendering the\n// whole tree. It's a single character that cycles through a small\n// alphabet on a clock; the dashboard places it in the header.\n//\n// We use `useEffect` + `setInterval` so the heartbeat doesn't depend\n// on the projection at all. When the projection IS ticking, frames\n// are driven by the SubscriptionRef subscription; the heartbeat\n// continues to spin to give long-quiet-stack feedback.\n\nimport { Text } from 'ink';\nimport type React from 'react';\nimport { useEffect, useState } from 'react';\n\nimport type { ColorToken } from './display-derivation.ts';\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\n\nexport interface HeartbeatProps {\n\t/** Tick interval in ms. Default 120ms. */\n\treadonly intervalMs?: number;\n\t/** Color token. Default terminal foreground. */\n\treadonly color?: ColorToken;\n}\n\nexport const Heartbeat = ({\n\tintervalMs = 120,\n\tcolor = 'white',\n}: HeartbeatProps): React.JSX.Element => {\n\tconst [frame, setFrame] = useState(0);\n\tuseEffect(() => {\n\t\tconst id = setInterval(() => {\n\t\t\tsetFrame((f) => (f + 1) % FRAMES.length);\n\t\t}, intervalMs);\n\t\treturn () => clearInterval(id);\n\t}, [intervalMs]);\n\treturn <Text color={color}>{FRAMES[frame]}</Text>;\n};\n"],"mappings":";;;;AAoBA,MAAM,SAAS;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAI;AASjE,MAAa,aAAa,EACzB,aAAa,KACb,QAAQ,cACgC;CACxC,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;AACrC,iBAAgB;EACf,MAAM,KAAK,kBAAkB;AAC5B,aAAU,OAAO,IAAI,KAAK,OAAO,OAAO;KACtC,WAAW;AACd,eAAa,cAAc,GAAG;IAC5B,CAAC,WAAW,CAAC;AAChB,QAAO,oBAAC,MAAD;EAAa;YAAQ,OAAO;EAAc,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { mountFailed } from "./errors.mjs";
2
+ import { detectMode } from "./mode-detect.mjs";
3
+ import "./display-derivation.mjs";
4
+ import { makePlainRenderer } from "./plain-renderer.mjs";
5
+ import { Effect, Stream, SubscriptionRef } from "effect";
6
+ //#region src/surfaces/tui/index.ts
7
+ /**
8
+ * Build the TUI renderer. The returned `Renderer` is the contract the
9
+ * supervisor mounts (once per process); the supervisor passes the
10
+ * SubscriptionRef + event Stream into `renderer.mount`.
11
+ *
12
+ * Mode selection:
13
+ * - `options.mode === 'silent'` → no-op renderer (no output).
14
+ * - `options.mode === 'plain'` → structured stderr lines.
15
+ * - `options.mode === 'ink'` → live Ink dashboard.
16
+ * - `undefined` → `detectMode()` (TTY → ink else plain).
17
+ */
18
+ const makeTuiSurface = (options = {}) => {
19
+ switch (detectMode(options.mode)) {
20
+ case "silent": return makeSilentRenderer();
21
+ case "plain": return makePlainRenderer();
22
+ case "ink": return makeInkRenderer({ publishCommand: options.publishCommand ?? (() => {}) });
23
+ default: return makeSilentRenderer();
24
+ }
25
+ };
26
+ const makeSilentRenderer = () => ({
27
+ mount: (stateRef, events) => Effect.gen(function* () {
28
+ yield* SubscriptionRef.get(stateRef);
29
+ yield* Stream.runDrain(events);
30
+ }).pipe(Effect.catch((cause) => Effect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))))),
31
+ flush: Effect.void
32
+ });
33
+ const makeInkRenderer = (options) => ({
34
+ mount: (stateRef, events) => Effect.gen(function* () {
35
+ const { mountInkApp } = yield* Effect.tryPromise({
36
+ try: () => import("./mount-ink.mjs"),
37
+ catch: (cause) => mountFailed(`ink lazy import failed: ${cause instanceof Error ? cause.message : String(cause)}`)
38
+ });
39
+ yield* mountInkApp({
40
+ stateRef,
41
+ events,
42
+ publishCommand: options.publishCommand
43
+ });
44
+ }),
45
+ flush: Effect.void
46
+ });
47
+ //#endregion
48
+ export { makeTuiSurface };
49
+
50
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/surfaces/tui/index.ts"],"sourcesContent":["// TUI surface entry point.\n//\n// Selects the renderer mode (ink / plain / silent), returns a\n// `Renderer`-contract-satisfying value the supervisor can mount once\n// per process. The supervisor wires the SubscriptionRef and event\n// stream in; this surface does the rest.\n//\n// Architecture §11 + distilled/21-tui:\n// - One mount per process (the engine cycle re-runs many times;\n// mount survives).\n// - No engine handle is captured here — only the SubscriptionRef +\n// event Stream + command publisher.\n// - Mode selection follows `mode-detect.ts`: explicit > TTY-detect.\n//\n// This file deliberately does NOT import `ink` at the top level so\n// non-TTY users (CI, scripts) don't pay the ink import cost. The ink\n// renderer is lazy-imported behind the `ink` mode branch via the\n// adjacent `mount-ink.tsx` helper (which owns the JSX).\n\nimport { Effect, Stream, SubscriptionRef } from 'effect';\n\nimport type { Renderer } from '../../contracts/renderer.ts';\nimport type { EngineCommand, EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport { mountFailed } from './errors.ts';\nimport { type RendererMode, detectMode } from './mode-detect.ts';\nimport { makePlainRenderer } from './plain-renderer.ts';\n\nexport interface TuiSurfaceOptions {\n\t/** Explicit mode override. `undefined` → auto-detect via stdout. */\n\treadonly mode?: RendererMode;\n\t/** Command publisher — every keypress turns into a typed\n\t * `EngineCommand` invoked here. Required for `ink` mode; ignored\n\t * for `plain` / `silent` (those modes are pure consumers). */\n\treadonly publishCommand?: (command: EngineCommand) => void;\n}\n\n/**\n * Build the TUI renderer. The returned `Renderer` is the contract the\n * supervisor mounts (once per process); the supervisor passes the\n * SubscriptionRef + event Stream into `renderer.mount`.\n *\n * Mode selection:\n * - `options.mode === 'silent'` → no-op renderer (no output).\n * - `options.mode === 'plain'` → structured stderr lines.\n * - `options.mode === 'ink'` → live Ink dashboard.\n * - `undefined` → `detectMode()` (TTY → ink else plain).\n */\nexport const makeTuiSurface = (options: TuiSurfaceOptions = {}): Renderer => {\n\tconst mode = detectMode(options.mode);\n\tswitch (mode) {\n\t\tcase 'silent':\n\t\t\treturn makeSilentRenderer();\n\t\tcase 'plain':\n\t\t\treturn makePlainRenderer();\n\t\tcase 'ink':\n\t\t\treturn makeInkRenderer({\n\t\t\t\tpublishCommand:\n\t\t\t\t\toptions.publishCommand ??\n\t\t\t\t\t(() => {\n\t\t\t\t\t\t/* no publisher wired → keypresses are silently dropped.\n\t\t\t\t\t\t * The CLI/supervisor wiring is expected to provide one;\n\t\t\t\t\t\t * we don't fail-fast on missing publisher so headless\n\t\t\t\t\t\t * test mounts work. */\n\t\t\t\t\t}),\n\t\t\t});\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = mode;\n\t\t\tvoid _exhaustive;\n\t\t\treturn makeSilentRenderer();\n\t\t}\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Silent renderer\n// -----------------------------------------------------------------------------\n\nconst makeSilentRenderer = (): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\t// Drain the event stream so back-pressure doesn't accumulate;\n\t\t// emit nothing. Keep the SubscriptionRef alive (no-op read).\n\t\tEffect.gen(function* () {\n\t\t\tyield* SubscriptionRef.get(stateRef);\n\t\t\tyield* Stream.runDrain(events);\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,\n});\n\n// -----------------------------------------------------------------------------\n// Ink renderer (lazy-loaded; depends on `ink` + `react`)\n// -----------------------------------------------------------------------------\n\ninterface InkRendererOptions {\n\treadonly publishCommand: (command: EngineCommand) => void;\n}\n\nconst makeInkRenderer = (options: InkRendererOptions): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\tEffect.gen(function* () {\n\t\t\t// Lazy-import the JSX mount helper. The dynamic import\n\t\t\t// keeps the static graph thin for non-TTY callers.\n\t\t\tconst { mountInkApp } = yield* Effect.tryPromise({\n\t\t\t\ttry: () => import('./mount-ink.tsx'),\n\t\t\t\tcatch: (cause) =>\n\t\t\t\t\tmountFailed(\n\t\t\t\t\t\t`ink lazy import failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\t\t\t),\n\t\t\t});\n\n\t\t\tyield* mountInkApp({\n\t\t\t\tstateRef,\n\t\t\t\tevents,\n\t\t\t\tpublishCommand: options.publishCommand,\n\t\t\t});\n\t\t}),\n\tflush: Effect.void,\n});\n\n// -----------------------------------------------------------------------------\n// Public exports\n// -----------------------------------------------------------------------------\n\nexport type { Renderer } from '../../contracts/renderer.ts';\nexport type { RendererMode } from './mode-detect.ts';\nexport { detectMode, resolveMode } from './mode-detect.ts';\nexport { deriveDisplayCells } from './display-derivation.ts';\nexport { formatEventLine, formatHeartbeat } from './plain-renderer.ts';\nexport type { EngineCommand, EngineEvent, SubscribableState };\n"],"mappings":";;;;;;;;;;;;;;;;;AAgDA,MAAa,kBAAkB,UAA6B,EAAE,KAAe;AAE5E,SADa,WAAW,QAAQ,KACpB,EAAZ;EACC,KAAK,SACJ,QAAO,oBAAoB;EAC5B,KAAK,QACJ,QAAO,mBAAmB;EAC3B,KAAK,MACJ,QAAO,gBAAgB,EACtB,gBACC,QAAQ,yBACD,KAMR,CAAC;EACH,QAGC,QAAO,oBAAoB;;;AAS9B,MAAM,4BAAsC;CAC3C,QAAQ,UAAU,WAGjB,OAAO,IAAI,aAAa;AACvB,SAAO,gBAAgB,IAAI,SAAS;AACpC,SAAO,OAAO,SAAS,OAAO;GAC7B,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KAAK,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC,CAAC,CAChF,CACD;CACF,OAAO,OAAO;CACd;AAUD,MAAM,mBAAmB,aAA2C;CACnE,QAAQ,UAAU,WACjB,OAAO,IAAI,aAAa;EAGvB,MAAM,EAAE,gBAAgB,OAAO,OAAO,WAAW;GAChD,WAAW,OAAO;GAClB,QAAQ,UACP,YACC,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACjF;GACF,CAAC;AAEF,SAAO,YAAY;GAClB;GACA;GACA,gBAAgB,QAAQ;GACxB,CAAC;GACD;CACH,OAAO,OAAO;CACd"}
@@ -0,0 +1,104 @@
1
+ import { useInput } from "ink";
2
+ import { useRef } from "react";
3
+ //#region src/surfaces/tui/input.tsx
4
+ const MAX_SNAPSHOT_NAME_LENGTH = 128;
5
+ const printableSnapshotNameInput = (input) => input.replace(/[\u0000-\u001f\u007f]/g, "").slice(0, MAX_SNAPSHOT_NAME_LENGTH);
6
+ /**
7
+ * Renderless component — mounts `useInput` at the dashboard root.
8
+ * Returns `null` so it composes inside layout boxes without taking
9
+ * up space.
10
+ */
11
+ const commandForKey = (input, ctrl, options = {}) => {
12
+ if (ctrl && input === "c") {
13
+ if (options.shutdownAlreadyRequested === true) return {
14
+ tag: "shutdown.hardKillRequested",
15
+ signal: "SIGINT",
16
+ exitCode: 130,
17
+ at: options.now?.() ?? Date.now()
18
+ };
19
+ return { tag: "shutdown.requested" };
20
+ }
21
+ switch (input) {
22
+ case "q":
23
+ case "Q": return { tag: "shutdown.requested" };
24
+ case "r":
25
+ case "R": return { tag: "stack.restart" };
26
+ default: return null;
27
+ }
28
+ };
29
+ const inputActionForKey = (input, key, options = {}) => {
30
+ if (options.snapshotPromptValue !== null && options.snapshotPromptValue !== void 0) {
31
+ if (key.ctrl === true && input === "c") {
32
+ const command = commandForKey(input, true, options);
33
+ return command === null ? null : {
34
+ tag: "publish",
35
+ command
36
+ };
37
+ }
38
+ if (key.escape === true) return { tag: "snapshotPrompt.cancel" };
39
+ if (key.return === true) {
40
+ const name = options.snapshotPromptValue.trim();
41
+ return {
42
+ tag: "publish",
43
+ command: name.length === 0 ? { tag: "snapshot.capture" } : {
44
+ tag: "snapshot.capture",
45
+ name
46
+ }
47
+ };
48
+ }
49
+ if (key.backspace === true || key.delete === true) return {
50
+ tag: "snapshotPrompt.update",
51
+ value: options.snapshotPromptValue.slice(0, -1)
52
+ };
53
+ if (key.ctrl === true) return null;
54
+ const printable = printableSnapshotNameInput(input);
55
+ if (printable.length === 0) return null;
56
+ return {
57
+ tag: "snapshotPrompt.update",
58
+ value: `${options.snapshotPromptValue}${printable}`.slice(0, MAX_SNAPSHOT_NAME_LENGTH)
59
+ };
60
+ }
61
+ if (input === "s" || input === "S") return { tag: "snapshotPrompt.open" };
62
+ const command = commandForKey(input, key.ctrl === true, options);
63
+ return command === null ? null : {
64
+ tag: "publish",
65
+ command
66
+ };
67
+ };
68
+ const InputHandler = ({ publish, snapshotPromptValue, onSnapshotPromptChange, disabled = false }) => {
69
+ const shutdownRequested = useRef(false);
70
+ useInput((input, key) => {
71
+ if (disabled) return;
72
+ const action = inputActionForKey(input, key, {
73
+ snapshotPromptValue,
74
+ shutdownAlreadyRequested: shutdownRequested.current
75
+ });
76
+ switch (action?.tag) {
77
+ case "publish": {
78
+ const { command } = action;
79
+ if (command.tag === "shutdown.requested" || command.tag === "shutdown.hardKillRequested") {
80
+ onSnapshotPromptChange(null);
81
+ shutdownRequested.current = true;
82
+ }
83
+ if (command.tag === "snapshot.capture") onSnapshotPromptChange(null);
84
+ publish(command);
85
+ break;
86
+ }
87
+ case "snapshotPrompt.open":
88
+ onSnapshotPromptChange("");
89
+ break;
90
+ case "snapshotPrompt.update":
91
+ onSnapshotPromptChange(action.value);
92
+ break;
93
+ case "snapshotPrompt.cancel":
94
+ onSnapshotPromptChange(null);
95
+ break;
96
+ default: break;
97
+ }
98
+ }, { isActive: !disabled });
99
+ return null;
100
+ };
101
+ //#endregion
102
+ export { InputHandler };
103
+
104
+ //# sourceMappingURL=input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.mjs","names":[],"sources":["../../../src/surfaces/tui/input.tsx"],"sourcesContent":["// Keyboard input handler.\n//\n// HARD INVARIANT (distilled/21-tui § Learnings #3): keypress handlers\n// MUST NOT call engine methods directly. They publish typed\n// `EngineCommand` values onto a `CommandPublisher` callback the\n// surface receives at mount time. The engine consumes the channel on\n// the other end; the renderer has no awareness of supervisor\n// internals like Deferred / Queue / scope structure.\n//\n// Key map (architecture §11 + distilled/21-tui §Responsibilities):\n//\n// q | Q -> 'shutdown.requested'\n// r | R -> 'stack.restart'\n// ctrl-c -> first press 'shutdown.requested'; repeat\n// press escalates to\n// 'shutdown.hardKillRequested'. Ink handles\n// Ctrl-C in-process when `exitOnCtrlC:\n// false`, so this mirrors the process-level\n// signal handler for TTY users.\n// s | S -> open snapshot-name prompt\n//\n// Defensive: useInput is mounted at the dashboard root level, NOT in\n// per-row components, so a re-rendered row never re-registers a\n// handler.\n\nimport { useInput } from 'ink';\nimport { useRef } from 'react';\n\nimport type { EngineCommand } from '../../substrate/events.ts';\n\n/**\n * Command publisher. A pure callback the renderer invokes with a\n * typed `EngineCommand`. The surface layer wires this to whatever\n * channel the engine is consuming on (Effect Queue, EventEmitter,\n * etc.); the renderer doesn't care.\n */\nexport type CommandPublisher = (command: EngineCommand) => void;\n\nexport interface InputHandlerProps {\n\t/** Publish a typed EngineCommand. */\n\treadonly publish: CommandPublisher;\n\t/** `null` means normal keymap mode; string means snapshot-name prompt mode. */\n\treadonly snapshotPromptValue: string | null;\n\t/** Update the snapshot prompt. Pass `null` to close it. */\n\treadonly onSnapshotPromptChange: (value: string | null) => void;\n\t/** Disable input handling (e.g. shutting-down state); defaults\n\t * to false. */\n\treadonly disabled?: boolean;\n}\n\nexport interface CommandForKeyOptions {\n\treadonly shutdownAlreadyRequested?: boolean;\n\treadonly now?: () => number;\n}\n\nexport interface InputActionForKeyOptions extends CommandForKeyOptions {\n\treadonly snapshotPromptValue?: string | null;\n}\n\ninterface KeyFlags {\n\treadonly ctrl?: boolean;\n\treadonly return?: boolean;\n\treadonly escape?: boolean;\n\treadonly backspace?: boolean;\n\treadonly delete?: boolean;\n}\n\nexport type InputAction =\n\t| { readonly tag: 'publish'; readonly command: EngineCommand }\n\t| { readonly tag: 'snapshotPrompt.open' }\n\t| { readonly tag: 'snapshotPrompt.update'; readonly value: string }\n\t| { readonly tag: 'snapshotPrompt.cancel' };\n\nconst MAX_SNAPSHOT_NAME_LENGTH = 128;\n\nconst printableSnapshotNameInput = (input: string): string =>\n\tinput.replace(/[\\u0000-\\u001f\\u007f]/g, '').slice(0, MAX_SNAPSHOT_NAME_LENGTH);\n\n/**\n * Renderless component — mounts `useInput` at the dashboard root.\n * Returns `null` so it composes inside layout boxes without taking\n * up space.\n */\nexport const commandForKey = (\n\tinput: string,\n\tctrl: boolean,\n\toptions: CommandForKeyOptions = {},\n): EngineCommand | null => {\n\tif (ctrl && input === 'c') {\n\t\tif (options.shutdownAlreadyRequested === true) {\n\t\t\treturn {\n\t\t\t\ttag: 'shutdown.hardKillRequested',\n\t\t\t\tsignal: 'SIGINT',\n\t\t\t\texitCode: 130,\n\t\t\t\tat: options.now?.() ?? Date.now(),\n\t\t\t};\n\t\t}\n\t\treturn { tag: 'shutdown.requested' };\n\t}\n\tswitch (input) {\n\t\tcase 'q':\n\t\tcase 'Q':\n\t\t\treturn { tag: 'shutdown.requested' };\n\t\tcase 'r':\n\t\tcase 'R':\n\t\t\treturn { tag: 'stack.restart' };\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const inputActionForKey = (\n\tinput: string,\n\tkey: KeyFlags,\n\toptions: InputActionForKeyOptions = {},\n): InputAction | null => {\n\tif (options.snapshotPromptValue !== null && options.snapshotPromptValue !== undefined) {\n\t\tif (key.ctrl === true && input === 'c') {\n\t\t\tconst command = commandForKey(input, true, options);\n\t\t\treturn command === null ? null : { tag: 'publish', command };\n\t\t}\n\t\tif (key.escape === true) return { tag: 'snapshotPrompt.cancel' };\n\t\tif (key.return === true) {\n\t\t\tconst name = options.snapshotPromptValue.trim();\n\t\t\treturn {\n\t\t\t\ttag: 'publish',\n\t\t\t\tcommand:\n\t\t\t\t\tname.length === 0 ? { tag: 'snapshot.capture' } : { tag: 'snapshot.capture', name },\n\t\t\t};\n\t\t}\n\t\tif (key.backspace === true || key.delete === true) {\n\t\t\treturn {\n\t\t\t\ttag: 'snapshotPrompt.update',\n\t\t\t\tvalue: options.snapshotPromptValue.slice(0, -1),\n\t\t\t};\n\t\t}\n\t\tif (key.ctrl === true) return null;\n\t\tconst printable = printableSnapshotNameInput(input);\n\t\tif (printable.length === 0) return null;\n\t\treturn {\n\t\t\ttag: 'snapshotPrompt.update',\n\t\t\tvalue: `${options.snapshotPromptValue}${printable}`.slice(0, MAX_SNAPSHOT_NAME_LENGTH),\n\t\t};\n\t}\n\n\tif (input === 's' || input === 'S') return { tag: 'snapshotPrompt.open' };\n\tconst command = commandForKey(input, key.ctrl === true, options);\n\treturn command === null ? null : { tag: 'publish', command };\n};\n\nexport const InputHandler = ({\n\tpublish,\n\tsnapshotPromptValue,\n\tonSnapshotPromptChange,\n\tdisabled = false,\n}: InputHandlerProps): null => {\n\tconst shutdownRequested = useRef(false);\n\tuseInput(\n\t\t(input, key) => {\n\t\t\tif (disabled) return;\n\t\t\tconst action = inputActionForKey(input, key, {\n\t\t\t\tsnapshotPromptValue,\n\t\t\t\tshutdownAlreadyRequested: shutdownRequested.current,\n\t\t\t});\n\t\t\tswitch (action?.tag) {\n\t\t\t\tcase 'publish': {\n\t\t\t\t\tconst { command } = action;\n\t\t\t\t\tif (\n\t\t\t\t\t\tcommand.tag === 'shutdown.requested' ||\n\t\t\t\t\t\tcommand.tag === 'shutdown.hardKillRequested'\n\t\t\t\t\t) {\n\t\t\t\t\t\tonSnapshotPromptChange(null);\n\t\t\t\t\t\tshutdownRequested.current = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (command.tag === 'snapshot.capture') {\n\t\t\t\t\t\tonSnapshotPromptChange(null);\n\t\t\t\t\t}\n\t\t\t\t\tpublish(command);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'snapshotPrompt.open':\n\t\t\t\t\tonSnapshotPromptChange('');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'snapshotPrompt.update':\n\t\t\t\t\tonSnapshotPromptChange(action.value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'snapshotPrompt.cancel':\n\t\t\t\t\tonSnapshotPromptChange(null);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t{ isActive: !disabled },\n\t);\n\treturn null;\n};\n"],"mappings":";;;AAyEA,MAAM,2BAA2B;AAEjC,MAAM,8BAA8B,UACnC,MAAM,QAAQ,0BAA0B,GAAG,CAAC,MAAM,GAAG,yBAAyB;;;;;;AAO/E,MAAa,iBACZ,OACA,MACA,UAAgC,EAAE,KACR;AAC1B,KAAI,QAAQ,UAAU,KAAK;AAC1B,MAAI,QAAQ,6BAA6B,KACxC,QAAO;GACN,KAAK;GACL,QAAQ;GACR,UAAU;GACV,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK;GACjC;AAEF,SAAO,EAAE,KAAK,sBAAsB;;AAErC,SAAQ,OAAR;EACC,KAAK;EACL,KAAK,IACJ,QAAO,EAAE,KAAK,sBAAsB;EACrC,KAAK;EACL,KAAK,IACJ,QAAO,EAAE,KAAK,iBAAiB;EAChC,QACC,QAAO;;;AAIV,MAAa,qBACZ,OACA,KACA,UAAoC,EAAE,KACd;AACxB,KAAI,QAAQ,wBAAwB,QAAQ,QAAQ,wBAAwB,KAAA,GAAW;AACtF,MAAI,IAAI,SAAS,QAAQ,UAAU,KAAK;GACvC,MAAM,UAAU,cAAc,OAAO,MAAM,QAAQ;AACnD,UAAO,YAAY,OAAO,OAAO;IAAE,KAAK;IAAW;IAAS;;AAE7D,MAAI,IAAI,WAAW,KAAM,QAAO,EAAE,KAAK,yBAAyB;AAChE,MAAI,IAAI,WAAW,MAAM;GACxB,MAAM,OAAO,QAAQ,oBAAoB,MAAM;AAC/C,UAAO;IACN,KAAK;IACL,SACC,KAAK,WAAW,IAAI,EAAE,KAAK,oBAAoB,GAAG;KAAE,KAAK;KAAoB;KAAM;IACpF;;AAEF,MAAI,IAAI,cAAc,QAAQ,IAAI,WAAW,KAC5C,QAAO;GACN,KAAK;GACL,OAAO,QAAQ,oBAAoB,MAAM,GAAG,GAAG;GAC/C;AAEF,MAAI,IAAI,SAAS,KAAM,QAAO;EAC9B,MAAM,YAAY,2BAA2B,MAAM;AACnD,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,SAAO;GACN,KAAK;GACL,OAAO,GAAG,QAAQ,sBAAsB,YAAY,MAAM,GAAG,yBAAyB;GACtF;;AAGF,KAAI,UAAU,OAAO,UAAU,IAAK,QAAO,EAAE,KAAK,uBAAuB;CACzE,MAAM,UAAU,cAAc,OAAO,IAAI,SAAS,MAAM,QAAQ;AAChE,QAAO,YAAY,OAAO,OAAO;EAAE,KAAK;EAAW;EAAS;;AAG7D,MAAa,gBAAgB,EAC5B,SACA,qBACA,wBACA,WAAW,YACmB;CAC9B,MAAM,oBAAoB,OAAO,MAAM;AACvC,WACE,OAAO,QAAQ;AACf,MAAI,SAAU;EACd,MAAM,SAAS,kBAAkB,OAAO,KAAK;GAC5C;GACA,0BAA0B,kBAAkB;GAC5C,CAAC;AACF,UAAQ,QAAQ,KAAhB;GACC,KAAK,WAAW;IACf,MAAM,EAAE,YAAY;AACpB,QACC,QAAQ,QAAQ,wBAChB,QAAQ,QAAQ,8BACf;AACD,4BAAuB,KAAK;AAC5B,uBAAkB,UAAU;;AAE7B,QAAI,QAAQ,QAAQ,mBACnB,wBAAuB,KAAK;AAE7B,YAAQ,QAAQ;AAChB;;GAED,KAAK;AACJ,2BAAuB,GAAG;AAC1B;GACD,KAAK;AACJ,2BAAuB,OAAO,MAAM;AACpC;GACD,KAAK;AACJ,2BAAuB,KAAK;AAC5B;GACD,QACC;;IAGH,EAAE,UAAU,CAAC,UAAU,CACvB;AACD,QAAO"}
@@ -0,0 +1,32 @@
1
+ //#region src/surfaces/tui/mode-detect.ts
2
+ /**
3
+ * Resolve the active renderer mode.
4
+ *
5
+ * requested | stdoutIsTty | result
6
+ * ---------------+-------------+--------
7
+ * 'ink' | any | 'ink'
8
+ * 'plain' | any | 'plain'
9
+ * 'silent' | any | 'silent'
10
+ * undefined | true | 'ink'
11
+ * undefined | false | 'plain'
12
+ *
13
+ * Note: the `'ink'` explicit override on a non-TTY is allowed and is
14
+ * the operator's problem (e.g. invoked under a TTY-emulating
15
+ * wrapper). The auto path NEVER picks `'ink'` for a non-TTY.
16
+ */
17
+ const resolveMode = (input) => {
18
+ if (input.requested) return input.requested;
19
+ return input.stdoutIsTty ? "ink" : "plain";
20
+ };
21
+ /**
22
+ * Detect-from-process convenience for callers that don't need the
23
+ * pure `resolveMode` separation. Reads `process.stdout.isTTY` once.
24
+ */
25
+ const detectMode = (requested) => resolveMode({
26
+ requested,
27
+ stdoutIsTty: Boolean(process.stdout.isTTY)
28
+ });
29
+ //#endregion
30
+ export { detectMode, resolveMode };
31
+
32
+ //# sourceMappingURL=mode-detect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-detect.mjs","names":[],"sources":["../../../src/surfaces/tui/mode-detect.ts"],"sourcesContent":["// Renderer mode detection.\n//\n// Architecture §11 + distilled/21-tui §Renderers: three renderer\n// variants exist (ink dashboard, plain, silent). Selection rule:\n//\n// 1. Explicit `mode` argument wins (CLI flag or programmable\n// surface override).\n// 2. Otherwise, auto-resolve by inspecting `process.stdout.isTTY`\n// (TTY → ink; non-TTY → plain).\n// 3. `silent` is only selected when explicitly requested.\n//\n// NO_COLOR / FORCE_COLOR / TERM=dumb are handled by Ink/upstream —\n// we don't override here (architecture invariant: defer to upstream\n// color conventions).\n//\n// Pure module; the detection ITSELF doesn't run side effects — it\n// reads `process.stdout.isTTY` once at call time but the surface\n// machinery decides when to call it.\n\n/** Closed set of renderer modes. Adding a mode is an architecture\n * revision (see distilled/21-tui § Renderers). */\nexport type RendererMode = 'ink' | 'plain' | 'silent';\n\nexport interface ModeDetectInput {\n\t/** Explicit override from CLI flag / config / programmable\n\t * surface. `undefined` → auto-detect. */\n\treadonly requested?: RendererMode;\n\t/** Whether stdout is a TTY. Pass `process.stdout.isTTY` from the\n\t * caller; we keep this dependency-injectable for testability. */\n\treadonly stdoutIsTty: boolean;\n}\n\n/**\n * Resolve the active renderer mode.\n *\n * requested | stdoutIsTty | result\n * ---------------+-------------+--------\n * 'ink' | any | 'ink'\n * 'plain' | any | 'plain'\n * 'silent' | any | 'silent'\n * undefined | true | 'ink'\n * undefined | false | 'plain'\n *\n * Note: the `'ink'` explicit override on a non-TTY is allowed and is\n * the operator's problem (e.g. invoked under a TTY-emulating\n * wrapper). The auto path NEVER picks `'ink'` for a non-TTY.\n */\nexport const resolveMode = (input: ModeDetectInput): RendererMode => {\n\tif (input.requested) return input.requested;\n\treturn input.stdoutIsTty ? 'ink' : 'plain';\n};\n\n/**\n * Detect-from-process convenience for callers that don't need the\n * pure `resolveMode` separation. Reads `process.stdout.isTTY` once.\n */\nexport const detectMode = (requested?: RendererMode): RendererMode =>\n\tresolveMode({\n\t\trequested,\n\t\tstdoutIsTty: Boolean(process.stdout.isTTY),\n\t});\n"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAa,eAAe,UAAyC;AACpE,KAAI,MAAM,UAAW,QAAO,MAAM;AAClC,QAAO,MAAM,cAAc,QAAQ;;;;;;AAOpC,MAAa,cAAc,cAC1B,YAAY;CACX;CACA,aAAa,QAAQ,QAAQ,OAAO,MAAM;CAC1C,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { mountFailed } from "./errors.mjs";
2
+ import { App } from "./app.mjs";
3
+ import { Effect } from "effect";
4
+ import { render } from "ink";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/surfaces/tui/mount-ink.tsx
7
+ const INK_RENDER_OPTIONS = {
8
+ exitOnCtrlC: false,
9
+ patchConsole: true
10
+ };
11
+ const mountInkApp = (input) => Effect.gen(function* () {
12
+ const instance = yield* Effect.try({
13
+ try: () => render(/* @__PURE__ */ jsx(App, {
14
+ stateRef: input.stateRef,
15
+ events: input.events,
16
+ publish: input.publishCommand
17
+ }), INK_RENDER_OPTIONS),
18
+ catch: (cause) => mountFailed(cause instanceof Error ? cause.message : String(cause))
19
+ });
20
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
21
+ instance.unmount();
22
+ }));
23
+ yield* Effect.tryPromise({
24
+ try: () => instance.waitUntilExit(),
25
+ catch: (cause) => mountFailed(`ink waitUntilExit failed: ${cause instanceof Error ? cause.message : String(cause)}`)
26
+ });
27
+ });
28
+ //#endregion
29
+ export { INK_RENDER_OPTIONS, mountInkApp };
30
+
31
+ //# sourceMappingURL=mount-ink.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount-ink.mjs","names":[],"sources":["../../../src/surfaces/tui/mount-ink.tsx"],"sourcesContent":["// Ink mount helper.\n//\n// Owns the `<App/>` JSX expression so `index.ts` stays a plain `.ts`\n// file (no JSX). Lazy-imported from `index.ts` only when the `ink`\n// mode is selected, so CI / non-TTY callers don't pay the ink+react\n// import cost.\n//\n// The mount itself awaits `instance.waitUntilExit()` so the surface's\n// mount Effect remains open until the user exits the ink app or the\n// supervisor finalizes the scope.\n\nimport { Effect, Scope, Stream, SubscriptionRef } from 'effect';\nimport { render } from 'ink';\n\nimport type { EngineCommand, EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport { App } from './app.tsx';\nimport { mountFailed, type RendererError } from './errors.ts';\n\nexport interface MountInkAppInput {\n\treadonly stateRef: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\treadonly events: Stream.Stream<EngineEvent, never>;\n\treadonly publishCommand: (command: EngineCommand) => void;\n}\n\nexport const INK_RENDER_OPTIONS = {\n\texitOnCtrlC: false,\n\tpatchConsole: true,\n} as const;\n\nexport const mountInkApp = (\n\tinput: MountInkAppInput,\n): Effect.Effect<void, RendererError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst instance = yield* Effect.try({\n\t\t\ttry: () =>\n\t\t\t\trender(\n\t\t\t\t\t<App stateRef={input.stateRef} events={input.events} publish={input.publishCommand} />,\n\t\t\t\t\tINK_RENDER_OPTIONS,\n\t\t\t\t),\n\t\t\tcatch: (cause) => mountFailed(cause instanceof Error ? cause.message : String(cause)),\n\t\t});\n\n\t\tyield* Effect.addFinalizer(() =>\n\t\t\tEffect.sync(() => {\n\t\t\t\tinstance.unmount();\n\t\t\t}),\n\t\t);\n\n\t\tyield* Effect.tryPromise({\n\t\t\ttry: () => instance.waitUntilExit(),\n\t\t\tcatch: (cause) =>\n\t\t\t\tmountFailed(\n\t\t\t\t\t`ink waitUntilExit failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\t\t),\n\t\t});\n\t});\n"],"mappings":";;;;;;AAyBA,MAAa,qBAAqB;CACjC,aAAa;CACb,cAAc;CACd;AAED,MAAa,eACZ,UAEA,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,OAAO,IAAI;EAClC,WACC,OACC,oBAAC,KAAD;GAAK,UAAU,MAAM;GAAU,QAAQ,MAAM;GAAQ,SAAS,MAAM;GAAkB,CAAA,EACtF,mBACA;EACF,QAAQ,UAAU,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;EACrF,CAAC;AAEF,QAAO,OAAO,mBACb,OAAO,WAAW;AACjB,WAAS,SAAS;GACjB,CACF;AAED,QAAO,OAAO,WAAW;EACxB,WAAW,SAAS,eAAe;EACnC,QAAQ,UACP,YACC,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACnF;EACF,CAAC;EACD"}
@@ -0,0 +1,170 @@
1
+ import { mountFailed } from "./errors.mjs";
2
+ import { accountLine, endpointLine, labelForRow, packageLine, roleLabel, statusLabel } from "./display-derivation.mjs";
3
+ import { Effect, Stream, SubscriptionRef } from "effect";
4
+ //#region src/surfaces/tui/plain-renderer.ts
5
+ /**
6
+ * Plain-renderer line shape (each call returns exactly one line, no
7
+ * trailing newline).
8
+ *
9
+ * <iso-timestamp> <level> <event-tag> <key>=<value> ...
10
+ *
11
+ * Example:
12
+ * 2026-05-19T20:11:32.001Z INFO lifecycle.statusChanged key=sui from=starting to=ready
13
+ * 2026-05-19T20:11:32.500Z WARN log.appended key=walrus line="failed to bind port 9000"
14
+ * 2026-05-19T20:11:33.000Z INFO endpoint.registered name=aggregator url=http://localhost:9000
15
+ */
16
+ const formatEventLine = (event) => {
17
+ const ts = isoTimestamp(eventAt(event));
18
+ const level = levelForEvent(event);
19
+ const payload = payloadFor(event);
20
+ return `${ts} ${level} ${event.tag} ${payload}`;
21
+ };
22
+ /**
23
+ * Build a plain renderer satisfying the `Renderer` contract.
24
+ *
25
+ * Mount subscribes to the live event stream, writes one line per
26
+ * event to stderr. The state-ref is sampled for the initial sweep
27
+ * (one line per declared row) so a renderer attached after boot
28
+ * still sees a coherent baseline.
29
+ */
30
+ const makePlainRenderer = () => ({
31
+ mount: (stateRef, events) => Effect.gen(function* () {
32
+ yield* emitInitialSweep(yield* SubscriptionRef.get(stateRef));
33
+ yield* events.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));
34
+ }).pipe(Effect.catch((cause) => Effect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))))),
35
+ flush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed("flush"))))
36
+ });
37
+ const isoTimestamp = (at) => new Date(at || Date.now()).toISOString();
38
+ const eventAt = (event) => {
39
+ if ("at" in event && typeof event.at === "number") return event.at;
40
+ switch (event.tag) {
41
+ case "endpoint.registered": return event.endpoint.registeredAt;
42
+ case "error.reported": return event.error.at;
43
+ case "build.statusChanged": return event.entry.startedAt;
44
+ default: return Date.now();
45
+ }
46
+ };
47
+ const levelForEvent = (event) => {
48
+ switch (event.tag) {
49
+ case "log.appended": return event.level === "error" ? "ERROR" : event.level === "warn" ? "WARN" : "INFO";
50
+ case "error.reported": return event.error.severity === "fatal" || event.error.severity === "error" ? "ERROR" : "WARN";
51
+ default: return "INFO";
52
+ }
53
+ };
54
+ const payloadFor = (event) => {
55
+ switch (event.tag) {
56
+ case "lifecycle.statusChanged": return kv({
57
+ key: event.pluginKey,
58
+ from: statusLabel(event.from),
59
+ to: statusLabel(event.to)
60
+ });
61
+ case "lifecycle.phaseSet": return kv({
62
+ key: event.pluginKey,
63
+ phase: event.phase ?? ""
64
+ });
65
+ case "log.appended": return kv({
66
+ key: event.pluginKey,
67
+ line: event.line
68
+ });
69
+ case "endpoint.registered": return kv({
70
+ key: event.endpoint.endpointKey,
71
+ name: event.endpoint.name,
72
+ displayUrl: event.endpoint.displayUrl ?? event.endpoint.url,
73
+ url: event.endpoint.url,
74
+ wire: event.endpoint.wireProtocol
75
+ });
76
+ case "account.updated": return kv({
77
+ key: event.account.key,
78
+ row: event.account.rowKey ?? "",
79
+ name: event.account.name,
80
+ address: event.account.address ?? "",
81
+ scheme: event.account.scheme ?? "",
82
+ source: event.account.source ?? "",
83
+ funding: event.account.funding.status,
84
+ fundingEntries: (event.account.funding.entries ?? []).map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`).join(","),
85
+ requestedMist: event.account.funding.requestedMist ?? "",
86
+ balanceMist: event.account.funding.balanceMist ?? ""
87
+ });
88
+ case "package.updated": return kv({
89
+ key: event.package.key,
90
+ row: event.package.rowKey ?? "",
91
+ name: event.package.name,
92
+ kind: event.package.kind,
93
+ packageId: event.package.packageId,
94
+ upgradeCapId: event.package.upgradeCapId ?? "",
95
+ mvr: event.package.mvrPlaceholder
96
+ });
97
+ case "endpoint.released": return kv({ key: event.endpointKey });
98
+ case "strategy.registered": return kv({
99
+ capability: event.capabilityKey,
100
+ autoMounted: event.autoMounted
101
+ });
102
+ case "strategy.unregistered": return kv({ capability: event.capabilityKey });
103
+ case "manifest.flushed": return kv({ version: event.manifestVersion });
104
+ case "codegen.emitted": return kv({ files: event.files.length });
105
+ case "error.reported": return kv({
106
+ key: event.error.pluginKey ?? "",
107
+ tag: event.error.tag,
108
+ summary: event.error.summary,
109
+ cause: event.error.chain.join(" | "),
110
+ severity: event.error.severity
111
+ });
112
+ case "build.statusChanged": return kv({
113
+ key: event.entry.pluginKey ?? "",
114
+ phase: event.entry.phase,
115
+ progress: event.entry.progress
116
+ });
117
+ case "restart.requested":
118
+ case "restart.completed": return kv({ target: event.target === "stack" ? "stack" : event.target.pluginKey });
119
+ case "shutdown.escalated": return kv({
120
+ mode: "hard-kill",
121
+ signal: event.signal,
122
+ exitCode: event.exitCode
123
+ });
124
+ case "snapshot.captureStarted": return kv({
125
+ snapshotId: event.snapshotId,
126
+ name: event.name
127
+ });
128
+ case "snapshot.captureProgress": return kv({
129
+ snapshotId: event.snapshotId,
130
+ name: event.name,
131
+ phase: event.phase,
132
+ detail: event.detail,
133
+ paused: event.pausedContainers,
134
+ total: event.totalContainers
135
+ });
136
+ case "snapshot.captureSkipped": return kv({ reason: event.reason });
137
+ case "snapshot.captureFailed": return kv({
138
+ snapshotId: event.snapshotId,
139
+ name: event.name,
140
+ summary: event.summary
141
+ });
142
+ case "snapshot.captured":
143
+ case "snapshot.restored": return kv({ snapshotId: event.snapshotId });
144
+ default: return "";
145
+ }
146
+ };
147
+ const kv = (record) => Object.entries(record).filter(([, v]) => v !== "" && v !== null && v !== void 0).map(([k, v]) => `${k}=${quoteIfNeeded(String(v))}`).join(" ");
148
+ const quoteIfNeeded = (s) => /[\s"]/.test(s) ? quote(s) : s;
149
+ const quote = (s) => `"${s.replace(/"/g, "\\\"")}"`;
150
+ const emitInitialSweep = (state) => Effect.gen(function* () {
151
+ 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}`);
152
+ for (const row of state.rows) yield* writeStderrLine(`${isoTimestamp(Date.now())} INFO row.declared ${kv({
153
+ key: row.key,
154
+ label: labelForRow(row.key),
155
+ role: roleLabel(row.role),
156
+ status: statusLabel(row.status)
157
+ })}`);
158
+ for (const endpoint of state.endpoints) yield* writeStderrLine(`${isoTimestamp(endpoint.registeredAt)} INFO endpoint.registered ${endpointLine(endpoint)}`);
159
+ for (const account of state.accounts) yield* writeStderrLine(`${isoTimestamp(account.updatedAt)} INFO account.updated ${accountLine(account)}`);
160
+ for (const pkg of state.packages) yield* writeStderrLine(`${isoTimestamp(pkg.updatedAt)} INFO package.updated ${packageLine(pkg)}`);
161
+ });
162
+ const writeStderrLine = (line) => Effect.sync(() => {
163
+ try {
164
+ process.stderr.write(`${line}\n`);
165
+ } catch (err) {}
166
+ });
167
+ //#endregion
168
+ export { formatEventLine, makePlainRenderer };
169
+
170
+ //# sourceMappingURL=plain-renderer.mjs.map
@@ -0,0 +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, 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\taccountLine,\n\tendpointLine,\n\tlabelForRow,\n\tnarrationFor,\n\tpackageLine,\n\troleLabel,\n\tstatusLabel,\n} from './display-derivation.ts';\nimport { mountFailed } from './errors.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 eventAt = (event: EngineEvent): number => {\n\tif ('at' in event && typeof event.at === 'number') return event.at;\n\tswitch (event.tag) {\n\t\tcase 'endpoint.registered':\n\t\t\treturn event.endpoint.registeredAt;\n\t\tcase 'error.reported':\n\t\t\treturn event.error.at;\n\t\tcase 'build.statusChanged':\n\t\t\treturn event.entry.startedAt;\n\t\tdefault:\n\t\t\treturn Date.now();\n\t}\n};\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\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 'account.updated':\n\t\t\treturn kv({\n\t\t\t\tkey: event.account.key,\n\t\t\t\trow: event.account.rowKey ?? '',\n\t\t\t\tname: event.account.name,\n\t\t\t\taddress: event.account.address ?? '',\n\t\t\t\tscheme: event.account.scheme ?? '',\n\t\t\t\tsource: event.account.source ?? '',\n\t\t\t\tfunding: event.account.funding.status,\n\t\t\t\tfundingEntries: (event.account.funding.entries ?? [])\n\t\t\t\t\t.map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`)\n\t\t\t\t\t.join(','),\n\t\t\t\trequestedMist: event.account.funding.requestedMist ?? '',\n\t\t\t\tbalanceMist: event.account.funding.balanceMist ?? '',\n\t\t\t});\n\t\tcase 'package.updated':\n\t\t\treturn kv({\n\t\t\t\tkey: event.package.key,\n\t\t\t\trow: event.package.rowKey ?? '',\n\t\t\t\tname: event.package.name,\n\t\t\t\tkind: event.package.kind,\n\t\t\t\tpackageId: event.package.packageId,\n\t\t\t\tupgradeCapId: event.package.upgradeCapId ?? '',\n\t\t\t\tmvr: event.package.mvrPlaceholder,\n\t\t\t});\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 '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\nconst quoteIfNeeded = (s: string): string => (/[\\s\"]/.test(s) ? quote(s) : s);\n\nconst quote = (s: string): string => `\"${s.replace(/\"/g, '\\\\\"')}\"`;\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 account.updated ${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 package.updated ${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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"}