okengine 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +45 -37
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -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));
@@ -184,9 +184,7 @@ describe("locality — local + object storage", () => {
184
184
  expect(localKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
185
185
  expect(remoteKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
186
186
 
187
- const rows = await runs.query(
188
- "SELECT id, dim_locality AS locality FROM runs ORDER BY id",
189
- );
187
+ const rows = await runs.query("SELECT id, dim_locality AS locality FROM runs ORDER BY id");
190
188
  expect(rows.length).toBe(2);
191
189
  const ids = rows.map((r) => String(r.id)).sort();
192
190
  expect(ids).toEqual(["archived", "recent"]);
@@ -242,9 +240,7 @@ describe("crypto-shredding erasure", () => {
242
240
 
243
241
  // Snapshot partition bytes before erase
244
242
  const bucket = await fsDriver.open({ name: "snap", root: root });
245
- const keysBefore = (await bucket.list("runs/")).filter((k) =>
246
- k.endsWith(".parquet"),
247
- );
243
+ const keysBefore = (await bucket.list("runs/")).filter((k) => k.endsWith(".parquet"));
248
244
  expect(keysBefore.length).toBeGreaterThan(0);
249
245
  const bytesBefore = await bucket.get(keysBefore[0]!);
250
246
  expect(bytesBefore).toBeTruthy();
@@ -262,9 +258,7 @@ describe("crypto-shredding erasure", () => {
262
258
  expect(bytesAfter).toEqual(bytesBefore);
263
259
 
264
260
  // Query still returns the row (operational dims intact)
265
- const rows = await runs.query(
266
- "SELECT id, subject_id FROM runs WHERE id = 'run_erase'",
267
- );
261
+ const rows = await runs.query("SELECT id, subject_id FROM runs WHERE id = 'run_erase'");
268
262
  expect(rows.length).toBe(1);
269
263
  expect(rows[0]!.subject_id).toBe(subjectId);
270
264
 
@@ -7,17 +7,8 @@ import { clickhouseRunsDriver } from "./drivers/clickhouse.ts";
7
7
  import { filesRunsDriver } from "./drivers/files.ts";
8
8
  import { memoryRunsDriver } from "./drivers/memory.ts";
9
9
  import { postgresRunsDriver } from "./drivers/postgres.ts";
10
- import {
11
- explainOutliers,
12
- type ExplainOutliersOptions,
13
- type OutlierFinding,
14
- } from "./outlier.ts";
15
- import {
16
- archiveFields,
17
- eraseSubject,
18
- revealArchived,
19
- type SubjectKeyVault,
20
- } from "./shred.ts";
10
+ import { explainOutliers, type ExplainOutliersOptions, type OutlierFinding } from "./outlier.ts";
11
+ import { archiveFields, eraseSubject, revealArchived, type SubjectKeyVault } from "./shred.ts";
21
12
  import type {
22
13
  RunsDriver,
23
14
  RunsDriverId,
@@ -114,9 +105,7 @@ const DRIVER_BY_ID: Record<RunsDriverId, RunsDriver> = {
114
105
  *
115
106
  * @param driver - Id or driver
116
107
  */
117
- export function resolveRunsDriver(
118
- driver?: RunsDriverId | RunsDriver,
119
- ): RunsDriver {
108
+ export function resolveRunsDriver(driver?: RunsDriverId | RunsDriver): RunsDriver {
120
109
  if (!driver) return filesRunsDriver;
121
110
  if (typeof driver === "string") {
122
111
  const d = DRIVER_BY_ID[driver];
@@ -131,9 +120,7 @@ export function resolveRunsDriver(
131
120
  *
132
121
  * @param options - Driver + locality + subject keys
133
122
  */
134
- export function createRunsRuntime(
135
- options: CreateRunsRuntimeOptions = {},
136
- ): RunsRuntime {
123
+ export function createRunsRuntime(options: CreateRunsRuntimeOptions = {}): RunsRuntime {
137
124
  const driver = resolveRunsDriver(options.driver);
138
125
  let store: RunsStore | undefined;
139
126
  const subjectKeys = options.subjectKeys;
@@ -156,21 +143,14 @@ export function createRunsRuntime(
156
143
  const s = await ensureStore();
157
144
  let archived = input.archived;
158
145
  const subjectId =
159
- input.telemetry.subjectId ??
160
- input.fx.auth.userId ??
161
- input.fx.tenant.id ??
162
- null;
146
+ input.telemetry.subjectId ?? input.fx.auth.userId ?? input.fx.tenant.id ?? null;
163
147
  if (
164
148
  archiveCleartext &&
165
149
  subjectId &&
166
150
  subjectKeys &&
167
151
  Object.keys(archiveCleartext).length > 0
168
152
  ) {
169
- archived = await archiveFields(
170
- subjectKeys,
171
- subjectId,
172
- archiveCleartext,
173
- );
153
+ archived = await archiveFields(subjectKeys, subjectId, archiveCleartext);
174
154
  }
175
155
  const event = collectWideEvent({
176
156
  ...input,
@@ -221,9 +201,4 @@ export function createRunsRuntime(
221
201
  };
222
202
  }
223
203
 
224
- export {
225
- filesRunsDriver,
226
- memoryRunsDriver,
227
- postgresRunsDriver,
228
- clickhouseRunsDriver,
229
- };
204
+ export { filesRunsDriver, memoryRunsDriver, postgresRunsDriver, clickhouseRunsDriver };
package/src/runs/shred.ts CHANGED
@@ -83,9 +83,7 @@ export function subjectKeysFromVault(vault: VaultRuntime): SubjectKeyVault {
83
83
  /**
84
84
  * In-memory subject-key vault (tests / when no Vault element is wired).
85
85
  */
86
- export function createMemorySubjectKeys(
87
- seed?: Readonly<Record<string, string>>,
88
- ): SubjectKeyVault {
86
+ export function createMemorySubjectKeys(seed?: Readonly<Record<string, string>>): SubjectKeyVault {
89
87
  const map = new Map<string, string>(Object.entries(seed ?? {}));
90
88
  return {
91
89
  read(name) {
@@ -181,26 +179,16 @@ export async function revealArchived(
181
179
  * @param subjectId - Subject id
182
180
  * @returns Whether a key was deleted
183
181
  */
184
- export function eraseSubject(
185
- keys: SubjectKeyVault,
186
- subjectId: string,
187
- ): boolean {
182
+ export function eraseSubject(keys: SubjectKeyVault, subjectId: string): boolean {
188
183
  return keys.delete(subjectKeyName(subjectId));
189
184
  }
190
185
 
191
- async function encryptAesGcm(
192
- plaintext: string,
193
- keyBytes: Uint8Array,
194
- ): Promise<string> {
186
+ async function encryptAesGcm(plaintext: string, keyBytes: Uint8Array): Promise<string> {
195
187
  const iv = crypto.getRandomValues(new Uint8Array(12));
196
188
  const keyBuf = toArrayBuffer(keyBytes);
197
- const cryptoKey = await crypto.subtle.importKey(
198
- "raw",
199
- keyBuf,
200
- { name: "AES-GCM" },
201
- false,
202
- ["encrypt"],
203
- );
189
+ const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
190
+ "encrypt",
191
+ ]);
204
192
  const cipher = await crypto.subtle.encrypt(
205
193
  { name: "AES-GCM", iv },
206
194
  cryptoKey,
@@ -212,21 +200,14 @@ async function encryptAesGcm(
212
200
  return Buffer.from(packed).toString("base64");
213
201
  }
214
202
 
215
- async function decryptAesGcm(
216
- blob: string,
217
- keyBytes: Uint8Array,
218
- ): Promise<string> {
203
+ async function decryptAesGcm(blob: string, keyBytes: Uint8Array): Promise<string> {
219
204
  const packed = Buffer.from(blob, "base64");
220
205
  const iv = toArrayBuffer(packed.subarray(0, 12));
221
206
  const data = toArrayBuffer(packed.subarray(12));
222
207
  const keyBuf = toArrayBuffer(keyBytes);
223
- const cryptoKey = await crypto.subtle.importKey(
224
- "raw",
225
- keyBuf,
226
- { name: "AES-GCM" },
227
- false,
228
- ["decrypt"],
229
- );
208
+ const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
209
+ "decrypt",
210
+ ]);
230
211
  const plain = await crypto.subtle.decrypt(
231
212
  { name: "AES-GCM", iv: new Uint8Array(iv) },
232
213
  cryptoKey,
package/src/runs/types.ts CHANGED
@@ -26,10 +26,7 @@ export interface RunError {
26
26
  * Declared / observed dimensions available without manual instrumentation.
27
27
  * Extra keys are allowed for outlier analysis.
28
28
  */
29
- export type RunDimensions = Record<
30
- string,
31
- string | number | boolean | null | undefined
32
- >;
29
+ export type RunDimensions = Record<string, string | number | boolean | null | undefined>;
33
30
 
34
31
  /**
35
32
  * One wide event — the atomic observability record.
@@ -26,10 +26,7 @@ export interface BunRuntime extends Runtime {
26
26
  * @param filename - Path, `":memory:"`, or omit for memory
27
27
  * @param options - `bun:sqlite` open options
28
28
  */
29
- sqlite(
30
- filename?: string,
31
- options?: ConstructorParameters<typeof Database>[1],
32
- ): Database;
29
+ sqlite(filename?: string, options?: ConstructorParameters<typeof Database>[1]): Database;
33
30
  }
34
31
 
35
32
  /**
@@ -43,9 +40,7 @@ export function createBunRuntime(): BunRuntime {
43
40
  env: createEnv(),
44
41
  files: createFiles(),
45
42
  sqlite(filename = ":memory:", options) {
46
- return options === undefined
47
- ? new Database(filename)
48
- : new Database(filename, options);
43
+ return options === undefined ? new Database(filename) : new Database(filename, options);
49
44
  },
50
45
  serve(app, options) {
51
46
  return listenBun(app, options);
@@ -67,9 +62,7 @@ export function isBunNativePath(path: string): boolean {
67
62
  return true;
68
63
  }
69
64
 
70
- type MethodHandlers = Partial<
71
- Record<string, (req: Request) => Response | Promise<Response>>
72
- >;
65
+ type MethodHandlers = Partial<Record<string, (req: Request) => Response | Promise<Response>>>;
73
66
 
74
67
  /**
75
68
  * Build Bun.serve `routes` from app HTTP bindings.
@@ -99,11 +92,7 @@ export function buildBunRoutes(
99
92
  function listenBun(app: FetchApp, options?: ServeOptions): ServerHandle {
100
93
  const port = options?.port ?? APP_PORT;
101
94
  const hostname = options?.hostname ?? "127.0.0.1";
102
- const fetchHandler = secureFetch(
103
- (req) => app.fetch(req),
104
- options,
105
- hostname,
106
- );
95
+ const fetchHandler = secureFetch((req) => app.fetch(req), options, hostname);
107
96
  const routes = buildBunRoutes(app, fetchHandler);
108
97
 
109
98
  const server = Bun.serve({
@@ -12,9 +12,7 @@ import { measureColdStartMedianMs } from "../release/measure.ts";
12
12
  describe("cold start budget", () => {
13
13
  test(`Bun adapter ready in < ${COLD_START_BUDGET_MS} ms`, async () => {
14
14
  const median = await measureColdStartMedianMs();
15
- console.log(
16
- `cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`,
17
- );
15
+ console.log(`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`);
18
16
  expect(median).toBeLessThan(COLD_START_BUDGET_MS);
19
17
  });
20
18
  });
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { afterEach, describe, expect, test } from "bun:test";
6
- import {
7
- isSilentDevRequest,
8
- shouldLogDevRequests,
9
- } from "./dev-request-log.ts";
6
+ import { isSilentDevRequest, shouldLogDevRequests } from "./dev-request-log.ts";
10
7
 
11
8
  describe("dev-request-log", () => {
12
9
  const prev = process.env.OKE_DEV_REQUEST_LOG;
@@ -103,10 +103,7 @@ export async function timedDevFetch(
103
103
  handle: (request: Request) => Response | Promise<Response>,
104
104
  options: {
105
105
  readonly surface?: DevLogSurface;
106
- readonly resolveFlow?: (
107
- request: Request,
108
- response: Response,
109
- ) => string | undefined;
106
+ readonly resolveFlow?: (request: Request, response: Response) => string | undefined;
110
107
  /** Skip logging for this path/method. */
111
108
  readonly silent?: (request: Request) => boolean;
112
109
  } = {},