okengine 0.2.5 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +46 -38
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -1,8 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import {
3
- canDismissOnceSecret,
4
- ONCE_SECRET_ACK_LABEL,
5
- } from "./acknowledgement.ts";
2
+ import { canDismissOnceSecret, ONCE_SECRET_ACK_LABEL } from "./acknowledgement.ts";
6
3
 
7
4
  describe("once-secret acknowledgement", () => {
8
5
  test("dismiss requires explicit acknowledgement — not a soft done", () => {
@@ -16,9 +16,7 @@ export interface OnceSecretState {
16
16
  *
17
17
  * @param state - Dialog state
18
18
  */
19
- export function canDismissOnceSecret(
20
- state: Pick<OnceSecretState, "acknowledged">,
21
- ): boolean {
19
+ export function canDismissOnceSecret(state: Pick<OnceSecretState, "acknowledged">): boolean {
22
20
  return state.acknowledged === true;
23
21
  }
24
22
 
@@ -18,9 +18,7 @@ export interface AccessBlastRadiusLines {
18
18
  *
19
19
  * @param blast - Queried radius
20
20
  */
21
- export function formatAccessBlastRadius(
22
- blast: AccessBlastRadius,
23
- ): AccessBlastRadiusLines {
21
+ export function formatAccessBlastRadius(blast: AccessBlastRadius): AccessBlastRadiusLines {
24
22
  return {
25
23
  volume:
26
24
  blast.callVolume === 0
@@ -1,9 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import {
3
- revokeConfirmation,
4
- rotateConfirmation,
5
- validateTypedConfirm,
6
- } from "./confirmation.ts";
2
+ import { revokeConfirmation, rotateConfirmation, validateTypedConfirm } from "./confirmation.ts";
7
3
 
8
4
  describe("access confirmation", () => {
9
5
  test("revoke and rotate always require typed confirm (D)", () => {
@@ -5,10 +5,7 @@
5
5
  * Revoke and rotate follow D (irreversible → typed confirm + reason).
6
6
  */
7
7
 
8
- import {
9
- type ConfirmationPattern,
10
- validateTypedConfirm,
11
- } from "../flows/confirmation.ts";
8
+ import { type ConfirmationPattern, validateTypedConfirm } from "../flows/confirmation.ts";
12
9
 
13
10
  export { validateTypedConfirm };
14
11
  export type { ConfirmationPattern };
@@ -2,11 +2,7 @@
2
2
  * Fixture Access projection for unit tests and the axe gate.
3
3
  */
4
4
 
5
- import type {
6
- AccessBlastRadius,
7
- AccessEffectiveResponse,
8
- AccessListResponse,
9
- } from "./types.ts";
5
+ import type { AccessBlastRadius, AccessEffectiveResponse, AccessListResponse } from "./types.ts";
10
6
 
11
7
  /** Full list response fixture — planes separate. */
12
8
  export const ACCESS_LIST_FIXTURE: AccessListResponse = {
@@ -8,9 +8,7 @@ describe("grantable scopes (UI)", () => {
8
8
  const ops = ACCESS_LIST_FIXTURE.operatorPlane.grantableScopes;
9
9
  expect(user.every((s) => !s.startsWith("console:"))).toBe(true);
10
10
  expect(ops.every((s) => s.startsWith("console:"))).toBe(true);
11
- expect(visibleGrantableScopes(user, ["member", "console:x"])).toEqual([
12
- "member",
13
- ]);
11
+ expect(visibleGrantableScopes(user, ["member", "console:x"])).toEqual(["member"]);
14
12
  expect(allGrantable(["member"], user)).toBe(true);
15
13
  expect(allGrantable(["console:store.sql:read"], user)).toBe(false);
16
14
  });
@@ -16,9 +16,7 @@ export function visibleGrantableScopes(
16
16
  ): string[] {
17
17
  if (!candidates) return [...grantable].sort((a, b) => a.localeCompare(b));
18
18
  const allowed = new Set(grantable);
19
- return candidates
20
- .filter((s) => allowed.has(s))
21
- .sort((a, b) => a.localeCompare(b));
19
+ return candidates.filter((s) => allowed.has(s)).sort((a, b) => a.localeCompare(b));
22
20
  }
23
21
 
24
22
  /**
@@ -27,10 +25,7 @@ export function visibleGrantableScopes(
27
25
  * @param requested - Requested scopes
28
26
  * @param grantable - Grantable scopes
29
27
  */
30
- export function allGrantable(
31
- requested: readonly string[],
32
- grantable: readonly string[],
33
- ): boolean {
28
+ export function allGrantable(requested: readonly string[], grantable: readonly string[]): boolean {
34
29
  const allowed = new Set(grantable);
35
30
  return requested.every((s) => allowed.has(s));
36
31
  }
@@ -15,11 +15,7 @@ export type {
15
15
  AccessUserRecord,
16
16
  } from "./types.ts";
17
17
 
18
- export {
19
- ACCESS_BLAST_FIXTURE,
20
- ACCESS_EFFECTIVE_FIXTURE,
21
- ACCESS_LIST_FIXTURE,
22
- } from "./fixture.ts";
18
+ export { ACCESS_BLAST_FIXTURE, ACCESS_EFFECTIVE_FIXTURE, ACCESS_LIST_FIXTURE } from "./fixture.ts";
23
19
 
24
20
  export {
25
21
  parseAccessSearch,
@@ -42,10 +38,7 @@ export {
42
38
  type OnceSecretState,
43
39
  } from "./acknowledgement.ts";
44
40
 
45
- export {
46
- formatAccessBlastRadius,
47
- type AccessBlastRadiusLines,
48
- } from "./blast-radius.ts";
41
+ export { formatAccessBlastRadius, type AccessBlastRadiusLines } from "./blast-radius.ts";
49
42
 
50
43
  export { visibleGrantableScopes, allGrantable } from "./grantable.ts";
51
44
 
@@ -5,8 +5,6 @@ import { formatProvenance } from "./provenance.ts";
5
5
  describe("formatProvenance", () => {
6
6
  test("shows which role granted which scope", () => {
7
7
  const lines = formatProvenance(ACCESS_EFFECTIVE_FIXTURE);
8
- expect(lines.find((l) => l.scope === "booking:create")?.sources).toContain(
9
- "role member",
10
- );
8
+ expect(lines.find((l) => l.scope === "booking:create")?.sources).toContain("role member");
11
9
  });
12
10
  });
@@ -15,15 +15,11 @@ export interface ProvenanceLine {
15
15
  *
16
16
  * @param effective - Server response
17
17
  */
18
- export function formatProvenance(
19
- effective: AccessEffectiveResponse,
20
- ): ProvenanceLine[] {
18
+ export function formatProvenance(effective: AccessEffectiveResponse): ProvenanceLine[] {
21
19
  return effective.scopes.map((row) => ({
22
20
  scope: row.scope,
23
21
  sources: row.sources
24
- .map((s) =>
25
- s.kind === "direct" ? `direct (${s.name})` : `role ${s.name}`,
26
- )
22
+ .map((s) => (s.kind === "direct" ? `direct (${s.name})` : `role ${s.name}`))
27
23
  .join(", "),
28
24
  }));
29
25
  }
@@ -1,9 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import {
3
- openAccessEntity,
4
- parseAccessSearch,
5
- serializeAccessSearch,
6
- } from "./search.ts";
2
+ import { openAccessEntity, parseAccessSearch, serializeAccessSearch } from "./search.ts";
7
3
 
8
4
  describe("access search", () => {
9
5
  test("round-trip plane + entity", () => {
@@ -24,9 +24,7 @@ export type AccessSearch = z.infer<typeof AccessSearchSchema>;
24
24
  *
25
25
  * @param search - Raw router search
26
26
  */
27
- export function parseAccessSearch(
28
- search: Record<string, unknown>,
29
- ): AccessSearch {
27
+ export function parseAccessSearch(search: Record<string, unknown>): AccessSearch {
30
28
  const parsed = AccessSearchSchema.safeParse(search);
31
29
  return parsed.success ? parsed.data : {};
32
30
  }
@@ -36,9 +34,7 @@ export function parseAccessSearch(
36
34
  *
37
35
  * @param search - Search state
38
36
  */
39
- export function serializeAccessSearch(
40
- search: AccessSearch,
41
- ): Record<string, string> {
37
+ export function serializeAccessSearch(search: AccessSearch): Record<string, string> {
42
38
  const out: Record<string, string> = {};
43
39
  if (search.q) out.q = search.q;
44
40
  if (search.plane) out.plane = search.plane;
@@ -43,8 +43,7 @@ export function AiA11yView(props: AiA11yViewProps) {
43
43
  const prompts = filterPrompts(data.prompts, undefined);
44
44
  const agents = filterAgents(data.agents, undefined);
45
45
  const versions = versionsForPrompt(data.versions, promptName);
46
- const selected =
47
- versions.find((v) => v.version === version) ?? versions[versions.length - 1];
46
+ const selected = versions.find((v) => v.version === version) ?? versions[versions.length - 1];
48
47
  const baseline = versions.find((v) => v.version === 2) ?? versions[0];
49
48
  const decision =
50
49
  baseline && selected && baseline.version !== selected.version
@@ -78,9 +77,7 @@ export function AiA11yView(props: AiA11yViewProps) {
78
77
  {p.name}
79
78
  {p.version !== undefined ? ` @${p.version}` : ""}
80
79
  </button>
81
- <a href={manifestDiffHref(p.manifestDiffPath)}>
82
- Manifest Diff
83
- </a>
80
+ <a href={manifestDiffHref(p.manifestDiffPath)}>Manifest Diff</a>
84
81
  </li>
85
82
  ))}
86
83
  </ul>
@@ -180,11 +177,7 @@ export function AiA11yView(props: AiA11yViewProps) {
180
177
  <ul>
181
178
  {agents.map((a) => (
182
179
  <li key={a.name}>
183
- <button
184
- type="button"
185
- aria-pressed={a.name === agentName}
186
- style={{ minHeight: 32 }}
187
- >
180
+ <button type="button" aria-pressed={a.name === agentName} style={{ minHeight: 32 }}>
188
181
  {a.name}
189
182
  </button>
190
183
  </li>
@@ -194,14 +187,11 @@ export function AiA11yView(props: AiA11yViewProps) {
194
187
 
195
188
  {run ? (
196
189
  <section aria-label="Agent run trail">
197
- <h2>
198
- Agent run {run.id}
199
- </h2>
190
+ <h2>Agent run {run.id}</h2>
200
191
  <ol>
201
192
  {run.trail.map((step, i) => (
202
193
  <li key={`${step.tool}-${i}`}>
203
- <span>{trailStatusLabel(step.status)}</span>{" "}
204
- <span>{step.tool}</span>
194
+ <span>{trailStatusLabel(step.status)}</span> <span>{step.tool}</span>
205
195
  {step.status === "denied" && step.denial ? (
206
196
  <p role="status">
207
197
  DENIED by gate {step.denial.gate}: {step.denial.reason}
@@ -225,8 +215,7 @@ export function AiA11yView(props: AiA11yViewProps) {
225
215
  <ul>
226
216
  {data.fallbackChains.map((chain, i) => (
227
217
  <li key={i}>
228
- {chain.prompt}:{" "}
229
- {chain.attempts.map((a) => a.model).join(" → ")}
218
+ {chain.prompt}: {chain.attempts.map((a) => a.model).join(" ")}
230
219
  {chain.costConsequence !== null
231
220
  ? ` · cost consequence ${formatCost(chain.costConsequence)}`
232
221
  : ""}
@@ -16,8 +16,7 @@ describe("AI panel accessibility", () => {
16
16
  let container: HTMLElement;
17
17
 
18
18
  beforeEach(() => {
19
- (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
- true;
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
21
20
  window = new Window({ url: "http://console.test/ai" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -70,9 +69,7 @@ describe("AI panel accessibility", () => {
70
69
 
71
70
  test("axe reports zero violations at WCAG 2.2 AA", async () => {
72
71
  await act(async () => {
73
- root.render(
74
- <AiA11yView openPrompt="ticket-triage" openVersion={3} openAgent="support" />,
75
- );
72
+ root.render(<AiA11yView openPrompt="ticket-triage" openVersion={3} openAgent="support" />);
76
73
  });
77
74
 
78
75
  await new Promise((r) => setTimeout(r, 10));
@@ -4,14 +4,9 @@
4
4
 
5
5
  import type { AiListResponse, PromptVersionMetrics } from "./types.ts";
6
6
 
7
- function dist(
8
- samples: readonly number[],
9
- ): PromptVersionMetrics["cost"] {
7
+ function dist(samples: readonly number[]): PromptVersionMetrics["cost"] {
10
8
  const sorted = [...samples].sort((a, b) => a - b);
11
- const mean =
12
- sorted.length === 0
13
- ? 0
14
- : sorted.reduce((a, b) => a + b, 0) / sorted.length;
9
+ const mean = sorted.length === 0 ? 0 : sorted.reduce((a, b) => a + b, 0) / sorted.length;
15
10
  const p50 = sorted[Math.floor(sorted.length * 0.5)] ?? 0;
16
11
  const p95 = sorted[Math.floor(sorted.length * 0.95)] ?? p50;
17
12
  const min = sorted[0] ?? 0;
@@ -65,9 +65,7 @@ export function distributionSummary(
65
65
  *
66
66
  * @param buckets - Histogram
67
67
  */
68
- export function maxBucketCount(
69
- buckets: readonly AiDistributionBucket[],
70
- ): number {
68
+ export function maxBucketCount(buckets: readonly AiDistributionBucket[]): number {
71
69
  return buckets.reduce((m, b) => Math.max(m, b.count), 0);
72
70
  }
73
71
 
@@ -25,9 +25,7 @@ describe("AI group helpers", () => {
25
25
 
26
26
  test("allowPiiStanding keeps only acknowledgements", () => {
27
27
  expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)).toHaveLength(1);
28
- expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)[0]!.flowId).toBe(
29
- "support.createTicket",
30
- );
28
+ expect(allowPiiStanding(AI_LIST_FIXTURE.allowPii)[0]!.flowId).toBe("support.createTicket");
31
29
  });
32
30
 
33
31
  test("runsForAgent + filterAgents", () => {
@@ -24,8 +24,7 @@ export function filterPrompts(
24
24
  if (!needle) return prompts;
25
25
  return prompts.filter(
26
26
  (p) =>
27
- p.name.toLowerCase().includes(needle) ||
28
- (p.model?.toLowerCase().includes(needle) ?? false),
27
+ p.name.toLowerCase().includes(needle) || (p.model?.toLowerCase().includes(needle) ?? false),
29
28
  );
30
29
  }
31
30
 
@@ -58,9 +57,7 @@ export function versionsForPrompt(
58
57
  versions: readonly PromptVersionMetrics[],
59
58
  prompt: string,
60
59
  ): readonly PromptVersionMetrics[] {
61
- return versions
62
- .filter((v) => v.prompt === prompt)
63
- .sort((a, b) => a.version - b.version);
60
+ return versions.filter((v) => v.prompt === prompt).sort((a, b) => a.version - b.version);
64
61
  }
65
62
 
66
63
  /**
@@ -69,10 +66,7 @@ export function versionsForPrompt(
69
66
  * @param runs - All runs
70
67
  * @param agent - Agent name
71
68
  */
72
- export function runsForAgent(
73
- runs: readonly AgentRunRow[],
74
- agent: string,
75
- ): readonly AgentRunRow[] {
69
+ export function runsForAgent(runs: readonly AgentRunRow[], agent: string): readonly AgentRunRow[] {
76
70
  return runs.filter((r) => r.agent === agent);
77
71
  }
78
72
 
@@ -81,8 +75,6 @@ export function runsForAgent(
81
75
  *
82
76
  * @param rows - All allowPii projections
83
77
  */
84
- export function allowPiiStanding(
85
- rows: readonly AllowPiiRow[],
86
- ): readonly AllowPiiRow[] {
78
+ export function allowPiiStanding(rows: readonly AllowPiiRow[]): readonly AllowPiiRow[] {
87
79
  return rows.filter((r) => r.allowPii);
88
80
  }
@@ -54,13 +54,6 @@ export {
54
54
  trailStatusLabel,
55
55
  } from "./format.ts";
56
56
 
57
- export {
58
- AI_LIST_FIXTURE,
59
- VERSION_V2,
60
- VERSION_V3,
61
- } from "./fixture.ts";
57
+ export { AI_LIST_FIXTURE, VERSION_V2, VERSION_V3 } from "./fixture.ts";
62
58
 
63
- export {
64
- overBudgetFindings,
65
- type OverBudgetFinding,
66
- } from "./findings.ts";
59
+ export { overBudgetFindings, type OverBudgetFinding } from "./findings.ts";
@@ -4,10 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { VERSION_V2, VERSION_V3 } from "./fixture.ts";
7
- import {
8
- formatPromotionBlockers,
9
- promotionDecision,
10
- } from "./promotion.ts";
7
+ import { formatPromotionBlockers, promotionDecision } from "./promotion.ts";
11
8
  import type { PromptVersionMetrics } from "./types.ts";
12
9
 
13
10
  function withRates(
@@ -29,9 +26,7 @@ describe("promotionDecision", () => {
29
26
  expect(decision.numbers.fromSchemaInvalidRate).toBe(0.02);
30
27
  const lines = formatPromotionBlockers(decision);
31
28
  expect(lines.some((l) => l.includes("schema-invalid"))).toBe(true);
32
- expect(lines.some((l) => l.includes("improved — still blocked"))).toBe(
33
- true,
34
- );
29
+ expect(lines.some((l) => l.includes("improved — still blocked"))).toBe(true);
35
30
  });
36
31
 
37
32
  test("allows when schema and budget do not regress", () => {
@@ -56,9 +56,7 @@ export function promotionDecision(
56
56
  to: PromptVersionMetrics,
57
57
  ): PromotionDecision {
58
58
  if (from.prompt !== to.prompt) {
59
- throw new Error(
60
- `promotionDecision: prompt mismatch (${from.prompt} vs ${to.prompt})`,
61
- );
59
+ throw new Error(`promotionDecision: prompt mismatch (${from.prompt} vs ${to.prompt})`);
62
60
  }
63
61
 
64
62
  const numbers: PromotionNumbers = {
@@ -70,8 +68,7 @@ export function promotionDecision(
70
68
  toOverBudgetRate: to.overBudgetRate,
71
69
  fromP95Cost: from.cost.p95,
72
70
  toP95Cost: to.cost.p95,
73
- budgetMaxCostPerCall:
74
- to.budgetMaxCostPerCall ?? from.budgetMaxCostPerCall,
71
+ budgetMaxCostPerCall: to.budgetMaxCostPerCall ?? from.budgetMaxCostPerCall,
75
72
  };
76
73
 
77
74
  const blockers: PromotionBlocker[] = [];
@@ -86,11 +83,7 @@ export function promotionDecision(
86
83
  const budget = numbers.budgetMaxCostPerCall;
87
84
  if (to.overBudgetRate > from.overBudgetRate + 1e-12) {
88
85
  blockers.push("budget");
89
- } else if (
90
- budget !== null &&
91
- to.cost.p95 > budget &&
92
- from.cost.p95 <= budget
93
- ) {
86
+ } else if (budget !== null && to.cost.p95 > budget && from.cost.p95 <= budget) {
94
87
  blockers.push("budget");
95
88
  }
96
89
 
@@ -133,9 +126,7 @@ export function formatPromotionBlockers(
133
126
  }
134
127
  if (decision.blockers.includes("budget")) {
135
128
  const budget =
136
- n.budgetMaxCostPerCall !== null
137
- ? `budget $${n.budgetMaxCostPerCall.toFixed(4)}`
138
- : "budget";
129
+ n.budgetMaxCostPerCall !== null ? `budget $${n.budgetMaxCostPerCall.toFixed(4)}` : "budget";
139
130
  lines.push(
140
131
  `over-budget ${(n.fromOverBudgetRate * 100).toFixed(1)}% → ${(n.toOverBudgetRate * 100).toFixed(1)}%` +
141
132
  ` · p95 $${n.fromP95Cost.toFixed(4)} → $${n.toP95Cost.toFixed(4)} (${budget})`,
@@ -3,12 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
- import {
7
- manifestDiffHref,
8
- openPromptVersion,
9
- parseAiSearch,
10
- serializeAiSearch,
11
- } from "./search.ts";
6
+ import { manifestDiffHref, openPromptVersion, parseAiSearch, serializeAiSearch } from "./search.ts";
12
7
 
13
8
  describe("AI search", () => {
14
9
  test("round-trips prompt + version", () => {
@@ -28,11 +23,7 @@ describe("AI search", () => {
28
23
  });
29
24
 
30
25
  test("openPromptVersion clears agent selection", () => {
31
- const next = openPromptVersion(
32
- { agent: "support", run: "r1" },
33
- "ticket-triage",
34
- 3,
35
- );
26
+ const next = openPromptVersion({ agent: "support", run: "r1" }, "ticket-triage", 3);
36
27
  expect(next.agent).toBeUndefined();
37
28
  expect(next.prompt).toBe("ticket-triage");
38
29
  expect(next.version).toBe(3);
@@ -36,9 +36,7 @@ export function parseAiSearch(search: Record<string, unknown>): AiSearch {
36
36
  *
37
37
  * @param search - Typed search
38
38
  */
39
- export function serializeAiSearch(
40
- search: AiSearch,
41
- ): Record<string, string | number> {
39
+ export function serializeAiSearch(search: AiSearch): Record<string, string | number> {
42
40
  const out: Record<string, string | number> = {};
43
41
  if (search.prompt) out.prompt = search.prompt;
44
42
  if (search.version !== undefined) out.version = search.version;
@@ -55,11 +53,7 @@ export function serializeAiSearch(
55
53
  * @param prompt - Prompt name
56
54
  * @param version - Version
57
55
  */
58
- export function openPromptVersion(
59
- search: AiSearch,
60
- prompt: string,
61
- version: number,
62
- ): AiSearch {
56
+ export function openPromptVersion(search: AiSearch, prompt: string, version: number): AiSearch {
63
57
  return { ...search, prompt, version, agent: undefined, run: undefined };
64
58
  }
65
59
 
@@ -70,11 +64,7 @@ export function openPromptVersion(
70
64
  * @param agent - Agent name
71
65
  * @param run - Run id
72
66
  */
73
- export function openAgentRun(
74
- search: AiSearch,
75
- agent: string,
76
- run: string,
77
- ): AiSearch {
67
+ export function openAgentRun(search: AiSearch, agent: string, run: string): AiSearch {
78
68
  return { ...search, agent, run };
79
69
  }
80
70
 
@@ -88,14 +88,7 @@ export interface FallbackChainRow {
88
88
 
89
89
  /** Agent tool effect — Flows/Traces vocabulary. */
90
90
  export interface AgentToolEffect {
91
- readonly kind:
92
- | "read"
93
- | "write"
94
- | "emit"
95
- | "send"
96
- | "ask"
97
- | "secret"
98
- | "call";
91
+ readonly kind: "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
99
92
  readonly resource: string;
100
93
  }
101
94
 
@@ -4,10 +4,7 @@
4
4
  */
5
5
 
6
6
  import { buildCausalityGraph } from "../flows/graph.ts";
7
- import {
8
- ARCHITECTURE_RUNS_FIXTURE,
9
- ARCHITECTURE_TEST_MANIFEST,
10
- } from "./fixture.ts";
7
+ import { ARCHITECTURE_RUNS_FIXTURE, ARCHITECTURE_TEST_MANIFEST } from "./fixture.ts";
11
8
  import { LAYER_LABEL, ELEMENT_LAYERS } from "./types.ts";
12
9
  import { buildArchitectureView } from "./view.ts";
13
10
  import { layersOf, type ArchitectureSearch } from "./search.ts";
@@ -44,9 +41,7 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
44
41
  <header>
45
42
  <h1>Architecture</h1>
46
43
  <p>What shape — clustered by unit, typed layers, live traffic</p>
47
- <p role="status">
48
- Boundary crossings: {view.boundaryCrossingCount}
49
- </p>
44
+ <p role="status">Boundary crossings: {view.boundaryCrossingCount}</p>
50
45
  </header>
51
46
 
52
47
  <main id="architecture-main">
@@ -74,22 +69,12 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
74
69
  <fieldset>
75
70
  <legend>Focus depth</legend>
76
71
  <label>
77
- <input
78
- type="radio"
79
- name="depth"
80
- checked={view.depth === 1}
81
- onChange={() => {}}
82
- />{" "}
83
- 1 hop
72
+ <input type="radio" name="depth" checked={view.depth === 1} onChange={() => {}} /> 1
73
+ hop
84
74
  </label>
85
75
  <label>
86
- <input
87
- type="radio"
88
- name="depth"
89
- checked={view.depth === 2}
90
- onChange={() => {}}
91
- />{" "}
92
- 2 hops
76
+ <input type="radio" name="depth" checked={view.depth === 2} onChange={() => {}} /> 2
77
+ hops
93
78
  </label>
94
79
  </fieldset>
95
80
  </div>
@@ -116,15 +101,9 @@ export function ArchitectureA11yView(props: ArchitectureA11yViewProps) {
116
101
  <ul aria-label="Nodes">
117
102
  {view.nodes.map((n) => (
118
103
  <li key={n.id}>
119
- <button
120
- type="button"
121
- aria-pressed={n.focused === true}
122
- style={{ minHeight: 32 }}
123
- >
104
+ <button type="button" aria-pressed={n.focused === true} style={{ minHeight: 32 }}>
124
105
  {n.label}
125
- {n.kind === "unit" && n.flowCount !== undefined
126
- ? ` (${n.flowCount} flows)`
127
- : ""}
106
+ {n.kind === "unit" && n.flowCount !== undefined ? ` (${n.flowCount} flows)` : ""}
128
107
  {!n.insideBoundary ? " — outside boundary" : ""}
129
108
  </button>
130
109
  </li>
@@ -16,8 +16,7 @@ describe("Architecture panel accessibility", () => {
16
16
  let container: HTMLElement;
17
17
 
18
18
  beforeEach(() => {
19
- (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
20
- true;
19
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
21
20
  window = new Window({ url: "http://console.test/architecture" });
22
21
  Object.defineProperty(globalThis, "window", {
23
22
  value: window,
@@ -5,11 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { CausalityGraph, FlowNode } from "../flows/graph.ts";
8
- import {
9
- isBoundaryExternal,
10
- layerOfCause,
11
- layerOfEffectRef,
12
- } from "./layers.ts";
8
+ import { isBoundaryExternal, layerOfCause, layerOfEffectRef } from "./layers.ts";
13
9
  import type { ElementLayer } from "./types.ts";
14
10
 
15
11
  /** One fine-grained declared relationship before aggregation / focus. */