okengine 0.2.6 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
@@ -77,9 +77,7 @@ export function isMeasurableDriverFile(name: string): boolean {
77
77
  *
78
78
  * @param driversDir - Absolute drivers directory
79
79
  */
80
- export async function listDriverModules(
81
- driversDir = DRIVERS_DIR,
82
- ): Promise<readonly string[]> {
80
+ export async function listDriverModules(driversDir = DRIVERS_DIR): Promise<readonly string[]> {
83
81
  const entries = await readdir(driversDir);
84
82
  return entries.filter(isMeasurableDriverFile).sort((a, b) => a.localeCompare(b));
85
83
  }
@@ -96,8 +94,7 @@ export async function resolveExportBudgetTargets(options?: {
96
94
  }): Promise<readonly ExportBudgetTarget[]> {
97
95
  const root = options?.root ?? ROOT;
98
96
  const pkg =
99
- options?.pkg ??
100
- ((await Bun.file(join(root, "package.json")).json()) as PackageExports);
97
+ options?.pkg ?? ((await Bun.file(join(root, "package.json")).json()) as PackageExports);
101
98
  const exportsMap = pkg.exports ?? {};
102
99
  const driversDir = options?.driversDir ?? join(root, "src/drivers");
103
100
 
@@ -106,9 +103,7 @@ export async function resolveExportBudgetTargets(options?: {
106
103
  for (const [subpath, entryRel] of Object.entries(exportsMap)) {
107
104
  if (subpath.endsWith("/*")) {
108
105
  if (subpath !== "./drivers/*") {
109
- throw new Error(
110
- `unsupported export glob ${subpath}: only ./drivers/* is expanded`,
111
- );
106
+ throw new Error(`unsupported export glob ${subpath}: only ./drivers/* is expanded`);
112
107
  }
113
108
  const modules = await listDriverModules(driversDir);
114
109
  for (const file of modules) {
@@ -24,9 +24,7 @@ describe("export gzip budgets", () => {
24
24
  });
25
25
 
26
26
  test("exportRegressionLimitBytes uses max(floor, 2% of previous)", () => {
27
- expect(exportRegressionLimitBytes(1000)).toBe(
28
- 1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES,
29
- );
27
+ expect(exportRegressionLimitBytes(1000)).toBe(1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES);
30
28
  const large = 100_000;
31
29
  expect(exportRegressionLimitBytes(large)).toBe(
32
30
  large + Math.ceil(large * EXPORT_REGRESSION_TOLERANCE_RATIO),
@@ -6,10 +6,7 @@ import { mkdtemp, readdir, rm } from "node:fs/promises";
6
6
  import { tmpdir } from "node:os";
7
7
  import { join, resolve } from "node:path";
8
8
  import { createRouter } from "../kernel/router.ts";
9
- import {
10
- type BudgetGroup,
11
- resolveExportBudgetTargets,
12
- } from "./exports.ts";
9
+ import { type BudgetGroup, resolveExportBudgetTargets } from "./exports.ts";
13
10
  import {
14
11
  CLIENT_BUDGET_BYTES,
15
12
  COLD_START_BUDGET_MS,
@@ -32,7 +29,6 @@ const BUILD_EXTERNALS = ["@duckdb/node-api", "@duckdb/*"] as const;
32
29
  /** Heavy optional / peer packages — not counted in export:* gzip samples. */
33
30
  const EXPORT_BUILD_EXTERNALS = [
34
31
  ...BUILD_EXTERNALS,
35
- "age-encryption",
36
32
  "sently",
37
33
  "sently/*",
38
34
  "ajv",
@@ -93,9 +89,7 @@ async function gzipBuildOutputs(
93
89
  label: string,
94
90
  ): Promise<number> {
95
91
  if (!result.success) {
96
- throw new Error(
97
- `${label} build failed:\n${result.logs.map(String).join("\n")}`,
98
- );
92
+ throw new Error(`${label} build failed:\n${result.logs.map(String).join("\n")}`);
99
93
  }
100
94
  let total = 0;
101
95
  for (const artifact of result.outputs) {
@@ -147,9 +141,7 @@ export async function measureKernelEdgeGzipBytes(): Promise<number> {
147
141
  external: [...BUILD_EXTERNALS],
148
142
  });
149
143
  if (!result.success) {
150
- throw new Error(
151
- `kernel edge build failed:\n${result.logs.map(String).join("\n")}`,
152
- );
144
+ throw new Error(`kernel edge build failed:\n${result.logs.map(String).join("\n")}`);
153
145
  }
154
146
  const artifact = result.outputs[0];
155
147
  if (!artifact) throw new Error("kernel edge build produced no output");
@@ -169,9 +161,7 @@ export async function measureClientGzipBytes(): Promise<number> {
169
161
  format: "esm",
170
162
  });
171
163
  if (!result.success) {
172
- throw new Error(
173
- `client build failed:\n${result.logs.map(String).join("\n")}`,
174
- );
164
+ throw new Error(`client build failed:\n${result.logs.map(String).join("\n")}`);
175
165
  }
176
166
  const artifact = result.outputs[0];
177
167
  if (!artifact) throw new Error("client build produced no output");
@@ -196,11 +186,7 @@ export async function measureExportGzipBytes(entry: string): Promise<number> {
196
186
  `export function __okeExportBudgetAnchor(){return mod;}\n`,
197
187
  );
198
188
  try {
199
- return await measureEntryGzipBytes(
200
- anchor,
201
- `export ${entry}`,
202
- EXPORT_BUILD_EXTERNALS,
203
- );
189
+ return await measureEntryGzipBytes(anchor, `export ${entry}`, EXPORT_BUILD_EXTERNALS);
204
190
  } finally {
205
191
  await rm(dir, { recursive: true, force: true });
206
192
  }
@@ -418,12 +404,11 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
418
404
  // Cold start alone first — parallel gzip work contends for CPU on CI and
419
405
  // falsely inflates the wall-clock probe.
420
406
  const coldStartMedianMs = await measureColdStartMedianMs();
421
- const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] =
422
- await Promise.all([
423
- measureKernelEdgeGzipBytes(),
424
- measureClientGzipBytes(),
425
- measureConsoleInitialGzipBytes(),
426
- ]);
407
+ const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] = await Promise.all([
408
+ measureKernelEdgeGzipBytes(),
409
+ measureClientGzipBytes(),
410
+ measureConsoleInitialGzipBytes(),
411
+ ]);
427
412
  const routingP99Ms = measureRoutingP99Ms();
428
413
 
429
414
  const budgets: BudgetSample[] = [
@@ -482,15 +467,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
482
467
  })),
483
468
  );
484
469
  for (const { target, bytes } of exportSizes) {
485
- budgets.push(
486
- regressionSample(
487
- target.id,
488
- target.label,
489
- target.group,
490
- bytes,
491
- previous,
492
- ),
493
- );
470
+ budgets.push(regressionSample(target.id, target.label, target.group, bytes, previous));
494
471
  }
495
472
 
496
473
  return {
@@ -506,9 +483,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
506
483
  * @param snapshot - Measured budgets
507
484
  */
508
485
  export function formatBudgetsReport(snapshot: BudgetsSnapshot): string {
509
- const lines = [
510
- `okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`,
511
- ];
486
+ const lines = [`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`];
512
487
  const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
513
488
  for (const group of order) {
514
489
  const rows = snapshot.budgets.filter((b) => b.group === group);
@@ -539,7 +514,7 @@ export function formatBudgetsMarkdown(snapshot: BudgetsSnapshot): string {
539
514
  "",
540
515
  `_okengine v${snapshot.version} · measured ${snapshot.measuredAt}_`,
541
516
  "",
542
- "Core rows are absolute AGENTS caps. Exports and Drivers fail on regression vs the prior [`budgets.json`](budgets.json) (max +256 B or +2%). Export gzip excludes peers/optionals (`zod`, `age-encryption`, `sently`, `oxc-parser`, `ajv`).",
517
+ "Core rows are absolute AGENTS caps. Exports and Drivers fail on regression vs the prior [`budgets.json`](budgets.json) (max +256 B or +2%). Export gzip excludes peers/optionals (`zod`, `sently`, `oxc-parser`, `ajv`).",
543
518
  ];
544
519
  const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
545
520
  for (const group of order) {
@@ -579,8 +554,7 @@ function sample(
579
554
  gate: BudgetGate,
580
555
  group: BudgetGroup,
581
556
  ): BudgetSample {
582
- const rounded =
583
- unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
557
+ const rounded = unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
584
558
  return {
585
559
  id,
586
560
  label,
@@ -652,8 +626,7 @@ function formatValue(value: number, unit: BudgetSample["unit"]): string {
652
626
  */
653
627
  function initialAssetHrefs(html: string): string[] {
654
628
  const hrefs: string[] = [];
655
- const re =
656
- /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
629
+ const re = /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
657
630
  for (const match of html.matchAll(re)) {
658
631
  const href = match[1];
659
632
  if (href) hrefs.push(href.replace(/^\//, ""));
@@ -671,9 +644,7 @@ async function gzipFile(path: string): Promise<number> {
671
644
  *
672
645
  * @param dir - Vite outDir
673
646
  */
674
- export async function consoleBundleBreakdown(
675
- dir: string,
676
- ): Promise<ConsoleBundleBreakdown> {
647
+ export async function consoleBundleBreakdown(dir: string): Promise<ConsoleBundleBreakdown> {
677
648
  const assetsDir = join(dir, "assets");
678
649
  const indexPath = join(dir, "index.html");
679
650
  const indexFile = Bun.file(indexPath);
@@ -38,9 +38,7 @@ describe("runs 1M-row query benchmark", () => {
38
38
  ) TO '${duckPath(parquetPath)}' (FORMAT PARQUET, COMPRESSION ZSTD)
39
39
  `);
40
40
  const genMs = performance.now() - t0;
41
- console.log(
42
- `runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`,
43
- );
41
+ console.log(`runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`);
44
42
  expect(await Bun.file(parquetPath).exists()).toBe(true);
45
43
  } finally {
46
44
  session.close();
@@ -11,10 +11,7 @@ import type { AnyFlowDef } from "../kernel/flow.ts";
11
11
  import type { Fx } from "../kernel/fx.ts";
12
12
  import type { Trigger } from "../kernel/triggers.ts";
13
13
  import type { FlowPlane } from "../manifest/types.ts";
14
- import {
15
- cacheDimensionOf,
16
- type RunTelemetry,
17
- } from "../kernel/run-telemetry.ts";
14
+ import { cacheDimensionOf, type RunTelemetry } from "../kernel/run-telemetry.ts";
18
15
  import type { RunError, WideEvent } from "./types.ts";
19
16
 
20
17
  /** Inputs for {@link collectWideEvent}. */
@@ -57,18 +54,12 @@ export interface CollectWideEventInput {
57
54
  */
58
55
  export function collectWideEvent(input: CollectWideEventInput): WideEvent {
59
56
  const plane: FlowPlane = input.flow.plane ?? "user";
60
- const principal =
61
- plane === "operator"
62
- ? input.fx.operator.id
63
- : input.fx.auth.userId;
57
+ const principal = plane === "operator" ? input.fx.operator.id : input.fx.auth.userId;
64
58
  const tenant = input.fx.tenant.id;
65
- const subjectId =
66
- input.telemetry.subjectId ?? principal ?? tenant ?? null;
59
+ const subjectId = input.telemetry.subjectId ?? principal ?? tenant ?? null;
67
60
  const cache = cacheDimensionOf(input.telemetry);
68
61
  const gates =
69
- input.telemetry.gates.length > 0
70
- ? [...input.telemetry.gates]
71
- : httpGates(input.trigger);
62
+ input.telemetry.gates.length > 0 ? [...input.telemetry.gates] : httpGates(input.trigger);
72
63
 
73
64
  const error = failureToRunError(input.failure);
74
65
  const durationMs = Math.max(0, input.endedAt - input.startedAt);
@@ -103,9 +94,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
103
94
  subjectId,
104
95
  gates,
105
96
  cache,
106
- ...(input.telemetry.replica !== undefined
107
- ? { replica: input.telemetry.replica }
108
- : {}),
97
+ ...(input.telemetry.replica !== undefined ? { replica: input.telemetry.replica } : {}),
109
98
  ...(input.telemetry.replicaLagMs !== undefined
110
99
  ? { replicaLagMs: input.telemetry.replicaLagMs }
111
100
  : {}),
@@ -113,9 +102,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
113
102
  ...(input.telemetry.promptVersion !== undefined
114
103
  ? { promptVersion: input.telemetry.promptVersion }
115
104
  : {}),
116
- ...(input.buildVersion !== undefined
117
- ? { buildVersion: input.buildVersion }
118
- : {}),
105
+ ...(input.buildVersion !== undefined ? { buildVersion: input.buildVersion } : {}),
119
106
  error,
120
107
  effects: [...input.ledger.entries],
121
108
  logs: [...input.telemetry.logs],
@@ -129,14 +116,10 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
129
116
 
130
117
  function httpGates(trigger: Trigger): string[] {
131
118
  if (trigger.kind !== "http") return [];
132
- return trigger.gates.map((g) =>
133
- typeof g === "string" ? g : g.name,
134
- );
119
+ return trigger.gates.map((g) => (typeof g === "string" ? g : g.name));
135
120
  }
136
121
 
137
- function failureToRunError(
138
- failure: FlowFailure | null | undefined,
139
- ): RunError | null {
122
+ function failureToRunError(failure: FlowFailure | null | undefined): RunError | null {
140
123
  if (!failure) return null;
141
124
  const code = failure.error?.code ?? "failure";
142
125
  const message = failure.error?.message;
@@ -5,13 +5,7 @@
5
5
  * the ClickHouse HTTP interface.
6
6
  */
7
7
 
8
- import type {
9
- RunsDriver,
10
- RunsOpenOptions,
11
- RunsRow,
12
- RunsStore,
13
- WideEvent,
14
- } from "../types.ts";
8
+ import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
15
9
 
16
10
  /** Minimal ClickHouse HTTP-like client. */
17
11
  export interface RunsClickHouseClient {
@@ -72,8 +66,7 @@ export const clickhouseRunsDriver: RunsDriver = {
72
66
  id: "clickhouse",
73
67
  async open(options: RunsOpenOptions = {}): Promise<RunsStore> {
74
68
  const client =
75
- (options.client as RunsClickHouseClient | undefined) ??
76
- createRunsClickHouseFake();
69
+ (options.client as RunsClickHouseClient | undefined) ?? createRunsClickHouseFake();
77
70
  const table = options.name ?? "oke_runs";
78
71
 
79
72
  return {
@@ -20,13 +20,7 @@ import {
20
20
  wideEventToRow,
21
21
  writeParquet,
22
22
  } from "../parquet.ts";
23
- import type {
24
- RunsDriver,
25
- RunsOpenOptions,
26
- RunsRow,
27
- RunsStore,
28
- WideEvent,
29
- } from "../types.ts";
23
+ import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
30
24
 
31
25
  /** Default hot window — 7 days. Older writes go to object storage when present. */
32
26
  const DEFAULT_HOT_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
@@ -40,14 +34,11 @@ export const filesRunsDriver: RunsDriver = {
40
34
  const hotWindowMs = options.hotWindowMs ?? DEFAULT_HOT_WINDOW_MS;
41
35
  const clock = () => Date.now();
42
36
 
43
- const localRoot =
44
- options.localRoot ??
45
- (await mkdtemp(join(tmpdir(), "oke-runs-")));
37
+ const localRoot = options.localRoot ?? (await mkdtemp(join(tmpdir(), "oke-runs-")));
46
38
  const ownsLocalRoot = options.localRoot === undefined && !options.localBucket;
47
39
 
48
40
  const local: FilesBucket =
49
- options.localBucket ??
50
- (await fsDriver.open({ name: "runs-local", root: localRoot }));
41
+ options.localBucket ?? (await fsDriver.open({ name: "runs-local", root: localRoot }));
51
42
 
52
43
  const remote = options.remote?.bucket;
53
44
  const remotePrefix = options.remote?.prefix ?? "";
@@ -112,16 +103,12 @@ export const filesRunsDriver: RunsDriver = {
112
103
 
113
104
  async function materialiseAllParquet(): Promise<string[]> {
114
105
  if (queryScratch) {
115
- await rm(queryScratch, { recursive: true, force: true }).catch(
116
- () => undefined,
117
- );
106
+ await rm(queryScratch, { recursive: true, force: true }).catch(() => undefined);
118
107
  }
119
108
  queryScratch = await mkdtemp(join(tmpdir(), "oke-runs-q-"));
120
109
  const paths: string[] = [];
121
110
 
122
- const localKeys = (await local.list("runs/")).filter((k) =>
123
- k.endsWith(".parquet"),
124
- );
111
+ const localKeys = (await local.list("runs/")).filter((k) => k.endsWith(".parquet"));
125
112
  for (const key of localKeys) {
126
113
  const data = await local.get(key);
127
114
  if (!data) continue;
@@ -131,16 +118,11 @@ export const filesRunsDriver: RunsDriver = {
131
118
  }
132
119
  if (remote) {
133
120
  const prefix = `${remotePrefix}runs/`;
134
- const remoteKeys = (await remote.list(prefix)).filter((k) =>
135
- k.endsWith(".parquet"),
136
- );
121
+ const remoteKeys = (await remote.list(prefix)).filter((k) => k.endsWith(".parquet"));
137
122
  for (const key of remoteKeys) {
138
123
  const data = await remote.get(key);
139
124
  if (!data) continue;
140
- const dest = join(
141
- queryScratch,
142
- `remote__${key.replaceAll("/", "__")}`,
143
- );
125
+ const dest = join(queryScratch, `remote__${key.replaceAll("/", "__")}`);
144
126
  await writeFile(dest, data);
145
127
  paths.push(dest);
146
128
  }
@@ -184,16 +166,12 @@ export const filesRunsDriver: RunsDriver = {
184
166
  await flushBuffer();
185
167
  session.close();
186
168
  if (queryScratch) {
187
- await rm(queryScratch, { recursive: true, force: true }).catch(
188
- () => undefined,
189
- );
169
+ await rm(queryScratch, { recursive: true, force: true }).catch(() => undefined);
190
170
  }
191
171
  await local.close();
192
172
  await remote?.close();
193
173
  if (ownsLocalRoot) {
194
- await rm(localRoot, { recursive: true, force: true }).catch(
195
- () => undefined,
196
- );
174
+ await rm(localRoot, { recursive: true, force: true }).catch(() => undefined);
197
175
  }
198
176
  },
199
177
  };
@@ -6,20 +6,9 @@
6
6
 
7
7
  import type { DuckDBConnection } from "@duckdb/node-api";
8
8
 
9
- import {
10
- duckLiteral,
11
- duckQuery,
12
- openDuckDB,
13
- type DuckSession,
14
- } from "../duckdb.ts";
9
+ import { duckLiteral, duckQuery, openDuckDB, type DuckSession } from "../duckdb.ts";
15
10
  import { wideEventToRow, type ParquetRow } from "../parquet.ts";
16
- import type {
17
- RunsDriver,
18
- RunsOpenOptions,
19
- RunsRow,
20
- RunsStore,
21
- WideEvent,
22
- } from "../types.ts";
11
+ import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
23
12
 
24
13
  /**
25
14
  * Memory runs driver (DuckDB `:memory:`).
@@ -65,9 +54,7 @@ export async function materialiseRunsTable(
65
54
  ): Promise<void> {
66
55
  await conn.run(`DROP TABLE IF EXISTS runs`);
67
56
  if (events.length === 0) {
68
- await conn.run(
69
- `CREATE TABLE runs AS SELECT * FROM (SELECT 1 AS id WHERE FALSE)`,
70
- );
57
+ await conn.run(`CREATE TABLE runs AS SELECT * FROM (SELECT 1 AS id WHERE FALSE)`);
71
58
  return;
72
59
  }
73
60
  // JSONL path avoids VALUES type-inference issues for mixed columns.
@@ -76,13 +63,9 @@ export async function materialiseRunsTable(
76
63
  // For small test sets, VALUES is fine and keeps the driver dependency-light.
77
64
  const colList = cols.map((c) => `"${c.replaceAll('"', '""')}"`).join(", ");
78
65
  const values = rows
79
- .map(
80
- (r) => `(${cols.map((c) => duckLiteral(r[c] ?? null)).join(", ")})`,
81
- )
66
+ .map((r) => `(${cols.map((c) => duckLiteral(r[c] ?? null)).join(", ")})`)
82
67
  .join(",\n");
83
- await conn.run(
84
- `CREATE TABLE runs AS SELECT * FROM (VALUES ${values}) AS t(${colList})`,
85
- );
68
+ await conn.run(`CREATE TABLE runs AS SELECT * FROM (VALUES ${values}) AS t(${colList})`);
86
69
  }
87
70
 
88
71
  function unionKeys(rows: readonly ParquetRow[]): string[] {
@@ -4,13 +4,7 @@
4
4
  * Protocol-named. Uses an injected client in tests; production binds Bun.sql.
5
5
  */
6
6
 
7
- import type {
8
- RunsDriver,
9
- RunsOpenOptions,
10
- RunsRow,
11
- RunsStore,
12
- WideEvent,
13
- } from "../types.ts";
7
+ import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
14
8
 
15
9
  /** Minimal SQL surface used by the postgres runs driver. */
16
10
  export interface RunsPostgresClient {
@@ -71,21 +65,17 @@ export function createRunsPostgresFake(): RunsPostgresClient & {
71
65
  export const postgresRunsDriver: RunsDriver = {
72
66
  id: "postgres",
73
67
  async open(options: RunsOpenOptions = {}): Promise<RunsStore> {
74
- const client =
75
- (options.client as RunsPostgresClient | undefined) ??
76
- createRunsPostgresFake();
68
+ const client = (options.client as RunsPostgresClient | undefined) ?? createRunsPostgresFake();
77
69
  const table = options.name ?? "oke_runs";
78
- await client.exec(
79
- `CREATE TABLE IF NOT EXISTS ${table} (id TEXT PRIMARY KEY, payload JSONB)`,
80
- );
70
+ await client.exec(`CREATE TABLE IF NOT EXISTS ${table} (id TEXT PRIMARY KEY, payload JSONB)`);
81
71
 
82
72
  return {
83
73
  driverId: "postgres",
84
74
  async append(event: WideEvent): Promise<void> {
85
- await client.exec(
86
- `INSERT INTO ${table} (id, payload) VALUES ($1, $2::jsonb)`,
87
- [event.id, JSON.stringify(event)],
88
- );
75
+ await client.exec(`INSERT INTO ${table} (id, payload) VALUES ($1, $2::jsonb)`, [
76
+ event.id,
77
+ JSON.stringify(event),
78
+ ]);
89
79
  },
90
80
  async flush(): Promise<void> {
91
81
  /* row-level writes are immediate */
@@ -97,9 +87,7 @@ export const postgresRunsDriver: RunsDriver = {
97
87
  const result = await client.query(`SELECT payload FROM ${table}`);
98
88
  return result.map((r) => {
99
89
  const p = r.payload ?? r;
100
- return typeof p === "string"
101
- ? (JSON.parse(p) as WideEvent)
102
- : (p as WideEvent);
90
+ return typeof p === "string" ? (JSON.parse(p) as WideEvent) : (p as WideEvent);
103
91
  });
104
92
  },
105
93
  async close(): Promise<void> {
@@ -2,10 +2,7 @@
2
2
  * Thin DuckDB adapter — adopted via `@duckdb/node-api`, not reinvented.
3
3
  */
4
4
 
5
- import {
6
- DuckDBInstance,
7
- type DuckDBConnection,
8
- } from "@duckdb/node-api";
5
+ import { DuckDBInstance, type DuckDBConnection } from "@duckdb/node-api";
9
6
 
10
7
  import type { RunsRow } from "./types.ts";
11
8
 
@@ -47,10 +44,7 @@ export async function openDuckDB(): Promise<DuckSession> {
47
44
  * @param conn - DuckDB connection
48
45
  * @param sql - SQL text
49
46
  */
50
- export async function duckQuery(
51
- conn: DuckDBConnection,
52
- sql: string,
53
- ): Promise<RunsRow[]> {
47
+ export async function duckQuery(conn: DuckDBConnection, sql: string): Promise<RunsRow[]> {
54
48
  const reader = await conn.runAndReadAll(sql);
55
49
  const rows = reader.getRowObjectsJson() as RunsRow[];
56
50
  return rows.map(normalizeRow);
package/src/runs/index.ts CHANGED
@@ -19,16 +19,9 @@ export type {
19
19
  RunsOpenOptions,
20
20
  } from "./types.ts";
21
21
 
22
- export {
23
- createRunTelemetry,
24
- cacheDimensionOf,
25
- type RunTelemetry,
26
- } from "./telemetry.ts";
22
+ export { createRunTelemetry, cacheDimensionOf, type RunTelemetry } from "./telemetry.ts";
27
23
 
28
- export {
29
- collectWideEvent,
30
- type CollectWideEventInput,
31
- } from "./collect.ts";
24
+ export { collectWideEvent, type CollectWideEventInput } from "./collect.ts";
32
25
 
33
26
  export {
34
27
  explainOutliers,
@@ -73,11 +66,7 @@ export {
73
66
  type RunsRuntime,
74
67
  } from "./runtime.ts";
75
68
 
76
- export {
77
- privacyErase,
78
- type PrivacyEraseOptions,
79
- type PrivacyEraseResult,
80
- } from "./privacy.ts";
69
+ export { privacyErase, type PrivacyEraseOptions, type PrivacyEraseResult } from "./privacy.ts";
81
70
 
82
71
  export { createRunsPostgresFake } from "./drivers/postgres.ts";
83
72
  export { createRunsClickHouseFake } from "./drivers/clickhouse.ts";
@@ -69,14 +69,10 @@ export function explainOutliers(
69
69
  for (const dim of dimNames) {
70
70
  const outlierCounts = valueCounts(outliers, dim);
71
71
  const baselineCounts = valueCounts(baseline, dim);
72
- const values = new Set([
73
- ...outlierCounts.keys(),
74
- ...baselineCounts.keys(),
75
- ]);
72
+ const values = new Set([...outlierCounts.keys(), ...baselineCounts.keys()]);
76
73
  for (const value of values) {
77
74
  const outlierShare = (outlierCounts.get(value) ?? 0) / outliers.length;
78
- const baselineShare =
79
- (baselineCounts.get(value) ?? 0) / baseline.length;
75
+ const baselineShare = (baselineCounts.get(value) ?? 0) / baseline.length;
80
76
  const lift = outlierShare - baselineShare;
81
77
  if (lift < minLift) continue;
82
78
  findings.push({
@@ -154,10 +150,7 @@ export function seedOutlierDataset(opts?: {
154
150
  return events;
155
151
  }
156
152
 
157
- function valueCounts(
158
- events: readonly WideEvent[],
159
- dim: string,
160
- ): Map<string, number> {
153
+ function valueCounts(events: readonly WideEvent[], dim: string): Map<string, number> {
161
154
  const m = new Map<string, number>();
162
155
  for (const e of events) {
163
156
  const raw = e.dimensions[dim];
@@ -91,26 +91,16 @@ export function rowToWideEvent(row: Record<string, unknown>): WideEvent {
91
91
  subjectId: row.subject_id != null ? String(row.subject_id) : null,
92
92
  gates: parseJsonArray(row.gates) as string[],
93
93
  cache: (row.cache as WideEvent["cache"]) ?? "none",
94
- ...(row.replica != null
95
- ? { replica: row.replica as "primary" | "replica" }
96
- : {}),
97
- ...(row.replica_lag_ms != null
98
- ? { replicaLagMs: Number(row.replica_lag_ms) }
99
- : {}),
94
+ ...(row.replica != null ? { replica: row.replica as "primary" | "replica" } : {}),
95
+ ...(row.replica_lag_ms != null ? { replicaLagMs: Number(row.replica_lag_ms) } : {}),
100
96
  ...(row.cost != null ? { cost: Number(row.cost) } : {}),
101
- ...(row.prompt_version != null
102
- ? { promptVersion: Number(row.prompt_version) }
103
- : {}),
104
- ...(row.build_version != null
105
- ? { buildVersion: String(row.build_version) }
106
- : {}),
97
+ ...(row.prompt_version != null ? { promptVersion: Number(row.prompt_version) } : {}),
98
+ ...(row.build_version != null ? { buildVersion: String(row.build_version) } : {}),
107
99
  error:
108
100
  errorCode != null
109
101
  ? {
110
102
  code: String(errorCode),
111
- ...(row.error_message != null
112
- ? { message: String(row.error_message) }
113
- : {}),
103
+ ...(row.error_message != null ? { message: String(row.error_message) } : {}),
114
104
  }
115
105
  : null,
116
106
  effects: parseJsonArray(row.effects) as WideEvent["effects"],
@@ -129,17 +119,11 @@ export function rowToWideEvent(row: Record<string, unknown>): WideEvent {
129
119
  * @param path - Absolute output path
130
120
  * @param rows - Flattened rows
131
121
  */
132
- export async function writeParquet(
133
- path: string,
134
- rows: readonly ParquetRow[],
135
- ): Promise<void> {
122
+ export async function writeParquet(path: string, rows: readonly ParquetRow[]): Promise<void> {
136
123
  if (rows.length === 0) return;
137
124
  await mkdir(dirname(path), { recursive: true });
138
125
  const jsonl = `${path}.jsonl`;
139
- await writeFile(
140
- jsonl,
141
- rows.map((r) => JSON.stringify(r)).join("\n"),
142
- );
126
+ await writeFile(jsonl, rows.map((r) => JSON.stringify(r)).join("\n"));
143
127
  const session = await openDuckDB();
144
128
  try {
145
129
  await session.conn.run(
@@ -156,9 +140,7 @@ export async function writeParquet(
156
140
  *
157
141
  * @param paths - Absolute Parquet paths
158
142
  */
159
- export async function readParquet(
160
- paths: readonly string[],
161
- ): Promise<ParquetRow[]> {
143
+ export async function readParquet(paths: readonly string[]): Promise<ParquetRow[]> {
162
144
  if (paths.length === 0) return [];
163
145
  const session = await openDuckDB();
164
146
  try {
@@ -3,11 +3,7 @@
3
3
  * journal / channel receipts). Deletes the Vault key, not the terabytes.
4
4
  */
5
5
 
6
- import {
7
- eraseSubject,
8
- subjectKeyName,
9
- type SubjectKeyVault,
10
- } from "./shred.ts";
6
+ import { eraseSubject, subjectKeyName, type SubjectKeyVault } from "./shred.ts";
11
7
 
12
8
  /** Options for {@link privacyErase}. */
13
9
  export interface PrivacyEraseOptions {
@@ -34,9 +30,7 @@ export interface PrivacyEraseResult {
34
30
  *
35
31
  * @param options - Subject + vault
36
32
  */
37
- export function privacyErase(
38
- options: PrivacyEraseOptions,
39
- ): PrivacyEraseResult {
33
+ export function privacyErase(options: PrivacyEraseOptions): PrivacyEraseResult {
40
34
  const key = subjectKeyName(options.subjectId);
41
35
  const deleted = eraseSubject(options.subjectKeys, options.subjectId);
42
36
  const write = options.write ?? ((t) => process.stdout.write(t));