okengine 0.2.5 → 0.2.8

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 (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +46 -38
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -6,10 +6,7 @@
6
6
  import { durableLine } from "./durable.ts";
7
7
  import { SIGNALS_FIXTURE } from "./fixture.ts";
8
8
  import { groupByPhysics } from "./group.ts";
9
- import {
10
- fieldsFromSchema,
11
- payloadToFormValues,
12
- } from "./schema-form.ts";
9
+ import { fieldsFromSchema, payloadToFormValues } from "./schema-form.ts";
13
10
 
14
11
  /** Props for {@link SignalsA11yView}. */
15
12
  export interface SignalsA11yViewProps {
@@ -49,10 +46,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
49
46
  <section aria-label="Signal list">
50
47
  <h2>Signals</h2>
51
48
  {groups.map((group) => (
52
- <section
53
- key={group.delivery}
54
- aria-label={group.label}
55
- >
49
+ <section key={group.delivery} aria-label={group.label}>
56
50
  <h3>{group.label}</h3>
57
51
  <ul>
58
52
  {group.signals.map((s) => (
@@ -63,12 +57,8 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
63
57
  style={{ minHeight: 32, width: "100%" }}
64
58
  >
65
59
  <span>{s.name}</span>
66
- {s.orphaned ? (
67
- <span role="status"> orphaned</span>
68
- ) : null}
69
- {s.dead > 0 ? (
70
- <span role="status"> DLQ {s.dead}</span>
71
- ) : null}
60
+ {s.orphaned ? <span role="status"> orphaned</span> : null}
61
+ {s.dead > 0 ? <span role="status"> DLQ {s.dead}</span> : null}
72
62
  {s.outboxLagMs !== null && s.outboxLagMs > 0 ? (
73
63
  <span> outbox {s.outboxLagMs}ms</span>
74
64
  ) : null}
@@ -168,9 +158,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
168
158
  {open.dead > 0 ? (
169
159
  <section aria-label="Dead letters">
170
160
  <h3>Dead letters</h3>
171
- <p>
172
- Bulk repair: dry run first, then replay at a controlled rate.
173
- </p>
161
+ <p>Bulk repair: dry run first, then replay at a controlled rate.</p>
174
162
  <label>
175
163
  Replay rate (per second)
176
164
  <input
@@ -190,11 +178,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
190
178
  <ul>
191
179
  {open.deadLetters.map((d) => (
192
180
  <li key={d.id}>
193
- <button
194
- type="button"
195
- aria-pressed={d.id === dlqId}
196
- style={{ minHeight: 32 }}
197
- >
181
+ <button type="button" aria-pressed={d.id === dlqId} style={{ minHeight: 32 }}>
198
182
  {d.id} · {d.failures[d.failures.length - 1]?.code}
199
183
  </button>
200
184
  </li>
@@ -213,10 +197,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
213
197
  <label key={f.key}>
214
198
  {f.key}
215
199
  {f.enumValues ? (
216
- <select
217
- aria-label={f.key}
218
- defaultValue={formValues[f.key] ?? ""}
219
- >
200
+ <select aria-label={f.key} defaultValue={formValues[f.key] ?? ""}>
220
201
  {f.enumValues.map((v) => (
221
202
  <option key={v} value={v}>
222
203
  {v}
@@ -224,10 +205,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
224
205
  ))}
225
206
  </select>
226
207
  ) : (
227
- <input
228
- aria-label={f.key}
229
- defaultValue={formValues[f.key] ?? ""}
230
- />
208
+ <input aria-label={f.key} defaultValue={formValues[f.key] ?? ""} />
231
209
  )}
232
210
  </label>
233
211
  ))
@@ -253,9 +231,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
253
231
  {dlq.causeRunId ? (
254
232
  <p>
255
233
  Causal chain:{" "}
256
- <a
257
- href={`/traces?trace=${encodeURIComponent(dlq.causeRunId)}`}
258
- >
234
+ <a href={`/traces?trace=${encodeURIComponent(dlq.causeRunId)}`}>
259
235
  {dlq.causeFlow ?? dlq.causeRunId}
260
236
  </a>
261
237
  </p>
@@ -16,8 +16,7 @@ describe("Signals panel accessibility", () => {
16
16
  let container: HTMLElement;
17
17
 
18
18
  beforeEach(() => {
19
- (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
- true;
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
21
20
  window = new Window({ url: "http://console.test/signals" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -70,9 +69,7 @@ describe("Signals panel accessibility", () => {
70
69
 
71
70
  test("axe reports zero violations at WCAG 2.2 AA", async () => {
72
71
  await act(async () => {
73
- root.render(
74
- <SignalsA11yView openSignal="order-placed" openDlq="dlq-1" />,
75
- );
72
+ root.render(<SignalsA11yView openSignal="order-placed" openDlq="dlq-1" />);
76
73
  });
77
74
 
78
75
  await new Promise((r) => setTimeout(r, 10));
@@ -1,9 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import {
3
- discardConfirmation,
4
- replayConfirmation,
5
- validateTypedConfirm,
6
- } from "./confirmation.ts";
2
+ import { discardConfirmation, replayConfirmation, validateTypedConfirm } from "./confirmation.ts";
7
3
  import { SIGNALS_FIXTURE } from "./fixture.ts";
8
4
 
9
5
  describe("signal confirmation", () => {
@@ -5,10 +5,7 @@
5
5
  * - Replay that re-triggers an external effect → typed confirmation + reason.
6
6
  */
7
7
 
8
- import {
9
- UNDO_WINDOW_MS,
10
- type ConfirmationPattern,
11
- } from "../flows/confirmation.ts";
8
+ import { UNDO_WINDOW_MS, type ConfirmationPattern } from "../flows/confirmation.ts";
12
9
  import type { SignalRecord } from "./types.ts";
13
10
 
14
11
  export { UNDO_WINDOW_MS, validateTypedConfirm } from "../flows/confirmation.ts";
@@ -50,8 +47,7 @@ export function discardConfirmation(
50
47
  ): ConfirmationPattern {
51
48
  const irreversible =
52
49
  options.production &&
53
- (signal.consumers.some((c) => c.external || !c.durable) ||
54
- signal.dead > 0);
50
+ (signal.consumers.some((c) => c.external || !c.durable) || signal.dead > 0);
55
51
  if (irreversible) {
56
52
  return {
57
53
  kind: "typed",
@@ -8,9 +8,7 @@
8
8
  import type { SignalRecord } from "./types.ts";
9
9
 
10
10
  /** Whether the panel may offer dry-run for this signal. */
11
- export type DryRunOffer =
12
- | { readonly ok: true }
13
- | { readonly ok: false; readonly reason: string };
11
+ export type DryRunOffer = { readonly ok: true } | { readonly ok: false; readonly reason: string };
14
12
 
15
13
  /**
16
14
  * Decide whether dry-run is offered — same refusal spirit as Traces.
@@ -17,9 +17,7 @@ export interface DurableLine {
17
17
  *
18
18
  * @param consumersDurable - From Manifest (`flow.durable` on every consumer)
19
19
  */
20
- export function durableLine(
21
- consumersDurable: boolean | null,
22
- ): DurableLine {
20
+ export function durableLine(consumersDurable: boolean | null): DurableLine {
23
21
  if (consumersDurable === true) {
24
22
  return {
25
23
  durable: true,
@@ -19,9 +19,7 @@ export interface DeadLetterFinding {
19
19
  *
20
20
  * @param signals - Signals panel rows
21
21
  */
22
- export function deadLetterFindings(
23
- signals: readonly SignalRecord[],
24
- ): readonly DeadLetterFinding[] {
22
+ export function deadLetterFindings(signals: readonly SignalRecord[]): readonly DeadLetterFinding[] {
25
23
  return signals
26
24
  .filter((s) => s.dead > 0)
27
25
  .map((s) => ({
@@ -5,11 +5,7 @@ import { groupByPhysics } from "./group.ts";
5
5
  describe("groupByPhysics", () => {
6
6
  test("one list grouped by delivery — not three tabs", () => {
7
7
  const groups = groupByPhysics(SIGNALS_FIXTURE);
8
- expect(groups.map((g) => g.delivery)).toEqual([
9
- "once",
10
- "broadcast",
11
- "live",
12
- ]);
8
+ expect(groups.map((g) => g.delivery)).toEqual(["once", "broadcast", "live"]);
13
9
  expect(groups.find((g) => g.delivery === "once")?.signals.length).toBe(2);
14
10
  expect(groups.find((g) => g.delivery === "broadcast")?.signals[0]?.name).toBe(
15
11
  "inventory-changed",
@@ -19,9 +15,7 @@ describe("groupByPhysics", () => {
19
15
  test("retains orphaned signals in the list", () => {
20
16
  const groups = groupByPhysics(SIGNALS_FIXTURE);
21
17
  const once = groups.find((g) => g.delivery === "once");
22
- expect(once?.signals.some((s) => s.name === "legacy-shipped" && s.orphaned)).toBe(
23
- true,
24
- );
18
+ expect(once?.signals.some((s) => s.name === "legacy-shipped" && s.orphaned)).toBe(true);
25
19
  });
26
20
 
27
21
  test("free-text filter dims across name and endpoints", () => {
@@ -2,17 +2,9 @@
2
2
  * Group signals by delivery physics — one list, not three tabs (console §9.4).
3
3
  */
4
4
 
5
- import type {
6
- SignalDelivery,
7
- SignalPhysicsGroup,
8
- SignalRecord,
9
- } from "./types.ts";
5
+ import type { SignalDelivery, SignalPhysicsGroup, SignalRecord } from "./types.ts";
10
6
 
11
- const PHYSICS_ORDER: readonly SignalDelivery[] = [
12
- "once",
13
- "broadcast",
14
- "live",
15
- ];
7
+ const PHYSICS_ORDER: readonly SignalDelivery[] = ["once", "broadcast", "live"];
16
8
 
17
9
  const LABELS: Record<SignalDelivery, string> = {
18
10
  once: "Once — competing consumers",
@@ -46,7 +46,4 @@ export {
46
46
  } from "./monitor.ts";
47
47
  export { SIGNALS_FIXTURE } from "./fixture.ts";
48
48
  export { dryRunOffer, type DryRunOffer } from "./dry-run.ts";
49
- export {
50
- deadLetterFindings,
51
- type DeadLetterFinding,
52
- } from "./findings.ts";
49
+ export { deadLetterFindings, type DeadLetterFinding } from "./findings.ts";
@@ -33,10 +33,7 @@ export function appendLivePayload(
33
33
  * @param state - Current
34
34
  * @param paused - Desired
35
35
  */
36
- export function setPaused(
37
- state: LiveMonitorState,
38
- paused: boolean,
39
- ): LiveMonitorState {
36
+ export function setPaused(state: LiveMonitorState, paused: boolean): LiveMonitorState {
40
37
  return {
41
38
  ...state,
42
39
  paused,
@@ -68,9 +65,7 @@ export function exportLivePayloads(payloads: readonly unknown[]): string {
68
65
  *
69
66
  * @param seed - Optional initial payloads
70
67
  */
71
- export function createLiveMonitor(
72
- seed: readonly unknown[] = [],
73
- ): LiveMonitorState {
68
+ export function createLiveMonitor(seed: readonly unknown[] = []): LiveMonitorState {
74
69
  return {
75
70
  paused: false,
76
71
  autoPausedByScroll: false,
@@ -1,24 +1,13 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import {
3
- fieldsFromSchema,
4
- formValuesToPayload,
5
- payloadToFormValues,
6
- } from "./schema-form.ts";
2
+ import { fieldsFromSchema, formValuesToPayload, payloadToFormValues } from "./schema-form.ts";
7
3
  import { SIGNALS_FIXTURE } from "./fixture.ts";
8
4
 
9
5
  describe("schema-form", () => {
10
6
  test("builds editable fields from declared schema", () => {
11
7
  const order = SIGNALS_FIXTURE.find((s) => s.name === "order-placed")!;
12
8
  const fields = fieldsFromSchema(order.schema);
13
- expect(fields.map((f) => f.key)).toEqual([
14
- "orderId",
15
- "amount",
16
- "currency",
17
- ]);
18
- expect(fields.find((f) => f.key === "currency")?.enumValues).toEqual([
19
- "USD",
20
- "EUR",
21
- ]);
9
+ expect(fields.map((f) => f.key)).toEqual(["orderId", "amount", "currency"]);
10
+ expect(fields.find((f) => f.key === "currency")?.enumValues).toEqual(["USD", "EUR"]);
22
11
  });
23
12
 
24
13
  test("round-trips payload through form values", () => {
@@ -39,10 +39,7 @@ export function fieldsFromSchema(schema: unknown): readonly SchemaField[] {
39
39
  ? d.enum.filter((v): v is string => typeof v === "string")
40
40
  : undefined;
41
41
  const type =
42
- d.type === "string" ||
43
- d.type === "number" ||
44
- d.type === "boolean" ||
45
- d.type === "integer"
42
+ d.type === "string" || d.type === "number" || d.type === "boolean" || d.type === "integer"
46
43
  ? d.type
47
44
  : "unknown";
48
45
  return {
@@ -16,9 +16,7 @@ export const SignalsSearchSchema = z.object({
16
16
  paused: z
17
17
  .union([z.boolean(), z.literal("true"), z.literal("false")])
18
18
  .optional()
19
- .transform((v) =>
20
- v === undefined ? undefined : v === true || v === "true",
21
- ),
19
+ .transform((v) => (v === undefined ? undefined : v === true || v === "true")),
22
20
  /** Bulk repair rate (messages/sec). */
23
21
  rate: z.coerce.number().min(1).max(1_000).optional(),
24
22
  /** Broadcast subscriber target for replay. */
@@ -33,9 +31,7 @@ export type SignalsSearch = z.infer<typeof SignalsSearchSchema>;
33
31
  *
34
32
  * @param search - Raw router search
35
33
  */
36
- export function parseSignalsSearch(
37
- search: Record<string, unknown>,
38
- ): SignalsSearch {
34
+ export function parseSignalsSearch(search: Record<string, unknown>): SignalsSearch {
39
35
  const parsed = SignalsSearchSchema.safeParse(search);
40
36
  return parsed.success ? parsed.data : {};
41
37
  }
@@ -45,9 +41,7 @@ export function parseSignalsSearch(
45
41
  *
46
42
  * @param search - Current state
47
43
  */
48
- export function serializeSignalsSearch(
49
- search: SignalsSearch,
50
- ): Record<string, unknown> {
44
+ export function serializeSignalsSearch(search: SignalsSearch): Record<string, unknown> {
51
45
  const out: Record<string, unknown> = {};
52
46
  if (search.q) out.q = search.q;
53
47
  if (search.signal) out.signal = search.signal;
@@ -84,10 +78,7 @@ export function closeSignal(search: SignalsSearch): SignalsSearch {
84
78
  * @param search - Current
85
79
  * @param id - Message id
86
80
  */
87
- export function openDeadLetter(
88
- search: SignalsSearch,
89
- id: string,
90
- ): SignalsSearch {
81
+ export function openDeadLetter(search: SignalsSearch, id: string): SignalsSearch {
91
82
  return { ...search, dlq: id };
92
83
  }
93
84
 
@@ -23,8 +23,7 @@ export interface StoreA11yViewProps {
23
23
  * @param props - Open store / child
24
24
  */
25
25
  export function StoreA11yView(props: StoreA11yViewProps) {
26
- const tenancy =
27
- props.tenancyDeclared ?? STORE_LIST_FIXTURE.tenancyDeclared;
26
+ const tenancy = props.tenancyDeclared ?? STORE_LIST_FIXTURE.tenancyDeclared;
28
27
  const groups = groupByFacet(STORE_LIST_FIXTURE.stores);
29
28
  const openRef = props.openRef ?? "sql:db";
30
29
  const open = STORE_LIST_FIXTURE.stores.find((s) => s.ref === openRef);
@@ -74,14 +73,9 @@ export function StoreA11yView(props: StoreA11yViewProps) {
74
73
  {s.replicaLagMs != null && s.replicaLagMs > 0 ? (
75
74
  <span role="status"> lag {s.replicaLagMs}ms</span>
76
75
  ) : null}
77
- {s.migrationDrift?.drifted ? (
78
- <span role="status"> drift</span>
79
- ) : null}
76
+ {s.migrationDrift?.drifted ? <span role="status"> drift</span> : null}
80
77
  {s.warnings.length > 0 ? (
81
- <span role="status">
82
- {" "}
83
- {s.warnings.length} warning(s)
84
- </span>
78
+ <span role="status"> {s.warnings.length} warning(s)</span>
85
79
  ) : null}
86
80
  </button>
87
81
  </li>
@@ -16,8 +16,7 @@ describe("Store panel accessibility", () => {
16
16
  let container: HTMLElement;
17
17
 
18
18
  beforeEach(() => {
19
- (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
- true;
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
21
20
  window = new Window({ url: "http://console.test/store" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -70,9 +69,7 @@ describe("Store panel accessibility", () => {
70
69
 
71
70
  test("axe reports zero violations at WCAG 2.2 AA", async () => {
72
71
  await act(async () => {
73
- root.render(
74
- <StoreA11yView openRef="sql:db" openChild="bookings" />,
75
- );
72
+ root.render(<StoreA11yView openRef="sql:db" openChild="bookings" />);
76
73
  });
77
74
 
78
75
  await new Promise((r) => setTimeout(r, 10));
@@ -31,8 +31,6 @@ describe("store confirmation", () => {
31
31
  phrase: "EDIT",
32
32
  }),
33
33
  ).toBeNull();
34
- expect(
35
- validateTypedConfirm({ typed: "x", reason: "ab", phrase: "EDIT" }),
36
- ).not.toBeNull();
34
+ expect(validateTypedConfirm({ typed: "x", reason: "ab", phrase: "EDIT" })).not.toBeNull();
37
35
  });
38
36
  });
@@ -4,10 +4,7 @@
4
4
  * Direct edit / delete / purge are irreversible in production — typed confirm.
5
5
  */
6
6
 
7
- import {
8
- UNDO_WINDOW_MS,
9
- type ConfirmationPattern,
10
- } from "../flows/confirmation.ts";
7
+ import { UNDO_WINDOW_MS, type ConfirmationPattern } from "../flows/confirmation.ts";
11
8
 
12
9
  export { UNDO_WINDOW_MS, validateTypedConfirm } from "../flows/confirmation.ts";
13
10
  export type { ConfirmationPattern } from "../flows/confirmation.ts";
@@ -8,9 +8,7 @@
8
8
  import type { StoreRecord } from "./types.ts";
9
9
 
10
10
  /** Whether the panel may offer a mutation preview. */
11
- export type PreviewOffer =
12
- | { readonly ok: true }
13
- | { readonly ok: false; readonly reason: string };
11
+ export type PreviewOffer = { readonly ok: true } | { readonly ok: false; readonly reason: string };
14
12
 
15
13
  /**
16
14
  * Decide whether preview is offered for this store.
@@ -21,8 +19,7 @@ export function previewOffer(store: StoreRecord): PreviewOffer {
21
19
  if (store.facet === "index") {
22
20
  return {
23
21
  ok: false,
24
- reason:
25
- "Index facet has no bulk-update preview — similarity probe is read-only.",
22
+ reason: "Index facet has no bulk-update preview — similarity probe is read-only.",
26
23
  };
27
24
  }
28
25
  return { ok: true };
@@ -112,8 +112,7 @@ export const STORE_FIXTURE: readonly StoreRecord[] = [
112
112
  warnings: [
113
113
  {
114
114
  code: "non_ascii_key",
115
- message:
116
- "Non-ASCII object key — signed URL encoding may break on S3-compatible stores.",
115
+ message: "Non-ASCII object key — signed URL encoding may break on S3-compatible stores.",
117
116
  key: "фото/id.jpg",
118
117
  },
119
118
  ],
@@ -5,12 +5,7 @@ import { groupByFacet } from "./group.ts";
5
5
  describe("groupByFacet", () => {
6
6
  test("groups into sql / kv / files / index", () => {
7
7
  const groups = groupByFacet(STORE_FIXTURE);
8
- expect(groups.map((g) => g.facet)).toEqual([
9
- "sql",
10
- "kv",
11
- "files",
12
- "index",
13
- ]);
8
+ expect(groups.map((g) => g.facet)).toEqual(["sql", "kv", "files", "index"]);
14
9
  });
15
10
 
16
11
  test("filters by name", () => {
@@ -19,10 +19,7 @@ const FACET_LABELS: Record<StoreFacet, string> = {
19
19
  * @param stores - Projected rows
20
20
  * @param q - Optional filter
21
21
  */
22
- export function groupByFacet(
23
- stores: readonly StoreRecord[],
24
- q = "",
25
- ): readonly StoreFacetGroup[] {
22
+ export function groupByFacet(stores: readonly StoreRecord[], q = ""): readonly StoreFacetGroup[] {
26
23
  const needle = q.trim().toLowerCase();
27
24
  const filtered = needle
28
25
  ? stores.filter(
@@ -33,8 +33,4 @@ export {
33
33
  export { formatWillNotFire, type WillNotFireLines } from "./will-not-fire.ts";
34
34
  export { previewOffer, type PreviewOffer } from "./dry-run.ts";
35
35
  export { explainCache, type CacheExplanation } from "./cache-view.ts";
36
- export {
37
- STORE_FIXTURE,
38
- STORE_LIST_FIXTURE,
39
- STORE_LIST_NO_TENANCY,
40
- } from "./fixture.ts";
36
+ export { STORE_FIXTURE, STORE_LIST_FIXTURE, STORE_LIST_NO_TENANCY } from "./fixture.ts";
@@ -22,9 +22,7 @@ export type StoreSearch = z.infer<typeof StoreSearchSchema>;
22
22
  *
23
23
  * @param search - Raw router search
24
24
  */
25
- export function parseStoreSearch(
26
- search: Record<string, unknown>,
27
- ): StoreSearch {
25
+ export function parseStoreSearch(search: Record<string, unknown>): StoreSearch {
28
26
  const parsed = StoreSearchSchema.safeParse(search);
29
27
  return parsed.success ? parsed.data : {};
30
28
  }
@@ -34,9 +32,7 @@ export function parseStoreSearch(
34
32
  *
35
33
  * @param search - Search state
36
34
  */
37
- export function serializeStoreSearch(
38
- search: StoreSearch,
39
- ): Record<string, string> {
35
+ export function serializeStoreSearch(search: StoreSearch): Record<string, string> {
40
36
  const out: Record<string, string> = {};
41
37
  if (search.q) out.q = search.q;
42
38
  if (search.ref) out.ref = search.ref;
@@ -32,8 +32,7 @@ export function formatWillNotFire(willNotFire: WillNotFire): WillNotFireLines {
32
32
  );
33
33
  }
34
34
  return {
35
- headline:
36
- "Direct edit is not a flow execution — the following will NOT happen:",
35
+ headline: "Direct edit is not a flow execution — the following will NOT happen:",
37
36
  lines,
38
37
  empty: lines.length === 0,
39
38
  };
@@ -27,18 +27,10 @@ export function TracesA11yView(props: TracesA11yViewProps) {
27
27
  const roots = groupTraceRoots(TRACES_FIXTURE);
28
28
  const openRootId = props.openRootId ?? "run-create-ok";
29
29
  const open = roots.find((r) => r.rootId === openRootId);
30
- const focusId = open
31
- ? initialFocusSpanId(open.spans)
32
- : undefined;
33
- const chain = focusId
34
- ? buildCausalChain(TRACES_FIXTURE, focusId)
35
- : null;
36
- const critical = chain
37
- ? criticalPathSpanIds(chain.connected)
38
- : new Set<string>();
39
- const folded = chain
40
- ? foldTimeline(intervalsFromSpans(chain.connected), {}, critical)
41
- : null;
30
+ const focusId = open ? initialFocusSpanId(open.spans) : undefined;
31
+ const chain = focusId ? buildCausalChain(TRACES_FIXTURE, focusId) : null;
32
+ const critical = chain ? criticalPathSpanIds(chain.connected) : new Set<string>();
33
+ const folded = chain ? foldTimeline(intervalsFromSpans(chain.connected), {}, critical) : null;
42
34
  const decision = chain ? replayDecision(chain.connected) : null;
43
35
 
44
36
  return (
@@ -83,10 +75,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
83
75
  {err}
84
76
  </span>
85
77
  ) : null}
86
- <span aria-hidden="true">
87
- {" "}
88
- [{bars.length} bars]
89
- </span>
78
+ <span aria-hidden="true"> [{bars.length} bars]</span>
90
79
  </button>
91
80
  </li>
92
81
  );
@@ -135,10 +124,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
135
124
  {folded.segments.map((seg) => {
136
125
  if (seg.kind === "fold") {
137
126
  return (
138
- <li
139
- key={seg.id}
140
- style={{ flex: `${seg.displayMs} 0 0` }}
141
- >
127
+ <li key={seg.id} style={{ flex: `${seg.displayMs} 0 0` }}>
142
128
  <button
143
129
  type="button"
144
130
  aria-expanded={seg.expanded}
@@ -151,10 +137,8 @@ export function TracesA11yView(props: TracesA11yViewProps) {
151
137
  }
152
138
  const dim = !seg.critical;
153
139
  const external =
154
- peakSpanTier(
155
- chain.connected.find((s) => s.id === seg.spanId)
156
- ?.effects ?? [],
157
- ) === "external";
140
+ peakSpanTier(chain.connected.find((s) => s.id === seg.spanId)?.effects ?? []) ===
141
+ "external";
158
142
  return (
159
143
  <li
160
144
  key={seg.id}
@@ -162,8 +146,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
162
146
  minHeight: 32,
163
147
  flex: `${seg.displayMs} 0 0`,
164
148
  opacity: dim ? 0.38 : 1,
165
- background:
166
- seg.tier === "external" ? "#d97706" : "#3d9a6a",
149
+ background: seg.tier === "external" ? "#d97706" : "#3d9a6a",
167
150
  outline: seg.failed ? "2px solid #c44b4b" : undefined,
168
151
  }}
169
152
  >
@@ -180,9 +163,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
180
163
  <button
181
164
  type="button"
182
165
  style={{ minHeight: 32, minWidth: 24 }}
183
- title={
184
- decision?.mode === "dry-run" ? decision.reason : undefined
185
- }
166
+ title={decision?.mode === "dry-run" ? decision.reason : undefined}
186
167
  >
187
168
  {decision?.mode === "dry-run" ? "Dry-run replay" : "Replay"}
188
169
  </button>
@@ -16,8 +16,7 @@ describe("Traces panel accessibility", () => {
16
16
  let container: HTMLElement;
17
17
 
18
18
  beforeEach(() => {
19
- (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
- true;
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
21
20
  window = new Window({ url: "http://console.test/traces" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,