okengine 0.2.6 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/AGENTS.md +33 -30
  2. package/README.md +74 -340
  3. package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
  4. package/package.json +47 -44
  5. package/site/content/docs/ai/llms-txt.mdx +54 -0
  6. package/site/content/docs/ai/mcp.mdx +123 -0
  7. package/site/content/docs/ai/meta.json +5 -0
  8. package/site/content/docs/ai/skills.mdx +53 -0
  9. package/site/content/docs/console/access.mdx +29 -0
  10. package/site/content/docs/console/ai.mdx +35 -0
  11. package/site/content/docs/console/architecture.mdx +35 -0
  12. package/site/content/docs/console/channels.mdx +37 -0
  13. package/site/content/docs/console/clock.mdx +31 -0
  14. package/site/content/docs/console/flows.mdx +31 -0
  15. package/site/content/docs/console/gates.mdx +35 -0
  16. package/site/content/docs/console/manifest-diff.mdx +34 -0
  17. package/site/content/docs/console/meta.json +23 -0
  18. package/site/content/docs/console/overview.mdx +40 -0
  19. package/site/content/docs/console/plugins.mdx +41 -0
  20. package/site/content/docs/console/privacy.mdx +32 -0
  21. package/site/content/docs/console/runs.mdx +40 -0
  22. package/site/content/docs/console/signals.mdx +31 -0
  23. package/site/content/docs/console/store.mdx +32 -0
  24. package/site/content/docs/console/tenancy.mdx +32 -0
  25. package/site/content/docs/console/traces.mdx +34 -0
  26. package/site/content/docs/console/vault.mdx +37 -0
  27. package/site/content/docs/elements/ai.mdx +180 -0
  28. package/site/content/docs/elements/channel.mdx +167 -0
  29. package/site/content/docs/elements/clock.mdx +182 -0
  30. package/site/content/docs/elements/flow.mdx +288 -0
  31. package/site/content/docs/elements/gate.mdx +171 -0
  32. package/site/content/docs/elements/meta.json +5 -0
  33. package/site/content/docs/elements/signal.mdx +171 -0
  34. package/site/content/docs/elements/store.mdx +320 -0
  35. package/site/content/docs/elements/vault.mdx +263 -0
  36. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  37. package/site/content/docs/get-started/comparison.mdx +65 -0
  38. package/site/content/docs/get-started/installation.mdx +113 -0
  39. package/site/content/docs/get-started/introduction.mdx +123 -0
  40. package/site/content/docs/get-started/meta.json +5 -0
  41. package/site/content/docs/index.mdx +63 -0
  42. package/site/content/docs/meta.json +5 -0
  43. package/site/content/docs/plugins/compression.mdx +60 -0
  44. package/site/content/docs/plugins/cors.mdx +92 -0
  45. package/site/content/docs/plugins/csrf.mdx +96 -0
  46. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  47. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  48. package/site/content/docs/plugins/meta.json +15 -0
  49. package/site/content/docs/plugins/security-headers.mdx +136 -0
  50. package/site/content/docs/reference/cli.md +101 -0
  51. package/site/content/docs/reference/configuration.mdx +159 -0
  52. package/site/content/docs/reference/environment-variables.mdx +87 -0
  53. package/site/content/docs/reference/errors.mdx +80 -0
  54. package/site/content/docs/reference/fx.mdx +117 -0
  55. package/site/content/docs/reference/meta.json +5 -0
  56. package/site/content/docs/reference/plugins.mdx +249 -0
  57. package/site/content/docs/reference/security.md +63 -0
  58. package/src/auth/api-keys.ts +2 -5
  59. package/src/auth/attenuation.ts +2 -6
  60. package/src/auth/auth.test.ts +56 -31
  61. package/src/auth/invoke-as.ts +1 -3
  62. package/src/auth/operator.ts +8 -26
  63. package/src/auth/planes.ts +2 -7
  64. package/src/auth/plugin.ts +4 -7
  65. package/src/auth/roles.ts +1 -5
  66. package/src/auth/sessions.ts +10 -39
  67. package/src/cli/args.ts +1 -5
  68. package/src/cli/ask-dev-mode.ts +40 -0
  69. package/src/cli/build.ts +1 -2
  70. package/src/cli/client-add.test.ts +8 -15
  71. package/src/cli/client-add.ts +5 -14
  72. package/src/cli/completion.test.ts +1 -5
  73. package/src/cli/completion.ts +4 -17
  74. package/src/cli/db-auto-push.test.ts +64 -0
  75. package/src/cli/db-auto-push.ts +72 -0
  76. package/src/cli/db.test.ts +189 -0
  77. package/src/cli/db.ts +456 -0
  78. package/src/cli/dev-app-runner.ts +2 -8
  79. package/src/cli/dev-db-push.test.ts +193 -0
  80. package/src/cli/dev-mode.test.ts +45 -0
  81. package/src/cli/dev-mode.ts +78 -0
  82. package/src/cli/dev-schema-sync.test.ts +66 -0
  83. package/src/cli/dev-schema-sync.ts +139 -0
  84. package/src/cli/dev.test.ts +264 -15
  85. package/src/cli/dev.ts +355 -139
  86. package/src/cli/doc-staleness.test.ts +69 -0
  87. package/src/cli/docker-cli.test.ts +27 -8
  88. package/src/cli/docker.ts +11 -3
  89. package/src/cli/doctor-diff.test.ts +1 -5
  90. package/src/cli/doctor-diff.ts +17 -46
  91. package/src/cli/doctor-pii.ts +2 -7
  92. package/src/cli/doctor.test.ts +26 -4
  93. package/src/cli/doctor.ts +35 -11
  94. package/src/cli/drizzle-env.test.ts +67 -0
  95. package/src/cli/drizzle-env.ts +78 -0
  96. package/src/cli/ensure-drizzle-config.ts +50 -0
  97. package/src/cli/eval.ts +4 -14
  98. package/src/cli/gates-list.ts +1 -4
  99. package/src/cli/hero-meta.test.ts +17 -19
  100. package/src/cli/hero-meta.ts +20 -30
  101. package/src/cli/images.ts +3 -8
  102. package/src/cli/index.ts +11 -2
  103. package/src/cli/load-config.images.test.ts +14 -14
  104. package/src/cli/load-config.ts +47 -47
  105. package/src/cli/mcp-from-console.ts +1 -4
  106. package/src/cli/mode.ts +65 -0
  107. package/src/cli/openbao-bootstrap.test.ts +147 -0
  108. package/src/cli/openbao-bootstrap.ts +280 -0
  109. package/src/cli/openbao-restart.integration.test.ts +136 -0
  110. package/src/cli/ports.test.ts +7 -14
  111. package/src/cli/ports.ts +7 -5
  112. package/src/cli/privacy-erase.ts +1 -3
  113. package/src/cli/registry.ts +75 -25
  114. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  115. package/src/cli/resolve-dev-sql-env.ts +42 -0
  116. package/src/cli/schema.ts +3 -10
  117. package/src/cli/stack.ts +8 -10
  118. package/src/cli/start.ts +4 -15
  119. package/src/cli/upgrade.ts +1 -4
  120. package/src/cli/vault-cmd.ts +63 -0
  121. package/src/client/budget-entry.ts +1 -6
  122. package/src/client/create.test.ts +6 -12
  123. package/src/client/create.ts +2 -8
  124. package/src/client/errors.ts +1 -4
  125. package/src/client/index.ts +1 -6
  126. package/src/client/notes-contract.test.ts +4 -13
  127. package/src/client/transport.ts +9 -30
  128. package/src/client/types.ts +15 -30
  129. package/src/compiler/aot.test.ts +2 -9
  130. package/src/compiler/aot.ts +1 -4
  131. package/src/compiler/differential.test.ts +3 -11
  132. package/src/compiler/dynamic.ts +1 -4
  133. package/src/compiler/effects-infer.ts +8 -34
  134. package/src/compiler/emit.ts +1 -3
  135. package/src/compiler/extract.test.ts +136 -30
  136. package/src/compiler/extract.ts +485 -157
  137. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  138. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
  139. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
  140. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
  141. package/src/compiler/fixtures/skyport.expected.json +24 -83
  142. package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
  143. package/src/compiler/http-parse.ts +2 -9
  144. package/src/compiler/index.ts +1 -5
  145. package/src/compiler/response.ts +16 -7
  146. package/src/compiler/sucrose.ts +11 -31
  147. package/src/config/define-config.test.ts +55 -34
  148. package/src/config/index.ts +177 -46
  149. package/src/config/resolve-driver.test.ts +28 -17
  150. package/src/console/budget.test.ts +1 -4
  151. package/src/console/index.ts +1 -4
  152. package/src/console/server/access.test.ts +15 -43
  153. package/src/console/server/access.ts +19 -49
  154. package/src/console/server/ai.test.ts +3 -11
  155. package/src/console/server/ai.ts +23 -46
  156. package/src/console/server/app.ts +16 -45
  157. package/src/console/server/auth-rate.test.ts +4 -12
  158. package/src/console/server/bind.ts +1 -5
  159. package/src/console/server/channels.test.ts +2 -6
  160. package/src/console/server/channels.ts +10 -35
  161. package/src/console/server/claim.ts +2 -8
  162. package/src/console/server/clock.test.ts +2 -6
  163. package/src/console/server/clock.ts +8 -26
  164. package/src/console/server/console.test.ts +1 -3
  165. package/src/console/server/diff.test.ts +5 -17
  166. package/src/console/server/diff.ts +10 -31
  167. package/src/console/server/dry-run.audit.test.ts +2 -8
  168. package/src/console/server/flows.ts +64 -233
  169. package/src/console/server/gates.test.ts +14 -50
  170. package/src/console/server/gates.ts +13 -48
  171. package/src/console/server/index.ts +2 -9
  172. package/src/console/server/live.ts +3 -12
  173. package/src/console/server/operator-db.test.ts +4 -15
  174. package/src/console/server/operator-db.ts +13 -32
  175. package/src/console/server/plugin.ts +50 -53
  176. package/src/console/server/plugins.test.ts +2 -6
  177. package/src/console/server/plugins.ts +17 -56
  178. package/src/console/server/runs-pii.ts +2 -7
  179. package/src/console/server/security.gate.test.ts +18 -40
  180. package/src/console/server/serve.ts +10 -25
  181. package/src/console/server/signals.test.ts +1 -3
  182. package/src/console/server/signals.ts +17 -40
  183. package/src/console/server/state.ts +21 -59
  184. package/src/console/server/store.test.ts +20 -22
  185. package/src/console/server/store.ts +31 -76
  186. package/src/console/server/vault.test.ts +12 -29
  187. package/src/console/server/vault.ts +44 -66
  188. package/src/console/ui/access/AccessA11yView.tsx +6 -21
  189. package/src/console/ui/access/a11y.test.tsx +3 -12
  190. package/src/console/ui/access/acknowledgement.test.ts +1 -4
  191. package/src/console/ui/access/acknowledgement.ts +1 -3
  192. package/src/console/ui/access/blast-radius.ts +1 -3
  193. package/src/console/ui/access/confirmation.test.ts +1 -5
  194. package/src/console/ui/access/confirmation.ts +1 -4
  195. package/src/console/ui/access/fixture.ts +1 -5
  196. package/src/console/ui/access/grantable.test.ts +1 -3
  197. package/src/console/ui/access/grantable.ts +2 -7
  198. package/src/console/ui/access/index.ts +2 -9
  199. package/src/console/ui/access/provenance.test.ts +1 -3
  200. package/src/console/ui/access/provenance.ts +2 -6
  201. package/src/console/ui/access/search.test.ts +1 -5
  202. package/src/console/ui/access/search.ts +2 -6
  203. package/src/console/ui/ai/AiA11yView.tsx +6 -17
  204. package/src/console/ui/ai/a11y.test.tsx +2 -5
  205. package/src/console/ui/ai/fixture.ts +2 -7
  206. package/src/console/ui/ai/format.ts +1 -3
  207. package/src/console/ui/ai/group.test.ts +1 -3
  208. package/src/console/ui/ai/group.ts +4 -12
  209. package/src/console/ui/ai/index.ts +2 -9
  210. package/src/console/ui/ai/promotion.test.ts +2 -7
  211. package/src/console/ui/ai/promotion.ts +4 -13
  212. package/src/console/ui/ai/search.test.ts +2 -11
  213. package/src/console/ui/ai/search.ts +3 -13
  214. package/src/console/ui/ai/types.ts +1 -8
  215. package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
  216. package/src/console/ui/architecture/a11y.test.tsx +1 -2
  217. package/src/console/ui/architecture/declared.ts +1 -5
  218. package/src/console/ui/architecture/index.ts +7 -35
  219. package/src/console/ui/architecture/layout.ts +1 -3
  220. package/src/console/ui/architecture/pathologies.ts +10 -19
  221. package/src/console/ui/architecture/search.ts +6 -15
  222. package/src/console/ui/architecture/traffic.ts +4 -14
  223. package/src/console/ui/architecture/types.ts +2 -10
  224. package/src/console/ui/architecture/view.test.ts +7 -19
  225. package/src/console/ui/architecture/view.ts +9 -36
  226. package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
  227. package/src/console/ui/channels/a11y.test.tsx +1 -2
  228. package/src/console/ui/channels/confirmation.test.ts +1 -4
  229. package/src/console/ui/channels/confirmation.ts +1 -4
  230. package/src/console/ui/channels/findings.ts +1 -5
  231. package/src/console/ui/channels/index.ts +2 -8
  232. package/src/console/ui/channels/locale.test.ts +1 -3
  233. package/src/console/ui/channels/locale.ts +2 -8
  234. package/src/console/ui/channels/search.ts +4 -13
  235. package/src/console/ui/channels/taxonomy.ts +1 -3
  236. package/src/console/ui/clock/ClockA11yView.tsx +9 -26
  237. package/src/console/ui/clock/a11y.test.tsx +2 -5
  238. package/src/console/ui/clock/confirmation.test.ts +1 -3
  239. package/src/console/ui/clock/confirmation.ts +1 -4
  240. package/src/console/ui/clock/findings.ts +1 -4
  241. package/src/console/ui/clock/health.ts +2 -7
  242. package/src/console/ui/clock/index.ts +2 -10
  243. package/src/console/ui/clock/search.test.ts +1 -3
  244. package/src/console/ui/clock/search.ts +2 -6
  245. package/src/console/ui/clock/timeline.test.ts +1 -3
  246. package/src/console/ui/clock/waiting-on.test.ts +1 -5
  247. package/src/console/ui/clock/waiting-on.ts +2 -7
  248. package/src/console/ui/diff/DiffA11yView.tsx +8 -17
  249. package/src/console/ui/diff/a11y.test.tsx +2 -5
  250. package/src/console/ui/diff/group.test.ts +3 -13
  251. package/src/console/ui/diff/group.ts +2 -8
  252. package/src/console/ui/diff/index.ts +2 -8
  253. package/src/console/ui/diff/search.test.ts +1 -5
  254. package/src/console/ui/diff/search.ts +4 -16
  255. package/src/console/ui/diff/summary.ts +1 -2
  256. package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
  257. package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
  258. package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
  259. package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
  260. package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
  261. package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
  262. package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
  263. package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
  264. package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
  265. package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
  266. package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
  267. package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
  268. package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
  269. package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
  270. package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
  271. package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
  272. package/src/console/ui/dist/index.html +1 -1
  273. package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
  274. package/src/console/ui/flows/a11y.test.tsx +2 -8
  275. package/src/console/ui/flows/buffer.test.ts +3 -11
  276. package/src/console/ui/flows/buffer.ts +4 -11
  277. package/src/console/ui/flows/confirmation.ts +1 -3
  278. package/src/console/ui/flows/contract.test.ts +3 -7
  279. package/src/console/ui/flows/contract.ts +12 -36
  280. package/src/console/ui/flows/graph.test.ts +3 -11
  281. package/src/console/ui/flows/graph.ts +5 -15
  282. package/src/console/ui/flows/index.ts +1 -6
  283. package/src/console/ui/flows/save-as-test.ts +1 -3
  284. package/src/console/ui/flows/search.ts +8 -25
  285. package/src/console/ui/flows/tiers.ts +2 -9
  286. package/src/console/ui/gates/GatesA11yView.tsx +4 -13
  287. package/src/console/ui/gates/a11y.test.tsx +2 -5
  288. package/src/console/ui/gates/audit.ts +1 -3
  289. package/src/console/ui/gates/denial.test.ts +1 -3
  290. package/src/console/ui/gates/denial.ts +4 -12
  291. package/src/console/ui/gates/findings.ts +1 -3
  292. package/src/console/ui/gates/group.test.ts +3 -3
  293. package/src/console/ui/gates/group.ts +3 -11
  294. package/src/console/ui/gates/index.ts +2 -10
  295. package/src/console/ui/gates/search.ts +3 -10
  296. package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
  297. package/src/console/ui/overview/a11y.test.tsx +1 -2
  298. package/src/console/ui/overview/busiest.ts +1 -3
  299. package/src/console/ui/overview/compose.ts +1 -13
  300. package/src/console/ui/overview/cost.ts +34 -38
  301. package/src/console/ui/overview/fixture.ts +21 -26
  302. package/src/console/ui/overview/golden.ts +4 -14
  303. package/src/console/ui/overview/index.ts +2 -9
  304. package/src/console/ui/overview/rank.test.ts +3 -10
  305. package/src/console/ui/overview/rank.ts +2 -7
  306. package/src/console/ui/overview/slo.test.ts +5 -9
  307. package/src/console/ui/overview/slo.ts +6 -23
  308. package/src/console/ui/overview/verdict.ts +3 -10
  309. package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
  310. package/src/console/ui/plugins/a11y.test.tsx +1 -2
  311. package/src/console/ui/plugins/fixture.ts +2 -4
  312. package/src/console/ui/plugins/group.test.ts +1 -3
  313. package/src/console/ui/plugins/group.ts +1 -6
  314. package/src/console/ui/plugins/index.ts +3 -13
  315. package/src/console/ui/plugins/search.ts +7 -19
  316. package/src/console/ui/runs/RunsA11yView.tsx +5 -20
  317. package/src/console/ui/runs/a11y.test.tsx +2 -5
  318. package/src/console/ui/runs/explain.ts +2 -6
  319. package/src/console/ui/runs/group.ts +3 -12
  320. package/src/console/ui/runs/histogram.test.ts +2 -11
  321. package/src/console/ui/runs/histogram.ts +1 -4
  322. package/src/console/ui/runs/index.ts +4 -18
  323. package/src/console/ui/runs/project.ts +2 -6
  324. package/src/console/ui/runs/query.test.ts +1 -3
  325. package/src/console/ui/runs/query.ts +12 -35
  326. package/src/console/ui/runs/search.ts +5 -19
  327. package/src/console/ui/runs/trace-link.test.ts +2 -6
  328. package/src/console/ui/runs/trace-link.ts +4 -16
  329. package/src/console/ui/runs/types.ts +1 -3
  330. package/src/console/ui/shell/App.tsx +2 -10
  331. package/src/console/ui/shell/client.ts +22 -115
  332. package/src/console/ui/shell/components/ui.tsx +1 -4
  333. package/src/console/ui/shell/layout/Shell.tsx +2 -4
  334. package/src/console/ui/shell/main.tsx +31 -96
  335. package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
  336. package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
  337. package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
  338. package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
  339. package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
  340. package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
  341. package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
  342. package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
  343. package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
  344. package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
  345. package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
  346. package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
  347. package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
  348. package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
  349. package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
  350. package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
  351. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
  352. package/src/console/ui/shell/setup/Wizard.tsx +3 -5
  353. package/src/console/ui/shell/styles.css +1 -2
  354. package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
  355. package/src/console/ui/signals/a11y.test.tsx +2 -5
  356. package/src/console/ui/signals/confirmation.test.ts +1 -5
  357. package/src/console/ui/signals/confirmation.ts +2 -6
  358. package/src/console/ui/signals/dry-run.ts +1 -3
  359. package/src/console/ui/signals/durable.ts +1 -3
  360. package/src/console/ui/signals/findings.ts +1 -3
  361. package/src/console/ui/signals/group.test.ts +2 -8
  362. package/src/console/ui/signals/group.ts +2 -10
  363. package/src/console/ui/signals/index.ts +1 -4
  364. package/src/console/ui/signals/monitor.ts +2 -7
  365. package/src/console/ui/signals/schema-form.test.ts +3 -14
  366. package/src/console/ui/signals/schema-form.ts +1 -4
  367. package/src/console/ui/signals/search.ts +4 -13
  368. package/src/console/ui/store/StoreA11yView.tsx +3 -9
  369. package/src/console/ui/store/a11y.test.tsx +2 -5
  370. package/src/console/ui/store/confirmation.test.ts +1 -3
  371. package/src/console/ui/store/confirmation.ts +1 -4
  372. package/src/console/ui/store/dry-run.ts +2 -5
  373. package/src/console/ui/store/fixture.ts +1 -2
  374. package/src/console/ui/store/group.test.ts +1 -6
  375. package/src/console/ui/store/group.ts +1 -4
  376. package/src/console/ui/store/index.ts +1 -5
  377. package/src/console/ui/store/search.ts +2 -6
  378. package/src/console/ui/store/will-not-fire.ts +1 -2
  379. package/src/console/ui/traces/TracesA11yView.tsx +10 -29
  380. package/src/console/ui/traces/a11y.test.tsx +1 -2
  381. package/src/console/ui/traces/chain.test.ts +5 -19
  382. package/src/console/ui/traces/chain.ts +1 -3
  383. package/src/console/ui/traces/critical-path.test.ts +1 -3
  384. package/src/console/ui/traces/critical-path.ts +2 -6
  385. package/src/console/ui/traces/filter.test.ts +2 -6
  386. package/src/console/ui/traces/filter.ts +5 -13
  387. package/src/console/ui/traces/fold.test.ts +4 -12
  388. package/src/console/ui/traces/fold.ts +1 -3
  389. package/src/console/ui/traces/mini.ts +1 -3
  390. package/src/console/ui/traces/replay.test.ts +1 -3
  391. package/src/console/ui/traces/replay.ts +1 -3
  392. package/src/console/ui/traces/sampling.ts +1 -4
  393. package/src/console/ui/traces/search.ts +4 -17
  394. package/src/console/ui/traces/tier.ts +1 -3
  395. package/src/console/ui/vault/VaultA11yView.tsx +5 -17
  396. package/src/console/ui/vault/a11y.test.tsx +1 -2
  397. package/src/console/ui/vault/blast-radius.ts +1 -3
  398. package/src/console/ui/vault/confirmation.test.ts +1 -5
  399. package/src/console/ui/vault/confirmation.ts +1 -4
  400. package/src/console/ui/vault/dormant.test.ts +1 -4
  401. package/src/console/ui/vault/export-safe.test.ts +1 -5
  402. package/src/console/ui/vault/export-safe.ts +1 -4
  403. package/src/console/ui/vault/fixture.ts +3 -3
  404. package/src/console/ui/vault/group.ts +1 -2
  405. package/src/console/ui/vault/index.ts +2 -10
  406. package/src/console/ui/vault/search.ts +2 -6
  407. package/src/console/ui/vault/types.ts +1 -1
  408. package/src/console/xss.gate.test.ts +1 -3
  409. package/src/docker/compose.ts +215 -27
  410. package/src/docker/derive.ts +6 -14
  411. package/src/docker/docker.test.ts +118 -15
  412. package/src/docker/dockerfile.integration.test.ts +12 -21
  413. package/src/docker/helpers.ts +5 -4
  414. package/src/docker/index.ts +9 -6
  415. package/src/docker/pin.ts +1 -9
  416. package/src/docker/recipes/index.ts +6 -6
  417. package/src/docker/recipes/mailpit.ts +22 -0
  418. package/src/docker/recipes/openbao.ts +47 -0
  419. package/src/docker/recipes/postgres.ts +17 -6
  420. package/src/docker/recipes/redis.ts +11 -2
  421. package/src/docker/recipes/rustfs.ts +32 -0
  422. package/src/docker/stack-id.test.ts +73 -5
  423. package/src/docker/stack-id.ts +124 -33
  424. package/src/docker/stack.integration.test.ts +6 -21
  425. package/src/docker/stack.ts +36 -4
  426. package/src/docker/types.ts +16 -4
  427. package/src/docs-origin.ts +4 -4
  428. package/src/drivers/ai-anthropic.ts +5 -14
  429. package/src/drivers/ai-mock.ts +2 -5
  430. package/src/drivers/ai-openai-compatible.ts +4 -10
  431. package/src/drivers/ai-providers.test.ts +6 -13
  432. package/src/drivers/bun-native-completeness.test.ts +6 -15
  433. package/src/drivers/channel-console.ts +6 -7
  434. package/src/drivers/channel-fcm.ts +20 -30
  435. package/src/drivers/channel-resend.ts +1 -3
  436. package/src/drivers/channel-smtp.ts +2 -6
  437. package/src/drivers/channel-types.ts +2 -12
  438. package/src/drivers/channel-unifonic.ts +2 -6
  439. package/src/drivers/channel-wa-cloud.ts +2 -6
  440. package/src/drivers/channel-webpush.ts +21 -60
  441. package/src/drivers/conformance.test.ts +2 -10
  442. package/src/drivers/conformance.ts +8 -21
  443. package/src/drivers/drizzle-dialect.test.ts +20 -0
  444. package/src/drivers/drizzle-dialect.ts +37 -0
  445. package/src/drivers/fs.ts +2 -8
  446. package/src/drivers/index.ts +12 -57
  447. package/src/drivers/memory.ts +287 -75
  448. package/src/drivers/pgvector.ts +7 -11
  449. package/src/drivers/postgres.ts +7 -13
  450. package/src/drivers/redis.ts +13 -37
  451. package/src/drivers/s3.ts +15 -18
  452. package/src/drivers/signal-engine.ts +12 -49
  453. package/src/drivers/signal-memory.ts +2 -8
  454. package/src/drivers/signal-nats.ts +4 -9
  455. package/src/drivers/signal-postgres.ts +62 -129
  456. package/src/drivers/signal-redis.ts +7 -21
  457. package/src/drivers/signal-types.ts +1 -4
  458. package/src/drivers/sqlite.ts +3 -12
  459. package/src/drivers/types.ts +4 -23
  460. package/src/drivers/vault-driver-removal.test.ts +55 -0
  461. package/src/drivers/vault-env.ts +2 -6
  462. package/src/drivers/vault-infisical.ts +1 -5
  463. package/src/drivers/vault-managed.ts +1 -5
  464. package/src/drivers/vault-memory.ts +1 -5
  465. package/src/drivers/vault-openbao.test.ts +97 -0
  466. package/src/drivers/vault-openbao.ts +103 -40
  467. package/src/drivers/vault-types.ts +3 -16
  468. package/src/elements/ai/declare.ts +4 -14
  469. package/src/elements/ai/eval.ts +2 -6
  470. package/src/elements/ai/pii.ts +1 -3
  471. package/src/elements/ai/runtime.ts +12 -50
  472. package/src/elements/ai/schema.ts +4 -15
  473. package/src/elements/ai.test.ts +13 -24
  474. package/src/elements/ai.ts +1 -5
  475. package/src/elements/channel/consent.ts +3 -12
  476. package/src/elements/channel/costs.ts +4 -15
  477. package/src/elements/channel/declare.ts +1 -4
  478. package/src/elements/channel/email-auth.ts +1 -4
  479. package/src/elements/channel/locale.ts +2 -10
  480. package/src/elements/channel/mask.ts +1 -3
  481. package/src/elements/channel/mime.ts +2 -12
  482. package/src/elements/channel/outcomes.test.ts +1 -5
  483. package/src/elements/channel/outcomes.ts +5 -15
  484. package/src/elements/channel/receipts.ts +2 -7
  485. package/src/elements/channel/runtime.ts +28 -74
  486. package/src/elements/channel/suppression.ts +8 -14
  487. package/src/elements/channel.test.ts +8 -31
  488. package/src/elements/channel.ts +3 -14
  489. package/src/elements/clock/actions.ts +6 -18
  490. package/src/elements/clock/declare.ts +1 -3
  491. package/src/elements/clock/dst.ts +1 -5
  492. package/src/elements/clock/durable.ts +4 -16
  493. package/src/elements/clock/health.ts +2 -7
  494. package/src/elements/clock/leader.ts +2 -9
  495. package/src/elements/clock/reconcile.ts +4 -15
  496. package/src/elements/clock/runtime.ts +2 -5
  497. package/src/elements/clock/schedule.ts +4 -20
  498. package/src/elements/clock.test.ts +2 -7
  499. package/src/elements/clock.ts +5 -23
  500. package/src/elements/gate/permissions.ts +1 -4
  501. package/src/elements/gate/runtime.ts +7 -28
  502. package/src/elements/gate.ts +1 -5
  503. package/src/elements/index.ts +9 -7
  504. package/src/elements/signal/declare.ts +2 -7
  505. package/src/elements/signal/reconcile.test.ts +1 -4
  506. package/src/elements/signal/runtime.ts +1 -3
  507. package/src/elements/signal.test.ts +3 -15
  508. package/src/elements/signal.ts +2 -8
  509. package/src/elements/store/cache.test.ts +46 -0
  510. package/src/elements/store/cache.ts +3 -11
  511. package/src/elements/store/classify.ts +5 -22
  512. package/src/elements/store/declare.ts +11 -17
  513. package/src/elements/store/domain-ddl.test.ts +86 -0
  514. package/src/elements/store/emit-drizzle.ts +363 -0
  515. package/src/elements/store/files-policy.test.ts +1 -5
  516. package/src/elements/store/files-policy.ts +4 -12
  517. package/src/elements/store/load-plugin-tables.ts +103 -0
  518. package/src/elements/store/missing-relation.test.ts +83 -0
  519. package/src/elements/store/missing-relation.ts +38 -0
  520. package/src/elements/store/replica.ts +1 -4
  521. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  522. package/src/elements/store/resource-list-docs.test.ts +79 -0
  523. package/src/elements/store/resource.test.ts +253 -0
  524. package/src/elements/store/resource.ts +786 -0
  525. package/src/elements/store/runtime.ts +25 -28
  526. package/src/elements/store/schema-decl.test.ts +227 -0
  527. package/src/elements/store/schema-decl.ts +516 -0
  528. package/src/elements/store/sql-condition.test.ts +132 -0
  529. package/src/elements/store/sql-condition.ts +293 -65
  530. package/src/elements/store/sql-session.test.ts +135 -0
  531. package/src/elements/store/sql-session.ts +241 -84
  532. package/src/elements/store/table.ts +69 -23
  533. package/src/elements/store.test.ts +17 -39
  534. package/src/elements/store.ts +53 -31
  535. package/src/elements/vault/chain.ts +34 -0
  536. package/src/elements/vault/declare.ts +22 -32
  537. package/src/elements/vault/fingerprint.ts +2 -7
  538. package/src/elements/vault/redact.ts +2 -6
  539. package/src/elements/vault/runtime.ts +19 -33
  540. package/src/elements/vault.test.ts +12 -55
  541. package/src/elements/vault.ts +9 -13
  542. package/src/index.ts +5 -2
  543. package/src/kernel/adopt-routes.ts +15 -29
  544. package/src/kernel/app.ts +92 -118
  545. package/src/kernel/auth-resolve.ts +2 -9
  546. package/src/kernel/boot-bind/ai.ts +1 -4
  547. package/src/kernel/boot-bind/channel.test.ts +60 -0
  548. package/src/kernel/boot-bind/channel.ts +61 -5
  549. package/src/kernel/boot-bind/clock.ts +2 -6
  550. package/src/kernel/boot-bind/gate.ts +2 -8
  551. package/src/kernel/boot-bind/runs.ts +1 -3
  552. package/src/kernel/boot-bind/signal.ts +3 -10
  553. package/src/kernel/boot-bind/store.test.ts +27 -18
  554. package/src/kernel/boot-bind/store.ts +93 -52
  555. package/src/kernel/boot-bind/vault.ts +2 -8
  556. package/src/kernel/boot.test.ts +4 -10
  557. package/src/kernel/boot.ts +30 -77
  558. package/src/kernel/budget.test.ts +1 -3
  559. package/src/kernel/capability.ts +3 -10
  560. package/src/kernel/dry-run.test.ts +1 -4
  561. package/src/kernel/dry-run.ts +3 -11
  562. package/src/kernel/edge.test.ts +68 -0
  563. package/src/kernel/effects.test.ts +1 -5
  564. package/src/kernel/effects.ts +4 -11
  565. package/src/kernel/errors.registry.test.ts +2 -8
  566. package/src/kernel/errors.ts +23 -32
  567. package/src/kernel/flow.test.ts +12 -25
  568. package/src/kernel/flow.ts +13 -25
  569. package/src/kernel/fx.test.ts +31 -40
  570. package/src/kernel/fx.ts +135 -90
  571. package/src/kernel/hook-timing.test.ts +3 -6
  572. package/src/kernel/hook-timing.ts +5 -14
  573. package/src/kernel/hooks.test.ts +43 -10
  574. package/src/kernel/hooks.ts +25 -12
  575. package/src/kernel/index.ts +11 -17
  576. package/src/kernel/journal.ts +7 -31
  577. package/src/kernel/on.ts +45 -9
  578. package/src/kernel/pipeline.test.ts +10 -19
  579. package/src/kernel/pipeline.ts +5 -17
  580. package/src/kernel/plug.ts +4 -11
  581. package/src/kernel/plugin/conflicts.test.ts +13 -25
  582. package/src/kernel/plugin/decorate.test.ts +8 -13
  583. package/src/kernel/plugin/scoping.test.ts +4 -11
  584. package/src/kernel/plugin.ts +81 -27
  585. package/src/kernel/registry-isolation.test.ts +74 -0
  586. package/src/kernel/registry.ts +102 -30
  587. package/src/kernel/router.test.ts +15 -13
  588. package/src/kernel/router.ts +9 -29
  589. package/src/kernel/routing-budget.test.ts +1 -3
  590. package/src/kernel/run-telemetry.ts +1 -3
  591. package/src/kernel/triggers.ts +63 -21
  592. package/src/manifest/diff.test.ts +26 -91
  593. package/src/manifest/diff.ts +95 -225
  594. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  595. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  596. package/src/manifest/index.ts +3 -10
  597. package/src/manifest/types.ts +30 -6
  598. package/src/manifest/undeclared.test.ts +4 -12
  599. package/src/manifest/undeclared.ts +1 -2
  600. package/src/manifest/validate.test.ts +2 -6
  601. package/src/manifest/validate.ts +5 -15
  602. package/src/mcp/authorization.ts +8 -27
  603. package/src/mcp/confirmation.ts +3 -10
  604. package/src/mcp/data.ts +2 -6
  605. package/src/mcp/docs-index.ts +4 -7
  606. package/src/mcp/docs-mcp.test.ts +3 -12
  607. package/src/mcp/docs-server.ts +7 -27
  608. package/src/mcp/docs-tools.ts +2 -6
  609. package/src/mcp/index.ts +1 -6
  610. package/src/mcp/injection.gate.test.ts +4 -18
  611. package/src/mcp/mcp.test.ts +18 -49
  612. package/src/mcp/protocol.ts +3 -10
  613. package/src/mcp/server.ts +11 -52
  614. package/src/mcp/session.ts +4 -14
  615. package/src/mcp/tools.ts +14 -50
  616. package/src/plugins/catalogue.test.ts +3 -7
  617. package/src/plugins/catalogue.ts +1 -3
  618. package/src/plugins/compression.test.ts +127 -0
  619. package/src/plugins/compression.ts +94 -0
  620. package/src/plugins/config-source.test.ts +204 -0
  621. package/src/plugins/config-source.ts +209 -0
  622. package/src/plugins/cors.test.ts +138 -0
  623. package/src/plugins/cors.ts +129 -0
  624. package/src/plugins/csrf.test.ts +102 -0
  625. package/src/plugins/csrf.ts +86 -0
  626. package/src/plugins/headers.ts +54 -0
  627. package/src/plugins/index.ts +26 -0
  628. package/src/plugins/ip-allowlist.test.ts +105 -0
  629. package/src/plugins/ip-allowlist.ts +76 -0
  630. package/src/plugins/maintenance-mode.test.ts +91 -0
  631. package/src/plugins/maintenance-mode.ts +85 -0
  632. package/src/plugins/node-import-scan.ts +2 -5
  633. package/src/plugins/security-headers.test.ts +243 -0
  634. package/src/plugins/security-headers.ts +255 -0
  635. package/src/plugins/supply-chain.ts +5 -17
  636. package/src/release/exports.ts +3 -8
  637. package/src/release/measure.exports.test.ts +1 -3
  638. package/src/release/measure.ts +16 -45
  639. package/src/runs/bench.test.ts +1 -3
  640. package/src/runs/collect.ts +8 -25
  641. package/src/runs/drivers/clickhouse.ts +2 -9
  642. package/src/runs/drivers/files.ts +9 -31
  643. package/src/runs/drivers/memory.ts +5 -22
  644. package/src/runs/drivers/postgres.ts +8 -20
  645. package/src/runs/duckdb.ts +2 -8
  646. package/src/runs/index.ts +3 -14
  647. package/src/runs/outlier.ts +3 -10
  648. package/src/runs/parquet.ts +8 -26
  649. package/src/runs/privacy.ts +2 -8
  650. package/src/runs/runs.test.ts +3 -9
  651. package/src/runs/runtime.ts +7 -32
  652. package/src/runs/shred.ts +10 -29
  653. package/src/runs/types.ts +1 -4
  654. package/src/runtime/bun.ts +4 -15
  655. package/src/runtime/cold-start.bench.ts +1 -3
  656. package/src/runtime/dev-request-log.test.ts +1 -4
  657. package/src/runtime/dev-request-log.ts +1 -4
  658. package/src/runtime/index.ts +1 -6
  659. package/src/runtime/primitives.ts +5 -4
  660. package/src/runtime/security.ts +3 -13
  661. package/src/runtime/serve.test.ts +4 -7
  662. package/src/runtime/types.ts +1 -4
  663. package/src/runtime/web-standard.ts +3 -15
  664. package/src/term.test.ts +4 -6
  665. package/src/term.ts +49 -98
  666. package/src/test/create-test-app.test.ts +4 -14
  667. package/src/test/create-test-app.ts +27 -33
  668. package/src/test/provisions.integration.test.ts +3 -11
  669. package/src/upgrade/codemods.test.ts +25 -6
  670. package/src/upgrade/codemods.ts +116 -3
  671. package/src/validation/standard-schema.test.ts +2 -5
  672. package/src/validation/standard-schema.ts +13 -33
  673. package/docs/spec/console.md +0 -739
  674. package/docs/spec/example.md +0 -1196
  675. package/docs/spec/four-applications.md +0 -1195
  676. package/docs/spec/unified-theory.md +0 -489
  677. package/src/cli/doc-drift.test.ts +0 -146
  678. package/src/cli/doc-drift.ts +0 -430
  679. package/src/cli/doctor-diff-examples.ts +0 -92
  680. package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
  681. package/src/drivers/vault-sops.ts +0 -271
@@ -27,15 +27,10 @@ import type {
27
27
  *
28
28
  * @param url - Optional Redis URL
29
29
  */
30
- export function createBunSignalRedisClient(
31
- url?: string,
32
- ): SignalRedisClientLike {
33
- const redis =
34
- url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
30
+ export function createBunSignalRedisClient(url?: string): SignalRedisClientLike {
31
+ const redis = url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
35
32
  /** Subscribe blocks a connection — keep a dedicated client. */
36
- let sub:
37
- | InstanceType<typeof Bun.RedisClient>
38
- | undefined;
33
+ let sub: InstanceType<typeof Bun.RedisClient> | undefined;
39
34
 
40
35
  function subClient(): InstanceType<typeof Bun.RedisClient> {
41
36
  if (!sub) {
@@ -127,16 +122,10 @@ export function parseXreadgroupReply(
127
122
  * In-memory redis-protocol fake for signal streams + pub/sub.
128
123
  */
129
124
  export function createSignalRedisFake(): SignalRedisClientLike & {
130
- readonly streams: Map<
131
- string,
132
- Array<{ id: string; fields: Record<string, string> }>
133
- >;
125
+ readonly streams: Map<string, Array<{ id: string; fields: Record<string, string> }>>;
134
126
  readonly published: Array<{ channel: string; message: string }>;
135
127
  } {
136
- const streams = new Map<
137
- string,
138
- Array<{ id: string; fields: Record<string, string> }>
139
- >();
128
+ const streams = new Map<string, Array<{ id: string; fields: Record<string, string> }>>();
140
129
  const groups = new Map<string, Set<string>>();
141
130
  const claimed = new Map<string, Set<string>>();
142
131
  const subs = new Map<string, Set<(message: string) => void>>();
@@ -210,9 +199,7 @@ export function createSignalRedisFake(): SignalRedisClientLike & {
210
199
  *
211
200
  * @param options - Declarations / redis client / durable outbox path
212
201
  */
213
- export async function openRedisSignal(
214
- options: SignalOpenOptions,
215
- ): Promise<SignalBus> {
202
+ export async function openRedisSignal(options: SignalOpenOptions): Promise<SignalBus> {
216
203
  // Same DI shape as postgres/redis/s3: inject a client in tests; production
217
204
  // binds Bun.redis (Streams via send until Bun ships typed xadd).
218
205
  const redis = options.redis ?? createBunSignalRedisClient();
@@ -255,8 +242,7 @@ export async function openRedisSignal(
255
242
  rollback: () => tx.rollback(),
256
243
  };
257
244
  },
258
- subscribe: (signal, subscriberId, handler) =>
259
- outbox.subscribe(signal, subscriberId, handler),
245
+ subscribe: (signal, subscriberId, handler) => outbox.subscribe(signal, subscriberId, handler),
260
246
  live: (signal, handler) => outbox.live(signal, handler),
261
247
  drain: () => outbox.drain(),
262
248
  deadLetters: (s) => outbox.deadLetters(s),
@@ -229,10 +229,7 @@ export interface SignalRedisClientLike {
229
229
  ): Promise<Array<{ id: string; fields: Record<string, string> }>>;
230
230
  xack(key: string, group: string, id: string): Promise<number>;
231
231
  publish(channel: string, message: string): Promise<number>;
232
- subscribe(
233
- channel: string,
234
- listener: (message: string) => void,
235
- ): Promise<() => void>;
232
+ subscribe(channel: string, listener: (message: string) => void): Promise<() => void>;
236
233
  }
237
234
 
238
235
  /** Minimal NATS / JetStream surface. */
@@ -3,26 +3,17 @@
3
3
  */
4
4
 
5
5
  import { Database, type SQLQueryBindings } from "bun:sqlite";
6
- import type {
7
- SqlConnectOptions,
8
- SqlConnection,
9
- SqlDriver,
10
- SqlRow,
11
- } from "./types.ts";
6
+ import type { SqlConnectOptions, SqlConnection, SqlDriver, SqlRow } from "./types.ts";
12
7
 
13
8
  /**
14
9
  * Open a bun:sqlite connection implementing {@link SqlConnection}.
15
10
  *
16
11
  * @param options - URL (`:memory:` / path) or injected Database
17
12
  */
18
- export async function connectSqlite(
19
- options: SqlConnectOptions = {},
20
- ): Promise<SqlConnection> {
13
+ export async function connectSqlite(options: SqlConnectOptions = {}): Promise<SqlConnection> {
21
14
  const role = options.role ?? "primary";
22
15
  const db =
23
- options.client instanceof Database
24
- ? options.client
25
- : new Database(options.url ?? ":memory:");
16
+ options.client instanceof Database ? options.client : new Database(options.url ?? ":memory:");
26
17
 
27
18
  function asBindings(params: readonly unknown[]): SQLQueryBindings[] {
28
19
  return params as SQLQueryBindings[];
@@ -8,14 +8,7 @@
8
8
  import type { ColumnClassification, StoreFacet } from "../manifest/types.ts";
9
9
 
10
10
  /** Protocol ids for store drivers in scope. */
11
- export type StoreDriverId =
12
- | "sqlite"
13
- | "postgres"
14
- | "memory"
15
- | "redis"
16
- | "fs"
17
- | "s3"
18
- | "pgvector";
11
+ export type StoreDriverId = "sqlite" | "postgres" | "memory" | "redis" | "fs" | "s3" | "pgvector";
19
12
 
20
13
  /** Facets a driver may serve. */
21
14
  export type DriverFacet = StoreFacet;
@@ -112,11 +105,7 @@ export interface KvNamespace {
112
105
  * @param keys - KEYS table entries (unprefixed)
113
106
  * @param args - ARGV table entries
114
107
  */
115
- eval<T = unknown>(
116
- script: string,
117
- keys: readonly string[],
118
- args?: readonly string[],
119
- ): Promise<T>;
108
+ eval<T = unknown>(script: string, keys: readonly string[], args?: readonly string[]): Promise<T>;
120
109
  /**
121
110
  * List keys in this namespace, optionally by prefix (Console Store browser).
122
111
  *
@@ -151,11 +140,7 @@ export interface KvClientLike {
151
140
  * @param numkeys - KEYS count
152
141
  * @param keysAndArgs - KEYS then ARGV
153
142
  */
154
- eval?(
155
- script: string,
156
- numkeys: number,
157
- ...keysAndArgs: string[]
158
- ): Promise<unknown>;
143
+ eval?(script: string, numkeys: number, ...keysAndArgs: string[]): Promise<unknown>;
159
144
  /**
160
145
  * Raw command send (Bun.RedisClient). Used when `eval` is absent.
161
146
  *
@@ -271,11 +256,7 @@ export interface IndexStore {
271
256
  * @param vector - Embedding
272
257
  * @param meta - Optional metadata
273
258
  */
274
- upsert(
275
- id: string,
276
- vector: readonly number[],
277
- meta?: Record<string, unknown>,
278
- ): Promise<void>;
259
+ upsert(id: string, vector: readonly number[], meta?: Record<string, unknown>): Promise<void>;
279
260
  /**
280
261
  * Similarity search (cosine).
281
262
  *
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Gate: the removed vault driver id stays gone from the tracked tree.
3
+ *
4
+ * Mirrors {@link ../cli/doc-staleness.test.ts} — `git grep` must find zero
5
+ * hits (this file splits the token so it never matches itself).
6
+ */
7
+
8
+ import { describe, expect, test } from "bun:test";
9
+ import { join } from "node:path";
10
+
11
+ const ROOT = join(import.meta.dir, "../..");
12
+
13
+ /** Forbidden driver id, split so this file does not match itself. */
14
+ const FORBIDDEN_DRIVER = ["so", "ps"].join("");
15
+ /** Forbidden optional peer, split so this file does not match itself. */
16
+ const FORBIDDEN_AGE = ["age", "-", "encryption"].join("");
17
+
18
+ /** Lockfiles regenerated by `bun install` — not source residue. */
19
+ const LOCKFILE_PREFIXES = ["bun.lock:", "packages/create-oke/template/bun.lock:"];
20
+
21
+ /**
22
+ * Run `git grep -F` and assert zero matches outside allow-listed prefixes.
23
+ *
24
+ * @param pattern - Fixed-string pattern
25
+ * @param ignorePrefixes - `path:line:` prefixes to ignore
26
+ */
27
+ function assertZeroGitGrep(pattern: string, ignorePrefixes: readonly string[] = []): void {
28
+ const proc = Bun.spawnSync(["git", "grep", "-F", "-i", "-n", "-e", pattern, "--"], {
29
+ cwd: ROOT,
30
+ stdout: "pipe",
31
+ stderr: "pipe",
32
+ });
33
+ // git grep exits 1 when there are no matches.
34
+ if (proc.exitCode === 1) {
35
+ expect(proc.stdout.toString()).toBe("");
36
+ return;
37
+ }
38
+ const hits = proc.stdout
39
+ .toString()
40
+ .trim()
41
+ .split("\n")
42
+ .filter((line) => line.length > 0)
43
+ .filter((line) => !ignorePrefixes.some((prefix) => line.startsWith(prefix)));
44
+ expect(hits.join("\n")).toBe("");
45
+ }
46
+
47
+ describe("removed vault driver gate", () => {
48
+ test("tracked tree has zero matches for the removed driver id", () => {
49
+ assertZeroGitGrep(FORBIDDEN_DRIVER);
50
+ });
51
+
52
+ test("tracked tree has zero matches for the removed age peer outside lockfiles", () => {
53
+ assertZeroGitGrep(FORBIDDEN_AGE, LOCKFILE_PREFIXES);
54
+ });
55
+ });
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `env` vault driver — resolves secrets from the process environment
3
- * and/or a dotenv file path (`.env.local`, `.env.stack`, …).
3
+ * and/or a dotenv file path (`.env.local`, `.env.docker`, …).
4
4
  *
5
5
  * Resolution order is owned by {@link createVaultRuntime}; this driver only
6
6
  * exposes one layer of the chain. Layer identity (`process.env` vs file)
@@ -8,11 +8,7 @@
8
8
  */
9
9
 
10
10
  import { parseDotenv, formatDotenv } from "./vault-dotenv-parse.ts";
11
- import type {
12
- VaultBag,
13
- VaultDriver,
14
- VaultOpenOptions,
15
- } from "./vault-types.ts";
11
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
16
12
 
17
13
  /**
18
14
  * Create an env vault driver.
@@ -2,11 +2,7 @@
2
2
  * `infisical` vault driver — Infisical REST secrets API (protocol-shaped).
3
3
  */
4
4
 
5
- import type {
6
- VaultBag,
7
- VaultDriver,
8
- VaultOpenOptions,
9
- } from "./vault-types.ts";
5
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
10
6
 
11
7
  /**
12
8
  * Infisical secrets driver.
@@ -4,11 +4,7 @@
4
4
  * Values arrive as an injected map (or env); OKE never invents a vendor client.
5
5
  */
6
6
 
7
- import type {
8
- VaultBag,
9
- VaultDriver,
10
- VaultOpenOptions,
11
- } from "./vault-types.ts";
7
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
12
8
 
13
9
  /**
14
10
  * Managed / platform vault driver.
@@ -2,11 +2,7 @@
2
2
  * In-memory vault driver — tests and deterministic harnesses.
3
3
  */
4
4
 
5
- import type {
6
- VaultBag,
7
- VaultDriver,
8
- VaultOpenOptions,
9
- } from "./vault-types.ts";
5
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
10
6
 
11
7
  /**
12
8
  * Create a memory vault driver seeded from `options.secrets`.
@@ -0,0 +1,97 @@
1
+ /**
2
+ * OpenBao vault driver — KV v2 read + write/delete + fail-loud semantics.
3
+ */
4
+
5
+ import { describe, expect, test } from "bun:test";
6
+ import { OpenBaoUnavailableError, openbaoVaultDriver } from "./vault-openbao.ts";
7
+
8
+ /** Scripted fetch: LIST + per-key GET, then capture writes/deletes. */
9
+ function fakeKv(
10
+ seed: Record<string, string>,
11
+ calls: { method: string; path: string; body?: string }[],
12
+ ) {
13
+ return (async (input: string | URL | Request, init?: RequestInit) => {
14
+ const url = new URL(String(input));
15
+ const method = init?.method ?? "GET";
16
+ calls.push({
17
+ method,
18
+ path: url.pathname + url.search,
19
+ body: typeof init?.body === "string" ? init.body : undefined,
20
+ });
21
+ const mount = "/v1/secret";
22
+ if (method === "GET" && url.pathname === `${mount}/metadata`) {
23
+ return Response.json({ data: { keys: Object.keys(seed) } });
24
+ }
25
+ if (method === "GET" && url.pathname.startsWith(`${mount}/data/`)) {
26
+ const name = decodeURIComponent(url.pathname.slice(`${mount}/data/`.length));
27
+ if (!(name in seed)) return new Response("{}", { status: 404 });
28
+ return Response.json({ data: { data: { value: seed[name] } } });
29
+ }
30
+ if (method === "POST" && url.pathname.startsWith(`${mount}/data/`)) {
31
+ return new Response(null, { status: 204 });
32
+ }
33
+ if (method === "DELETE" && url.pathname.startsWith(`${mount}/data/`)) {
34
+ return new Response(null, { status: 204 });
35
+ }
36
+ return new Response("{}", { status: 404 });
37
+ }) as typeof globalThis.fetch;
38
+ }
39
+
40
+ describe("openbao vault driver", () => {
41
+ test("LIST + GET loads all keys", async () => {
42
+ const calls: { method: string; path: string; body?: string }[] = [];
43
+ const bag = await openbaoVaultDriver.open({
44
+ url: "http://127.0.0.1:8200",
45
+ token: "app-tok",
46
+ fetch: fakeKv({ STRIPE_KEY: "sk_live", DATABASE_URL: "postgres://x" }, calls),
47
+ });
48
+ expect(bag.get("STRIPE_KEY")).toBe("sk_live");
49
+ expect([...bag.names()].sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
50
+ });
51
+
52
+ test("set POSTs KV v2 data payload", async () => {
53
+ const calls: { method: string; path: string; body?: string }[] = [];
54
+ const bag = await openbaoVaultDriver.open({
55
+ url: "http://127.0.0.1:8200",
56
+ token: "app-tok",
57
+ fetch: fakeKv({ STRIPE_KEY: "sk_live" }, calls),
58
+ });
59
+ bag.set?.("STRIPE_KEY", "sk_rotated");
60
+ await Bun.sleep(0);
61
+ const writeCall = calls.find((c) => c.method === "POST");
62
+ expect(writeCall?.path).toBe("/v1/secret/data/STRIPE_KEY");
63
+ expect(writeCall?.body).toBe(JSON.stringify({ data: { value: "sk_rotated" } }));
64
+ expect(bag.get("STRIPE_KEY")).toBe("sk_rotated");
65
+ });
66
+
67
+ test("unreachable remote fails loud (no soft-empty bag)", async () => {
68
+ let failed: unknown;
69
+ try {
70
+ await openbaoVaultDriver.open({
71
+ url: "http://127.0.0.1:9",
72
+ token: "app-tok",
73
+ fetch: (async () => {
74
+ throw new Error("connect ECONNREFUSED");
75
+ }) as unknown as typeof globalThis.fetch,
76
+ });
77
+ } catch (err) {
78
+ failed = err;
79
+ }
80
+ expect(failed).toBeInstanceOf(OpenBaoUnavailableError);
81
+ });
82
+
83
+ test("sealed / 5xx on GET fails loud", async () => {
84
+ const fetchFn = (async (input: string | URL | Request) => {
85
+ const url = String(input);
86
+ if (url.includes("metadata")) return Response.json({ data: { keys: ["STRIPE_KEY"] } });
87
+ return new Response("sealed", { status: 503 });
88
+ }) as typeof globalThis.fetch;
89
+ let failed: unknown;
90
+ try {
91
+ await openbaoVaultDriver.open({ url: "http://127.0.0.1:8200", token: "t", fetch: fetchFn });
92
+ } catch (err) {
93
+ failed = err;
94
+ }
95
+ expect(failed).toBeInstanceOf(OpenBaoUnavailableError);
96
+ });
97
+ });
@@ -1,25 +1,30 @@
1
1
  /**
2
- * `openbao` vault driver — HashiCorp Vault / OpenBao KV v2 HTTP API.
2
+ * `openbao` vault driver — OpenBao (Vault-compatible) KV v2 HTTP API.
3
3
  *
4
4
  * Protocol-named; image/vendor choice lives in `images`.
5
5
  */
6
6
 
7
- import type {
8
- VaultBag,
9
- VaultDriver,
10
- VaultOpenOptions,
11
- } from "./vault-types.ts";
7
+ import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
8
+
9
+ /** Error thrown when the remote OpenBao is unreachable / sealed / errors. */
10
+ export class OpenBaoUnavailableError extends Error {
11
+ constructor(message: string) {
12
+ super(message);
13
+ this.name = "OpenBaoUnavailableError";
14
+ }
15
+ }
12
16
 
13
17
  /**
14
- * OpenBao / Vault KV driver.
18
+ * OpenBao KV-v2 bag. Reads are loaded at open when `url` + `token` resolve;
19
+ * writes (`set` / `delete`) hit the HTTP API directly.
15
20
  *
16
- * Expects `url` + `token` + optional `mount` (default `secret`).
17
- * Fetches `GET {url}/v1/{mount}/data/{name}` for each requested secret
18
- * lazily via a cached bag loaded at open when `secrets` seed keys are listed,
19
- * or returns empty until {@link VaultBag.get} is called against a remote.
21
+ * When `url` and `token` are provided, an unreachable, sealed, or erroring
22
+ * OpenBao is **fatal** (fail-loud) the bag never silently degrades to an
23
+ * empty / seed-only view.
20
24
  *
21
25
  * For boot validation the runtime passes declared names; this driver loads
22
- * all keys under `mount` when the LIST API is available, else uses seed names.
26
+ * all keys under `mount` when the LIST API is available, else falls back to
27
+ * GETs for the seed names.
23
28
  */
24
29
  export const openbaoVaultDriver: VaultDriver = {
25
30
  id: "openbao",
@@ -34,36 +39,60 @@ export const openbaoVaultDriver: VaultDriver = {
34
39
  ),
35
40
  );
36
41
 
37
- if (url && token) {
38
- // Best-effort LIST; ignore failures (permission / disabled).
42
+ const remote = url !== undefined && token !== undefined;
43
+ let mutableRemote = false;
44
+
45
+ if (remote && url !== undefined && token !== undefined) {
46
+ const headers = { "X-Vault-Token": token };
47
+ const base = `${url}/v1/${mount}`;
48
+
49
+ async function listNames(): Promise<string[]> {
50
+ const res = await fetchFn(`${base}/metadata?list=true`, { headers });
51
+ if (!res.ok) return [];
52
+ const body = (await res.json()) as { data?: { keys?: string[] } };
53
+ return (body.data?.keys ?? []).map((k) => k.replace(/\/$/, ""));
54
+ }
55
+
56
+ async function readName(name: string): Promise<boolean> {
57
+ const res = await fetchFn(`${base}/data/${encodeURIComponent(name)}`, { headers });
58
+ if (res.status === 404) return false;
59
+ if (!res.ok) {
60
+ throw new OpenBaoUnavailableError(
61
+ `openbao vault: GET ${name} failed (${res.status}) — sealed or unauthorized?`,
62
+ );
63
+ }
64
+ const body = (await res.json()) as { data?: { data?: Record<string, unknown> } };
65
+ const data = body.data?.data ?? {};
66
+ const value =
67
+ typeof data.value === "string"
68
+ ? data.value
69
+ : typeof data[name] === "string"
70
+ ? (data[name] as string)
71
+ : JSON.stringify(data);
72
+ map.set(name, value);
73
+ return true;
74
+ }
75
+
76
+ // LIST when the token has metadata list; otherwise only fetch the
77
+ // seed/declared names so a least-privilege token still works. A
78
+ // connection-level failure here must never degrade to an empty bag.
79
+ let names: string[] = [];
39
80
  try {
40
- const listRes = await fetchFn(`${url}/v1/${mount}/metadata?list=true`, {
41
- headers: { "X-Vault-Token": token },
42
- });
43
- if (listRes.ok) {
44
- const body = (await listRes.json()) as {
45
- data?: { keys?: string[] };
46
- };
47
- for (const key of body.data?.keys ?? []) {
48
- const getRes = await fetchFn(`${url}/v1/${mount}/data/${key}`, {
49
- headers: { "X-Vault-Token": token },
50
- });
51
- if (!getRes.ok) continue;
52
- const got = (await getRes.json()) as {
53
- data?: { data?: Record<string, unknown> };
54
- };
55
- const data = got.data?.data ?? {};
56
- const value =
57
- typeof data.value === "string"
58
- ? data.value
59
- : typeof data[key] === "string"
60
- ? (data[key] as string)
61
- : JSON.stringify(data);
62
- map.set(key.replace(/\/$/, ""), value);
63
- }
81
+ names = await listNames();
82
+ } catch (err) {
83
+ if (map.size === 0) {
84
+ throw new OpenBaoUnavailableError(
85
+ `openbao vault: unreachable at ${url} — ${err instanceof Error ? err.message : String(err)}`,
86
+ );
64
87
  }
65
- } catch {
66
- // Remote unavailable — bag stays at seed / empty; boot validation reports gaps.
88
+ // Fall through: LIST denied but we still have declared names to GET.
89
+ }
90
+ if (names.length > 0) {
91
+ for (const key of names) await readName(key);
92
+ mutableRemote = true;
93
+ } else if (map.size > 0) {
94
+ for (const name of map.keys()) await readName(name);
95
+ mutableRemote = true;
67
96
  }
68
97
  }
69
98
 
@@ -75,6 +104,40 @@ export const openbaoVaultDriver: VaultDriver = {
75
104
  names() {
76
105
  return [...map.keys()];
77
106
  },
107
+ ...(mutableRemote && url !== undefined && token !== undefined
108
+ ? {
109
+ set(name: string, value: string) {
110
+ void (async () => {
111
+ const res = await fetchFn(`${url}/v1/${mount}/data/${encodeURIComponent(name)}`, {
112
+ method: "POST",
113
+ headers: { "X-Vault-Token": token, "content-type": "application/json" },
114
+ body: JSON.stringify({ data: { value } }),
115
+ });
116
+ if (!res.ok) {
117
+ throw new OpenBaoUnavailableError(
118
+ `openbao vault: write ${name} failed (${res.status})`,
119
+ );
120
+ }
121
+ map.set(name, value);
122
+ })();
123
+ },
124
+ delete(name: string) {
125
+ const had = map.delete(name);
126
+ void (async () => {
127
+ const res = await fetchFn(`${url}/v1/${mount}/data/${encodeURIComponent(name)}`, {
128
+ method: "DELETE",
129
+ headers: { "X-Vault-Token": token },
130
+ });
131
+ if (!res.ok && res.status !== 404) {
132
+ throw new OpenBaoUnavailableError(
133
+ `openbao vault: delete ${name} failed (${res.status})`,
134
+ );
135
+ }
136
+ })();
137
+ return had;
138
+ },
139
+ }
140
+ : {}),
78
141
  };
79
142
  },
80
143
  };
@@ -1,30 +1,17 @@
1
1
  /**
2
2
  * Protocol-named vault driver contracts.
3
3
  *
4
- * Driver ids: `sops` · `env` · `openbao` · `infisical` · `managed` · `memory`.
4
+ * Driver ids: `env` · `openbao` · `infisical` · `managed` · `memory`.
5
5
  * Never vendor names (`neon`, `infisical-cloud`, …) — vendor choice lives in `images`.
6
6
  */
7
7
 
8
8
  /** Protocol ids for vault drivers. */
9
- export type VaultDriverId =
10
- | "sops"
11
- | "env"
12
- | "openbao"
13
- | "infisical"
14
- | "managed"
15
- | "memory";
9
+ export type VaultDriverId = "env" | "openbao" | "infisical" | "managed" | "memory";
16
10
 
17
11
  /** Options when opening a vault backend. */
18
12
  export interface VaultOpenOptions {
19
- /**
20
- * Path to a SOPS-encrypted file (`sops` driver) or a dotenv file (`env` driver).
21
- * Prefer JSON / ENV formats produced by `sops -e` for SOPS.
22
- */
13
+ /** Path to a dotenv file (`env` driver). */
23
14
  readonly path?: string;
24
- /** Inline SOPS ciphertext (tests). */
25
- readonly ciphertext?: string | Uint8Array;
26
- /** Age identity (`AGE-SECRET-KEY-…`) for Typage decryption. */
27
- readonly ageIdentity?: string;
28
15
  /** Env prefix filter for the `env` driver (default: none — whole `process.env`). */
29
16
  readonly envPrefix?: string;
30
17
  /** Injected env map for tests (defaults to `process.env`). */
@@ -145,13 +145,9 @@ export const ai: AiNamespace = {
145
145
  kind: "prompt",
146
146
  name: promptName,
147
147
  model: name,
148
- ...(promptOpts.version !== undefined
149
- ? { version: promptOpts.version }
150
- : {}),
148
+ ...(promptOpts.version !== undefined ? { version: promptOpts.version } : {}),
151
149
  ...(promptOpts.evals !== undefined ? { evals: promptOpts.evals } : {}),
152
- ...(promptOpts.budget !== undefined
153
- ? { budget: promptOpts.budget }
154
- : {}),
150
+ ...(promptOpts.budget !== undefined ? { budget: promptOpts.budget } : {}),
155
151
  ...(promptOpts.in !== undefined ? { in: promptOpts.in } : {}),
156
152
  ...(promptOpts.out !== undefined ? { out: promptOpts.out } : {}),
157
153
  };
@@ -167,14 +163,8 @@ export const ai: AiNamespace = {
167
163
  * @param options - Model + destination index
168
164
  */
169
165
  embed(name: string, options: AiEmbedOptions = {}): AiEmbedDecl {
170
- const model =
171
- typeof options.model === "string"
172
- ? options.model
173
- : options.model?.name;
174
- const into =
175
- typeof options.into === "string"
176
- ? options.into
177
- : options.into?.name;
166
+ const model = typeof options.model === "string" ? options.model : options.model?.name;
167
+ const into = typeof options.into === "string" ? options.into : options.into?.name;
178
168
  return {
179
169
  kind: "embed",
180
170
  name,
@@ -52,12 +52,8 @@ export interface RunPromptEvalsOptions {
52
52
  *
53
53
  * @param options - Cases + ask fn
54
54
  */
55
- export async function runPromptEvals(
56
- options: RunPromptEvalsOptions,
57
- ): Promise<EvalSuiteResult> {
58
- const equals =
59
- options.equals ??
60
- ((a, b) => JSON.stringify(a) === JSON.stringify(b));
55
+ export async function runPromptEvals(options: RunPromptEvalsOptions): Promise<EvalSuiteResult> {
56
+ const equals = options.equals ?? ((a, b) => JSON.stringify(a) === JSON.stringify(b));
61
57
  const results: EvalCaseResult[] = [];
62
58
 
63
59
  for (let i = 0; i < options.cases.length; i++) {
@@ -55,9 +55,7 @@ export class AiPiiBuildError extends Error {
55
55
  *
56
56
  * @param tags - Classification value
57
57
  */
58
- function isPiiTags(
59
- tags: ColumnClassification | string | readonly string[] | undefined,
60
- ): boolean {
58
+ function isPiiTags(tags: ColumnClassification | string | readonly string[] | undefined): boolean {
61
59
  if (!tags) return false;
62
60
  if (typeof tags === "string") return tags === "pii";
63
61
  if (Array.isArray(tags)) return tags.includes("pii");