okengine 0.2.6 → 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 +45 -37
  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
@@ -59,14 +59,9 @@ export function StorePanel() {
59
59
  const tenancyDeclared = listQuery.data?.tenancyDeclared ?? false;
60
60
  const tenants = listQuery.data?.tenants ?? [];
61
61
  const stores = listQuery.data?.stores ?? [];
62
- const groups = useMemo(
63
- () => groupByFacet(stores, search.q ?? ""),
64
- [stores, search.q],
65
- );
62
+ const groups = useMemo(() => groupByFacet(stores, search.q ?? ""), [stores, search.q]);
66
63
  const open = stores.find((s) => s.ref === search.ref);
67
- const child =
68
- open?.children.find((c) => c.name === search.child) ??
69
- open?.children[0];
64
+ const child = open?.children.find((c) => c.name === search.child) ?? open?.children[0];
70
65
  const view = search.view ?? "browse";
71
66
  const editConfirm = editConfirmation({ production: true });
72
67
  const delConfirm = deleteConfirmation({ production: true });
@@ -85,11 +80,7 @@ export function StorePanel() {
85
80
  view,
86
81
  probeVector,
87
82
  ],
88
- enabled:
89
- !!open &&
90
- !!child &&
91
- view === "browse" &&
92
- (!tenancyDeclared || !!search.tenant),
83
+ enabled: !!open && !!child && view === "browse" && (!tenancyDeclared || !!search.tenant),
93
84
  queryFn: async () => {
94
85
  if (!open || !child) return null;
95
86
  const vector =
@@ -143,9 +134,7 @@ export function StorePanel() {
143
134
  });
144
135
  if (res.error) throw new Error(res.error.code);
145
136
  const data = res.data!;
146
- setWillNotPreview(
147
- formatWillNotFire(data.willNotFire).lines as string[],
148
- );
137
+ setWillNotPreview(formatWillNotFire(data.willNotFire).lines as string[]);
149
138
  return data;
150
139
  },
151
140
  });
@@ -299,9 +288,7 @@ export function StorePanel() {
299
288
  aria-label="Filter stores"
300
289
  className="min-h-8 border border-[var(--oke-line)] bg-transparent px-2"
301
290
  value={search.q ?? ""}
302
- onChange={(e) =>
303
- setSearch({ ...search, q: e.target.value || undefined })
304
- }
291
+ onChange={(e) => setSearch({ ...search, q: e.target.value || undefined })}
305
292
  />
306
293
  </label>
307
294
  </header>
@@ -336,13 +323,9 @@ export function StorePanel() {
336
323
  <span>{s.name}</span>
337
324
  <span className="text-xs text-[var(--oke-muted)]">
338
325
  {s.children.length} resource(s)
339
- {s.replicaLagMs != null
340
- ? ` · lag ${s.replicaLagMs}ms`
341
- : ""}
326
+ {s.replicaLagMs != null ? ` · lag ${s.replicaLagMs}ms` : ""}
342
327
  {s.migrationDrift?.drifted ? " · drift" : ""}
343
- {s.warnings.length > 0
344
- ? ` · ${s.warnings.length} warn`
345
- : ""}
328
+ {s.warnings.length > 0 ? ` · ${s.warnings.length} warn` : ""}
346
329
  </span>
347
330
  </button>
348
331
  </li>
@@ -359,13 +342,12 @@ export function StorePanel() {
359
342
  >
360
343
  {!open ? (
361
344
  <p className="text-sm text-[var(--oke-muted)]">
362
- Select a store. Tenant selector appears only when tenancy is
363
- declared on the Manifest.
345
+ Select a store. Tenant selector appears only when tenancy is declared on the Manifest.
364
346
  </p>
365
347
  ) : tenancyDeclared && !search.tenant ? (
366
348
  <p role="status" className="text-sm">
367
- Select a tenant in the header before browsing — compliance
368
- boundary, not a display filter.
349
+ Select a tenant in the header before browsing — compliance boundary, not a display
350
+ filter.
369
351
  </p>
370
352
  ) : (
371
353
  <StoreDetail
@@ -419,9 +401,7 @@ function StoreDetail(props: {
419
401
  readonly view: "browse" | "cache" | "sql" | "probe";
420
402
  readonly search: StoreSearch;
421
403
  readonly setSearch: (s: StoreSearch) => void;
422
- readonly browse: Awaited<
423
- ReturnType<typeof consoleCalls.storeQuery>
424
- >["data"];
404
+ readonly browse: Awaited<ReturnType<typeof consoleCalls.storeQuery>>["data"];
425
405
  readonly browseLoading: boolean;
426
406
  readonly cache: ReturnType<typeof explainCache> | null;
427
407
  readonly willNot: ReturnType<typeof formatWillNotFire> | null;
@@ -503,8 +483,8 @@ function StoreDetail(props: {
503
483
  [
504
484
  ["browse", "Browse"],
505
485
  ["cache", "Cache"],
506
- ...(open.facet === "sql" ? [["sql", "SQL"]] as const : []),
507
- ...(open.facet === "index" ? [["probe", "Probe"]] as const : []),
486
+ ...(open.facet === "sql" ? ([["sql", "SQL"]] as const) : []),
487
+ ...(open.facet === "index" ? ([["probe", "Probe"]] as const) : []),
508
488
  ] as const
509
489
  ).map(([id, label]) => (
510
490
  <button
@@ -514,9 +494,7 @@ function StoreDetail(props: {
514
494
  aria-selected={view === id}
515
495
  className={clsx(
516
496
  "min-h-8 px-2 text-sm",
517
- view === id
518
- ? "text-[var(--oke-fg)] underline"
519
- : "text-[var(--oke-muted)]",
497
+ view === id ? "text-[var(--oke-fg)] underline" : "text-[var(--oke-muted)]",
520
498
  )}
521
499
  onClick={() => setSearch({ ...search, view: id })}
522
500
  >
@@ -531,9 +509,7 @@ function StoreDetail(props: {
531
509
  aria-label="Store resource"
532
510
  className="min-h-8 max-w-xs border border-[var(--oke-line)] bg-transparent px-2"
533
511
  value={childName ?? ""}
534
- onChange={(e) =>
535
- setSearch(openChild(search, e.target.value))
536
- }
512
+ onChange={(e) => setSearch(openChild(search, e.target.value))}
537
513
  >
538
514
  {open.children.map((c) => (
539
515
  <option key={c.name} value={c.name}>
@@ -547,21 +523,14 @@ function StoreDetail(props: {
547
523
  <p className="text-sm" role="status">
548
524
  Writers:{" "}
549
525
  {child.writers.map((f) => (
550
- <Link
551
- key={f}
552
- to="/flows"
553
- search={{ flow: f } as never}
554
- className="mr-2 underline"
555
- >
526
+ <Link key={f} to="/flows" search={{ flow: f } as never} className="mr-2 underline">
556
527
  {f}
557
528
  </Link>
558
529
  ))}
559
530
  {child.writers.length === 0 ? "none" : null}
560
531
  {" · "}
561
532
  Readers: {child.readers.join(", ") || "none"}
562
- {child.piiColumns.length > 0
563
- ? ` · PII columns: ${child.piiColumns.join(", ")}`
564
- : ""}
533
+ {child.piiColumns.length > 0 ? ` · PII columns: ${child.piiColumns.join(", ")}` : ""}
565
534
  </p>
566
535
  ) : null}
567
536
 
@@ -592,8 +561,7 @@ function StoreDetail(props: {
592
561
  {cache.summary}
593
562
  </p>
594
563
  <p className="text-xs text-[var(--oke-muted)]">
595
- Invalidating flows:{" "}
596
- {cache.invalidatingFlows.join(", ") || "none"}
564
+ Invalidating flows: {cache.invalidatingFlows.join(", ") || "none"}
597
565
  </p>
598
566
  <Button type="button" onClick={onPurge}>
599
567
  Purge cache namespace
@@ -635,9 +603,7 @@ function StoreDetail(props: {
635
603
  />
636
604
  </label>
637
605
  ) : null}
638
- {browseLoading ? (
639
- <p className="text-sm text-[var(--oke-muted)]">Loading…</p>
640
- ) : null}
606
+ {browseLoading ? <p className="text-sm text-[var(--oke-muted)]">Loading…</p> : null}
641
607
  {browse?.rows ? (
642
608
  <table className="w-full text-left text-sm">
643
609
  <thead>
@@ -663,9 +629,7 @@ function StoreDetail(props: {
663
629
  type="button"
664
630
  className="ml-2 underline"
665
631
  style={{ minHeight: 32 }}
666
- onClick={() =>
667
- onReveal(String(row.id ?? ""), col)
668
- }
632
+ onClick={() => onReveal(String(row.id ?? ""), col)}
669
633
  >
670
634
  Reveal
671
635
  </button>
@@ -673,10 +637,7 @@ function StoreDetail(props: {
673
637
  </td>
674
638
  ))}
675
639
  <td className="border-b px-2 py-1">
676
- <Button
677
- type="button"
678
- onClick={() => onDelete([String(row.id ?? "")])}
679
- >
640
+ <Button type="button" onClick={() => onDelete([String(row.id ?? "")])}>
680
641
  Delete
681
642
  </Button>
682
643
  </td>
@@ -691,9 +652,7 @@ function StoreDetail(props: {
691
652
  <li key={k.key} className="flex min-h-8 items-center gap-2">
692
653
  <span className="font-mono">{k.key}</span>
693
654
  {k.value !== undefined ? (
694
- <span className="text-[var(--oke-muted)]">
695
- {JSON.stringify(k.value)}
696
- </span>
655
+ <span className="text-[var(--oke-muted)]">{JSON.stringify(k.value)}</span>
697
656
  ) : null}
698
657
  {k.warnings?.map((w) => (
699
658
  <span key={w.code} role="status" className="text-xs">
@@ -724,11 +683,13 @@ function StoreDetail(props: {
724
683
  </section>
725
684
  )}
726
685
 
727
- <section aria-label="Direct edit" className="flex flex-col gap-2 border-t border-[var(--oke-line)] pt-4">
686
+ <section
687
+ aria-label="Direct edit"
688
+ className="flex flex-col gap-2 border-t border-[var(--oke-line)] pt-4"
689
+ >
728
690
  <h3 className="text-sm font-medium">Direct edit</h3>
729
691
  <p className="text-sm text-[var(--oke-muted)]">
730
- Not a flow execution. Before saving, preview names what will not
731
- fire.
692
+ Not a flow execution. Before saving, preview names what will not fire.
732
693
  </p>
733
694
  {willNot && !willNot.empty ? (
734
695
  <ul className="text-sm">
@@ -7,20 +7,10 @@ import { Link, useNavigate, useSearch } from "@tanstack/react-router";
7
7
  import { clsx } from "clsx";
8
8
  import { useEffect, useMemo, useState } from "react";
9
9
  import { createRowBuffer, matchesQuery } from "../../../flows/buffer.ts";
10
- import {
11
- buildCausalChain,
12
- groupTraceRoots,
13
- initialFocusSpanId,
14
- } from "../../../traces/chain.ts";
10
+ import { buildCausalChain, groupTraceRoots, initialFocusSpanId } from "../../../traces/chain.ts";
15
11
  import { criticalPathSpanIds } from "../../../traces/critical-path.ts";
16
- import {
17
- parseEffectFilter,
18
- traceMatchesEffectFilter,
19
- } from "../../../traces/filter.ts";
20
- import {
21
- foldTimeline,
22
- intervalsFromSpans,
23
- } from "../../../traces/fold.ts";
12
+ import { parseEffectFilter, traceMatchesEffectFilter } from "../../../traces/filter.ts";
13
+ import { foldTimeline, intervalsFromSpans } from "../../../traces/fold.ts";
24
14
  import { miniWaterfall, rootErrorCode } from "../../../traces/mini.ts";
25
15
  import { replayDecision } from "../../../traces/replay.ts";
26
16
  import {
@@ -95,10 +85,7 @@ export function TracesPanel() {
95
85
  refetchInterval: 5_000,
96
86
  });
97
87
 
98
- const spans = useMemo(
99
- () => (runsQuery.data ?? []).map(rowToSpan),
100
- [runsQuery.data],
101
- );
88
+ const spans = useMemo(() => (runsQuery.data ?? []).map(rowToSpan), [runsQuery.data]);
102
89
 
103
90
  // Seed / update buffer without moving the ground (console §7.2).
104
91
  useEffect(() => {
@@ -144,15 +131,9 @@ export function TracesPanel() {
144
131
  (search.trace
145
132
  ? groupTraceRoots(visibleSpans).find((r) => r.rootId === search.trace)
146
133
  : undefined);
147
- const focusId = openRoot
148
- ? initialFocusSpanId(openRoot.spans, search.span)
149
- : undefined;
150
- const chain = focusId
151
- ? buildCausalChain(visibleSpans, focusId)
152
- : null;
153
- const critical = chain
154
- ? criticalPathSpanIds(chain.connected)
155
- : new Set<string>();
134
+ const focusId = openRoot ? initialFocusSpanId(openRoot.spans, search.span) : undefined;
135
+ const chain = focusId ? buildCausalChain(visibleSpans, focusId) : null;
136
+ const critical = chain ? criticalPathSpanIds(chain.connected) : new Set<string>();
156
137
  const folded = chain
157
138
  ? foldTimeline(
158
139
  intervalsFromSpans(chain.connected),
@@ -183,15 +164,9 @@ export function TracesPanel() {
183
164
  <div className="flex h-full min-h-0 flex-col">
184
165
  <header className="flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4">
185
166
  <div className="flex flex-col gap-1">
186
- <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
187
- Traces
188
- </p>
189
- <h1 className="text-xl font-semibold tracking-tight">
190
- Causal chain
191
- </h1>
192
- <p className="text-xs text-[var(--oke-muted)]">
193
- Sampling: {samplingLabel(liveBoosts)}
194
- </p>
167
+ <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">Traces</p>
168
+ <h1 className="text-xl font-semibold tracking-tight">Causal chain</h1>
169
+ <p className="text-xs text-[var(--oke-muted)]">Sampling: {samplingLabel(liveBoosts)}</p>
195
170
  </div>
196
171
  <label className="flex flex-col gap-1 text-sm">
197
172
  <span className="text-[var(--oke-muted)]">Filter by effect</span>
@@ -201,9 +176,7 @@ export function TracesPanel() {
201
176
  value={search.effect ?? ""}
202
177
  onChange={(e) => {
203
178
  const v = e.target.value;
204
- setSearch(
205
- setEffectFilter(search, v ? parseEffectFilter(v) : null),
206
- );
179
+ setSearch(setEffectFilter(search, v ? parseEffectFilter(v) : null));
207
180
  }}
208
181
  >
209
182
  <option value="">All effects</option>
@@ -219,10 +192,7 @@ export function TracesPanel() {
219
192
  type="button"
220
193
  variant="ghost"
221
194
  onClick={() => {
222
- const flow =
223
- openRoot?.root.flow ??
224
- roots[0]?.root.flow ??
225
- "bookings.create";
195
+ const flow = openRoot?.root.flow ?? roots[0]?.root.flow ?? "bookings.create";
226
196
  setBoosts((b) => boostFlowFully(b, flow));
227
197
  }}
228
198
  >
@@ -245,9 +215,7 @@ export function TracesPanel() {
245
215
  className="min-h-0 overflow-auto border-r border-[var(--oke-line)]"
246
216
  >
247
217
  {runsQuery.isLoading ? (
248
- <p className="px-6 py-8 text-sm text-[var(--oke-muted)]">
249
- Loading traces…
250
- </p>
218
+ <p className="px-6 py-8 text-sm text-[var(--oke-muted)]">Loading traces…</p>
251
219
  ) : roots.length === 0 ? (
252
220
  <p className="px-6 py-8 text-sm text-[var(--oke-muted)]">
253
221
  No traces yet. Invoke a flow or wait for traffic.
@@ -311,14 +279,11 @@ export function TracesPanel() {
311
279
  <div className="flex flex-col gap-6">
312
280
  <div className="flex flex-wrap items-start justify-between gap-3">
313
281
  <div>
314
- <h2 className="text-lg font-semibold">
315
- {chain.current.flow}
316
- </h2>
282
+ <h2 className="text-lg font-semibold">{chain.current.flow}</h2>
317
283
  <p className="text-xs text-[var(--oke-muted)]">
318
284
  {chain.connected.length} span
319
- {chain.connected.length === 1 ? "" : "s"} · wall{" "}
320
- {folded.wallDurationMs}ms · display scale{" "}
321
- {Math.round(folded.displayDurationMs)}ms
285
+ {chain.connected.length === 1 ? "" : "s"} · wall {folded.wallDurationMs}ms ·
286
+ display scale {Math.round(folded.displayDurationMs)}ms
322
287
  </p>
323
288
  </div>
324
289
  <div className="flex flex-wrap gap-2">
@@ -331,20 +296,14 @@ export function TracesPanel() {
331
296
  </Link>
332
297
  <Button
333
298
  type="button"
334
- variant={
335
- decision?.mode === "dry-run" ? "external" : "primary"
336
- }
299
+ variant={decision?.mode === "dry-run" ? "external" : "primary"}
337
300
  disabled={replay.isPending}
338
301
  title={
339
- decision?.mode === "dry-run"
340
- ? decision.reason
341
- : "Replay from the journal"
302
+ decision?.mode === "dry-run" ? decision.reason : "Replay from the journal"
342
303
  }
343
304
  onClick={() => replay.mutate()}
344
305
  >
345
- {decision?.mode === "dry-run"
346
- ? "Dry-run replay"
347
- : "Replay"}
306
+ {decision?.mode === "dry-run" ? "Dry-run replay" : "Replay"}
348
307
  </Button>
349
308
  <Button
350
309
  type="button"
@@ -357,10 +316,7 @@ export function TracesPanel() {
357
316
  </div>
358
317
 
359
318
  {decision?.mode === "dry-run" ? (
360
- <p
361
- role="note"
362
- className="text-sm text-[var(--oke-external)]"
363
- >
319
+ <p role="note" className="text-sm text-[var(--oke-external)]">
364
320
  {decision.reason}
365
321
  </p>
366
322
  ) : null}
@@ -373,18 +329,14 @@ export function TracesPanel() {
373
329
  <button
374
330
  type="button"
375
331
  className="min-h-8 text-sm text-[var(--oke-muted)]"
376
- onClick={() =>
377
- setSearch({ ...search, span: p.id })
378
- }
332
+ onClick={() => setSearch({ ...search, span: p.id })}
379
333
  >
380
334
  {p.flow}
381
335
  </button>
382
336
  </li>
383
337
  ))}
384
338
  <li aria-current="true">
385
- <span className="text-sm font-medium">
386
- {chain.current.flow}
387
- </span>
339
+ <span className="text-sm font-medium">{chain.current.flow}</span>
388
340
  {chain.current.errorCode ? (
389
341
  <span
390
342
  role="status"
@@ -402,9 +354,7 @@ export function TracesPanel() {
402
354
  <button
403
355
  type="button"
404
356
  className="min-h-8 text-sm text-[var(--oke-muted)]"
405
- onClick={() =>
406
- setSearch({ ...search, span: c.id })
407
- }
357
+ onClick={() => setSearch({ ...search, span: c.id })}
408
358
  >
409
359
  {c.flow}
410
360
  {peakSpanTier(c.effects) === "external" ? (
@@ -417,10 +367,7 @@ export function TracesPanel() {
417
367
  </div>
418
368
 
419
369
  <div>
420
- <h3
421
- id="waterfall-heading"
422
- className="mb-2 text-sm font-medium"
423
- >
370
+ <h3 id="waterfall-heading" className="mb-2 text-sm font-medium">
424
371
  Waterfall
425
372
  </h3>
426
373
  <ul
@@ -441,9 +388,7 @@ export function TracesPanel() {
441
388
  type="button"
442
389
  aria-expanded={seg.expanded}
443
390
  className="h-full min-h-10 w-full border border-dashed border-[var(--oke-line)] px-1 font-mono text-[10px] text-[var(--oke-muted)]"
444
- onClick={() =>
445
- setSearch(toggleFold(search, seg.id))
446
- }
391
+ onClick={() => setSearch(toggleFold(search, seg.id))}
447
392
  >
448
393
  {seg.label}
449
394
  </button>
@@ -459,8 +404,7 @@ export function TracesPanel() {
459
404
  seg.tier === "external"
460
405
  ? "bg-[var(--oke-external)] text-black"
461
406
  : "bg-[color-mix(in_oklab,var(--oke-accent)_55%,transparent)]",
462
- seg.failed &&
463
- "outline outline-2 outline-[var(--oke-danger)]",
407
+ seg.failed && "outline outline-2 outline-[var(--oke-danger)]",
464
408
  )}
465
409
  style={{
466
410
  flex: `${seg.displayMs} 1 0`,
@@ -478,8 +422,7 @@ export function TracesPanel() {
478
422
  })}
479
423
  </ul>
480
424
  <p className="mt-2 text-xs text-[var(--oke-muted)]">
481
- Critical path at full opacity · dead time folded into
482
- expandable bars
425
+ Critical path at full opacity · dead time folded into expandable bars
483
426
  </p>
484
427
  </div>
485
428
  </div>
@@ -507,11 +450,7 @@ function rowToSpan(row: RunsListRow): TraceSpan {
507
450
  };
508
451
  }
509
452
 
510
- function MiniWaterfall({
511
- bars,
512
- }: {
513
- readonly bars: ReturnType<typeof miniWaterfall>;
514
- }) {
453
+ function MiniWaterfall({ bars }: { readonly bars: ReturnType<typeof miniWaterfall> }) {
515
454
  return (
516
455
  <div
517
456
  aria-hidden="true"
@@ -53,11 +53,8 @@ export function VaultPanel() {
53
53
  });
54
54
 
55
55
  const secrets = listQuery.data?.secrets ?? [];
56
- const env = listQuery.data?.env ?? "dev";
57
- const groups = useMemo(
58
- () => groupByKind(secrets, search.q ?? ""),
59
- [secrets, search.q],
60
- );
56
+ const env = listQuery.data?.env ?? "local";
57
+ const groups = useMemo(() => groupByKind(secrets, search.q ?? ""), [secrets, search.q]);
61
58
  const open = secrets.find((s) => s.name === search.name);
62
59
  const blast = open ? formatBlastRadius(open.blastRadius) : null;
63
60
  const setConfirm = setConfirmation({ production: true });
@@ -144,9 +141,7 @@ export function VaultPanel() {
144
141
  <Input
145
142
  aria-label="Filter vault"
146
143
  value={search.q ?? ""}
147
- onChange={(e) =>
148
- setSearch({ ...search, q: e.currentTarget.value || undefined })
149
- }
144
+ onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
150
145
  />
151
146
  </label>
152
147
  <Button
@@ -198,9 +193,7 @@ export function VaultPanel() {
198
193
  >
199
194
  <span className="font-mono">{s.name}</span>
200
195
  <span className="truncate text-xs">
201
- {s.sensitive
202
- ? (s.fingerprint ?? "unset")
203
- : (s.cleartext ?? "unset")}
196
+ {s.sensitive ? (s.fingerprint ?? "unset") : (s.cleartext ?? "unset")}
204
197
  </span>
205
198
  {s.blastRadius.count > 0 ? (
206
199
  <span role="status" className="text-xs text-[var(--oke-danger)]">
@@ -227,24 +220,17 @@ export function VaultPanel() {
227
220
  >
228
221
  {!open ? (
229
222
  <p className="text-sm text-[var(--oke-muted)]">
230
- Select a contract to inspect fingerprints, resolution, and
231
- readers.
223
+ Select a contract to inspect fingerprints, resolution, and readers.
232
224
  </p>
233
225
  ) : (
234
226
  <div className="flex max-w-2xl flex-col gap-6">
235
227
  <div>
236
- <h2 className="font-mono text-lg text-[var(--oke-fg)]">
237
- {open.name}
238
- </h2>
228
+ <h2 className="font-mono text-lg text-[var(--oke-fg)]">{open.name}</h2>
239
229
  {open.description ? (
240
- <p className="text-sm text-[var(--oke-muted)]">
241
- {open.description}
242
- </p>
230
+ <p className="text-sm text-[var(--oke-muted)]">{open.description}</p>
243
231
  ) : null}
244
232
  {open.rotate ? (
245
- <p className="text-sm text-[var(--oke-muted)]">
246
- Rotate hint: {open.rotate}
247
- </p>
233
+ <p className="text-sm text-[var(--oke-muted)]">Rotate hint: {open.rotate}</p>
248
234
  ) : null}
249
235
  </div>
250
236
 
@@ -254,10 +240,12 @@ export function VaultPanel() {
254
240
  <ul className="space-y-1 font-mono text-sm">
255
241
  {Object.entries(open.fingerprints).map(([e, fp]) => (
256
242
  <li key={e}>
257
- <span className="text-[var(--oke-muted)]">{e}:</span>{" "}
258
- {fp}
243
+ <span className="text-[var(--oke-muted)]">{e}:</span> {fp}
259
244
  {open.sharedFingerprintEnvs.includes(e) ? (
260
- <span role="status" className="ml-2 text-[var(--oke-warn,var(--oke-muted))]">
245
+ <span
246
+ role="status"
247
+ className="ml-2 text-[var(--oke-warn,var(--oke-muted))]"
248
+ >
261
249
  (matches {env} — warning, may be deliberate)
262
250
  </span>
263
251
  ) : null}
@@ -280,32 +268,22 @@ export function VaultPanel() {
280
268
  {open.resolution.map((step) => (
281
269
  <li
282
270
  key={step.source}
283
- className={
284
- step.won
285
- ? "text-[var(--oke-fg)]"
286
- : "text-[var(--oke-muted)]"
287
- }
271
+ className={step.won ? "text-[var(--oke-fg)]" : "text-[var(--oke-muted)]"}
288
272
  >
289
273
  <span className="font-mono">{step.source}</span>
290
- {step.won
291
- ? " — won"
292
- : step.present
293
- ? " — present (lost)"
294
- : " — absent"}
274
+ {step.won ? " — won" : step.present ? " — present (lost)" : " — absent"}
295
275
  </li>
296
276
  ))}
297
277
  </ol>
298
278
  <p className="mt-2 text-sm" role="status">
299
- Winner:{" "}
300
- <span className="font-mono">{open.winner ?? "none"}</span>
279
+ Winner: <span className="font-mono">{open.winner ?? "none"}</span>
301
280
  </p>
302
281
  </section>
303
282
 
304
283
  <section aria-label="Readers">
305
284
  <h3 className="mb-2 text-sm font-medium">Readers</h3>
306
285
  <p className="text-sm text-[var(--oke-muted)]">
307
- Flows that declare{" "}
308
- <code className="font-mono">fx.vault({open.name})</code>
286
+ Flows that declare <code className="font-mono">fx.vault({open.name})</code>
309
287
  </p>
310
288
  <ul className="mt-1 list-disc pl-5 font-mono text-sm">
311
289
  {open.readers.length === 0 ? (
@@ -317,21 +295,14 @@ export function VaultPanel() {
317
295
  </section>
318
296
 
319
297
  <section aria-label="Rotation blast radius">
320
- <h3 className="mb-2 text-sm font-medium">
321
- Rotation blast radius
322
- </h3>
298
+ <h3 className="mb-2 text-sm font-medium">Rotation blast radius</h3>
323
299
  {blast ? (
324
300
  <>
325
- <p
326
- className="text-sm"
327
- role={blast.warn ? "alert" : "status"}
328
- >
301
+ <p className="text-sm" role={blast.warn ? "alert" : "status"}>
329
302
  {blast.summary}
330
303
  </p>
331
304
  {blast.detail ? (
332
- <p className="text-sm text-[var(--oke-muted)]">
333
- {blast.detail}
334
- </p>
305
+ <p className="text-sm text-[var(--oke-muted)]">{blast.detail}</p>
335
306
  ) : null}
336
307
  {open.blastRadius.runIds.length > 0 ? (
337
308
  <p className="mt-1 font-mono text-xs text-[var(--oke-muted)]">
@@ -354,8 +325,7 @@ export function VaultPanel() {
354
325
  <section aria-label="Set or rotate" className="space-y-3">
355
326
  <h3 className="text-sm font-medium">Set / rotate</h3>
356
327
  <p className="text-sm text-[var(--oke-muted)]">
357
- Write-only. Values are never revealed after submit. No
358
- preview.
328
+ Write-only. Values are never revealed after submit. No preview.
359
329
  </p>
360
330
  <div className="flex gap-2">
361
331
  <Button
@@ -422,8 +392,7 @@ export function VaultPanel() {
422
392
  type="button"
423
393
  variant={action === "rotate" ? "danger" : "primary"}
424
394
  disabled={
425
- !value ||
426
- (action === "set" ? setMut.isPending : rotateMut.isPending)
395
+ !value || (action === "set" ? setMut.isPending : rotateMut.isPending)
427
396
  }
428
397
  onClick={() => {
429
398
  if (action === "set") setMut.mutate();
@@ -76,13 +76,11 @@ export function SetupWizard() {
76
76
  <section className="mx-auto flex max-w-md flex-col gap-6 px-6 py-16">
77
77
  <header className="flex flex-col gap-2">
78
78
  <OkeLogo className="h-7 w-auto text-[var(--oke-fg)]" />
79
- <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
80
- First admin
81
- </p>
79
+ <p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">First admin</p>
82
80
  <h1 className="text-3xl font-semibold tracking-tight">Console</h1>
83
81
  <p className="text-[var(--oke-muted)]">
84
- Enter the claim code printed once to the boot log. This wizard closes
85
- permanently after the first operator.
82
+ Enter the claim code printed once to the boot log. This wizard closes permanently after
83
+ the first operator.
86
84
  </p>
87
85
  </header>
88
86
  <form className="flex flex-col gap-4" onSubmit={onSubmit} autoComplete="off">
@@ -33,8 +33,7 @@ body {
33
33
  font-family: var(--oke-font);
34
34
  background:
35
35
  radial-gradient(1200px 600px at 10% -10%, #1a2433 0%, transparent 55%),
36
- radial-gradient(900px 500px at 100% 0%, #13201a 0%, transparent 50%),
37
- var(--oke-bg);
36
+ radial-gradient(900px 500px at 100% 0%, #13201a 0%, transparent 50%), var(--oke-bg);
38
37
  color: var(--oke-fg);
39
38
  font-variant-numeric: tabular-nums;
40
39
  }