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
@@ -57,174 +57,113 @@ const indexRoute = createRoute({
57
57
  const overviewRoute = createRoute({
58
58
  getParentRoute: () => rootRoute,
59
59
  path: "/overview",
60
- component: lazyRouteComponent(
61
- () => import("./panels/Overview.tsx"),
62
- "default",
63
- ),
60
+ component: lazyRouteComponent(() => import("./panels/Overview.tsx"), "default"),
64
61
  });
65
62
 
66
63
  const flowsRoute = createRoute({
67
64
  getParentRoute: () => rootRoute,
68
65
  path: "/flows",
69
66
  validateSearch: (search: Record<string, unknown>) => parseFlowsSearch(search),
70
- component: lazyRouteComponent(
71
- () => import("./panels/Flows.tsx"),
72
- "default",
73
- ),
67
+ component: lazyRouteComponent(() => import("./panels/Flows.tsx"), "default"),
74
68
  });
75
69
 
76
70
  const tracesRoute = createRoute({
77
71
  getParentRoute: () => rootRoute,
78
72
  path: "/traces",
79
- validateSearch: (search: Record<string, unknown>) =>
80
- parseTracesSearch(search),
81
- component: lazyRouteComponent(
82
- () => import("./panels/Traces.tsx"),
83
- "default",
84
- ),
73
+ validateSearch: (search: Record<string, unknown>) => parseTracesSearch(search),
74
+ component: lazyRouteComponent(() => import("./panels/Traces.tsx"), "default"),
85
75
  });
86
76
 
87
77
  const runsRoute = createRoute({
88
78
  getParentRoute: () => rootRoute,
89
79
  path: "/runs",
90
- validateSearch: (search: Record<string, unknown>) =>
91
- parseRunsSearch(search),
92
- component: lazyRouteComponent(
93
- () => import("./panels/Runs.tsx"),
94
- "default",
95
- ),
80
+ validateSearch: (search: Record<string, unknown>) => parseRunsSearch(search),
81
+ component: lazyRouteComponent(() => import("./panels/Runs.tsx"), "default"),
96
82
  });
97
83
 
98
84
  const signalsRoute = createRoute({
99
85
  getParentRoute: () => rootRoute,
100
86
  path: "/signals",
101
- validateSearch: (search: Record<string, unknown>) =>
102
- parseSignalsSearch(search),
103
- component: lazyRouteComponent(
104
- () => import("./panels/Signals.tsx"),
105
- "default",
106
- ),
87
+ validateSearch: (search: Record<string, unknown>) => parseSignalsSearch(search),
88
+ component: lazyRouteComponent(() => import("./panels/Signals.tsx"), "default"),
107
89
  });
108
90
 
109
91
  const storeRoute = createRoute({
110
92
  getParentRoute: () => rootRoute,
111
93
  path: "/store",
112
- validateSearch: (search: Record<string, unknown>) =>
113
- parseStoreSearch(search),
114
- component: lazyRouteComponent(
115
- () => import("./panels/Store.tsx"),
116
- "default",
117
- ),
94
+ validateSearch: (search: Record<string, unknown>) => parseStoreSearch(search),
95
+ component: lazyRouteComponent(() => import("./panels/Store.tsx"), "default"),
118
96
  });
119
97
 
120
98
  const vaultRoute = createRoute({
121
99
  getParentRoute: () => rootRoute,
122
100
  path: "/vault",
123
- validateSearch: (search: Record<string, unknown>) =>
124
- parseVaultSearch(search),
125
- component: lazyRouteComponent(
126
- () => import("./panels/Vault.tsx"),
127
- "default",
128
- ),
101
+ validateSearch: (search: Record<string, unknown>) => parseVaultSearch(search),
102
+ component: lazyRouteComponent(() => import("./panels/Vault.tsx"), "default"),
129
103
  });
130
104
 
131
105
  const gatesRoute = createRoute({
132
106
  getParentRoute: () => rootRoute,
133
107
  path: "/gates",
134
- validateSearch: (search: Record<string, unknown>) =>
135
- parseGatesSearch(search),
136
- component: lazyRouteComponent(
137
- () => import("./panels/Gates.tsx"),
138
- "default",
139
- ),
108
+ validateSearch: (search: Record<string, unknown>) => parseGatesSearch(search),
109
+ component: lazyRouteComponent(() => import("./panels/Gates.tsx"), "default"),
140
110
  });
141
111
 
142
112
  const clockRoute = createRoute({
143
113
  getParentRoute: () => rootRoute,
144
114
  path: "/clock",
145
- validateSearch: (search: Record<string, unknown>) =>
146
- parseClockSearch(search),
147
- component: lazyRouteComponent(
148
- () => import("./panels/Clock.tsx"),
149
- "default",
150
- ),
115
+ validateSearch: (search: Record<string, unknown>) => parseClockSearch(search),
116
+ component: lazyRouteComponent(() => import("./panels/Clock.tsx"), "default"),
151
117
  });
152
118
 
153
119
  const aiRoute = createRoute({
154
120
  getParentRoute: () => rootRoute,
155
121
  path: "/ai",
156
122
  validateSearch: (search: Record<string, unknown>) => parseAiSearch(search),
157
- component: lazyRouteComponent(
158
- () => import("./panels/Ai.tsx"),
159
- "default",
160
- ),
123
+ component: lazyRouteComponent(() => import("./panels/Ai.tsx"), "default"),
161
124
  });
162
125
 
163
126
  const channelsRoute = createRoute({
164
127
  getParentRoute: () => rootRoute,
165
128
  path: "/channels",
166
- validateSearch: (search: Record<string, unknown>) =>
167
- parseChannelsSearch(search),
168
- component: lazyRouteComponent(
169
- () => import("./panels/Channels.tsx"),
170
- "default",
171
- ),
129
+ validateSearch: (search: Record<string, unknown>) => parseChannelsSearch(search),
130
+ component: lazyRouteComponent(() => import("./panels/Channels.tsx"), "default"),
172
131
  });
173
132
 
174
133
  const architectureRoute = createRoute({
175
134
  getParentRoute: () => rootRoute,
176
135
  path: "/architecture",
177
- validateSearch: (search: Record<string, unknown>) =>
178
- parseArchitectureSearch(search),
179
- component: lazyRouteComponent(
180
- () => import("./panels/Architecture.tsx"),
181
- "default",
182
- ),
136
+ validateSearch: (search: Record<string, unknown>) => parseArchitectureSearch(search),
137
+ component: lazyRouteComponent(() => import("./panels/Architecture.tsx"), "default"),
183
138
  });
184
139
 
185
140
  const accessRoute = createRoute({
186
141
  getParentRoute: () => rootRoute,
187
142
  path: "/access",
188
- validateSearch: (search: Record<string, unknown>) =>
189
- parseAccessSearch(search),
190
- component: lazyRouteComponent(
191
- () => import("./panels/Access.tsx"),
192
- "default",
193
- ),
143
+ validateSearch: (search: Record<string, unknown>) => parseAccessSearch(search),
144
+ component: lazyRouteComponent(() => import("./panels/Access.tsx"), "default"),
194
145
  });
195
146
 
196
147
  const manifestDiffRoute = createRoute({
197
148
  getParentRoute: () => rootRoute,
198
149
  path: "/manifest-diff",
199
- validateSearch: (search: Record<string, unknown>) =>
200
- parseDiffSearch(search),
201
- component: lazyRouteComponent(
202
- () => import("./panels/Diff.tsx"),
203
- "default",
204
- ),
150
+ validateSearch: (search: Record<string, unknown>) => parseDiffSearch(search),
151
+ component: lazyRouteComponent(() => import("./panels/Diff.tsx"), "default"),
205
152
  });
206
153
 
207
154
  /** Alias for AI deep-links that historically used `/diff`. */
208
155
  const diffAliasRoute = createRoute({
209
156
  getParentRoute: () => rootRoute,
210
157
  path: "/diff",
211
- validateSearch: (search: Record<string, unknown>) =>
212
- parseDiffSearch(search),
213
- component: lazyRouteComponent(
214
- () => import("./panels/Diff.tsx"),
215
- "default",
216
- ),
158
+ validateSearch: (search: Record<string, unknown>) => parseDiffSearch(search),
159
+ component: lazyRouteComponent(() => import("./panels/Diff.tsx"), "default"),
217
160
  });
218
161
 
219
162
  const pluginsRoute = createRoute({
220
163
  getParentRoute: () => rootRoute,
221
164
  path: "/plugins",
222
- validateSearch: (search: Record<string, unknown>) =>
223
- parsePluginsSearch(search),
224
- component: lazyRouteComponent(
225
- () => import("./panels/Plugins.tsx"),
226
- "default",
227
- ),
165
+ validateSearch: (search: Record<string, unknown>) => parsePluginsSearch(search),
166
+ component: lazyRouteComponent(() => import("./panels/Plugins.tsx"), "default"),
228
167
  });
229
168
 
230
169
  const routeTree = rootRoute.addChildren([
@@ -249,9 +188,7 @@ const routeTree = rootRoute.addChildren([
249
188
  const router = createRouter({
250
189
  routeTree,
251
190
  defaultPendingComponent: () => (
252
- <div className="grid h-full place-items-center text-[var(--oke-muted)]">
253
- Loading panel…
254
- </div>
191
+ <div className="grid h-full place-items-center text-[var(--oke-muted)]">Loading panel…</div>
255
192
  ),
256
193
  });
257
194
 
@@ -269,9 +206,7 @@ createRoot(el).render(
269
206
  <QueryClientProvider client={queryClient}>
270
207
  <Suspense
271
208
  fallback={
272
- <div className="grid h-full place-items-center text-[var(--oke-muted)]">
273
- Loading…
274
- </div>
209
+ <div className="grid h-full place-items-center text-[var(--oke-muted)]">Loading…</div>
275
210
  }
276
211
  >
277
212
  <RouterProvider router={router} />
@@ -43,9 +43,7 @@ export function AccessPanel() {
43
43
  const [reason, setReason] = useState("");
44
44
  const [onceSecret, setOnceSecret] = useState<OnceSecretState | null>(null);
45
45
  const [blast, setBlast] = useState<AccessBlastRadius | null>(null);
46
- const [effective, setEffective] = useState<AccessEffectiveResponse | null>(
47
- null,
48
- );
46
+ const [effective, setEffective] = useState<AccessEffectiveResponse | null>(null);
49
47
 
50
48
  const setSearch = (next: AccessSearch) => {
51
49
  void navigate({
@@ -65,31 +63,22 @@ export function AccessPanel() {
65
63
  });
66
64
 
67
65
  const data = listQuery.data;
68
- const section =
69
- plane === "operator" ? data?.operatorPlane : data?.userPlane;
66
+ const section = plane === "operator" ? data?.operatorPlane : data?.userPlane;
70
67
  const grantable = section?.grantableScopes ?? [];
71
68
  const hygiene = data?.hygiene;
72
- const lines = useMemo(
73
- () => (hygiene ? hygieneLines(hygiene) : []),
74
- [hygiene],
75
- );
69
+ const lines = useMemo(() => (hygiene ? hygieneLines(hygiene) : []), [hygiene]);
76
70
 
77
71
  const openKey: AccessKeyRecord | undefined = section?.keys.find(
78
72
  (k) => search.kind === "key" && k.id === search.id,
79
73
  );
80
- const openRole = section?.roles.find(
81
- (r) => search.kind === "role" && r.id === search.id,
82
- );
74
+ const openRole = section?.roles.find((r) => search.kind === "role" && r.id === search.id);
83
75
  const openOperator = section?.operators?.find(
84
76
  (o) => search.kind === "operator" && o.id === search.id,
85
77
  );
86
- const openUser = section?.users?.find(
87
- (u) => search.kind === "user" && u.id === search.id,
88
- );
78
+ const openUser = section?.users?.find((u) => search.kind === "user" && u.id === search.id);
89
79
 
90
80
  const q = (search.q ?? "").toLowerCase();
91
- const filterText = (text: string) =>
92
- q.length === 0 || text.toLowerCase().includes(q);
81
+ const filterText = (text: string) => q.length === 0 || text.toLowerCase().includes(q);
93
82
 
94
83
  const createKey = useMutation({
95
84
  mutationFn: async () => {
@@ -195,10 +184,7 @@ export function AccessPanel() {
195
184
 
196
185
  const loadEffective = useMutation({
197
186
  mutationFn: async () => {
198
- const kind =
199
- search.kind === "invite" || !search.kind || !search.id
200
- ? null
201
- : search.kind;
187
+ const kind = search.kind === "invite" || !search.kind || !search.id ? null : search.kind;
202
188
  if (!kind || !search.id) throw new Error("Select a principal");
203
189
  const res = await consoleCalls.accessEffective({
204
190
  kind,
@@ -282,9 +268,7 @@ export function AccessPanel() {
282
268
  <Input
283
269
  aria-label="Filter access"
284
270
  value={search.q ?? ""}
285
- onChange={(e) =>
286
- setSearch({ ...search, q: e.currentTarget.value || undefined })
287
- }
271
+ onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
288
272
  />
289
273
  </label>
290
274
  </header>
@@ -322,9 +306,7 @@ export function AccessPanel() {
322
306
  key={op.id}
323
307
  selected={search.kind === "operator" && search.id === op.id}
324
308
  onClick={() =>
325
- setSearch(
326
- openAccessEntity(search, "operator", "operator", op.id),
327
- )
309
+ setSearch(openAccessEntity(search, "operator", "operator", op.id))
328
310
  }
329
311
  >
330
312
  {op.name}
@@ -344,9 +326,7 @@ export function AccessPanel() {
344
326
  <EntityButton
345
327
  key={u.id}
346
328
  selected={search.kind === "user" && search.id === u.id}
347
- onClick={() =>
348
- setSearch(openAccessEntity(search, "user", "user", u.id))
349
- }
329
+ onClick={() => setSearch(openAccessEntity(search, "user", "user", u.id))}
350
330
  >
351
331
  {u.name}
352
332
  </EntityButton>
@@ -385,9 +365,7 @@ export function AccessPanel() {
385
365
  }}
386
366
  >
387
367
  {k.name}
388
- {k.unused90d ? (
389
- <span className="text-[var(--oke-muted)]"> · 90d+</span>
390
- ) : null}
368
+ {k.unused90d ? <span className="text-[var(--oke-muted)]"> · 90d+</span> : null}
391
369
  {k.revokedAt != null ? (
392
370
  <span className="text-[var(--oke-danger)]"> · revoked</span>
393
371
  ) : null}
@@ -403,11 +381,7 @@ export function AccessPanel() {
403
381
  <EntityButton
404
382
  key={i.id}
405
383
  selected={search.kind === "invite" && search.id === i.id}
406
- onClick={() =>
407
- setSearch(
408
- openAccessEntity(search, "operator", "invite", i.id),
409
- )
410
- }
384
+ onClick={() => setSearch(openAccessEntity(search, "operator", "invite", i.id))}
411
385
  >
412
386
  {i.email}
413
387
  {i.expired ? (
@@ -443,8 +417,8 @@ export function AccessPanel() {
443
417
  <div className="space-y-4">
444
418
  <h2 className="text-lg font-medium">Create API key</h2>
445
419
  <p className="text-sm text-[var(--oke-muted)]">
446
- Only scopes you hold on the {plane} plane are shown —
447
- impossibility taught by absence. No preview.
420
+ Only scopes you hold on the {plane} plane are shown — impossibility taught by
421
+ absence. No preview.
448
422
  </p>
449
423
  <label className="flex flex-col gap-1 text-sm">
450
424
  <span>Name</span>
@@ -454,11 +428,7 @@ export function AccessPanel() {
454
428
  onChange={(e) => setKeyName(e.currentTarget.value)}
455
429
  />
456
430
  </label>
457
- <ScopePicker
458
- grantable={grantable}
459
- selected={selectedScopes}
460
- onToggle={toggleScope}
461
- />
431
+ <ScopePicker grantable={grantable} selected={selectedScopes} onToggle={toggleScope} />
462
432
  <Button
463
433
  type="button"
464
434
  disabled={createKey.isPending || !keyName.trim()}
@@ -476,9 +446,7 @@ export function AccessPanel() {
476
446
  <div className="space-y-6">
477
447
  <div>
478
448
  <h2 className="text-lg font-medium">{openKey.name}</h2>
479
- <p className="font-mono text-sm text-[var(--oke-muted)]">
480
- {openKey.id}
481
- </p>
449
+ <p className="font-mono text-sm text-[var(--oke-muted)]">{openKey.id}</p>
482
450
  <ul className="mt-2 font-mono text-sm">
483
451
  {openKey.scopes.map((s) => (
484
452
  <li key={s}>{s}</li>
@@ -490,18 +458,11 @@ export function AccessPanel() {
490
458
  <h3 className="text-sm font-medium">Revocation blast radius</h3>
491
459
  {blastLines ? (
492
460
  <>
493
- <p
494
- className="text-sm"
495
- role={blastLines.warn ? "alert" : "status"}
496
- >
461
+ <p className="text-sm" role={blastLines.warn ? "alert" : "status"}>
497
462
  {blastLines.volume}
498
463
  </p>
499
- <p className="text-sm text-[var(--oke-muted)]">
500
- {blastLines.lastUsed}
501
- </p>
502
- <p className="text-sm text-[var(--oke-muted)]">
503
- {blastLines.sources}
504
- </p>
464
+ <p className="text-sm text-[var(--oke-muted)]">{blastLines.lastUsed}</p>
465
+ <p className="text-sm text-[var(--oke-muted)]">{blastLines.sources}</p>
505
466
  <p className="text-sm" role="status">
506
467
  {blastLines.residual}
507
468
  </p>
@@ -554,18 +515,13 @@ export function AccessPanel() {
554
515
  </div>
555
516
  {revokeKey.error || rotateKey.error ? (
556
517
  <p role="alert" className="text-sm text-[var(--oke-danger)]">
557
- {(
558
- (revokeKey.error ?? rotateKey.error) as Error
559
- ).message}
518
+ {((revokeKey.error ?? rotateKey.error) as Error).message}
560
519
  </p>
561
520
  ) : null}
562
521
  </section>
563
522
  ) : (
564
523
  <p role="status" className="text-sm text-[var(--oke-danger)]">
565
- Revoked{" "}
566
- {openKey.revokedAt
567
- ? new Date(openKey.revokedAt).toISOString()
568
- : ""}
524
+ Revoked {openKey.revokedAt ? new Date(openKey.revokedAt).toISOString() : ""}
569
525
  </p>
570
526
  )}
571
527
 
@@ -583,14 +539,8 @@ export function AccessPanel() {
583
539
  ) : openRole ? (
584
540
  <div className="space-y-4">
585
541
  <h2 className="text-lg font-medium">{openRole.name}</h2>
586
- <p className="text-sm text-[var(--oke-muted)]">
587
- {openRole.description}
588
- </p>
589
- <ScopePicker
590
- grantable={grantable}
591
- selected={selectedScopes}
592
- onToggle={toggleScope}
593
- />
542
+ <p className="text-sm text-[var(--oke-muted)]">{openRole.description}</p>
543
+ <ScopePicker grantable={grantable} selected={selectedScopes} onToggle={toggleScope} />
594
544
  <Button
595
545
  type="button"
596
546
  disabled={grantRole.isPending}
@@ -611,9 +561,7 @@ export function AccessPanel() {
611
561
  </div>
612
562
  ) : openOperator || openUser ? (
613
563
  <div className="space-y-4">
614
- <h2 className="text-lg font-medium">
615
- {openOperator?.name ?? openUser?.name}
616
- </h2>
564
+ <h2 className="text-lg font-medium">{openOperator?.name ?? openUser?.name}</h2>
617
565
  <p className="text-sm text-[var(--oke-muted)]">
618
566
  {openOperator?.email ?? openUser?.email}
619
567
  </p>
@@ -631,12 +579,14 @@ export function AccessPanel() {
631
579
  <EffectiveTable provenance={provenance} />
632
580
  ) : (
633
581
  <p className="text-sm text-[var(--oke-muted)]">
634
- Choose an identity, role, or key. Planes stay separate; scopes you
635
- cannot grant do not appear.
582
+ Choose an identity, role, or key. Planes stay separate; scopes you cannot grant do not
583
+ appear.
636
584
  </p>
637
585
  )}
638
586
 
639
- {search.view === "effective" && provenance.length > 0 && (openKey || openRole || openOperator || openUser) ? (
587
+ {search.view === "effective" &&
588
+ provenance.length > 0 &&
589
+ (openKey || openRole || openOperator || openUser) ? (
640
590
  <div className="mt-6">
641
591
  <EffectiveTable provenance={provenance} />
642
592
  </div>
@@ -690,18 +640,10 @@ export function AccessPanel() {
690
640
  );
691
641
  }
692
642
 
693
- function PlaneGroup({
694
- label,
695
- children,
696
- }: {
697
- readonly label: string;
698
- readonly children: ReactNode;
699
- }) {
643
+ function PlaneGroup({ label, children }: { readonly label: string; readonly children: ReactNode }) {
700
644
  return (
701
645
  <section aria-label={label} className="border-t border-[var(--oke-line)]">
702
- <h3 className="px-4 py-2 text-xs uppercase tracking-wide text-[var(--oke-muted)]">
703
- {label}
704
- </h3>
646
+ <h3 className="px-4 py-2 text-xs uppercase tracking-wide text-[var(--oke-muted)]">{label}</h3>
705
647
  <ul className="pb-2">{children}</ul>
706
648
  </section>
707
649
  );
@@ -724,9 +666,7 @@ function EntityButton({
724
666
  onClick={onClick}
725
667
  className={clsx(
726
668
  "flex min-h-8 w-full items-center px-4 text-left text-sm",
727
- selected
728
- ? "bg-[var(--oke-accent)]/15 text-[var(--oke-fg)]"
729
- : "text-[var(--oke-fg)]",
669
+ selected ? "bg-[var(--oke-accent)]/15 text-[var(--oke-fg)]" : "text-[var(--oke-fg)]",
730
670
  )}
731
671
  >
732
672
  {children}
@@ -747,9 +687,7 @@ function ScopePicker({
747
687
  return (
748
688
  <section aria-label="Grantable scopes" className="space-y-2">
749
689
  <h3 className="text-sm font-medium">Grantable scopes</h3>
750
- <p className="text-sm text-[var(--oke-muted)]">
751
- Only scopes you hold appear
752
- </p>
690
+ <p className="text-sm text-[var(--oke-muted)]">Only scopes you hold appear</p>
753
691
  {grantable.length === 0 ? (
754
692
  <p role="status" className="text-sm text-[var(--oke-muted)]">
755
693
  No grantable scopes on this plane
@@ -786,9 +724,7 @@ function EffectiveTable({
786
724
  Every permission with provenance — inverse of the Gates simulator
787
725
  </p>
788
726
  <table className="w-full text-left text-sm">
789
- <caption className="sr-only">
790
- Effective permissions with provenance
791
- </caption>
727
+ <caption className="sr-only">Effective permissions with provenance</caption>
792
728
  <thead>
793
729
  <tr className="border-b border-[var(--oke-line)]">
794
730
  <th scope="col" className="py-2 pr-4 font-medium">