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
@@ -99,9 +99,7 @@ export function computeSloBurns(options: {
99
99
  readonly now: number;
100
100
  }): readonly SloBurn[] {
101
101
  const objectives = declaredSlos(options.manifest);
102
- return objectives.map((obj) =>
103
- burnForObjective(obj, options.runs, options.now),
104
- );
102
+ return objectives.map((obj) => burnForObjective(obj, options.runs, options.now));
105
103
  }
106
104
 
107
105
  /**
@@ -113,11 +111,7 @@ export function hasDeclaredSlos(manifest: Manifest | null): boolean {
113
111
  return declaredSlos(manifest).length > 0;
114
112
  }
115
113
 
116
- function burnForObjective(
117
- obj: DeclaredSlo,
118
- runs: readonly RunRecord[],
119
- now: number,
120
- ): SloBurn {
114
+ function burnForObjective(obj: DeclaredSlo, runs: readonly RunRecord[], now: number): SloBurn {
121
115
  const short = windowStats(runs, obj.flowIds, now - BURN_SHORT_WINDOW_MS, now);
122
116
  const long = windowStats(runs, obj.flowIds, now - BURN_LONG_WINDOW_MS, now);
123
117
  const currentErrorRate = short.errorRate;
@@ -130,8 +124,7 @@ function burnForObjective(
130
124
 
131
125
  const budget = long.total * obj.tolerableErrorRate;
132
126
  const remaining = Math.max(0, budget - long.errors);
133
- const remainingBudgetFraction =
134
- budget <= 0 ? (long.errors > 0 ? 0 : 1) : remaining / budget;
127
+ const remainingBudgetFraction = budget <= 0 ? (long.errors > 0 ? 0 : 1) : remaining / budget;
135
128
 
136
129
  const excessRate = currentErrorRate - obj.tolerableErrorRate;
137
130
  let timeToExhaustionMs: number | null = null;
@@ -143,14 +136,8 @@ function burnForObjective(
143
136
  }
144
137
  }
145
138
 
146
- const lastBurnAt = lastBurnTimestamp(
147
- runs,
148
- obj.flowIds,
149
- obj.tolerableErrorRate,
150
- now,
151
- );
152
- const ceremonial =
153
- lastBurnAt == null || now - lastBurnAt >= CEREMONIAL_LOOKBACK_MS;
139
+ const lastBurnAt = lastBurnTimestamp(runs, obj.flowIds, obj.tolerableErrorRate, now);
140
+ const ceremonial = lastBurnAt == null || now - lastBurnAt >= CEREMONIAL_LOOKBACK_MS;
154
141
 
155
142
  return {
156
143
  id: obj.id,
@@ -203,11 +190,7 @@ function lastBurnTimestamp(
203
190
  if (tolerable <= 0) return null;
204
191
  const start = now - CEREMONIAL_LOOKBACK_MS;
205
192
  let last: number | null = null;
206
- for (
207
- let bucketStart = start;
208
- bucketStart < now;
209
- bucketStart += BURN_HISTORY_BUCKET_MS
210
- ) {
193
+ for (let bucketStart = start; bucketStart < now; bucketStart += BURN_HISTORY_BUCKET_MS) {
211
194
  const bucketEnd = Math.min(now, bucketStart + BURN_HISTORY_BUCKET_MS);
212
195
  const stats = windowStats(runs, flowIds, bucketStart, bucketEnd);
213
196
  if (stats.total === 0) continue;
@@ -2,12 +2,7 @@
2
2
  * One-line plain-language Overview verdict (console §9.16).
3
3
  */
4
4
 
5
- import type {
6
- CostBudget,
7
- OverviewFinding,
8
- OverviewVerdict,
9
- SloBurn,
10
- } from "./types.ts";
5
+ import type { CostBudget, OverviewFinding, OverviewVerdict, SloBurn } from "./types.ts";
11
6
 
12
7
  /**
13
8
  * Build the top verdict from SLO burn, cost budgets, and ranked findings.
@@ -27,8 +22,7 @@ export function composeVerdict(options: {
27
22
  .sort(
28
23
  (a, b) =>
29
24
  b.burnRate - a.burnRate ||
30
- (a.timeToExhaustionMs ?? Infinity) -
31
- (b.timeToExhaustionMs ?? Infinity),
25
+ (a.timeToExhaustionMs ?? Infinity) - (b.timeToExhaustionMs ?? Infinity),
32
26
  );
33
27
 
34
28
  if (burning.length > 0) {
@@ -49,8 +43,7 @@ export function composeVerdict(options: {
49
43
  .sort(
50
44
  (a, b) =>
51
45
  b.burnRate - a.burnRate ||
52
- (a.timeToExhaustionMs ?? Infinity) -
53
- (b.timeToExhaustionMs ?? Infinity),
46
+ (a.timeToExhaustionMs ?? Infinity) - (b.timeToExhaustionMs ?? Infinity),
54
47
  );
55
48
  if (costBurning.length > 0) {
56
49
  const top = costBurning[0]!;
@@ -31,8 +31,8 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
31
31
  <header>
32
32
  <h1>Plugins</h1>
33
33
  <p>
34
- Origin × state — CORE stays listed when off; local/community only when
35
- plugged. Read-only; git review is the approval.
34
+ Origin × state — CORE stays listed when off; local/community only when plugged. Read-only;
35
+ git review is the approval.
36
36
  </p>
37
37
  <label>
38
38
  Filter plugins
@@ -134,9 +134,7 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
134
134
  {open.intercepts.map((i) => (
135
135
  <tr key={i.stage}>
136
136
  <th scope="row">{i.stage}</th>
137
- <td>
138
- {i.meanMs === null ? "—" : i.meanMs.toFixed(2)}
139
- </td>
137
+ <td>{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}</td>
140
138
  <td>{i.count}</td>
141
139
  </tr>
142
140
  ))}
@@ -145,8 +143,8 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
145
143
  )}
146
144
  {open.hookCost ? (
147
145
  <p role="status">
148
- p50 {open.hookCost.p50Ms.toFixed(2)} ms · p95{" "}
149
- {open.hookCost.p95Ms.toFixed(2)} ms · n={open.hookCost.count}
146
+ p50 {open.hookCost.p50Ms.toFixed(2)} ms · p95 {open.hookCost.p95Ms.toFixed(2)} ms ·
147
+ n={open.hookCost.count}
150
148
  </p>
151
149
  ) : null}
152
150
  </section>
@@ -189,9 +187,7 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
189
187
  <ul>
190
188
  {open.capabilityDiff.map((c) => (
191
189
  <li key={c.path}>
192
- <a href={`/manifest-diff?path=${encodeURIComponent(c.path)}`}>
193
- {c.summary}
194
- </a>
190
+ <a href={`/manifest-diff?path=${encodeURIComponent(c.path)}`}>{c.summary}</a>
195
191
  </li>
196
192
  ))}
197
193
  </ul>
@@ -208,16 +204,10 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
208
204
  <button type="button" style={{ minHeight: 32 }}>
209
205
  {copyCommandLabel(open)}
210
206
  </button>
211
- <p>
212
- The Console never installs. Git review is the approval — run
213
- this yourself.
214
- </p>
207
+ <p>The Console never installs. Git review is the approval — run this yourself.</p>
215
208
  </>
216
209
  ) : (
217
- <p>
218
- No install command — toggle off by removing the code line, not
219
- from this UI.
220
- </p>
210
+ <p>No install command — toggle off by removing the code line, not from this UI.</p>
221
211
  )}
222
212
  </section>
223
213
  </section>
@@ -16,8 +16,7 @@ describe("Plugins 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/plugins" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -192,13 +192,11 @@ export const PLUGINS_LIST_FIXTURE: PluginsListResponse = {
192
192
  state: "not-applicable",
193
193
  publishedAt: null,
194
194
  holdUntil: null,
195
- detail:
196
- "Release cooldown applies to community registry packages only (local)",
195
+ detail: "Release cooldown applies to community registry packages only (local)",
197
196
  },
198
197
  npmProvenance: {
199
198
  state: "not-applicable",
200
- detail:
201
- "npm provenance applies to community registry packages only (local)",
199
+ detail: "npm provenance applies to community registry packages only (local)",
202
200
  },
203
201
  },
204
202
  capabilityDiff: [
@@ -16,9 +16,7 @@ describe("groupPlugins", () => {
16
16
  expect(ids).toContain("rate-limit");
17
17
  expect(ids).toContain("tenancy");
18
18
  expect(ids).toContain("privacy");
19
- expect(core!.items.some((p) => p.id === "rate-limit" && p.state === "off")).toBe(
20
- true,
21
- );
19
+ expect(core!.items.some((p) => p.id === "rate-limit" && p.state === "off")).toBe(true);
22
20
 
23
21
  const local = groups.find((g) => g.id === "local");
24
22
  expect(local?.items.map((p) => p.id)).toEqual(["audit"]);
@@ -3,12 +3,7 @@
3
3
  */
4
4
 
5
5
  import type { PluginsSearch } from "./search.ts";
6
- import type {
7
- PluginOrigin,
8
- PluginRecord,
9
- PluginState,
10
- PluginsListGroup,
11
- } from "./types.ts";
6
+ import type { PluginOrigin, PluginRecord, PluginState, PluginsListGroup } from "./types.ts";
12
7
 
13
8
  const ORIGIN_LABEL: Record<PluginOrigin, string> = {
14
9
  core: "Core",
@@ -2,14 +2,8 @@
2
2
  * Plugins panel pure modules (console §9.15).
3
3
  */
4
4
 
5
- export {
6
- pluginCapabilityFindings,
7
- type PluginCapabilityFinding,
8
- } from "./findings.ts";
9
- export {
10
- copyCommandLabel,
11
- copyableCommand,
12
- } from "./command.ts";
5
+ export { pluginCapabilityFindings, type PluginCapabilityFinding } from "./findings.ts";
6
+ export { copyCommandLabel, copyableCommand } from "./command.ts";
13
7
  export { groupPlugins } from "./group.ts";
14
8
  export {
15
9
  openPlugin,
@@ -17,11 +11,7 @@ export {
17
11
  serializePluginsSearch,
18
12
  type PluginsSearch,
19
13
  } from "./search.ts";
20
- export {
21
- PLUGINS_LIST_FIXTURE,
22
- SUPPLY_CHAIN_COMMUNITY,
23
- SUPPLY_CHAIN_CORE_NA,
24
- } from "./fixture.ts";
14
+ export { PLUGINS_LIST_FIXTURE, SUPPLY_CHAIN_COMMUNITY, SUPPLY_CHAIN_CORE_NA } from "./fixture.ts";
25
15
  export type {
26
16
  BootConflictSignal,
27
17
  LifecycleScriptsSignal,
@@ -17,19 +17,12 @@ export interface PluginsSearch {
17
17
  *
18
18
  * @param search - Raw search
19
19
  */
20
- export function parsePluginsSearch(
21
- search: Record<string, unknown>,
22
- ): PluginsSearch {
23
- const q = typeof search.q === "string" && search.q.length > 0
24
- ? search.q
25
- : undefined;
20
+ export function parsePluginsSearch(search: Record<string, unknown>): PluginsSearch {
21
+ const q = typeof search.q === "string" && search.q.length > 0 ? search.q : undefined;
26
22
  const origin = isOrigin(search.origin) ? search.origin : undefined;
27
- const state = search.state === "on" || search.state === "off"
28
- ? search.state
29
- : undefined;
30
- const plugin = typeof search.plugin === "string" && search.plugin.length > 0
31
- ? search.plugin
32
- : undefined;
23
+ const state = search.state === "on" || search.state === "off" ? search.state : undefined;
24
+ const plugin =
25
+ typeof search.plugin === "string" && search.plugin.length > 0 ? search.plugin : undefined;
33
26
  return { q, origin, state, plugin };
34
27
  }
35
28
 
@@ -38,9 +31,7 @@ export function parsePluginsSearch(
38
31
  *
39
32
  * @param search - Typed search
40
33
  */
41
- export function serializePluginsSearch(
42
- search: PluginsSearch,
43
- ): Record<string, string> {
34
+ export function serializePluginsSearch(search: PluginsSearch): Record<string, string> {
44
35
  const out: Record<string, string> = {};
45
36
  if (search.q) out.q = search.q;
46
37
  if (search.origin) out.origin = search.origin;
@@ -55,10 +46,7 @@ export function serializePluginsSearch(
55
46
  * @param search - Current search
56
47
  * @param pluginId - Plugin to open
57
48
  */
58
- export function openPlugin(
59
- search: PluginsSearch,
60
- pluginId: string,
61
- ): PluginsSearch {
49
+ export function openPlugin(search: PluginsSearch, pluginId: string): PluginsSearch {
62
50
  return { ...search, plugin: pluginId };
63
51
  }
64
52
 
@@ -6,15 +6,9 @@
6
6
  import { explainDurationOutliers } from "./explain.ts";
7
7
  import { RUNS_CHAIN_FIXTURE, runsOutlierFixture } from "./fixture.ts";
8
8
  import { groupByDimension } from "./group.ts";
9
- import {
10
- durationHistogram,
11
- formatDurationMs,
12
- } from "./histogram.ts";
9
+ import { durationHistogram, formatDurationMs } from "./histogram.ts";
13
10
  import { filterRuns, parseDimensionQuery } from "./query.ts";
14
- import {
15
- shouldOfferTracesLink,
16
- tracesHrefForRun,
17
- } from "./trace-link.ts";
11
+ import { shouldOfferTracesLink, tracesHrefForRun } from "./trace-link.ts";
18
12
 
19
13
  /** Props for {@link RunsA11yView}. */
20
14
  export interface RunsA11yViewProps {
@@ -103,8 +97,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
103
97
  }}
104
98
  >
105
99
  {buckets.map((b, i) => {
106
- const selected =
107
- b.minMs <= range.maxMs && b.maxMs >= range.minMs;
100
+ const selected = b.minMs <= range.maxMs && b.maxMs >= range.minMs;
108
101
  return (
109
102
  <button
110
103
  key={i}
@@ -224,13 +217,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
224
217
  </div>
225
218
  <div>
226
219
  <dt>error</dt>
227
- <dd>
228
- {open.error ? (
229
- <span role="status">{open.error}</span>
230
- ) : (
231
- "—"
232
- )}
233
- </dd>
220
+ <dd>{open.error ? <span role="status">{open.error}</span> : "—"}</dd>
234
221
  </div>
235
222
  </dl>
236
223
  <h3>Effects</h3>
@@ -252,9 +239,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
252
239
  </ul>
253
240
  </details>
254
241
  {shouldOfferTracesLink(population, open.id) ? (
255
- <a href={tracesHrefForRun(population, open.id)}>
256
- Open in Traces
257
- </a>
242
+ <a href={tracesHrefForRun(population, open.id)}>Open in Traces</a>
258
243
  ) : null}
259
244
  <button type="button" style={{ minHeight: 32, minWidth: 24 }}>
260
245
  Close
@@ -16,8 +16,7 @@ describe("Runs 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/runs" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -70,9 +69,7 @@ describe("Runs 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
- <RunsA11yView openRunId="run-create-ok" withOutliers />,
75
- );
72
+ root.render(<RunsA11yView openRunId="run-create-ok" withOutliers />);
76
73
  });
77
74
 
78
75
  await new Promise((r) => setTimeout(r, 10));
@@ -3,10 +3,7 @@
3
3
  * (console §9.11 · §14), never a reimplementation.
4
4
  */
5
5
 
6
- import {
7
- explainOutliers,
8
- type OutlierFinding,
9
- } from "../../../runs/outlier.ts";
6
+ import { explainOutliers, type OutlierFinding } from "../../../runs/outlier.ts";
10
7
  import { runToWideEvent } from "./project.ts";
11
8
  import type { DurationRange, RunRecord } from "./types.ts";
12
9
 
@@ -24,8 +21,7 @@ export function explainDurationOutliers(
24
21
  ): OutlierFinding[] {
25
22
  const events = runs.map(runToWideEvent);
26
23
  return explainOutliers(events, {
27
- select: (e) =>
28
- e.durationMs >= range.minMs && e.durationMs <= range.maxMs,
24
+ select: (e) => e.durationMs >= range.minMs && e.durationMs <= range.maxMs,
29
25
  minLift: 0.15,
30
26
  ignore: ["duration_ms", "duration", "flow"],
31
27
  });
@@ -11,17 +11,11 @@ import type { GroupAggregate, RunRecord } from "./types.ts";
11
11
  * @param runs - Filtered population
12
12
  * @param dimension - Dimension to group by
13
13
  */
14
- export function groupByDimension(
15
- runs: readonly RunRecord[],
16
- dimension: string,
17
- ): GroupAggregate[] {
14
+ export function groupByDimension(runs: readonly RunRecord[], dimension: string): GroupAggregate[] {
18
15
  const buckets = new Map<string, RunRecord[]>();
19
16
  for (const run of runs) {
20
17
  const raw = dimensionValue(run, dimension);
21
- const key =
22
- raw === undefined || raw === null || raw === ""
23
- ? "(empty)"
24
- : String(raw);
18
+ const key = raw === undefined || raw === null || raw === "" ? "(empty)" : String(raw);
25
19
  const list = buckets.get(key) ?? [];
26
20
  list.push(run);
27
21
  buckets.set(key, list);
@@ -77,9 +71,6 @@ export function discoverDimensions(runs: readonly RunRecord[]): string[] {
77
71
  function percentile(sorted: readonly number[], p: number): number {
78
72
  if (sorted.length === 0) return 0;
79
73
  if (sorted.length === 1) return sorted[0]!;
80
- const idx = Math.min(
81
- sorted.length - 1,
82
- Math.max(0, Math.ceil(p * sorted.length) - 1),
83
- );
74
+ const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(p * sorted.length) - 1));
84
75
  return sorted[idx]!;
85
76
  }
@@ -4,11 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { runsOutlierFixture } from "./fixture.ts";
7
- import {
8
- durationHistogram,
9
- inDurationRange,
10
- normalizeRange,
11
- } from "./histogram.ts";
7
+ import { durationHistogram, inDurationRange, normalizeRange } from "./histogram.ts";
12
8
 
13
9
  describe("duration histogram", () => {
14
10
  test("buckets cover the population", () => {
@@ -21,11 +17,6 @@ describe("duration histogram", () => {
21
17
 
22
18
  test("range helpers", () => {
23
19
  expect(normalizeRange(2000, 40)).toEqual({ minMs: 40, maxMs: 2000 });
24
- expect(
25
- inDurationRange(
26
- { durationMs: 2000 } as never,
27
- { minMs: 1000, maxMs: 3000 },
28
- ),
29
- ).toBe(true);
20
+ expect(inDurationRange({ durationMs: 2000 } as never, { minMs: 1000, maxMs: 3000 })).toBe(true);
30
21
  });
31
22
  });
@@ -55,10 +55,7 @@ export function durationHistogram(
55
55
  * @param run - Run
56
56
  * @param range - Selected region
57
57
  */
58
- export function inDurationRange(
59
- run: RunRecord,
60
- range: DurationRange,
61
- ): boolean {
58
+ export function inDurationRange(run: RunRecord, range: DurationRange): boolean {
62
59
  return run.durationMs >= range.minMs && run.durationMs <= range.maxMs;
63
60
  }
64
61
 
@@ -5,19 +5,9 @@
5
5
  * without mounting the full SPA.
6
6
  */
7
7
 
8
- export {
9
- explainDurationOutliers,
10
- type OutlierFinding,
11
- } from "./explain.ts";
12
- export {
13
- RUNS_CHAIN_FIXTURE,
14
- RUNS_FIXTURE_T0,
15
- runsOutlierFixture,
16
- } from "./fixture.ts";
17
- export {
18
- discoverDimensions,
19
- groupByDimension,
20
- } from "./group.ts";
8
+ export { explainDurationOutliers, type OutlierFinding } from "./explain.ts";
9
+ export { RUNS_CHAIN_FIXTURE, RUNS_FIXTURE_T0, runsOutlierFixture } from "./fixture.ts";
10
+ export { discoverDimensions, groupByDimension } from "./group.ts";
21
11
  export {
22
12
  DEFAULT_BUCKET_COUNT,
23
13
  durationHistogram,
@@ -25,11 +15,7 @@ export {
25
15
  inDurationRange,
26
16
  normalizeRange,
27
17
  } from "./histogram.ts";
28
- export {
29
- rowToRun,
30
- runToWideEvent,
31
- type RunsListRow,
32
- } from "./project.ts";
18
+ export { rowToRun, runToWideEvent, type RunsListRow } from "./project.ts";
33
19
  export {
34
20
  BUILDER_DIMENSIONS,
35
21
  dimensionValue,
@@ -28,9 +28,7 @@ export interface RunsListRow {
28
28
  readonly error?: string | null;
29
29
  readonly effects?: RunRecord["effects"];
30
30
  readonly logs?: RunRecord["logs"];
31
- readonly dimensions?: Readonly<
32
- Record<string, string | number | boolean | null>
33
- >;
31
+ readonly dimensions?: Readonly<Record<string, string | number | boolean | null>>;
34
32
  }
35
33
 
36
34
  /**
@@ -107,9 +105,7 @@ export function runToWideEvent(run: RunRecord): WideEvent {
107
105
  ...(run.replica ? { replica: run.replica } : {}),
108
106
  ...(run.replicaLagMs != null ? { replicaLagMs: run.replicaLagMs } : {}),
109
107
  ...(run.cost != null ? { cost: run.cost } : {}),
110
- ...(run.promptVersion != null
111
- ? { promptVersion: run.promptVersion }
112
- : {}),
108
+ ...(run.promptVersion != null ? { promptVersion: run.promptVersion } : {}),
113
109
  ...(run.buildVersion ? { buildVersion: run.buildVersion } : {}),
114
110
  error: run.error ? { code: run.error } : null,
115
111
  effects: run.effects as WideEvent["effects"],
@@ -15,9 +15,7 @@ import {
15
15
 
16
16
  describe("dimension query", () => {
17
17
  test("parses flow = X AND cache = miss AND duration > 1s", () => {
18
- const q = parseDimensionQuery(
19
- "flow = bookings.create AND cache = miss AND duration > 1s",
20
- );
18
+ const q = parseDimensionQuery("flow = bookings.create AND cache = miss AND duration > 1s");
21
19
  expect(q.clauses).toEqual([
22
20
  { dimension: "flow", op: "=", value: "bookings.create" },
23
21
  { dimension: "cache", op: "=", value: "miss" },
@@ -5,12 +5,7 @@
5
5
  * — analysis by dimension, not free-text search.
6
6
  */
7
7
 
8
- import type {
9
- DimensionQuery,
10
- QueryClause,
11
- QueryOp,
12
- RunRecord,
13
- } from "./types.ts";
8
+ import type { DimensionQuery, QueryClause, QueryOp, RunRecord } from "./types.ts";
14
9
 
15
10
  const OPS: readonly QueryOp[] = ["!=", ">=", "<=", "=", ">", "<"];
16
11
 
@@ -22,7 +17,10 @@ const OPS: readonly QueryOp[] = ["!=", ">=", "<=", "=", ">", "<"];
22
17
  */
23
18
  export function parseDimensionQuery(expr: string | undefined | null): DimensionQuery {
24
19
  if (!expr || !expr.trim()) return { clauses: [] };
25
- const parts = expr.split(/\s+AND\s+/i).map((p) => p.trim()).filter(Boolean);
20
+ const parts = expr
21
+ .split(/\s+AND\s+/i)
22
+ .map((p) => p.trim())
23
+ .filter(Boolean);
26
24
  const clauses: QueryClause[] = [];
27
25
  for (const part of parts) {
28
26
  const clause = parseClause(part);
@@ -46,10 +44,7 @@ export function serializeDimensionQuery(query: DimensionQuery): string {
46
44
  * @param query - Current query
47
45
  * @param clause - Clause to add
48
46
  */
49
- export function upsertClause(
50
- query: DimensionQuery,
51
- clause: QueryClause,
52
- ): DimensionQuery {
47
+ export function upsertClause(query: DimensionQuery, clause: QueryClause): DimensionQuery {
53
48
  const rest = query.clauses.filter((c) => c.dimension !== clause.dimension);
54
49
  return { clauses: [...rest, clause] };
55
50
  }
@@ -60,10 +55,7 @@ export function upsertClause(
60
55
  * @param query - Current query
61
56
  * @param dimension - Dimension name
62
57
  */
63
- export function removeClause(
64
- query: DimensionQuery,
65
- dimension: string,
66
- ): DimensionQuery {
58
+ export function removeClause(query: DimensionQuery, dimension: string): DimensionQuery {
67
59
  return {
68
60
  clauses: query.clauses.filter((c) => c.dimension !== dimension),
69
61
  };
@@ -75,10 +67,7 @@ export function removeClause(
75
67
  * @param run - Wide-event projection
76
68
  * @param query - Dimension query
77
69
  */
78
- export function matchesDimensionQuery(
79
- run: RunRecord,
80
- query: DimensionQuery,
81
- ): boolean {
70
+ export function matchesDimensionQuery(run: RunRecord, query: DimensionQuery): boolean {
82
71
  for (const clause of query.clauses) {
83
72
  if (!matchClause(run, clause)) return false;
84
73
  }
@@ -91,10 +80,7 @@ export function matchesDimensionQuery(
91
80
  * @param runs - All runs
92
81
  * @param query - Dimension query
93
82
  */
94
- export function filterRuns(
95
- runs: readonly RunRecord[],
96
- query: DimensionQuery,
97
- ): RunRecord[] {
83
+ export function filterRuns(runs: readonly RunRecord[], query: DimensionQuery): RunRecord[] {
98
84
  if (query.clauses.length === 0) return [...runs];
99
85
  return runs.filter((r) => matchesDimensionQuery(r, query));
100
86
  }
@@ -147,19 +133,13 @@ function parseClause(raw: string): QueryClause | null {
147
133
  return { dimension, op, value };
148
134
  }
149
135
 
150
- function parseValue(
151
- dimension: string,
152
- raw: string,
153
- ): string | number | boolean | undefined {
136
+ function parseValue(dimension: string, raw: string): string | number | boolean | undefined {
154
137
  if (dimension === "duration" || dimension === "duration_ms") {
155
138
  return parseDurationMs(raw);
156
139
  }
157
140
  if (raw === "true") return true;
158
141
  if (raw === "false") return false;
159
- if (
160
- (raw.startsWith('"') && raw.endsWith('"')) ||
161
- (raw.startsWith("'") && raw.endsWith("'"))
162
- ) {
142
+ if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
163
143
  return raw.slice(1, -1);
164
144
  }
165
145
  if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw);
@@ -263,10 +243,7 @@ export function dimensionValue(
263
243
  }
264
244
  }
265
245
 
266
- function compareEq(
267
- left: string | number | boolean,
268
- right: string | number | boolean,
269
- ): boolean {
246
+ function compareEq(left: string | number | boolean, right: string | number | boolean): boolean {
270
247
  if (typeof left === "number" || typeof right === "number") {
271
248
  const ln = toNumber(left);
272
249
  const rn = toNumber(right);