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
@@ -76,10 +76,7 @@ export function GatesPanel() {
76
76
 
77
77
  const selectedPrincipal = decodePrincipal(search.principal);
78
78
  const openPrincipalRow = selectedPrincipal
79
- ? principals.find(
80
- (p) =>
81
- p.kind === selectedPrincipal.kind && p.id === selectedPrincipal.id,
82
- )
79
+ ? principals.find((p) => p.kind === selectedPrincipal.kind && p.id === selectedPrincipal.id)
83
80
  : undefined;
84
81
  const openFlowRow = flows.find((f) => f.flowId === search.flow);
85
82
 
@@ -132,11 +129,7 @@ export function GatesPanel() {
132
129
  What can this principal do · what guards this flow
133
130
  </p>
134
131
  </div>
135
- <div
136
- role="group"
137
- aria-label="Inquiry direction"
138
- className="flex gap-1"
139
- >
132
+ <div role="group" aria-label="Inquiry direction" className="flex gap-1">
140
133
  <Button
141
134
  type="button"
142
135
  variant={from === "principal" ? "primary" : "ghost"}
@@ -171,9 +164,7 @@ export function GatesPanel() {
171
164
  <Input
172
165
  aria-label="Filter gates"
173
166
  value={search.q ?? ""}
174
- onChange={(e) =>
175
- setSearch({ ...search, q: e.currentTarget.value || undefined })
176
- }
167
+ onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
177
168
  />
178
169
  </label>
179
170
  </header>
@@ -199,9 +190,7 @@ export function GatesPanel() {
199
190
  className="border-b border-[var(--oke-line)] bg-[var(--oke-danger)]/10 px-4 py-2"
200
191
  role="alert"
201
192
  >
202
- <h2 className="text-sm font-medium text-[var(--oke-danger)]">
203
- Two-plane violations
204
- </h2>
193
+ <h2 className="text-sm font-medium text-[var(--oke-danger)]">Two-plane violations</h2>
205
194
  <ul className="mt-1 text-sm text-[var(--oke-fg)]">
206
195
  {violations.map((v) => (
207
196
  <li key={v.operatorId}>{formatViolation(v)}</li>
@@ -215,9 +204,7 @@ export function GatesPanel() {
215
204
  aria-label={from === "principal" ? "Principal list" : "Flow list"}
216
205
  className="w-80 shrink-0 overflow-y-auto border-r border-[var(--oke-line)]"
217
206
  >
218
- <h2 className="sr-only">
219
- {from === "principal" ? "Principals" : "Flows"}
220
- </h2>
207
+ <h2 className="sr-only">{from === "principal" ? "Principals" : "Flows"}</h2>
221
208
  {listQuery.isLoading ? (
222
209
  <p className="p-4 text-sm text-[var(--oke-muted)]">Loading…</p>
223
210
  ) : null}
@@ -229,9 +216,7 @@ export function GatesPanel() {
229
216
  <ul>
230
217
  {group.items.map((item) => {
231
218
  const pressed =
232
- from === "flow"
233
- ? item.id === search.flow
234
- : item.id === search.principal;
219
+ from === "flow" ? item.id === search.flow : item.id === search.principal;
235
220
  return (
236
221
  <li key={item.id}>
237
222
  <button
@@ -251,25 +236,14 @@ export function GatesPanel() {
251
236
  } else {
252
237
  const decoded = decodePrincipal(item.id);
253
238
  if (!decoded) return;
254
- setSearch(
255
- openPrincipal(
256
- search,
257
- decoded.kind,
258
- decoded.id,
259
- ),
260
- );
239
+ setSearch(openPrincipal(search, decoded.kind, decoded.id));
261
240
  }
262
241
  }}
263
242
  >
264
243
  <span className="font-mono">{item.label}</span>
265
- {item.meta ? (
266
- <span className="truncate text-xs">{item.meta}</span>
267
- ) : null}
244
+ {item.meta ? <span className="truncate text-xs">{item.meta}</span> : null}
268
245
  {item.flag ? (
269
- <span
270
- role="status"
271
- className="text-xs text-[var(--oke-danger)]"
272
- >
246
+ <span role="status" className="text-xs text-[var(--oke-danger)]">
273
247
  {item.flag}
274
248
  </span>
275
249
  ) : null}
@@ -295,17 +269,13 @@ export function GatesPanel() {
295
269
  <div className="flex max-w-2xl flex-col gap-6">
296
270
  {from === "flow" && openFlowRow ? (
297
271
  <div>
298
- <h2 className="font-mono text-lg text-[var(--oke-fg)]">
299
- {openFlowRow.flowId}
300
- </h2>
272
+ <h2 className="font-mono text-lg text-[var(--oke-fg)]">{openFlowRow.flowId}</h2>
301
273
  <p className="text-sm text-[var(--oke-muted)]">
302
274
  What guards this — registration order
303
275
  </p>
304
276
  {openFlowRow.gates.length === 0 ? (
305
277
  <p className="mt-2 text-sm" role="status">
306
- {openFlowRow.unguarded
307
- ? "Unguarded — public on the user plane"
308
- : "No gates"}
278
+ {openFlowRow.unguarded ? "Unguarded — public on the user plane" : "No gates"}
309
279
  </p>
310
280
  ) : (
311
281
  <ol
@@ -329,15 +299,10 @@ export function GatesPanel() {
329
299
  </h2>
330
300
  <p className="text-sm text-[var(--oke-muted)]">
331
301
  {openPrincipalRow.kind} · {openPrincipalRow.plane} plane
332
- {openPrincipalRow.email
333
- ? ` · ${openPrincipalRow.email}`
334
- : ""}
302
+ {openPrincipalRow.email ? ` · ${openPrincipalRow.email}` : ""}
335
303
  </p>
336
304
  <h3 className="mt-4 text-sm font-medium">Scopes</h3>
337
- <ul
338
- aria-label="Scopes"
339
- className="mt-1 flex flex-wrap gap-2 text-sm"
340
- >
305
+ <ul aria-label="Scopes" className="mt-1 flex flex-wrap gap-2 text-sm">
341
306
  {openPrincipalRow.scopes.map((s) => (
342
307
  <li key={s}>
343
308
  <code className="font-mono">{s}</code>
@@ -355,13 +320,10 @@ export function GatesPanel() {
355
320
  {powers ? (
356
321
  <div className="mt-3 text-sm">
357
322
  <p role="status">
358
- {powers.allowedFlowIds.length} flows allowed ·{" "}
359
- {powers.deniedFlowIds.length} denied
323
+ {powers.allowedFlowIds.length} flows allowed · {powers.deniedFlowIds.length}{" "}
324
+ denied
360
325
  </p>
361
- <ul
362
- aria-label="Allowed flows"
363
- className="mt-2 list-disc pl-5"
364
- >
326
+ <ul aria-label="Allowed flows" className="mt-2 list-disc pl-5">
365
327
  {powers.allowedFlowIds.map((id) => (
366
328
  <li key={id}>
367
329
  <code className="font-mono">{id}</code>
@@ -373,21 +335,14 @@ export function GatesPanel() {
373
335
  </div>
374
336
  ) : null}
375
337
 
376
- <section
377
- aria-label="Simulator"
378
- className="border-t border-[var(--oke-line)] pt-4"
379
- >
380
- <h3 className="text-sm font-medium text-[var(--oke-fg)]">
381
- Simulator
382
- </h3>
338
+ <section aria-label="Simulator" className="border-t border-[var(--oke-line)] pt-4">
339
+ <h3 className="text-sm font-medium text-[var(--oke-fg)]">Simulator</h3>
383
340
  <p className="text-sm text-[var(--oke-muted)]">
384
341
  Evaluates the real gate chain only — never runs the handler
385
342
  </p>
386
343
  <label className="mt-3 flex max-w-md flex-col gap-1 text-sm">
387
344
  <span className="text-[var(--oke-muted)]">
388
- {from === "flow"
389
- ? "Simulate as principal"
390
- : "Simulate against flow"}
345
+ {from === "flow" ? "Simulate as principal" : "Simulate against flow"}
391
346
  </span>
392
347
  <select
393
348
  aria-label="Companion selection"
@@ -405,10 +360,7 @@ export function GatesPanel() {
405
360
  <option value="">Select…</option>
406
361
  {from === "flow"
407
362
  ? principals.map((p) => (
408
- <option
409
- key={`${p.kind}:${p.id}`}
410
- value={`${p.kind}:${p.id}`}
411
- >
363
+ <option key={`${p.kind}:${p.id}`} value={`${p.kind}:${p.id}`}>
412
364
  {p.kind}: {p.name}
413
365
  </option>
414
366
  ))
@@ -431,9 +383,7 @@ export function GatesPanel() {
431
383
  </Button>
432
384
  {simulate.isError ? (
433
385
  <p role="alert" className="mt-2 text-sm text-[var(--oke-danger)]">
434
- {simulate.error instanceof Error
435
- ? simulate.error.message
436
- : "Simulate failed"}
386
+ {simulate.error instanceof Error ? simulate.error.message : "Simulate failed"}
437
387
  </p>
438
388
  ) : null}
439
389
  {simResult ? (
@@ -443,9 +393,7 @@ export function GatesPanel() {
443
393
  className="list-decimal space-y-1 pl-5 text-sm"
444
394
  >
445
395
  {simResult.evaluations.map((e, i) => (
446
- <li key={`${e.name}-${i}`}>
447
- {formatEvaluationStep(e, i)}
448
- </li>
396
+ <li key={`${e.name}-${i}`}>{formatEvaluationStep(e, i)}</li>
449
397
  ))}
450
398
  </ol>
451
399
  <p
@@ -453,9 +401,7 @@ export function GatesPanel() {
453
401
  className="mt-3 text-sm"
454
402
  data-denial={simResult.denial?.code ?? "allowed"}
455
403
  >
456
- {simResult.denial
457
- ? formatDenial(simResult.denial)
458
- : "Allowed — chain passed"}
404
+ {simResult.denial ? formatDenial(simResult.denial) : "Allowed — chain passed"}
459
405
  </p>
460
406
  </div>
461
407
  ) : null}
@@ -463,9 +409,7 @@ export function GatesPanel() {
463
409
 
464
410
  {widenings.length > 0 ? (
465
411
  <section aria-label="Permission widenings">
466
- <h3 className="text-sm font-medium text-[var(--oke-danger)]">
467
- Deploy widenings
468
- </h3>
412
+ <h3 className="text-sm font-medium text-[var(--oke-danger)]">Deploy widenings</h3>
469
413
  <ul className="mt-2 list-disc pl-5 text-sm">
470
414
  {widenings.map((w) => (
471
415
  <li key={`${w.path}:${w.summary}`}>{w.summary}</li>
@@ -158,17 +158,12 @@ export function OverviewPanel() {
158
158
  accessQuery.data,
159
159
  ]);
160
160
 
161
- const loading =
162
- manifestQuery.isLoading ||
163
- runsQuery.isLoading ||
164
- gatesQuery.isLoading;
161
+ const loading = manifestQuery.isLoading || runsQuery.isLoading || gatesQuery.isLoading;
165
162
 
166
163
  return (
167
164
  <div className="flex h-full min-h-0 flex-col overflow-y-auto">
168
165
  <header className="shrink-0 border-b border-[var(--oke-line)] px-6 py-5">
169
- <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
170
- Overview
171
- </p>
166
+ <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">Overview</p>
172
167
  <h1 className="mt-1 text-xl font-semibold tracking-tight text-[var(--oke-fg)]">
173
168
  Is the system healthy right now?
174
169
  </h1>
@@ -191,8 +186,8 @@ export function OverviewPanel() {
191
186
  {!loading && !manifestQuery.data ? (
192
187
  <p className="text-sm text-[var(--oke-muted)]">
193
188
  No Manifest yet — save a Flow under{" "}
194
- <code className="font-mono text-[var(--oke-fg)]">src/</code> and
195
- the Console will refresh.
189
+ <code className="font-mono text-[var(--oke-fg)]">src/</code> and the Console will
190
+ refresh.
196
191
  </p>
197
192
  ) : null}
198
193
 
@@ -228,9 +223,7 @@ export function OverviewPanel() {
228
223
  />
229
224
 
230
225
  <section aria-label="What changed" className="flex flex-col gap-2">
231
- <h2 className="text-sm font-medium text-[var(--oke-fg)]">
232
- What changed
233
- </h2>
226
+ <h2 className="text-sm font-medium text-[var(--oke-fg)]">What changed</h2>
234
227
  <p className="text-sm text-[var(--oke-muted)]">
235
228
  <a
236
229
  href={view.whatChanged.href}
@@ -250,9 +243,7 @@ export function OverviewPanel() {
250
243
  aria-label="Declare first SLO"
251
244
  className="flex flex-col gap-2 border border-[var(--oke-line)] px-4 py-3"
252
245
  >
253
- <h2 className="text-sm font-medium text-[var(--oke-fg)]">
254
- Declare a first objective
255
- </h2>
246
+ <h2 className="text-sm font-medium text-[var(--oke-fg)]">Declare a first objective</h2>
256
247
  <p className="text-sm text-[var(--oke-muted)]">
257
248
  Your busiest flow is{" "}
258
249
  <a
@@ -261,8 +252,7 @@ export function OverviewPanel() {
261
252
  >
262
253
  {view.firstSloInvite.busiestFlow}
263
254
  </a>{" "}
264
- ({view.firstSloInvite.runCount.toLocaleString("en-US")} runs).
265
- Add{" "}
255
+ ({view.firstSloInvite.runCount.toLocaleString("en-US")} runs). Add{" "}
266
256
  <code className="font-mono text-[13px] text-[var(--oke-fg)]">
267
257
  {'slo: { availability: "99.9%" }'}
268
258
  </code>{" "}
@@ -291,13 +281,9 @@ function BudgetStrip(props: {
291
281
  }) {
292
282
  return (
293
283
  <section aria-label={props.ariaLabel} className="flex flex-col gap-3">
294
- <h2 className="text-sm font-medium text-[var(--oke-fg)]">
295
- {props.label}
296
- </h2>
284
+ <h2 className="text-sm font-medium text-[var(--oke-fg)]">{props.label}</h2>
297
285
  {props.items.length === 0 ? (
298
- <p className="text-sm text-[var(--oke-muted)]">
299
- {props.empty ?? "None."}
300
- </p>
286
+ <p className="text-sm text-[var(--oke-muted)]">{props.empty ?? "None."}</p>
301
287
  ) : (
302
288
  <ul className="divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]">
303
289
  {props.items.map((item) => (
@@ -306,23 +292,16 @@ function BudgetStrip(props: {
306
292
  className="flex min-h-10 flex-wrap items-center justify-between gap-3 py-2 text-sm"
307
293
  >
308
294
  <div className="flex min-w-0 flex-col gap-0.5">
309
- <span className="font-mono text-[13px] text-[var(--oke-fg)]">
310
- {item.title}
311
- </span>
295
+ <span className="font-mono text-[13px] text-[var(--oke-fg)]">{item.title}</span>
312
296
  <span className="text-[var(--oke-muted)]">{item.meta}</span>
313
297
  </div>
314
298
  <div className="flex flex-wrap items-center gap-3 text-[var(--oke-muted)]">
315
299
  <span>
316
- burn{" "}
317
- <span className="text-[var(--oke-fg)]">
318
- {formatBurnRate(item.burn)}
319
- </span>
300
+ burn <span className="text-[var(--oke-fg)]">{formatBurnRate(item.burn)}</span>
320
301
  </span>
321
302
  <span>
322
303
  exhausts{" "}
323
- <span className="text-[var(--oke-fg)]">
324
- {formatBudgetDuration(item.exhaust)}
325
- </span>
304
+ <span className="text-[var(--oke-fg)]">{formatBudgetDuration(item.exhaust)}</span>
326
305
  </span>
327
306
  <span
328
307
  aria-hidden
@@ -358,9 +337,7 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
358
337
  <section aria-label="Findings" aria-live="polite" className="flex flex-col gap-3">
359
338
  <h2 className="text-sm font-medium text-[var(--oke-fg)]">Findings</h2>
360
339
  {view.findings.length === 0 ? (
361
- <p className="text-sm text-[var(--oke-muted)]">
362
- No findings from other panels.
363
- </p>
340
+ <p className="text-sm text-[var(--oke-muted)]">No findings from other panels.</p>
364
341
  ) : (
365
342
  <ol className="divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]">
366
343
  {view.findings.map((f, i) => (
@@ -369,15 +346,10 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
369
346
  href={f.href}
370
347
  className="flex min-h-8 items-start gap-3 hover:text-[var(--oke-fg)]"
371
348
  >
372
- <span className="w-5 shrink-0 text-[var(--oke-muted)]">
373
- {i + 1}.
374
- </span>
349
+ <span className="w-5 shrink-0 text-[var(--oke-muted)]">{i + 1}.</span>
375
350
  <span>
376
351
  <span className="text-[var(--oke-fg)]">{f.title}</span>
377
- <span className="text-[var(--oke-muted)]">
378
- {" "}
379
- · {f.detail}
380
- </span>
352
+ <span className="text-[var(--oke-muted)]"> · {f.detail}</span>
381
353
  <span className="ml-2 text-xs uppercase tracking-wider text-[var(--oke-muted)]">
382
354
  {f.source}
383
355
  </span>
@@ -394,38 +366,28 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
394
366
  function GoldenStrip({ view }: { readonly view: OverviewView }) {
395
367
  return (
396
368
  <section aria-label="Golden signals" className="flex flex-col gap-3">
397
- <h2 className="text-sm font-medium text-[var(--oke-fg)]">
398
- Golden signals
399
- </h2>
369
+ <h2 className="text-sm font-medium text-[var(--oke-fg)]">Golden signals</h2>
400
370
  <dl className="grid grid-cols-2 gap-4 sm:grid-cols-4">
401
371
  <div>
402
- <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
403
- Latency p99
404
- </dt>
372
+ <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Latency p99</dt>
405
373
  <dd className="mt-1 text-sm text-[var(--oke-fg)]">
406
374
  {Math.round(view.golden.latencyP99Ms)} ms
407
375
  </dd>
408
376
  </div>
409
377
  <div>
410
- <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
411
- Traffic
412
- </dt>
378
+ <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Traffic</dt>
413
379
  <dd className="mt-1 text-sm text-[var(--oke-fg)]">
414
380
  {view.golden.trafficPerMin.toFixed(1)} / min
415
381
  </dd>
416
382
  </div>
417
383
  <div>
418
- <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
419
- Errors
420
- </dt>
384
+ <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Errors</dt>
421
385
  <dd className="mt-1 text-sm text-[var(--oke-fg)]">
422
386
  {(view.golden.errorRate * 100).toFixed(2)}%
423
387
  </dd>
424
388
  </div>
425
389
  <div>
426
- <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
427
- Saturation
428
- </dt>
390
+ <dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Saturation</dt>
429
391
  <dd className="mt-1 text-sm text-[var(--oke-fg)]">
430
392
  {(view.golden.saturation * 100).toFixed(1)}%
431
393
  </dd>
@@ -48,14 +48,8 @@ export function PluginsPanel() {
48
48
  });
49
49
 
50
50
  const list = listQuery.data;
51
- const groups = useMemo(
52
- () => groupPlugins(list?.plugins ?? [], search),
53
- [list?.plugins, search],
54
- );
55
- const open =
56
- list?.plugins.find((p) => p.id === search.plugin) ??
57
- list?.plugins[0] ??
58
- null;
51
+ const groups = useMemo(() => groupPlugins(list?.plugins ?? [], search), [list?.plugins, search]);
52
+ const open = list?.plugins.find((p) => p.id === search.plugin) ?? list?.plugins[0] ?? null;
59
53
  const command = open ? copyableCommand(open) : null;
60
54
 
61
55
  const copy = async () => {
@@ -70,8 +64,8 @@ export function PluginsPanel() {
70
64
  <header className="shrink-0 border-b border-[var(--oke-line)] px-4 py-3">
71
65
  <h1 className="text-lg text-[var(--oke-fg)]">Plugins</h1>
72
66
  <p className="mt-1 text-sm text-[var(--oke-muted)]">
73
- Origin × state — CORE stays listed when off; local/community only when
74
- plugged. Read-only; git review is the approval.
67
+ Origin × state — CORE stays listed when off; local/community only when plugged. Read-only;
68
+ git review is the approval.
75
69
  </p>
76
70
  <div className="mt-3 flex flex-wrap items-end gap-3">
77
71
  <label className="flex flex-col gap-1 text-xs text-[var(--oke-muted)]">
@@ -79,9 +73,7 @@ export function PluginsPanel() {
79
73
  <Input
80
74
  aria-label="Filter plugins"
81
75
  value={search.q ?? ""}
82
- onChange={(e) =>
83
- setSearch({ ...search, q: e.target.value || undefined })
84
- }
76
+ onChange={(e) => setSearch({ ...search, q: e.target.value || undefined })}
85
77
  className="min-h-8 w-56"
86
78
  />
87
79
  </label>
@@ -89,10 +81,7 @@ export function PluginsPanel() {
89
81
  value={search.origin}
90
82
  onChange={(origin) => setSearch({ ...search, origin })}
91
83
  />
92
- <StateFilter
93
- value={search.state}
94
- onChange={(state) => setSearch({ ...search, state })}
95
- />
84
+ <StateFilter value={search.state} onChange={(state) => setSearch({ ...search, state })} />
96
85
  </div>
97
86
  </header>
98
87
 
@@ -142,9 +131,7 @@ export function PluginsPanel() {
142
131
  className="min-h-0 flex-1 overflow-y-auto px-4 py-3"
143
132
  >
144
133
  {!open ? (
145
- <p className="text-sm text-[var(--oke-muted)]">
146
- Select a plugin
147
- </p>
134
+ <p className="text-sm text-[var(--oke-muted)]">Select a plugin</p>
148
135
  ) : (
149
136
  <PluginDetail
150
137
  plugin={open}
@@ -175,13 +162,9 @@ function PluginDetail(props: {
175
162
  ({p.origin} · {p.state})
176
163
  </span>
177
164
  </h2>
178
- {p.summary ? (
179
- <p className="mt-1 text-sm text-[var(--oke-muted)]">{p.summary}</p>
180
- ) : null}
165
+ {p.summary ? <p className="mt-1 text-sm text-[var(--oke-muted)]">{p.summary}</p> : null}
181
166
  {p.version ? (
182
- <p className="mt-1 text-xs text-[var(--oke-muted)]">
183
- Version {p.version}
184
- </p>
167
+ <p className="mt-1 text-xs text-[var(--oke-muted)]">Version {p.version}</p>
185
168
  ) : null}
186
169
  </div>
187
170
 
@@ -210,9 +193,7 @@ function PluginDetail(props: {
210
193
  <p className="mt-2 text-sm text-[var(--oke-muted)]">None</p>
211
194
  ) : (
212
195
  <table className="mt-2 w-full text-left text-sm">
213
- <caption className="sr-only">
214
- Hook stages and measured mean cost
215
- </caption>
196
+ <caption className="sr-only">Hook stages and measured mean cost</caption>
216
197
  <thead>
217
198
  <tr className="text-xs text-[var(--oke-muted)]">
218
199
  <th scope="col" className="py-1 pr-3 font-normal">
@@ -232,9 +213,7 @@ function PluginDetail(props: {
232
213
  <th scope="row" className="py-1 pr-3 font-mono font-normal">
233
214
  {i.stage}
234
215
  </th>
235
- <td className="py-1 pr-3">
236
- {i.meanMs === null ? "—" : i.meanMs.toFixed(2)}
237
- </td>
216
+ <td className="py-1 pr-3">{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}</td>
238
217
  <td className="py-1">{i.count}</td>
239
218
  </tr>
240
219
  ))}
@@ -243,8 +222,8 @@ function PluginDetail(props: {
243
222
  )}
244
223
  {p.hookCost ? (
245
224
  <p className="mt-2 text-xs text-[var(--oke-muted)]" role="status">
246
- p50 {p.hookCost.p50Ms.toFixed(2)} ms · p95{" "}
247
- {p.hookCost.p95Ms.toFixed(2)} ms · n={p.hookCost.count}
225
+ p50 {p.hookCost.p50Ms.toFixed(2)} ms · p95 {p.hookCost.p95Ms.toFixed(2)} ms · n=
226
+ {p.hookCost.count}
248
227
  </p>
249
228
  ) : null}
250
229
  </section>
@@ -299,9 +278,7 @@ function PluginDetail(props: {
299
278
  >
300
279
  {c.summary}
301
280
  </a>
302
- <span className="ml-2 text-xs text-[var(--oke-muted)]">
303
- {c.category}
304
- </span>
281
+ <span className="ml-2 text-xs text-[var(--oke-muted)]">{c.category}</span>
305
282
  </li>
306
283
  ))}
307
284
  </ul>
@@ -326,14 +303,12 @@ function PluginDetail(props: {
326
303
  ) : null}
327
304
  </div>
328
305
  <p className="text-xs text-[var(--oke-muted)]">
329
- The Console never installs. Git review is the approval — run this
330
- yourself.
306
+ The Console never installs. Git review is the approval — run this yourself.
331
307
  </p>
332
308
  </div>
333
309
  ) : (
334
310
  <p className="mt-2 text-sm text-[var(--oke-muted)]">
335
- No install command — turn off by removing the code line, not from
336
- this UI.
311
+ No install command — turn off by removing the code line, not from this UI.
337
312
  </p>
338
313
  )}
339
314
  </section>