okengine 0.2.6 → 0.3.2

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 (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
@@ -5,10 +5,7 @@
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { defineTable } from "../../elements/store.ts";
7
7
  import { classify } from "../../elements/store/classify.ts";
8
- import {
9
- DryRunWriteIsolationError,
10
- withDryRun,
11
- } from "../../kernel/dry-run.ts";
8
+ import { DryRunWriteIsolationError, withDryRun } from "../../kernel/dry-run.ts";
12
9
  import type { Manifest } from "../../manifest/types.ts";
13
10
  import {
14
11
  createManifestStoreRuntime,
@@ -79,21 +76,24 @@ describe("tenancyDeclared", () => {
79
76
  describe("projectStoresList", () => {
80
77
  test("groups facets and surfaces will-not-fire from effects", async () => {
81
78
  const runtime = await createManifestStoreRuntime(MANIFEST);
82
- const { stores, tenancyDeclared: tenancy, tenants } =
83
- await projectStoresList({
84
- manifest: MANIFEST,
85
- runtime,
86
- declaredFingerprint: "decl",
87
- appliedFingerprint: "decl",
88
- runs: [
89
- {
90
- flow: "bookings.mine",
91
- replicaLagMs: 120,
92
- tenant: "t1",
93
- effects: [{ kind: "read", resource: "sql:bookings" } as never],
94
- },
95
- ],
96
- });
79
+ const {
80
+ stores,
81
+ tenancyDeclared: tenancy,
82
+ tenants,
83
+ } = await projectStoresList({
84
+ manifest: MANIFEST,
85
+ runtime,
86
+ declaredFingerprint: "decl",
87
+ appliedFingerprint: "decl",
88
+ runs: [
89
+ {
90
+ flow: "bookings.mine",
91
+ replicaLagMs: 120,
92
+ tenant: "t1",
93
+ effects: [{ kind: "read", resource: "sql:bookings" } as never],
94
+ },
95
+ ],
96
+ });
97
97
 
98
98
  expect(tenancy).toBe(true);
99
99
  expect(tenants).toContain("t1");
@@ -226,8 +226,6 @@ describe("preview dual test (withDryRun)", () => {
226
226
  const { recordWouldHaveFired } = await import("../../kernel/dry-run.ts");
227
227
  recordWouldHaveFired("send", "booking-confirmed");
228
228
  });
229
- expect(wouldHaveFired).toEqual([
230
- { kind: "send", resource: "booking-confirmed" },
231
- ]);
229
+ expect(wouldHaveFired).toEqual([{ kind: "send", resource: "booking-confirmed" }]);
232
230
  });
233
231
  });
@@ -4,10 +4,7 @@
4
4
  * The UI must not reimplement cache invalidation, PII masking, or effects graph.
5
5
  */
6
6
 
7
- import {
8
- readSchemaFingerprint,
9
- schemaFingerprint,
10
- } from "../../cli/schema.ts";
7
+ import { readSchemaFingerprint, schemaFingerprint } from "../../cli/schema.ts";
11
8
  import {
12
9
  memoryFilesDriver,
13
10
  memoryIndexDriver,
@@ -29,16 +26,8 @@ import {
29
26
  type SqlStoreHandle,
30
27
  type StoreRuntime,
31
28
  } from "../../elements/store.ts";
32
- import {
33
- DryRunWriteIsolationError,
34
- withDryRun,
35
- } from "../../kernel/dry-run.ts";
36
- import type {
37
- Effects,
38
- Manifest,
39
- ResourceRef,
40
- StoreFacet,
41
- } from "../../manifest/types.ts";
29
+ import { DryRunWriteIsolationError, withDryRun } from "../../kernel/dry-run.ts";
30
+ import type { Effects, Manifest, ResourceRef, StoreFacet } from "../../manifest/types.ts";
42
31
  import type { WideEvent } from "../../runs/types.ts";
43
32
 
44
33
  /** Whether multi-tenancy is declared on the Manifest (off by default). */
@@ -114,9 +103,7 @@ export interface ProjectStoresOptions {
114
103
  *
115
104
  * @param options - Manifest, runtime, runs
116
105
  */
117
- export async function projectStoresList(
118
- options: ProjectStoresOptions,
119
- ): Promise<{
106
+ export async function projectStoresList(options: ProjectStoresOptions): Promise<{
120
107
  readonly stores: readonly ConsoleStoreRow[];
121
108
  readonly tenancyDeclared: boolean;
122
109
  readonly tenants: readonly string[];
@@ -146,8 +133,7 @@ export async function projectStoresList(
146
133
  const facet = store.facet;
147
134
  const ref = `${facet}:${name}` as ResourceRef;
148
135
  const children = childrenOf(manifest!, name, facet, store);
149
- const replicaLagMs =
150
- facet === "sql" ? latestReplicaLag(options.runs ?? [], children) : null;
136
+ const replicaLagMs = facet === "sql" ? latestReplicaLag(options.runs ?? [], children) : null;
151
137
 
152
138
  let warnings: ConsoleStoreRow["warnings"] = [];
153
139
  if (facet === "files" && options.runtime) {
@@ -194,10 +180,7 @@ function childrenOf(
194
180
  names.push(...Object.keys(store.tables ?? {}));
195
181
  // Also surface table suffixes from effects when Manifest tables are sparse.
196
182
  for (const flow of Object.values(manifest.flows ?? {})) {
197
- for (const ref of [
198
- ...(flow.effects?.reads ?? []),
199
- ...(flow.effects?.writes ?? []),
200
- ]) {
183
+ for (const ref of [...(flow.effects?.reads ?? []), ...(flow.effects?.writes ?? [])]) {
201
184
  if (ref.startsWith("sql:")) {
202
185
  const table = ref.slice(4);
203
186
  if (!names.includes(table)) names.push(table);
@@ -240,11 +223,7 @@ function childrenOf(
240
223
  });
241
224
  }
242
225
 
243
- function flowsTouching(
244
- manifest: Manifest,
245
- ref: ResourceRef,
246
- kind: "reads" | "writes",
247
- ): string[] {
226
+ function flowsTouching(manifest: Manifest, ref: ResourceRef, kind: "reads" | "writes"): string[] {
248
227
  const out: string[] = [];
249
228
  for (const [flowId, flow] of Object.entries(manifest.flows ?? {})) {
250
229
  if ((flow.effects?.[kind] ?? []).includes(ref)) out.push(flowId);
@@ -277,10 +256,7 @@ export function willNotFireFor(
277
256
  };
278
257
  }
279
258
 
280
- function piiColumnsFor(
281
- store: NonNullable<Manifest["stores"]>[string],
282
- table: string,
283
- ): string[] {
259
+ function piiColumnsFor(store: NonNullable<Manifest["stores"]>[string], table: string): string[] {
284
260
  const cols: string[] = [];
285
261
  const tableMeta = store.tables?.[table];
286
262
  for (const [col, tags] of Object.entries(tableMeta?.columns ?? {})) {
@@ -309,18 +285,14 @@ function latestReplicaLag(
309
285
  let lag: number | null = null;
310
286
  for (const run of runs) {
311
287
  if (run.replicaLagMs == null) continue;
312
- const touches = (run.effects ?? []).some(
313
- (e) => refs.has(e.resource as ResourceRef),
314
- );
288
+ const touches = (run.effects ?? []).some((e) => refs.has(e.resource as ResourceRef));
315
289
  if (!touches) continue;
316
290
  if (lag === null || run.replicaLagMs > lag) lag = run.replicaLagMs;
317
291
  }
318
292
  return lag;
319
293
  }
320
294
 
321
- function collectTenants(
322
- runs: ReadonlyArray<{ readonly tenant?: string | null }>,
323
- ): string[] {
295
+ function collectTenants(runs: ReadonlyArray<{ readonly tenant?: string | null }>): string[] {
324
296
  const set = new Set<string>();
325
297
  for (const r of runs) {
326
298
  if (r.tenant) set.add(r.tenant);
@@ -497,13 +469,9 @@ export async function editStore(
497
469
  },
498
470
  ): Promise<StoreEditResult> {
499
471
  const effectRef = (
500
- input.child && input.ref.startsWith("sql:")
501
- ? `sql:${input.child}`
502
- : input.ref
472
+ input.child && input.ref.startsWith("sql:") ? `sql:${input.child}` : input.ref
503
473
  ) as ResourceRef;
504
- const writers = manifest
505
- ? flowsTouching(manifest, effectRef, "writes")
506
- : [];
474
+ const writers = manifest ? flowsTouching(manifest, effectRef, "writes") : [];
507
475
  const willNotFire = willNotFireFor(manifest ?? { oke: "1.0", app: "" }, writers);
508
476
 
509
477
  if (options.dryRun) {
@@ -547,7 +515,12 @@ export async function editStore(
547
515
 
548
516
  /** Snapshot of a direct-edit target for dry-run rollback. */
549
517
  type EditSnapshot =
550
- | { readonly kind: "kv"; readonly ref: ResourceRef; readonly key: string; readonly value: unknown }
518
+ | {
519
+ readonly kind: "kv";
520
+ readonly ref: ResourceRef;
521
+ readonly key: string;
522
+ readonly value: unknown;
523
+ }
551
524
  | {
552
525
  readonly kind: "sql";
553
526
  readonly ref: ResourceRef;
@@ -578,10 +551,9 @@ async function snapshotEditTarget(
578
551
  effects: { reads: [input.ref] },
579
552
  })) as SqlStoreHandle;
580
553
  try {
581
- const rows = await sql.raw(
582
- `SELECT * FROM "${input.child}" WHERE "id" = ? LIMIT 1`,
583
- [input.id],
584
- );
554
+ const rows = await sql.raw(`SELECT * FROM "${input.child}" WHERE "id" = ? LIMIT 1`, [
555
+ input.id,
556
+ ]);
585
557
  return {
586
558
  kind: "sql",
587
559
  ref: input.ref,
@@ -602,10 +574,7 @@ async function snapshotEditTarget(
602
574
  return { kind: "none" };
603
575
  }
604
576
 
605
- async function restoreEditTarget(
606
- runtime: StoreRuntime,
607
- snapshot: EditSnapshot,
608
- ): Promise<void> {
577
+ async function restoreEditTarget(runtime: StoreRuntime, snapshot: EditSnapshot): Promise<void> {
609
578
  if (snapshot.kind === "kv") {
610
579
  const kv = (await runtime.openRef(snapshot.ref, {
611
580
  effects: { writes: [snapshot.ref] },
@@ -623,10 +592,7 @@ async function restoreEditTarget(
623
592
  })) as SqlStoreHandle;
624
593
  if (snapshot.row === null) {
625
594
  try {
626
- await sql.raw(
627
- `DELETE FROM "${snapshot.child}" WHERE "id" = ?`,
628
- [snapshot.id],
629
- );
595
+ await sql.raw(`DELETE FROM "${snapshot.child}" WHERE "id" = ?`, [snapshot.id]);
630
596
  } catch {
631
597
  /* table may not exist */
632
598
  }
@@ -635,10 +601,10 @@ async function restoreEditTarget(
635
601
  const cols = Object.keys(snapshot.row);
636
602
  const assignments = cols.map((c) => `"${c}" = ?`).join(", ");
637
603
  try {
638
- await sql.raw(
639
- `UPDATE "${snapshot.child}" SET ${assignments} WHERE "id" = ?`,
640
- [...cols.map((c) => snapshot.row![c]), snapshot.id],
641
- );
604
+ await sql.raw(`UPDATE "${snapshot.child}" SET ${assignments} WHERE "id" = ?`, [
605
+ ...cols.map((c) => snapshot.row![c]),
606
+ snapshot.id,
607
+ ]);
642
608
  } catch {
643
609
  /* best-effort restore */
644
610
  }
@@ -673,10 +639,7 @@ async function applyEdit(
673
639
  if (sets.length === 0) return;
674
640
  const assignments = sets.map((c) => `"${c}" = ?`).join(", ");
675
641
  const params = [...sets.map((c) => input.patch[c]), id];
676
- await sql.raw(
677
- `UPDATE "${table}" SET ${assignments} WHERE "id" = ?`,
678
- params,
679
- );
642
+ await sql.raw(`UPDATE "${table}" SET ${assignments} WHERE "id" = ?`, params);
680
643
  return;
681
644
  }
682
645
 
@@ -786,14 +749,9 @@ export async function runStoreSql(
786
749
  readonly routedRole: "primary" | "replica";
787
750
  }> {
788
751
  const trimmed = sqlText.trim();
789
- const isWrite =
790
- /^(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE)\b/i.test(
791
- trimmed,
792
- );
752
+ const isWrite = /^(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE)\b/i.test(trimmed);
793
753
  if (isWrite && !options.allowWrite) {
794
- throw new Error(
795
- "SQL console is read-only by default — write requires console:store.sql:write",
796
- );
754
+ throw new Error("SQL console is read-only by default — write requires console:store.sql:write");
797
755
  }
798
756
  const handle = (await runtime.openRef(ref, {
799
757
  effects: isWrite ? { writes: [ref] } : { reads: [ref] },
@@ -814,10 +772,7 @@ export async function runStoreSql(
814
772
  * @param key - Cache key
815
773
  * @param writeRef - Written resource
816
774
  */
817
- export function cacheKeyInvalidatedBy(
818
- key: string,
819
- writeRef: ResourceRef,
820
- ): boolean {
775
+ export function cacheKeyInvalidatedBy(key: string, writeRef: ResourceRef): boolean {
821
776
  return isInvalidatedByWrite(key, { writes: [writeRef] });
822
777
  }
823
778
 
@@ -4,15 +4,8 @@
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { memoryVaultDriver } from "../../drivers/index.ts";
7
- import {
8
- createVaultRuntime,
9
- fingerprintSecretSync,
10
- vault,
11
- } from "../../elements/vault.ts";
12
- import {
13
- createMemoryJournalStore,
14
- type JournalRun,
15
- } from "../../kernel/journal.ts";
7
+ import { createVaultRuntime, fingerprintSecretSync, vault } from "../../elements/vault.ts";
8
+ import { createMemoryJournalStore, type JournalRun } from "../../kernel/journal.ts";
16
9
  import type { Manifest } from "../../manifest/types.ts";
17
10
  import {
18
11
  assertNoSecretLeak,
@@ -82,13 +75,13 @@ describe("projectVaultList", () => {
82
75
  const { secrets, env } = await projectVaultList({
83
76
  manifest: manifest(),
84
77
  runtime: rt,
85
- env: "dev",
78
+ env: "local",
86
79
  peerFingerprints: {
87
80
  STRIPE_KEY: { staging: fingerprintSecretSync(SECRET) },
88
81
  },
89
82
  });
90
83
 
91
- expect(env).toBe("dev");
84
+ expect(env).toBe("local");
92
85
  const stripe = secrets.find((s) => s.name === "STRIPE_KEY");
93
86
  const pub = secrets.find((s) => s.name === "PUBLIC_APP_URL");
94
87
  expect(stripe?.sensitive).toBe(true);
@@ -131,16 +124,12 @@ describe("projectVaultList", () => {
131
124
  const { secrets } = await projectVaultList({
132
125
  manifest: null,
133
126
  runtime: rt,
134
- env: "dev",
127
+ env: "local",
135
128
  });
136
129
  const row = secrets.find((s) => s.name === "KEY");
137
130
  expect(row?.winner).toBe(".env.local");
138
- expect(row?.resolution.find((s) => s.source === ".env.local")?.won).toBe(
139
- true,
140
- );
141
- expect(row?.resolution.find((s) => s.source === "driver")?.present).toBe(
142
- true,
143
- );
131
+ expect(row?.resolution.find((s) => s.source === ".env.local")?.won).toBe(true);
132
+ expect(row?.resolution.find((s) => s.source === "driver")?.present).toBe(true);
144
133
  expect(row?.resolution.find((s) => s.source === "driver")?.won).toBe(false);
145
134
  });
146
135
 
@@ -152,11 +141,9 @@ describe("projectVaultList", () => {
152
141
  const { secrets } = await projectVaultList({
153
142
  manifest: manifest(),
154
143
  runtime: rt,
155
- env: "dev",
144
+ env: "local",
156
145
  });
157
- expect(secrets.find((s) => s.name === "STRIPE_KEY")?.lastReadAt).toBe(
158
- 1_700_000_000_000,
159
- );
146
+ expect(secrets.find((s) => s.name === "STRIPE_KEY")?.lastReadAt).toBe(1_700_000_000_000);
160
147
  });
161
148
 
162
149
  test("blast radius queries journal — count + longest wake", async () => {
@@ -215,12 +202,10 @@ describe("projectVaultList", () => {
215
202
  manifest: manifest(),
216
203
  runtime: rt,
217
204
  journal,
218
- env: "dev",
205
+ env: "local",
219
206
  now: () => now,
220
207
  });
221
- expect(secrets.find((s) => s.name === "STRIPE_KEY")?.blastRadius.count).toBe(
222
- 2,
223
- );
208
+ expect(secrets.find((s) => s.name === "STRIPE_KEY")?.blastRadius.count).toBe(2);
224
209
  });
225
210
  });
226
211
 
@@ -234,9 +219,7 @@ describe("set / rotate", () => {
234
219
  });
235
220
  expect(result.name).toBe("STRIPE_KEY");
236
221
  expect(result.fingerprint).not.toBe(before);
237
- expect(result.fingerprint).toBe(
238
- fingerprintSecretSync("sk_rotated_value_xyz"),
239
- );
222
+ expect(result.fingerprint).toBe(fingerprintSecretSync("sk_rotated_value_xyz"));
240
223
  expect(JSON.stringify(result)).not.toContain("sk_rotated_value_xyz");
241
224
  });
242
225
 
@@ -6,17 +6,21 @@
6
6
  * rotation blast radius are derived — never reimplemented in the UI.
7
7
  */
8
8
 
9
+ import { readFileSync } from "node:fs";
9
10
  import { resolve } from "node:path";
10
11
  import type { ConfigEnv } from "../../config/index.ts";
11
- import { envVaultDriver, memoryVaultDriver } from "../../drivers/index.ts";
12
+ import { envVaultDriver, memoryVaultDriver, openbaoVaultDriver } from "../../drivers/index.ts";
13
+ import { parseDotenv } from "../../drivers/vault-dotenv-parse.ts";
12
14
  import {
13
15
  createVaultRuntime,
14
16
  vault as declareVault,
17
+ type VaultChainLayer,
15
18
  type VaultResolutionSource,
16
19
  type VaultResolutionStep,
17
20
  type VaultRuntime,
18
21
  type VaultSecretDecl,
19
22
  } from "../../elements/vault.ts";
23
+ import { resolveComposeEnvPath } from "../../elements/vault/chain.ts";
20
24
  import type { JournalRun, JournalStore } from "../../kernel/journal.ts";
21
25
  import type { Manifest } from "../../manifest/types.ts";
22
26
 
@@ -24,9 +28,7 @@ import type { Manifest } from "../../manifest/types.ts";
24
28
  export type VaultEnvLabel = ConfigEnv | "staging" | (string & {});
25
29
 
26
30
  /** Fingerprints keyed by environment — never values. */
27
- export type VaultFingerprintsByEnv = Readonly<
28
- Partial<Record<VaultEnvLabel, string>>
29
- >;
31
+ export type VaultFingerprintsByEnv = Readonly<Partial<Record<VaultEnvLabel, string>>>;
30
32
 
31
33
  /** Rotation blast radius from the durable journal (queried, not estimated). */
32
34
  export interface ConsoleVaultBlastRadius {
@@ -84,9 +86,7 @@ export interface ProjectVaultOptions {
84
86
  * Optional peer-environment fingerprints (e.g. staging from a remote
85
87
  * probe). Never values — fingerprints only.
86
88
  */
87
- readonly peerFingerprints?: Readonly<
88
- Record<string, VaultFingerprintsByEnv>
89
- >;
89
+ readonly peerFingerprints?: Readonly<Record<string, VaultFingerprintsByEnv>>;
90
90
  /** Durable journal — blast radius is queried, not estimated. */
91
91
  readonly journal?: JournalStore | null;
92
92
  readonly now?: () => number;
@@ -97,13 +97,11 @@ export interface ProjectVaultOptions {
97
97
  *
98
98
  * @param options - Manifest, runtime, journal
99
99
  */
100
- export async function projectVaultList(
101
- options: ProjectVaultOptions,
102
- ): Promise<{
100
+ export async function projectVaultList(options: ProjectVaultOptions): Promise<{
103
101
  readonly secrets: readonly ConsoleVaultRow[];
104
102
  readonly env: VaultEnvLabel;
105
103
  }> {
106
- const env = options.env ?? "dev";
104
+ const env = options.env ?? "local";
107
105
  const now = options.now ?? (() => Date.now());
108
106
  const names = collectNames(options.manifest, options.runtime);
109
107
  const journalRuns = options.journal
@@ -115,11 +113,7 @@ export async function projectVaultList(
115
113
  const contract = contractOf(name, options.manifest, options.runtime);
116
114
  const sensitive = contract.sensitive;
117
115
  const readers = readersOf(options.manifest, name);
118
- const blastRadius = blastRadiusOf(
119
- journalRuns,
120
- readers,
121
- now(),
122
- );
116
+ const blastRadius = blastRadiusOf(journalRuns, readers, now());
123
117
  const winner = options.runtime?.resolution(name) ?? null;
124
118
  const resolution = options.runtime?.resolutionChain(name) ?? [];
125
119
  const lastReadAt = options.runtime?.lastReadAt(name) ?? null;
@@ -141,17 +135,13 @@ export async function projectVaultList(
141
135
  cleartext = options.runtime?.cleartext(name) ?? null;
142
136
  }
143
137
 
144
- const sharedFingerprintEnvs = sensitive
145
- ? sharedEnvs(fingerprints, env, fingerprint)
146
- : [];
138
+ const sharedFingerprintEnvs = sensitive ? sharedEnvs(fingerprints, env, fingerprint) : [];
147
139
 
148
140
  secrets.push({
149
141
  name,
150
142
  kind: contract.kind,
151
143
  sensitive,
152
- ...(contract.description !== undefined
153
- ? { description: contract.description }
154
- : {}),
144
+ ...(contract.description !== undefined ? { description: contract.description } : {}),
155
145
  ...(contract.rotate !== undefined ? { rotate: contract.rotate } : {}),
156
146
  fingerprints,
157
147
  fingerprint,
@@ -187,9 +177,7 @@ export function setVaultValue(
187
177
  runtime.put(input.name, input.value);
188
178
  return {
189
179
  name: input.name,
190
- fingerprint: runtime.isSensitive(input.name)
191
- ? (runtime.fingerprint(input.name) ?? null)
192
- : null,
180
+ fingerprint: runtime.isSensitive(input.name) ? (runtime.fingerprint(input.name) ?? null) : null,
193
181
  };
194
182
  }
195
183
 
@@ -209,7 +197,7 @@ export function rotateVaultValue(
209
197
  /**
210
198
  * Build a VaultRuntime from Manifest contracts when no host runtime is attached.
211
199
  *
212
- * Uses the standard resolution chain: process.env → .env.local → .env.stack
200
+ * Uses the standard resolution chain: process.env → .env.local → .env.docker
213
201
  * → memory driver → (optional) dev fallback. Does not parse dotenv in the UI.
214
202
  *
215
203
  * @param manifest - Manifest snapshot
@@ -248,10 +236,26 @@ export async function createManifestVaultRuntime(
248
236
  });
249
237
 
250
238
  const seed = options.seed ?? {};
239
+ const composeEnv = resolveComposeEnvPath(cwd);
240
+ const envMap = parseDotenv(readFileSync(composeEnv.path, "utf8").toString());
241
+ const openbaoUrl = process.env.OKE_VAULT_URL ?? envMap.get("OKE_VAULT_URL");
242
+ const openbaoToken = process.env.OKE_VAULT_TOKEN ?? envMap.get("OKE_VAULT_TOKEN");
243
+ const openbaoMount = process.env.OKE_VAULT_MOUNT ?? envMap.get("OKE_VAULT_MOUNT") ?? "secret";
244
+ const driverLayer: VaultChainLayer =
245
+ openbaoUrl && openbaoToken
246
+ ? {
247
+ driver: openbaoVaultDriver,
248
+ source: "driver",
249
+ options: { url: openbaoUrl, token: openbaoToken, mount: openbaoMount },
250
+ }
251
+ : {
252
+ driver: memoryVaultDriver,
253
+ source: "driver",
254
+ options: { secrets: seed },
255
+ };
251
256
  const runtime = createVaultRuntime({
252
257
  secrets,
253
- allowDevFallbacks:
254
- options.allowDevFallbacks ?? (options.env ?? "dev") !== "prod",
258
+ allowDevFallbacks: options.allowDevFallbacks ?? (options.env ?? "local") !== "prod",
255
259
  now: options.now,
256
260
  chain: [
257
261
  { driver: envVaultDriver, source: "process.env" },
@@ -262,14 +266,10 @@ export async function createManifestVaultRuntime(
262
266
  },
263
267
  {
264
268
  driver: envVaultDriver,
265
- source: ".env.stack",
266
- options: { path: resolve(cwd, ".env.stack") },
267
- },
268
- {
269
- driver: memoryVaultDriver,
270
- source: "driver",
271
- options: { secrets: seed },
269
+ source: composeEnv.source,
270
+ options: { path: composeEnv.path },
272
271
  },
272
+ driverLayer,
273
273
  ],
274
274
  });
275
275
  await runtime.boot();
@@ -290,10 +290,7 @@ export function blastRadiusOf(
290
290
  ): ConsoleVaultBlastRadius {
291
291
  const readers = new Set(readerFlowIds);
292
292
  const affected = runs.filter(
293
- (r) =>
294
- r.status === "sleeping" &&
295
- r.wakeAt != null &&
296
- readers.has(r.flow),
293
+ (r) => r.status === "sleeping" && r.wakeAt != null && readers.has(r.flow),
297
294
  );
298
295
  if (affected.length === 0) {
299
296
  return {
@@ -323,10 +320,7 @@ export function blastRadiusOf(
323
320
  * @param manifest - Manifest
324
321
  * @param name - Secret name
325
322
  */
326
- export function readersOf(
327
- manifest: Manifest | null,
328
- name: string,
329
- ): readonly string[] {
323
+ export function readersOf(manifest: Manifest | null, name: string): readonly string[] {
330
324
  if (!manifest?.flows) return [];
331
325
  const out: string[] = [];
332
326
  for (const [flowId, flow] of Object.entries(manifest.flows)) {
@@ -339,10 +333,7 @@ export function readersOf(
339
333
  * @param manifest - Manifest
340
334
  * @param runtime - Runtime
341
335
  */
342
- function collectNames(
343
- manifest: Manifest | null,
344
- runtime: VaultRuntime | null,
345
- ): readonly string[] {
336
+ function collectNames(manifest: Manifest | null, runtime: VaultRuntime | null): readonly string[] {
346
337
  const set = new Set<string>();
347
338
  for (const name of Object.keys(manifest?.vault ?? {})) set.add(name);
348
339
  if (runtime) {
@@ -372,12 +363,8 @@ function contractOf(
372
363
  return {
373
364
  kind: fromRuntime.kind,
374
365
  sensitive: fromRuntime.sensitive,
375
- ...(fromRuntime.description !== undefined
376
- ? { description: fromRuntime.description }
377
- : {}),
378
- ...(fromRuntime.rotate !== undefined
379
- ? { rotate: fromRuntime.rotate }
380
- : {}),
366
+ ...(fromRuntime.description !== undefined ? { description: fromRuntime.description } : {}),
367
+ ...(fromRuntime.rotate !== undefined ? { rotate: fromRuntime.rotate } : {}),
381
368
  };
382
369
  }
383
370
  const fromManifest = manifest?.vault?.[name];
@@ -385,12 +372,8 @@ function contractOf(
385
372
  return {
386
373
  kind: sensitive ? "secret" : "config",
387
374
  sensitive,
388
- ...(fromManifest?.description !== undefined
389
- ? { description: fromManifest.description }
390
- : {}),
391
- ...(fromManifest?.rotate !== undefined
392
- ? { rotate: fromManifest.rotate }
393
- : {}),
375
+ ...(fromManifest?.description !== undefined ? { description: fromManifest.description } : {}),
376
+ ...(fromManifest?.rotate !== undefined ? { rotate: fromManifest.rotate } : {}),
394
377
  };
395
378
  }
396
379
 
@@ -414,17 +397,12 @@ function sharedEnvs(
414
397
  }
415
398
 
416
399
  /** Assert a Console row never embeds a secret value (tests / export safety). */
417
- export function assertNoSecretLeak(
418
- row: ConsoleVaultRow,
419
- knownSecrets: readonly string[],
420
- ): void {
400
+ export function assertNoSecretLeak(row: ConsoleVaultRow, knownSecrets: readonly string[]): void {
421
401
  const blob = JSON.stringify(row);
422
402
  for (const secret of knownSecrets) {
423
403
  if (secret.length === 0) continue;
424
404
  if (blob.includes(secret)) {
425
- throw new Error(
426
- `vault console leak: secret value appears in row for ${row.name}`,
427
- );
405
+ throw new Error(`vault console leak: secret value appears in row for ${row.name}`);
428
406
  }
429
407
  }
430
408
  }
@@ -3,16 +3,9 @@
3
3
  * (console §9.14).
4
4
  */
5
5
 
6
- import {
7
- ONCE_SECRET_ACK_LABEL,
8
- ONCE_SECRET_WARNING,
9
- } from "./acknowledgement.ts";
6
+ import { ONCE_SECRET_ACK_LABEL, ONCE_SECRET_WARNING } from "./acknowledgement.ts";
10
7
  import { formatAccessBlastRadius } from "./blast-radius.ts";
11
- import {
12
- ACCESS_BLAST_FIXTURE,
13
- ACCESS_EFFECTIVE_FIXTURE,
14
- ACCESS_LIST_FIXTURE,
15
- } from "./fixture.ts";
8
+ import { ACCESS_BLAST_FIXTURE, ACCESS_EFFECTIVE_FIXTURE, ACCESS_LIST_FIXTURE } from "./fixture.ts";
16
9
  import { hygieneLines } from "./hygiene.ts";
17
10
  import { formatProvenance } from "./provenance.ts";
18
11
 
@@ -34,9 +27,7 @@ export interface AccessA11yViewProps {
34
27
  export function AccessA11yView(props: AccessA11yViewProps) {
35
28
  const plane = props.plane ?? "user";
36
29
  const section =
37
- plane === "operator"
38
- ? ACCESS_LIST_FIXTURE.operatorPlane
39
- : ACCESS_LIST_FIXTURE.userPlane;
30
+ plane === "operator" ? ACCESS_LIST_FIXTURE.operatorPlane : ACCESS_LIST_FIXTURE.userPlane;
40
31
  const openKeyId = props.openKeyId ?? "key_demo";
41
32
  const openKey = section.keys.find((k) => k.id === openKeyId);
42
33
  const blast = formatAccessBlastRadius(ACCESS_BLAST_FIXTURE);
@@ -86,9 +77,7 @@ export function AccessA11yView(props: AccessA11yViewProps) {
86
77
  <li key={op.id}>
87
78
  <button type="button" style={{ minHeight: 32, width: "100%" }}>
88
79
  {op.name} ({op.email})
89
- {op.neverSignedIn ? (
90
- <span role="status"> never signed in</span>
91
- ) : null}
80
+ {op.neverSignedIn ? <span role="status"> never signed in</span> : null}
92
81
  </button>
93
82
  </li>
94
83
  ))}
@@ -135,9 +124,7 @@ export function AccessA11yView(props: AccessA11yViewProps) {
135
124
  style={{ minHeight: 32, width: "100%" }}
136
125
  >
137
126
  {k.name}
138
- {k.unused90d ? (
139
- <span role="status"> unused 90d+</span>
140
- ) : null}
127
+ {k.unused90d ? <span role="status"> unused 90d+</span> : null}
141
128
  </button>
142
129
  </li>
143
130
  ))}
@@ -146,9 +133,7 @@ export function AccessA11yView(props: AccessA11yViewProps) {
146
133
 
147
134
  <section aria-label="Grantable scopes">
148
135
  <h3>Grantable scopes</h3>
149
- <p>
150
- Only scopes you hold appear — impossibility taught by absence
151
- </p>
136
+ <p>Only scopes you hold appear — impossibility taught by absence</p>
152
137
  <ul>
153
138
  {section.grantableScopes.map((s) => (
154
139
  <li key={s}>