okengine 0.2.5 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/AGENTS.md +24 -23
  2. package/README.md +52 -346
  3. package/docs/spec/console.md +165 -142
  4. package/docs/spec/example.md +490 -312
  5. package/docs/spec/four-applications.md +495 -314
  6. package/docs/spec/unified-theory.md +184 -175
  7. package/package.json +46 -38
  8. package/spec/manifest.v1.schema.json +40 -9
  9. package/src/auth/api-keys.ts +2 -5
  10. package/src/auth/attenuation.ts +2 -6
  11. package/src/auth/auth.test.ts +53 -31
  12. package/src/auth/invoke-as.ts +1 -3
  13. package/src/auth/operator.ts +8 -26
  14. package/src/auth/planes.ts +2 -7
  15. package/src/auth/plugin.ts +4 -7
  16. package/src/auth/roles.ts +1 -5
  17. package/src/auth/sessions.ts +10 -39
  18. package/src/cli/args.ts +1 -5
  19. package/src/cli/ask-dev-mode.ts +40 -0
  20. package/src/cli/build.ts +1 -2
  21. package/src/cli/client-add.test.ts +8 -15
  22. package/src/cli/client-add.ts +5 -14
  23. package/src/cli/completion.test.ts +1 -5
  24. package/src/cli/completion.ts +4 -17
  25. package/src/cli/db-auto-push.test.ts +64 -0
  26. package/src/cli/db-auto-push.ts +72 -0
  27. package/src/cli/db.test.ts +189 -0
  28. package/src/cli/db.ts +386 -0
  29. package/src/cli/dev-app-runner.ts +2 -8
  30. package/src/cli/dev-db-push.test.ts +163 -0
  31. package/src/cli/dev-mode.test.ts +45 -0
  32. package/src/cli/dev-mode.ts +78 -0
  33. package/src/cli/dev.test.ts +148 -21
  34. package/src/cli/dev.ts +208 -134
  35. package/src/cli/doc-drift.test.ts +3 -2
  36. package/src/cli/doc-drift.ts +21 -50
  37. package/src/cli/doc-staleness.test.ts +69 -0
  38. package/src/cli/docker-cli.test.ts +7 -8
  39. package/src/cli/docker.ts +1 -3
  40. package/src/cli/doctor-diff-examples.ts +1 -3
  41. package/src/cli/doctor-diff.test.ts +1 -5
  42. package/src/cli/doctor-diff.ts +17 -46
  43. package/src/cli/doctor-pii.ts +2 -7
  44. package/src/cli/doctor.test.ts +26 -4
  45. package/src/cli/doctor.ts +35 -11
  46. package/src/cli/eval.ts +4 -14
  47. package/src/cli/gates-list.ts +1 -4
  48. package/src/cli/hero-meta.test.ts +17 -19
  49. package/src/cli/hero-meta.ts +20 -30
  50. package/src/cli/images.ts +3 -8
  51. package/src/cli/index.ts +11 -2
  52. package/src/cli/load-config.images.test.ts +14 -14
  53. package/src/cli/load-config.ts +41 -47
  54. package/src/cli/mcp-from-console.ts +1 -4
  55. package/src/cli/mode.ts +45 -0
  56. package/src/cli/ports.test.ts +4 -13
  57. package/src/cli/ports.ts +1 -3
  58. package/src/cli/privacy-erase.ts +1 -3
  59. package/src/cli/registry.ts +75 -25
  60. package/src/cli/schema.ts +3 -10
  61. package/src/cli/stack.ts +2 -7
  62. package/src/cli/start.ts +4 -15
  63. package/src/cli/upgrade.ts +1 -4
  64. package/src/client/budget-entry.ts +1 -6
  65. package/src/client/create.test.ts +6 -12
  66. package/src/client/create.ts +2 -8
  67. package/src/client/errors.ts +1 -4
  68. package/src/client/index.ts +1 -6
  69. package/src/client/notes-contract.test.ts +4 -13
  70. package/src/client/transport.ts +9 -30
  71. package/src/client/types.ts +8 -29
  72. package/src/compiler/aot.test.ts +2 -9
  73. package/src/compiler/aot.ts +1 -4
  74. package/src/compiler/differential.test.ts +3 -11
  75. package/src/compiler/dynamic.ts +1 -4
  76. package/src/compiler/effects-infer.ts +8 -34
  77. package/src/compiler/emit.ts +1 -3
  78. package/src/compiler/extract.test.ts +96 -30
  79. package/src/compiler/extract.ts +362 -156
  80. package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
  81. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  82. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  83. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  84. package/src/compiler/fixtures/skyport.expected.json +24 -83
  85. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  86. package/src/compiler/http-parse.ts +2 -9
  87. package/src/compiler/index.ts +1 -5
  88. package/src/compiler/response.ts +4 -7
  89. package/src/compiler/sucrose.ts +11 -31
  90. package/src/config/define-config.test.ts +57 -34
  91. package/src/config/index.ts +181 -37
  92. package/src/config/resolve-driver.test.ts +28 -17
  93. package/src/console/budget.test.ts +1 -4
  94. package/src/console/index.ts +1 -4
  95. package/src/console/server/access.test.ts +15 -43
  96. package/src/console/server/access.ts +19 -49
  97. package/src/console/server/ai.test.ts +3 -11
  98. package/src/console/server/ai.ts +23 -46
  99. package/src/console/server/app.ts +14 -45
  100. package/src/console/server/auth-rate.test.ts +4 -12
  101. package/src/console/server/bind.ts +1 -5
  102. package/src/console/server/channels.test.ts +2 -6
  103. package/src/console/server/channels.ts +10 -35
  104. package/src/console/server/claim.ts +2 -8
  105. package/src/console/server/clock.test.ts +2 -6
  106. package/src/console/server/clock.ts +8 -26
  107. package/src/console/server/console.test.ts +1 -3
  108. package/src/console/server/diff.test.ts +5 -17
  109. package/src/console/server/diff.ts +10 -31
  110. package/src/console/server/dry-run.audit.test.ts +2 -8
  111. package/src/console/server/flows.ts +64 -233
  112. package/src/console/server/gates.test.ts +14 -50
  113. package/src/console/server/gates.ts +13 -48
  114. package/src/console/server/index.ts +2 -9
  115. package/src/console/server/live.ts +3 -12
  116. package/src/console/server/operator-db.test.ts +4 -15
  117. package/src/console/server/operator-db.ts +13 -32
  118. package/src/console/server/plugin.ts +50 -53
  119. package/src/console/server/plugins.test.ts +2 -6
  120. package/src/console/server/plugins.ts +17 -56
  121. package/src/console/server/runs-pii.ts +2 -7
  122. package/src/console/server/security.gate.test.ts +18 -40
  123. package/src/console/server/serve.ts +10 -25
  124. package/src/console/server/signals.test.ts +1 -3
  125. package/src/console/server/signals.ts +17 -40
  126. package/src/console/server/state.ts +21 -59
  127. package/src/console/server/store.test.ts +20 -22
  128. package/src/console/server/store.ts +31 -76
  129. package/src/console/server/vault.test.ts +12 -29
  130. package/src/console/server/vault.ts +23 -60
  131. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  132. package/src/console/ui/access/a11y.test.tsx +3 -12
  133. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  134. package/src/console/ui/access/acknowledgement.ts +1 -3
  135. package/src/console/ui/access/blast-radius.ts +1 -3
  136. package/src/console/ui/access/confirmation.test.ts +1 -5
  137. package/src/console/ui/access/confirmation.ts +1 -4
  138. package/src/console/ui/access/fixture.ts +1 -5
  139. package/src/console/ui/access/grantable.test.ts +1 -3
  140. package/src/console/ui/access/grantable.ts +2 -7
  141. package/src/console/ui/access/index.ts +2 -9
  142. package/src/console/ui/access/provenance.test.ts +1 -3
  143. package/src/console/ui/access/provenance.ts +2 -6
  144. package/src/console/ui/access/search.test.ts +1 -5
  145. package/src/console/ui/access/search.ts +2 -6
  146. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  147. package/src/console/ui/ai/a11y.test.tsx +2 -5
  148. package/src/console/ui/ai/fixture.ts +2 -7
  149. package/src/console/ui/ai/format.ts +1 -3
  150. package/src/console/ui/ai/group.test.ts +1 -3
  151. package/src/console/ui/ai/group.ts +4 -12
  152. package/src/console/ui/ai/index.ts +2 -9
  153. package/src/console/ui/ai/promotion.test.ts +2 -7
  154. package/src/console/ui/ai/promotion.ts +4 -13
  155. package/src/console/ui/ai/search.test.ts +2 -11
  156. package/src/console/ui/ai/search.ts +3 -13
  157. package/src/console/ui/ai/types.ts +1 -8
  158. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  159. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  160. package/src/console/ui/architecture/declared.ts +1 -5
  161. package/src/console/ui/architecture/index.ts +7 -35
  162. package/src/console/ui/architecture/layout.ts +1 -3
  163. package/src/console/ui/architecture/pathologies.ts +10 -19
  164. package/src/console/ui/architecture/search.ts +6 -15
  165. package/src/console/ui/architecture/traffic.ts +4 -14
  166. package/src/console/ui/architecture/types.ts +2 -10
  167. package/src/console/ui/architecture/view.test.ts +7 -19
  168. package/src/console/ui/architecture/view.ts +9 -36
  169. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  170. package/src/console/ui/channels/a11y.test.tsx +1 -2
  171. package/src/console/ui/channels/confirmation.test.ts +1 -4
  172. package/src/console/ui/channels/confirmation.ts +1 -4
  173. package/src/console/ui/channels/findings.ts +1 -5
  174. package/src/console/ui/channels/index.ts +2 -8
  175. package/src/console/ui/channels/locale.test.ts +1 -3
  176. package/src/console/ui/channels/locale.ts +2 -8
  177. package/src/console/ui/channels/search.ts +4 -13
  178. package/src/console/ui/channels/taxonomy.ts +1 -3
  179. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  180. package/src/console/ui/clock/a11y.test.tsx +2 -5
  181. package/src/console/ui/clock/confirmation.test.ts +1 -3
  182. package/src/console/ui/clock/confirmation.ts +1 -4
  183. package/src/console/ui/clock/findings.ts +1 -4
  184. package/src/console/ui/clock/health.ts +2 -7
  185. package/src/console/ui/clock/index.ts +2 -10
  186. package/src/console/ui/clock/search.test.ts +1 -3
  187. package/src/console/ui/clock/search.ts +2 -6
  188. package/src/console/ui/clock/timeline.test.ts +1 -3
  189. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  190. package/src/console/ui/clock/waiting-on.ts +2 -7
  191. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  192. package/src/console/ui/diff/a11y.test.tsx +2 -5
  193. package/src/console/ui/diff/group.test.ts +3 -13
  194. package/src/console/ui/diff/group.ts +2 -8
  195. package/src/console/ui/diff/index.ts +2 -8
  196. package/src/console/ui/diff/search.test.ts +1 -5
  197. package/src/console/ui/diff/search.ts +4 -16
  198. package/src/console/ui/diff/summary.ts +1 -2
  199. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  200. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  201. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  202. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  203. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  204. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  205. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  206. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  207. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  208. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  209. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  210. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  211. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  212. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  213. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  214. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  215. package/src/console/ui/dist/index.html +1 -1
  216. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  217. package/src/console/ui/flows/a11y.test.tsx +2 -8
  218. package/src/console/ui/flows/buffer.test.ts +3 -11
  219. package/src/console/ui/flows/buffer.ts +4 -11
  220. package/src/console/ui/flows/confirmation.ts +1 -3
  221. package/src/console/ui/flows/contract.test.ts +3 -7
  222. package/src/console/ui/flows/contract.ts +12 -36
  223. package/src/console/ui/flows/graph.test.ts +3 -11
  224. package/src/console/ui/flows/graph.ts +5 -15
  225. package/src/console/ui/flows/index.ts +1 -6
  226. package/src/console/ui/flows/save-as-test.ts +1 -3
  227. package/src/console/ui/flows/search.ts +8 -25
  228. package/src/console/ui/flows/tiers.ts +2 -9
  229. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  230. package/src/console/ui/gates/a11y.test.tsx +2 -5
  231. package/src/console/ui/gates/audit.ts +1 -3
  232. package/src/console/ui/gates/denial.test.ts +1 -3
  233. package/src/console/ui/gates/denial.ts +4 -12
  234. package/src/console/ui/gates/findings.ts +1 -3
  235. package/src/console/ui/gates/group.test.ts +3 -3
  236. package/src/console/ui/gates/group.ts +3 -11
  237. package/src/console/ui/gates/index.ts +2 -10
  238. package/src/console/ui/gates/search.ts +3 -10
  239. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  240. package/src/console/ui/overview/a11y.test.tsx +1 -2
  241. package/src/console/ui/overview/busiest.ts +1 -3
  242. package/src/console/ui/overview/compose.ts +1 -13
  243. package/src/console/ui/overview/cost.ts +34 -38
  244. package/src/console/ui/overview/fixture.ts +21 -26
  245. package/src/console/ui/overview/golden.ts +4 -14
  246. package/src/console/ui/overview/index.ts +2 -9
  247. package/src/console/ui/overview/rank.test.ts +3 -10
  248. package/src/console/ui/overview/rank.ts +2 -7
  249. package/src/console/ui/overview/slo.test.ts +5 -9
  250. package/src/console/ui/overview/slo.ts +6 -23
  251. package/src/console/ui/overview/verdict.ts +3 -10
  252. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  253. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  254. package/src/console/ui/plugins/fixture.ts +2 -4
  255. package/src/console/ui/plugins/group.test.ts +1 -3
  256. package/src/console/ui/plugins/group.ts +1 -6
  257. package/src/console/ui/plugins/index.ts +3 -13
  258. package/src/console/ui/plugins/search.ts +7 -19
  259. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  260. package/src/console/ui/runs/a11y.test.tsx +2 -5
  261. package/src/console/ui/runs/explain.ts +2 -6
  262. package/src/console/ui/runs/group.ts +3 -12
  263. package/src/console/ui/runs/histogram.test.ts +2 -11
  264. package/src/console/ui/runs/histogram.ts +1 -4
  265. package/src/console/ui/runs/index.ts +4 -18
  266. package/src/console/ui/runs/project.ts +2 -6
  267. package/src/console/ui/runs/query.test.ts +1 -3
  268. package/src/console/ui/runs/query.ts +12 -35
  269. package/src/console/ui/runs/search.ts +5 -19
  270. package/src/console/ui/runs/trace-link.test.ts +2 -6
  271. package/src/console/ui/runs/trace-link.ts +4 -16
  272. package/src/console/ui/runs/types.ts +1 -3
  273. package/src/console/ui/shell/App.tsx +2 -10
  274. package/src/console/ui/shell/client.ts +22 -115
  275. package/src/console/ui/shell/components/ui.tsx +1 -4
  276. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  277. package/src/console/ui/shell/main.tsx +31 -96
  278. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  279. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  280. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  281. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  282. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  283. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  284. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  285. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  286. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  287. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  288. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  289. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  290. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  291. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  292. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  293. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  294. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  295. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  296. package/src/console/ui/shell/styles.css +1 -2
  297. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  298. package/src/console/ui/signals/a11y.test.tsx +2 -5
  299. package/src/console/ui/signals/confirmation.test.ts +1 -5
  300. package/src/console/ui/signals/confirmation.ts +2 -6
  301. package/src/console/ui/signals/dry-run.ts +1 -3
  302. package/src/console/ui/signals/durable.ts +1 -3
  303. package/src/console/ui/signals/findings.ts +1 -3
  304. package/src/console/ui/signals/group.test.ts +2 -8
  305. package/src/console/ui/signals/group.ts +2 -10
  306. package/src/console/ui/signals/index.ts +1 -4
  307. package/src/console/ui/signals/monitor.ts +2 -7
  308. package/src/console/ui/signals/schema-form.test.ts +3 -14
  309. package/src/console/ui/signals/schema-form.ts +1 -4
  310. package/src/console/ui/signals/search.ts +4 -13
  311. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  312. package/src/console/ui/store/a11y.test.tsx +2 -5
  313. package/src/console/ui/store/confirmation.test.ts +1 -3
  314. package/src/console/ui/store/confirmation.ts +1 -4
  315. package/src/console/ui/store/dry-run.ts +2 -5
  316. package/src/console/ui/store/fixture.ts +1 -2
  317. package/src/console/ui/store/group.test.ts +1 -6
  318. package/src/console/ui/store/group.ts +1 -4
  319. package/src/console/ui/store/index.ts +1 -5
  320. package/src/console/ui/store/search.ts +2 -6
  321. package/src/console/ui/store/will-not-fire.ts +1 -2
  322. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  323. package/src/console/ui/traces/a11y.test.tsx +1 -2
  324. package/src/console/ui/traces/chain.test.ts +5 -19
  325. package/src/console/ui/traces/chain.ts +1 -3
  326. package/src/console/ui/traces/critical-path.test.ts +1 -3
  327. package/src/console/ui/traces/critical-path.ts +2 -6
  328. package/src/console/ui/traces/filter.test.ts +2 -6
  329. package/src/console/ui/traces/filter.ts +5 -13
  330. package/src/console/ui/traces/fold.test.ts +4 -12
  331. package/src/console/ui/traces/fold.ts +1 -3
  332. package/src/console/ui/traces/mini.ts +1 -3
  333. package/src/console/ui/traces/replay.test.ts +1 -3
  334. package/src/console/ui/traces/replay.ts +1 -3
  335. package/src/console/ui/traces/sampling.ts +1 -4
  336. package/src/console/ui/traces/search.ts +4 -17
  337. package/src/console/ui/traces/tier.ts +1 -3
  338. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  339. package/src/console/ui/vault/a11y.test.tsx +1 -2
  340. package/src/console/ui/vault/blast-radius.ts +1 -3
  341. package/src/console/ui/vault/confirmation.test.ts +1 -5
  342. package/src/console/ui/vault/confirmation.ts +1 -4
  343. package/src/console/ui/vault/dormant.test.ts +1 -4
  344. package/src/console/ui/vault/export-safe.test.ts +1 -5
  345. package/src/console/ui/vault/export-safe.ts +1 -4
  346. package/src/console/ui/vault/fixture.ts +3 -3
  347. package/src/console/ui/vault/group.ts +1 -2
  348. package/src/console/ui/vault/index.ts +2 -10
  349. package/src/console/ui/vault/search.ts +2 -6
  350. package/src/console/ui/vault/types.ts +1 -1
  351. package/src/console/xss.gate.test.ts +1 -3
  352. package/src/docker/compose.ts +112 -20
  353. package/src/docker/derive.ts +5 -19
  354. package/src/docker/docker.test.ts +15 -15
  355. package/src/docker/dockerfile.integration.test.ts +12 -21
  356. package/src/docker/helpers.ts +5 -4
  357. package/src/docker/index.ts +4 -11
  358. package/src/docker/pin.ts +1 -9
  359. package/src/docker/recipes/index.ts +5 -6
  360. package/src/docker/recipes/mailpit.ts +22 -0
  361. package/src/docker/recipes/postgres.ts +17 -6
  362. package/src/docker/recipes/redis.ts +6 -1
  363. package/src/docker/recipes/rustfs.ts +33 -0
  364. package/src/docker/stack-id.test.ts +33 -0
  365. package/src/docker/stack-id.ts +25 -13
  366. package/src/docker/stack.integration.test.ts +6 -21
  367. package/src/docker/types.ts +13 -4
  368. package/src/drivers/ai-anthropic.ts +5 -14
  369. package/src/drivers/ai-mock.ts +2 -5
  370. package/src/drivers/ai-openai-compatible.ts +4 -10
  371. package/src/drivers/ai-providers.test.ts +6 -13
  372. package/src/drivers/bun-native-completeness.test.ts +6 -15
  373. package/src/drivers/channel-console.ts +6 -7
  374. package/src/drivers/channel-fcm.ts +20 -30
  375. package/src/drivers/channel-resend.ts +1 -3
  376. package/src/drivers/channel-smtp.ts +2 -6
  377. package/src/drivers/channel-types.ts +2 -12
  378. package/src/drivers/channel-unifonic.ts +2 -6
  379. package/src/drivers/channel-wa-cloud.ts +2 -6
  380. package/src/drivers/channel-webpush.ts +21 -60
  381. package/src/drivers/conformance.test.ts +2 -10
  382. package/src/drivers/conformance.ts +8 -21
  383. package/src/drivers/fs.ts +2 -8
  384. package/src/drivers/index.ts +12 -56
  385. package/src/drivers/memory.ts +14 -41
  386. package/src/drivers/pgvector.ts +7 -11
  387. package/src/drivers/postgres.ts +7 -13
  388. package/src/drivers/redis.ts +13 -37
  389. package/src/drivers/s3.ts +5 -17
  390. package/src/drivers/signal-engine.ts +12 -49
  391. package/src/drivers/signal-memory.ts +2 -8
  392. package/src/drivers/signal-nats.ts +4 -9
  393. package/src/drivers/signal-postgres.ts +62 -129
  394. package/src/drivers/signal-redis.ts +7 -21
  395. package/src/drivers/signal-types.ts +1 -4
  396. package/src/drivers/sqlite.ts +3 -12
  397. package/src/drivers/types.ts +4 -23
  398. package/src/drivers/vault-env.ts +2 -6
  399. package/src/drivers/vault-infisical.ts +1 -5
  400. package/src/drivers/vault-managed.ts +1 -5
  401. package/src/drivers/vault-memory.ts +1 -5
  402. package/src/drivers/vault-openbao.ts +1 -5
  403. package/src/drivers/vault-sops.ts +10 -35
  404. package/src/drivers/vault-types.ts +1 -7
  405. package/src/elements/ai/declare.ts +4 -14
  406. package/src/elements/ai/eval.ts +2 -6
  407. package/src/elements/ai/pii.ts +1 -3
  408. package/src/elements/ai/runtime.ts +12 -50
  409. package/src/elements/ai/schema.ts +4 -15
  410. package/src/elements/ai.test.ts +13 -24
  411. package/src/elements/ai.ts +1 -5
  412. package/src/elements/channel/consent.ts +3 -12
  413. package/src/elements/channel/costs.ts +4 -15
  414. package/src/elements/channel/declare.ts +1 -4
  415. package/src/elements/channel/email-auth.ts +1 -4
  416. package/src/elements/channel/locale.ts +2 -10
  417. package/src/elements/channel/mask.ts +1 -3
  418. package/src/elements/channel/mime.ts +2 -12
  419. package/src/elements/channel/outcomes.test.ts +1 -5
  420. package/src/elements/channel/outcomes.ts +5 -15
  421. package/src/elements/channel/receipts.ts +2 -7
  422. package/src/elements/channel/runtime.ts +28 -74
  423. package/src/elements/channel/suppression.ts +8 -14
  424. package/src/elements/channel.test.ts +8 -31
  425. package/src/elements/channel.ts +3 -14
  426. package/src/elements/clock/actions.ts +6 -18
  427. package/src/elements/clock/declare.ts +1 -3
  428. package/src/elements/clock/dst.ts +1 -5
  429. package/src/elements/clock/durable.ts +4 -16
  430. package/src/elements/clock/health.ts +2 -7
  431. package/src/elements/clock/leader.ts +2 -9
  432. package/src/elements/clock/reconcile.ts +4 -15
  433. package/src/elements/clock/runtime.ts +2 -5
  434. package/src/elements/clock/schedule.ts +4 -20
  435. package/src/elements/clock.test.ts +2 -7
  436. package/src/elements/clock.ts +5 -23
  437. package/src/elements/gate/permissions.ts +1 -4
  438. package/src/elements/gate/runtime.ts +7 -28
  439. package/src/elements/gate.ts +1 -5
  440. package/src/elements/index.ts +9 -7
  441. package/src/elements/signal/declare.ts +2 -7
  442. package/src/elements/signal/reconcile.test.ts +1 -4
  443. package/src/elements/signal/runtime.ts +1 -3
  444. package/src/elements/signal.test.ts +3 -15
  445. package/src/elements/signal.ts +2 -8
  446. package/src/elements/store/cache.test.ts +46 -0
  447. package/src/elements/store/cache.ts +3 -11
  448. package/src/elements/store/classify.ts +5 -22
  449. package/src/elements/store/declare.ts +8 -17
  450. package/src/elements/store/domain-ddl.test.ts +86 -0
  451. package/src/elements/store/emit-drizzle.ts +363 -0
  452. package/src/elements/store/files-policy.test.ts +1 -5
  453. package/src/elements/store/files-policy.ts +4 -12
  454. package/src/elements/store/load-plugin-tables.ts +103 -0
  455. package/src/elements/store/missing-relation.test.ts +83 -0
  456. package/src/elements/store/missing-relation.ts +38 -0
  457. package/src/elements/store/replica.ts +1 -4
  458. package/src/elements/store/runtime.ts +25 -28
  459. package/src/elements/store/schema-decl.test.ts +227 -0
  460. package/src/elements/store/schema-decl.ts +516 -0
  461. package/src/elements/store/sql-condition.ts +11 -21
  462. package/src/elements/store/sql-session.test.ts +50 -0
  463. package/src/elements/store/sql-session.ts +60 -63
  464. package/src/elements/store/table.ts +35 -19
  465. package/src/elements/store.test.ts +17 -39
  466. package/src/elements/store.ts +37 -31
  467. package/src/elements/vault/chain.ts +34 -0
  468. package/src/elements/vault/declare.ts +22 -32
  469. package/src/elements/vault/fingerprint.ts +2 -7
  470. package/src/elements/vault/redact.ts +2 -6
  471. package/src/elements/vault/runtime.ts +18 -32
  472. package/src/elements/vault.test.ts +12 -28
  473. package/src/elements/vault.ts +8 -12
  474. package/src/index.ts +5 -2
  475. package/src/kernel/adopt-routes.ts +15 -29
  476. package/src/kernel/app.ts +34 -94
  477. package/src/kernel/auth-resolve.ts +2 -9
  478. package/src/kernel/boot-bind/ai.ts +1 -4
  479. package/src/kernel/boot-bind/channel.ts +2 -8
  480. package/src/kernel/boot-bind/clock.ts +2 -6
  481. package/src/kernel/boot-bind/gate.ts +2 -8
  482. package/src/kernel/boot-bind/runs.ts +1 -3
  483. package/src/kernel/boot-bind/signal.ts +3 -10
  484. package/src/kernel/boot-bind/store.test.ts +17 -17
  485. package/src/kernel/boot-bind/store.ts +44 -50
  486. package/src/kernel/boot-bind/vault.ts +2 -8
  487. package/src/kernel/boot.test.ts +4 -9
  488. package/src/kernel/boot.ts +29 -76
  489. package/src/kernel/budget.test.ts +1 -3
  490. package/src/kernel/capability.ts +3 -10
  491. package/src/kernel/dry-run.test.ts +1 -4
  492. package/src/kernel/dry-run.ts +3 -11
  493. package/src/kernel/effects.test.ts +1 -5
  494. package/src/kernel/effects.ts +4 -11
  495. package/src/kernel/errors.registry.test.ts +2 -8
  496. package/src/kernel/errors.ts +23 -32
  497. package/src/kernel/flow.test.ts +12 -25
  498. package/src/kernel/flow.ts +5 -25
  499. package/src/kernel/fx.test.ts +15 -44
  500. package/src/kernel/fx.ts +27 -79
  501. package/src/kernel/hook-timing.test.ts +3 -6
  502. package/src/kernel/hook-timing.ts +5 -14
  503. package/src/kernel/hooks.test.ts +10 -10
  504. package/src/kernel/hooks.ts +3 -12
  505. package/src/kernel/index.ts +4 -17
  506. package/src/kernel/journal.ts +7 -31
  507. package/src/kernel/on.ts +1 -6
  508. package/src/kernel/pipeline.test.ts +10 -19
  509. package/src/kernel/pipeline.ts +5 -17
  510. package/src/kernel/plug.ts +4 -11
  511. package/src/kernel/plugin/conflicts.test.ts +13 -25
  512. package/src/kernel/plugin/decorate.test.ts +8 -13
  513. package/src/kernel/plugin/scoping.test.ts +4 -11
  514. package/src/kernel/plugin.ts +48 -24
  515. package/src/kernel/registry.ts +80 -29
  516. package/src/kernel/router.test.ts +15 -13
  517. package/src/kernel/router.ts +9 -29
  518. package/src/kernel/routing-budget.test.ts +1 -3
  519. package/src/kernel/run-telemetry.ts +1 -3
  520. package/src/kernel/triggers.ts +4 -21
  521. package/src/manifest/diff.test.ts +26 -91
  522. package/src/manifest/diff.ts +95 -225
  523. package/src/manifest/index.ts +2 -9
  524. package/src/manifest/types.ts +29 -5
  525. package/src/manifest/undeclared.test.ts +4 -12
  526. package/src/manifest/undeclared.ts +1 -2
  527. package/src/manifest/validate.test.ts +2 -6
  528. package/src/manifest/validate.ts +4 -14
  529. package/src/mcp/authorization.ts +8 -27
  530. package/src/mcp/confirmation.ts +3 -10
  531. package/src/mcp/data.ts +2 -6
  532. package/src/mcp/docs-index.ts +4 -7
  533. package/src/mcp/docs-mcp.test.ts +3 -12
  534. package/src/mcp/docs-server.ts +7 -27
  535. package/src/mcp/docs-tools.ts +2 -6
  536. package/src/mcp/index.ts +1 -6
  537. package/src/mcp/injection.gate.test.ts +4 -18
  538. package/src/mcp/mcp.test.ts +18 -49
  539. package/src/mcp/protocol.ts +3 -10
  540. package/src/mcp/server.ts +11 -52
  541. package/src/mcp/session.ts +4 -14
  542. package/src/mcp/tools.ts +14 -50
  543. package/src/plugins/catalogue.test.ts +3 -7
  544. package/src/plugins/catalogue.ts +1 -3
  545. package/src/plugins/node-import-scan.ts +2 -5
  546. package/src/plugins/supply-chain.ts +5 -17
  547. package/src/release/exports.ts +3 -8
  548. package/src/release/measure.exports.test.ts +1 -3
  549. package/src/release/measure.ts +15 -43
  550. package/src/runs/bench.test.ts +1 -3
  551. package/src/runs/collect.ts +8 -25
  552. package/src/runs/drivers/clickhouse.ts +2 -9
  553. package/src/runs/drivers/files.ts +9 -31
  554. package/src/runs/drivers/memory.ts +5 -22
  555. package/src/runs/drivers/postgres.ts +8 -20
  556. package/src/runs/duckdb.ts +2 -8
  557. package/src/runs/index.ts +3 -14
  558. package/src/runs/outlier.ts +3 -10
  559. package/src/runs/parquet.ts +8 -26
  560. package/src/runs/privacy.ts +2 -8
  561. package/src/runs/runs.test.ts +3 -9
  562. package/src/runs/runtime.ts +7 -32
  563. package/src/runs/shred.ts +10 -29
  564. package/src/runs/types.ts +1 -4
  565. package/src/runtime/bun.ts +4 -15
  566. package/src/runtime/cold-start.bench.ts +1 -3
  567. package/src/runtime/dev-request-log.test.ts +1 -4
  568. package/src/runtime/dev-request-log.ts +1 -4
  569. package/src/runtime/index.ts +1 -6
  570. package/src/runtime/primitives.ts +5 -4
  571. package/src/runtime/security.ts +3 -13
  572. package/src/runtime/serve.test.ts +4 -7
  573. package/src/runtime/types.ts +1 -4
  574. package/src/runtime/web-standard.ts +3 -15
  575. package/src/term.test.ts +4 -6
  576. package/src/term.ts +49 -98
  577. package/src/test/create-test-app.test.ts +4 -14
  578. package/src/test/create-test-app.ts +13 -31
  579. package/src/test/provisions.integration.test.ts +3 -11
  580. package/src/upgrade/codemods.test.ts +25 -6
  581. package/src/upgrade/codemods.ts +116 -3
  582. package/src/validation/standard-schema.test.ts +2 -5
  583. package/src/validation/standard-schema.ts +13 -33
  584. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
@@ -47,9 +47,7 @@ function b64urlEncode(bytes: Uint8Array): string {
47
47
  *
48
48
  * @param privateKeyB64 - Base64url private key
49
49
  */
50
- async function importVapidPrivateKey(
51
- privateKeyB64: string,
52
- ): Promise<CryptoKey> {
50
+ async function importVapidPrivateKey(privateKeyB64: string): Promise<CryptoKey> {
53
51
  const raw = b64urlDecode(privateKeyB64);
54
52
  // Prefer PKCS8; fall back to raw JWK construction for 32-byte seeds.
55
53
  if (raw.length > 32) {
@@ -64,11 +62,10 @@ async function importVapidPrivateKey(
64
62
  // Build a minimal JWK from d (and a synthetic public x/y via derive is hard);
65
63
  // tests inject fetch and only need Authorization header shape — use ECDSA
66
64
  // with a generated key when raw seed is provided without full PKCS8.
67
- const pair = await crypto.subtle.generateKey(
68
- { name: "ECDSA", namedCurve: "P-256" },
69
- true,
70
- ["sign", "verify"],
71
- );
65
+ const pair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [
66
+ "sign",
67
+ "verify",
68
+ ]);
72
69
  return pair.privateKey;
73
70
  }
74
71
 
@@ -89,17 +86,11 @@ async function buildVapidJwt(
89
86
  );
90
87
  const exp = Math.floor(Date.now() / 1000) + 12 * 60 * 60;
91
88
  const payload = b64urlEncode(
92
- new TextEncoder().encode(
93
- JSON.stringify({ aud: audience, exp, sub: subject }),
94
- ),
89
+ new TextEncoder().encode(JSON.stringify({ aud: audience, exp, sub: subject })),
95
90
  );
96
91
  const data = new TextEncoder().encode(`${header}.${payload}`);
97
92
  const sig = new Uint8Array(
98
- await crypto.subtle.sign(
99
- { name: "ECDSA", hash: "SHA-256" },
100
- privateKey,
101
- data,
102
- ),
93
+ await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, privateKey, data),
103
94
  );
104
95
  // Convert DER → raw r||s if needed; Web Crypto in Bun returns raw P-1363.
105
96
  return `${header}.${payload}.${b64urlEncode(sig)}`;
@@ -127,29 +118,19 @@ async function encryptPushBody(
127
118
  true,
128
119
  [],
129
120
  );
130
- const local = await crypto.subtle.generateKey(
131
- { name: "ECDH", namedCurve: "P-256" },
132
- true,
133
- ["deriveBits"],
134
- );
121
+ const local = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, [
122
+ "deriveBits",
123
+ ]);
135
124
  const shared = new Uint8Array(
136
- await crypto.subtle.deriveBits(
137
- { name: "ECDH", public: userPublic },
138
- local.privateKey,
139
- 256,
140
- ),
125
+ await crypto.subtle.deriveBits({ name: "ECDH", public: userPublic }, local.privateKey, 256),
141
126
  );
142
127
  const salt = crypto.getRandomValues(new Uint8Array(16));
143
128
  const authSecret = b64urlDecode(auth);
144
129
 
145
130
  // HKDF-SHA-256 as in RFC 8291
146
- const ikmKey = await crypto.subtle.importKey(
147
- "raw",
148
- asBufferSource(shared),
149
- "HKDF",
150
- false,
151
- ["deriveBits"],
152
- );
131
+ const ikmKey = await crypto.subtle.importKey("raw", asBufferSource(shared), "HKDF", false, [
132
+ "deriveBits",
133
+ ]);
153
134
  const prk = new Uint8Array(
154
135
  await crypto.subtle.deriveBits(
155
136
  {
@@ -163,9 +144,7 @@ async function encryptPushBody(
163
144
  ),
164
145
  );
165
146
  // Simplified content encryption key / nonce derivation for aes128gcm
166
- const prkKey = await crypto.subtle.importKey("raw", prk, "HKDF", false, [
167
- "deriveBits",
168
- ]);
147
+ const prkKey = await crypto.subtle.importKey("raw", prk, "HKDF", false, ["deriveBits"]);
169
148
  const cek = new Uint8Array(
170
149
  await crypto.subtle.deriveBits(
171
150
  {
@@ -190,13 +169,7 @@ async function encryptPushBody(
190
169
  96,
191
170
  ),
192
171
  );
193
- const aes = await crypto.subtle.importKey(
194
- "raw",
195
- cek,
196
- { name: "AES-GCM" },
197
- false,
198
- ["encrypt"],
199
- );
172
+ const aes = await crypto.subtle.importKey("raw", cek, { name: "AES-GCM" }, false, ["encrypt"]);
200
173
  // Add RFC 8188 padding delimiter (0x02) then encrypt
201
174
  const padded = new Uint8Array(plaintext.length + 1);
202
175
  padded.set(plaintext, 0);
@@ -204,17 +177,13 @@ async function encryptPushBody(
204
177
  const ciphertext = new Uint8Array(
205
178
  await crypto.subtle.encrypt({ name: "AES-GCM", iv: nonce }, aes, padded),
206
179
  );
207
- const localPublic = new Uint8Array(
208
- await crypto.subtle.exportKey("raw", local.publicKey),
209
- );
180
+ const localPublic = new Uint8Array(await crypto.subtle.exportKey("raw", local.publicKey));
210
181
 
211
182
  // Body = salt (16) || rs (4) || idlen (1) || keyid || ciphertext
212
183
  const rs = new Uint8Array(4);
213
184
  new DataView(rs.buffer).setUint32(0, 4096);
214
185
  const idlen = new Uint8Array([localPublic.length]);
215
- const body = new Uint8Array(
216
- 16 + 4 + 1 + localPublic.length + ciphertext.length,
217
- );
186
+ const body = new Uint8Array(16 + 4 + 1 + localPublic.length + ciphertext.length);
218
187
  body.set(salt, 0);
219
188
  body.set(rs, 16);
220
189
  body.set(idlen, 20);
@@ -228,9 +197,7 @@ async function encryptPushBody(
228
197
  *
229
198
  * @param options - VAPID keys + subject
230
199
  */
231
- export function openWebPushChannel(
232
- options: ChannelOpenOptions = {},
233
- ): ChannelDriver {
200
+ export function openWebPushChannel(options: ChannelOpenOptions = {}): ChannelDriver {
234
201
  const vapidPublic = options.vapidPublicKey;
235
202
  const vapidPrivate = options.vapidPrivateKey;
236
203
  const subject = options.vapidSubject ?? "mailto:ops@oke.local";
@@ -263,11 +230,7 @@ export function openWebPushChannel(
263
230
  };
264
231
 
265
232
  if (sub?.keys?.p256dh && sub.keys.auth) {
266
- const enc = await encryptPushBody(
267
- plaintext,
268
- sub.keys.p256dh,
269
- sub.keys.auth,
270
- );
233
+ const enc = await encryptPushBody(plaintext, sub.keys.p256dh, sub.keys.auth);
271
234
  body = enc.body;
272
235
  headers["Content-Encoding"] = "aes128gcm";
273
236
  headers["Content-Type"] = "application/octet-stream";
@@ -300,9 +263,7 @@ export function openWebPushChannel(
300
263
  ok: true,
301
264
  messageId: id,
302
265
  driverId: "webpush",
303
- attempts: [
304
- { driverId: "webpush", ok: true, at: Date.now(), messageId: id },
305
- ],
266
+ attempts: [{ driverId: "webpush", ok: true, at: Date.now(), messageId: id }],
306
267
  };
307
268
  },
308
269
  };
@@ -11,12 +11,7 @@ import {
11
11
  runSqlConformance,
12
12
  } from "./conformance.ts";
13
13
  import { fsDriver } from "./fs.ts";
14
- import {
15
- memoryFilesDriver,
16
- memoryIndexDriver,
17
- memoryKvDriver,
18
- memorySqlDriver,
19
- } from "./memory.ts";
14
+ import { memoryFilesDriver, memoryIndexDriver, memoryKvDriver, memorySqlDriver } from "./memory.ts";
20
15
  import { pgvectorDriver } from "./pgvector.ts";
21
16
  import { createPostgresFakeClient, postgresDriver } from "./postgres.ts";
22
17
  import { createRedisFakeClient, redisDriver } from "./redis.ts";
@@ -41,10 +36,7 @@ describe("kv conformance", () => {
41
36
  describe("files conformance", () => {
42
37
  test("memory", () => runFilesConformance(memoryFilesDriver));
43
38
  test("fs", async () => {
44
- const root = join(
45
- process.env.TMPDIR ?? "/tmp",
46
- `oke-fs-conf-${crypto.randomUUID()}`,
47
- );
39
+ const root = join(process.env.TMPDIR ?? "/tmp", `oke-fs-conf-${crypto.randomUUID()}`);
48
40
  await runFilesConformance(fsDriver, { root, name: "conf" });
49
41
  });
50
42
  test("s3 (fake Bun.S3 client)", () =>
@@ -8,13 +8,7 @@
8
8
  import { expect } from "bun:test";
9
9
  import { createSqlStoreHandle } from "../elements/store/sql-session.ts";
10
10
  import { defineTable } from "../elements/store/table.ts";
11
- import type {
12
- FilesDriver,
13
- IndexDriver,
14
- KvDriver,
15
- SqlDriver,
16
- SqlConnectOptions,
17
- } from "./types.ts";
11
+ import type { FilesDriver, IndexDriver, KvDriver, SqlDriver, SqlConnectOptions } from "./types.ts";
18
12
 
19
13
  /** SQL conformance against one driver. */
20
14
  export async function runSqlConformance(
@@ -37,9 +31,7 @@ export async function runSqlConformance(
37
31
  expect(all).toHaveLength(1);
38
32
  expect(all[0]?.title).toBe("hello");
39
33
 
40
- const one = await primary.query(`SELECT * FROM "notes" WHERE "id" = ?`, [
41
- "n1",
42
- ]);
34
+ const one = await primary.query(`SELECT * FROM "notes" WHERE "id" = ?`, ["n1"]);
43
35
  expect(one[0]?.email).toBe("a@b.c");
44
36
 
45
37
  const del = await primary.exec(`DELETE FROM "notes" WHERE "id" = ?`, ["n1"]);
@@ -51,10 +43,10 @@ export async function runSqlConformance(
51
43
  await primary.exec(
52
44
  `CREATE TABLE IF NOT EXISTS "counters" ("id" TEXT PRIMARY KEY, "clicks" INTEGER)`,
53
45
  );
54
- await primary.query(
55
- `INSERT INTO "counters" ("id", "clicks") VALUES (?, ?) RETURNING *`,
56
- ["c1", 0],
57
- );
46
+ await primary.query(`INSERT INTO "counters" ("id", "clicks") VALUES (?, ?) RETURNING *`, [
47
+ "c1",
48
+ 0,
49
+ ]);
58
50
 
59
51
  const handle = createSqlStoreHandle(`sql:conformance`, {
60
52
  connection: primary,
@@ -71,14 +63,9 @@ export async function runSqlConformance(
71
63
 
72
64
  const concurrent = 100;
73
65
  await Promise.all(
74
- Array.from({ length: concurrent }, () =>
75
- handle.increment(counters, "c1", "clicks"),
76
- ),
77
- );
78
- const finalRows = await primary.query(
79
- `SELECT * FROM "counters" WHERE "id" = ?`,
80
- ["c1"],
66
+ Array.from({ length: concurrent }, () => handle.increment(counters, "c1", "clicks")),
81
67
  );
68
+ const finalRows = await primary.query(`SELECT * FROM "counters" WHERE "id" = ?`, ["c1"]);
82
69
  expect(Number(finalRows[0]?.clicks)).toBe(1 + concurrent);
83
70
  } finally {
84
71
  await primary.close();
package/src/drivers/fs.ts CHANGED
@@ -4,20 +4,14 @@
4
4
 
5
5
  import { mkdir, rm } from "node:fs/promises";
6
6
  import { join } from "node:path";
7
- import type {
8
- FilesBucket,
9
- FilesDriver,
10
- FilesOpenOptions,
11
- } from "./types.ts";
7
+ import type { FilesBucket, FilesDriver, FilesOpenOptions } from "./types.ts";
12
8
 
13
9
  /**
14
10
  * Open a files bucket rooted on the local filesystem.
15
11
  *
16
12
  * @param options - Bucket name and root directory
17
13
  */
18
- export async function openFsBucket(
19
- options: FilesOpenOptions,
20
- ): Promise<FilesBucket> {
14
+ export async function openFsBucket(options: FilesOpenOptions): Promise<FilesBucket> {
21
15
  const root = options.root ?? join(tmpdirSafe(), `oke-files-${options.name}`);
22
16
  await mkdir(root, { recursive: true });
23
17
 
@@ -67,33 +67,17 @@ export {
67
67
  type PostgresClientLike,
68
68
  } from "./postgres.ts";
69
69
 
70
- export {
71
- redisDriver,
72
- openRedisKv,
73
- createRedisFakeClient,
74
- createBunRedisClient,
75
- } from "./redis.ts";
70
+ export { redisDriver, openRedisKv, createRedisFakeClient, createBunRedisClient } from "./redis.ts";
76
71
 
77
- export {
78
- LuaKvStore,
79
- registerLuaScript,
80
- hasLuaScript,
81
- } from "./kv-lua.ts";
72
+ export { LuaKvStore, registerLuaScript, hasLuaScript } from "./kv-lua.ts";
82
73
 
83
74
  export { fsDriver, openFsBucket } from "./fs.ts";
84
75
 
85
- export {
86
- s3Driver,
87
- openS3Bucket,
88
- createS3FakeClient,
89
- } from "./s3.ts";
76
+ export { s3Driver, openS3Bucket, createS3FakeClient } from "./s3.ts";
90
77
 
91
78
  export { pgvectorDriver, openPgvectorIndex } from "./pgvector.ts";
92
79
 
93
- export {
94
- memorySignalDriver,
95
- openMemorySignal,
96
- } from "./signal-memory.ts";
80
+ export { memorySignalDriver, openMemorySignal } from "./signal-memory.ts";
97
81
 
98
82
  export {
99
83
  postgresSignalDriver,
@@ -110,28 +94,15 @@ export {
110
94
  parseXreadgroupReply,
111
95
  } from "./signal-redis.ts";
112
96
 
113
- export {
114
- natsSignalDriver,
115
- openNatsSignal,
116
- createSignalNatsFake,
117
- } from "./signal-nats.ts";
97
+ export { natsSignalDriver, openNatsSignal, createSignalNatsFake } from "./signal-nats.ts";
118
98
 
119
99
  // Conformance helpers are test-only — import from `okengine/drivers/conformance`.
120
100
 
121
- export type {
122
- VaultDriverId,
123
- VaultOpenOptions,
124
- VaultBag,
125
- VaultDriver,
126
- } from "./vault-types.ts";
101
+ export type { VaultDriverId, VaultOpenOptions, VaultBag, VaultDriver } from "./vault-types.ts";
127
102
 
128
103
  export { memoryVaultDriver } from "./vault-memory.ts";
129
104
  export { envVaultDriver } from "./vault-env.ts";
130
- export {
131
- sopsVaultDriver,
132
- buildSopsFixture,
133
- sopsEncryptValue,
134
- } from "./vault-sops.ts";
105
+ export { sopsVaultDriver, buildSopsFixture, sopsEncryptValue } from "./vault-sops.ts";
135
106
  export { openbaoVaultDriver } from "./vault-openbao.ts";
136
107
  export { infisicalVaultDriver } from "./vault-infisical.ts";
137
108
  export { managedVaultDriver } from "./vault-managed.ts";
@@ -150,25 +121,13 @@ export type {
150
121
  } from "./channel-types.ts";
151
122
  export { createChannelInbox } from "./channel-types.ts";
152
123
 
153
- export {
154
- consoleChannelDriver,
155
- openConsoleChannel,
156
- } from "./channel-console.ts";
124
+ export { consoleChannelDriver, openConsoleChannel } from "./channel-console.ts";
157
125
  export { smtpChannelDriver, openSmtpChannel } from "./channel-smtp.ts";
158
126
  export { resendChannelDriver, openResendChannel } from "./channel-resend.ts";
159
- export {
160
- unifonicChannelDriver,
161
- openUnifonicChannel,
162
- } from "./channel-unifonic.ts";
163
- export {
164
- waCloudChannelDriver,
165
- openWaCloudChannel,
166
- } from "./channel-wa-cloud.ts";
127
+ export { unifonicChannelDriver, openUnifonicChannel } from "./channel-unifonic.ts";
128
+ export { waCloudChannelDriver, openWaCloudChannel } from "./channel-wa-cloud.ts";
167
129
  export { fcmChannelDriver, openFcmChannel } from "./channel-fcm.ts";
168
- export {
169
- webpushChannelDriver,
170
- openWebPushChannel,
171
- } from "./channel-webpush.ts";
130
+ export { webpushChannelDriver, openWebPushChannel } from "./channel-webpush.ts";
172
131
 
173
132
  export type {
174
133
  AiDriverId,
@@ -184,7 +143,4 @@ export type {
184
143
 
185
144
  export { mockAiDriver, createMockAiDriver } from "./ai-mock.ts";
186
145
  export { anthropicAiDriver, openAnthropic } from "./ai-anthropic.ts";
187
- export {
188
- openaiCompatibleAiDriver,
189
- openOpenaiCompatible,
190
- } from "./ai-openai-compatible.ts";
146
+ export { openaiCompatibleAiDriver, openOpenaiCompatible } from "./ai-openai-compatible.ts";
@@ -53,12 +53,8 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
53
53
  const table = getTable(parseIdent(selectGeneric[2]!));
54
54
  const selectList = selectGeneric[1]!.trim();
55
55
  const whereClause = selectGeneric[3]?.trim();
56
- const orderCol = selectGeneric[4]
57
- ? parseIdent(selectGeneric[4])
58
- : undefined;
59
- const limit = selectGeneric[5]
60
- ? Number(selectGeneric[5])
61
- : undefined;
56
+ const orderCol = selectGeneric[4] ? parseIdent(selectGeneric[4]) : undefined;
57
+ const limit = selectGeneric[5] ? Number(selectGeneric[5]) : undefined;
62
58
  let rows = table.rows.map((r) => ({ ...r }));
63
59
  if (whereClause) {
64
60
  const preds = parseWherePredicates(whereClause);
@@ -74,9 +70,8 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
74
70
  if (limit !== undefined) rows = rows.slice(0, limit);
75
71
  if (selectList === "*") return rows;
76
72
  const cols = selectList.split(",").map((part) => {
77
- const as = /^\s*("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+AS\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*$/i.exec(
78
- part,
79
- );
73
+ const as =
74
+ /^\s*("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+AS\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*$/i.exec(part);
80
75
  if (as) {
81
76
  return { sql: parseIdent(as[1]!), alias: parseIdent(as[2]!) };
82
77
  }
@@ -97,9 +92,7 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
97
92
  if (exists) {
98
93
  const table = getTable(parseIdent(exists[2]!));
99
94
  const preds = parseEqualityWhere(exists[3]!);
100
- const hit = table.rows.some((r) =>
101
- preds.every((p, i) => r[p] === params[i]),
102
- );
95
+ const hit = table.rows.some((r) => preds.every((p, i) => r[p] === params[i]));
103
96
  return hit ? [{ [parseIdent(exists[1]!)]: 1 }] : [];
104
97
  }
105
98
 
@@ -215,18 +208,14 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
215
208
  throw new Error(`memory sql: unsupported exec: ${sql}`);
216
209
  }
217
210
  const preds = parseEqualityWhere(updateIncAnd[4]!);
218
- const row = table.rows.find((r) =>
219
- preds.every((p, i) => r[p] === params[i]),
220
- );
211
+ const row = table.rows.find((r) => preds.every((p, i) => r[p] === params[i]));
221
212
  if (!row) return { changes: 0 };
222
213
  row[setCol] = Number(row[setCol] ?? 0) + 1;
223
214
  return { changes: 1 };
224
215
  }
225
216
 
226
217
  const updateSet =
227
- /^UPDATE\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+SET\s+(.+?)\s+WHERE\s+(.+)\s*$/i.exec(
228
- text,
229
- );
218
+ /^UPDATE\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+SET\s+(.+?)\s+WHERE\s+(.+)\s*$/i.exec(text);
230
219
  if (updateSet) {
231
220
  const table = getTable(parseIdent(updateSet[1]!));
232
221
  const setParts = updateSet[2]!.split(",").map((p) => p.trim());
@@ -237,9 +226,7 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
237
226
  });
238
227
  const preds = parseWherePredicates(updateSet[3]!);
239
228
  const row = table.rows.find((r) =>
240
- preds.every((p, i) =>
241
- compareRow(r[p.column], params[setCols.length + i], p.op),
242
- ),
229
+ preds.every((p, i) => compareRow(r[p.column], params[setCols.length + i], p.op)),
243
230
  );
244
231
  if (!row) return { changes: 0 };
245
232
  setCols.forEach((col, i) => {
@@ -275,23 +262,15 @@ interface WherePred {
275
262
  /** Parse `col = ? AND col2 < ?` into ordered predicates. */
276
263
  function parseWherePredicates(clause: string): WherePred[] {
277
264
  return clause.split(/\s+AND\s+/i).map((part) => {
278
- const m =
279
- /^("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*(=|<=|>=|<>|!=|<|>)\s*\?$/.exec(
280
- part.trim(),
281
- );
265
+ const m = /^("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*(=|<=|>=|<>|!=|<|>)\s*\?$/.exec(part.trim());
282
266
  if (!m) throw new Error(`memory sql: unsupported WHERE: ${clause}`);
283
267
  const opRaw = m[2]!;
284
- const op: WherePred["op"] =
285
- opRaw === "<>" ? "!=" : (opRaw as WherePred["op"]);
268
+ const op: WherePred["op"] = opRaw === "<>" ? "!=" : (opRaw as WherePred["op"]);
286
269
  return { column: m[1]!.replaceAll('"', "").trim(), op };
287
270
  });
288
271
  }
289
272
 
290
- function compareRow(
291
- cell: unknown,
292
- want: unknown,
293
- op: WherePred["op"],
294
- ): boolean {
273
+ function compareRow(cell: unknown, want: unknown, op: WherePred["op"]): boolean {
295
274
  if (op === "=") return cell === want;
296
275
  if (op === "!=") return cell !== want;
297
276
  const a = Number(cell ?? 0);
@@ -382,8 +361,7 @@ export const memoryFilesDriver: FilesDriver = {
382
361
  return {
383
362
  driverId: "memory",
384
363
  async put(key, data) {
385
- const bytes =
386
- typeof data === "string" ? new TextEncoder().encode(data) : data;
364
+ const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
387
365
  objects.set(prefix + key, bytes);
388
366
  },
389
367
  async get(key) {
@@ -425,17 +403,12 @@ export const memoryIndexDriver: IndexDriver = {
425
403
  id: "memory",
426
404
  facet: "index",
427
405
  async open(options: IndexOpenOptions): Promise<IndexStore> {
428
- const docs = new Map<
429
- string,
430
- { vector: number[]; meta?: Record<string, unknown> }
431
- >();
406
+ const docs = new Map<string, { vector: number[]; meta?: Record<string, unknown> }>();
432
407
  return {
433
408
  driverId: "memory",
434
409
  async upsert(id, vector, meta) {
435
410
  if (vector.length !== options.dims) {
436
- throw new Error(
437
- `vector dims ${vector.length} !== index dims ${options.dims}`,
438
- );
411
+ throw new Error(`vector dims ${vector.length} !== index dims ${options.dims}`);
439
412
  }
440
413
  docs.set(id, { vector: [...vector], meta });
441
414
  },
@@ -18,9 +18,7 @@ import type {
18
18
  *
19
19
  * @param options - Name / dims / SQL connection
20
20
  */
21
- export async function openPgvectorIndex(
22
- options: IndexOpenOptions,
23
- ): Promise<IndexStore> {
21
+ export async function openPgvectorIndex(options: IndexOpenOptions): Promise<IndexStore> {
24
22
  if (options.sql) {
25
23
  return openPgvectorSql(options.name, options.dims, options.sql);
26
24
  }
@@ -45,10 +43,11 @@ async function openPgvectorSql(
45
43
  throw new Error(`vector dims ${vector.length} !== index dims ${dims}`);
46
44
  }
47
45
  await sql.exec(`DELETE FROM "${table}" WHERE id = ?`, [id]);
48
- await sql.exec(
49
- `INSERT INTO "${table}" (id, embedding, meta) VALUES (?, ?, ?)`,
50
- [id, JSON.stringify(vector), meta ? JSON.stringify(meta) : null],
51
- );
46
+ await sql.exec(`INSERT INTO "${table}" (id, embedding, meta) VALUES (?, ?, ?)`, [
47
+ id,
48
+ JSON.stringify(vector),
49
+ meta ? JSON.stringify(meta) : null,
50
+ ]);
52
51
  },
53
52
  async search(vector, topK = 10): Promise<IndexHit[]> {
54
53
  const rows = await sql.query(`SELECT id, embedding, meta FROM "${table}"`);
@@ -78,10 +77,7 @@ async function openPgvectorSql(
78
77
  }
79
78
 
80
79
  function openPgvectorMemory(dims: number): IndexStore {
81
- const docs = new Map<
82
- string,
83
- { vector: number[]; meta?: Record<string, unknown> }
84
- >();
80
+ const docs = new Map<string, { vector: number[]; meta?: Record<string, unknown> }>();
85
81
  return {
86
82
  driverId: "pgvector",
87
83
  async upsert(id, vector, meta) {
@@ -4,16 +4,14 @@
4
4
  * Protocol-named: Neon, Supabase, RDS, Timescale all speak postgres.
5
5
  */
6
6
 
7
- import type {
8
- SqlConnectOptions,
9
- SqlConnection,
10
- SqlDriver,
11
- SqlRow,
12
- } from "./types.ts";
7
+ import type { SqlConnectOptions, SqlConnection, SqlDriver, SqlRow } from "./types.ts";
13
8
 
14
9
  /** Minimal surface we use from Bun.SQL (and test fakes). */
15
10
  export interface PostgresClientLike {
16
- unsafe(sql: string, values?: unknown[]): PromiseLike<SqlRow[] | { length: number; changes?: number } | SqlRow[]>;
11
+ unsafe(
12
+ sql: string,
13
+ values?: unknown[],
14
+ ): PromiseLike<SqlRow[] | { length: number; changes?: number } | SqlRow[]>;
17
15
  close?(options?: { timeout?: number }): Promise<void>;
18
16
  }
19
17
 
@@ -32,9 +30,7 @@ export function toPostgresParams(sql: string): string {
32
30
  *
33
31
  * @param options - URL / role / injected client
34
32
  */
35
- export async function connectPostgres(
36
- options: SqlConnectOptions = {},
37
- ): Promise<SqlConnection> {
33
+ export async function connectPostgres(options: SqlConnectOptions = {}): Promise<SqlConnection> {
38
34
  const role = options.role ?? "primary";
39
35
  const client =
40
36
  (options.client as PostgresClientLike | undefined) ??
@@ -121,9 +117,7 @@ export function createPostgresFakeClient(): PostgresClientLike & {
121
117
  if (exists) {
122
118
  const rows = tables.get(parseIdent(exists[2]!)) ?? [];
123
119
  const preds = parseEqualityWhere(exists[3]!);
124
- const hit = rows.some((r) =>
125
- preds.every((p, i) => r[p] === values[i]),
126
- );
120
+ const hit = rows.some((r) => preds.every((p, i) => r[p] === values[i]));
127
121
  return hit ? [{ [parseIdent(exists[1]!)]: 1 }] : [];
128
122
  }
129
123