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
@@ -7,11 +7,7 @@
7
7
  */
8
8
 
9
9
  import { describe, expect, test } from "bun:test";
10
- import {
11
- createPostgresFakeClient,
12
- postgresDriver,
13
- sqliteDriver,
14
- } from "../drivers/index.ts";
10
+ import { createPostgresFakeClient, postgresDriver, sqliteDriver } from "../drivers/index.ts";
15
11
  import type { Effects } from "../manifest/types.ts";
16
12
  import {
17
13
  classify,
@@ -72,9 +68,7 @@ describe("store facets", () => {
72
68
  });
73
69
 
74
70
  test("id and now helpers", () => {
75
- expect(id()).toMatch(
76
- /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
77
- );
71
+ expect(id()).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
78
72
  expect(now()).toBeGreaterThan(0);
79
73
  });
80
74
  });
@@ -119,13 +113,11 @@ describe("same flow against sqlite and postgres", () => {
119
113
  describe("replica routing from effects", () => {
120
114
  test("read-only flows are detected from the effect set", () => {
121
115
  expect(isReadOnlyStoreFlow({ reads: ["sql:notes"] })).toBe(true);
122
- expect(
123
- isReadOnlyStoreFlow({ reads: ["sql:notes"], writes: ["sql:notes"] }),
124
- ).toBe(false);
116
+ expect(isReadOnlyStoreFlow({ reads: ["sql:notes"], writes: ["sql:notes"] })).toBe(false);
125
117
  expect(sqlRoleForEffects({ reads: ["sql:notes"] }, true)).toBe("replica");
126
- expect(
127
- sqlRoleForEffects({ reads: ["sql:notes"], writes: ["sql:notes"] }, true),
128
- ).toBe("primary");
118
+ expect(sqlRoleForEffects({ reads: ["sql:notes"], writes: ["sql:notes"] }, true)).toBe(
119
+ "primary",
120
+ );
129
121
  });
130
122
 
131
123
  test("read-only flow provably hits a replica", async () => {
@@ -135,10 +127,11 @@ describe("replica routing from effects", () => {
135
127
  await replicaClient.unsafe(
136
128
  `CREATE TABLE IF NOT EXISTS "notes" ("id" TEXT PRIMARY KEY, "title" TEXT, "email" TEXT)`,
137
129
  );
138
- await replicaClient.unsafe(
139
- `INSERT INTO "notes" ("id", "title", "email") VALUES ($1, $2, $3)`,
140
- ["n1", "from-replica", "x@y.z"],
141
- );
130
+ await replicaClient.unsafe(`INSERT INTO "notes" ("id", "title", "email") VALUES ($1, $2, $3)`, [
131
+ "n1",
132
+ "from-replica",
133
+ "x@y.z",
134
+ ]);
142
135
 
143
136
  const decl = store.sql("notes", {
144
137
  classify: { notes: { email: classify({ pii: true }) } },
@@ -213,12 +206,8 @@ describe("tier-1 cache invalidation from effects", () => {
213
206
  expiresAt: null,
214
207
  });
215
208
 
216
- expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:notes"] })).toBe(
217
- true,
218
- );
219
- expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:orders"] })).toBe(
220
- false,
221
- );
209
+ expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:notes"] })).toBe(true);
210
+ expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:orders"] })).toBe(false);
222
211
 
223
212
  const event = cache.invalidateFromEffects({ writes: ["sql:notes"] });
224
213
  expect(event.keys).toEqual([computedCacheKey("sql:notes")]);
@@ -268,10 +257,7 @@ describe("exists and increment helpers", () => {
268
257
  }),
269
258
  );
270
259
  await handle.ensureTable(counters);
271
- await handle
272
- .insert(counters)
273
- .values({ id: "c1", clicks: 0 })
274
- .execute();
260
+ await handle.insert(counters).values({ id: "c1", clicks: 0 }).execute();
275
261
 
276
262
  expect(await handle.exists(counters, { id: "c1" }), label).toBe(true);
277
263
  expect(await handle.exists(counters, { id: "gone" }), label).toBe(false);
@@ -301,16 +287,11 @@ describe("exists and increment helpers", () => {
301
287
  }),
302
288
  );
303
289
  await handle.ensureTable(counters);
304
- await handle
305
- .insert(counters)
306
- .values({ id: "c1", clicks: 0 })
307
- .execute();
290
+ await handle.insert(counters).values({ id: "c1", clicks: 0 }).execute();
308
291
 
309
292
  const n = 100;
310
293
  const results = await Promise.all(
311
- Array.from({ length: n }, () =>
312
- handle.increment(counters, "c1", "clicks"),
313
- ),
294
+ Array.from({ length: n }, () => handle.increment(counters, "c1", "clicks")),
314
295
  );
315
296
  expect(new Set(results).size, label).toBe(n);
316
297
  expect(Math.max(...results), label).toBe(n);
@@ -337,10 +318,7 @@ describe("PII masking at the driver boundary", () => {
337
318
  }),
338
319
  );
339
320
  await handle.ensureTable(notes);
340
- await handle
341
- .insert(notes)
342
- .values({ id: "1", title: "t", email: "pii@x.com" })
343
- .execute();
321
+ await handle.insert(notes).values({ id: "1", title: "t", email: "pii@x.com" }).execute();
344
322
 
345
323
  const rows = await handle.raw(`SELECT * FROM notes`);
346
324
  expect(rows[0]?.title).toBe("t");
@@ -21,6 +21,37 @@ export type {
21
21
  IndexStoreOptions,
22
22
  } from "./store/declare.ts";
23
23
 
24
+ export {
25
+ field,
26
+ schema,
27
+ schemaTable,
28
+ schemaRelations,
29
+ isSchemaTableDecl,
30
+ isSchemaColumnDecl,
31
+ isSchemaRelationsDecl,
32
+ isFieldBuilder,
33
+ finalizeColumnMap,
34
+ tablesFromExports,
35
+ relationsFromExports,
36
+ } from "./store/schema-decl.ts";
37
+ export type {
38
+ FieldBuilder,
39
+ FieldSqlType,
40
+ DefaultFnKind,
41
+ SchemaColumnDecl,
42
+ SchemaColumnInput,
43
+ SchemaTableDecl,
44
+ SchemaTableWithColumns,
45
+ SchemaRelationsDecl,
46
+ SchemaRelationEntry,
47
+ SchemaRelationOne,
48
+ SchemaRelationMany,
49
+ RelationColumnRef,
50
+ ReferenceAction,
51
+ ReferenceActions,
52
+ ColumnReference,
53
+ } from "./store/schema-decl.ts";
54
+
24
55
  export {
25
56
  classify,
26
57
  buildClassificationMap,
@@ -39,47 +70,42 @@ export {
39
70
  isInvalidatedByWrite,
40
71
  parseTtlMs,
41
72
  } from "./store/cache.ts";
42
- export type {
43
- CacheTier,
44
- CacheEntry,
45
- InvalidationEvent,
46
- StoreCache,
47
- } from "./store/cache.ts";
73
+ export type { CacheTier, CacheEntry, InvalidationEvent, StoreCache } from "./store/cache.ts";
48
74
 
49
- export {
50
- isReadOnlyStoreFlow,
51
- sqlRoleForEffects,
52
- resolveSqlTarget,
53
- } from "./store/replica.ts";
75
+ export { isReadOnlyStoreFlow, sqlRoleForEffects, resolveSqlTarget } from "./store/replica.ts";
54
76
  export type { SqlBindingConfig } from "./store/replica.ts";
55
77
 
56
- export {
57
- defineTable,
58
- resolveTableName,
59
- classificationsFromTable,
60
- id,
61
- now,
62
- } from "./store/table.ts";
78
+ export { defineTable, resolveTableName, classificationsFromTable, id, now } from "./store/table.ts";
63
79
  export type { ColumnDef, TableHandle } from "./store/table.ts";
64
80
 
65
- export {
66
- createSqlStoreHandle,
67
- resolvePkColumn,
68
- } from "./store/sql-session.ts";
81
+ export { resource } from "./store/resource.ts";
82
+ export type {
83
+ ColumnScope,
84
+ ListCountMode,
85
+ ListPageMode,
86
+ ResourceColumns,
87
+ ResourceDef,
88
+ ResourceFlowDefs,
89
+ ResourceListOptions,
90
+ ResourceOptions,
91
+ ResolvedListConfig,
92
+ } from "./store/resource.ts";
93
+
94
+ export { createSqlStoreHandle, resolvePkColumn } from "./store/sql-session.ts";
69
95
  export type {
70
96
  SqlStoreHandle,
71
97
  SelectBuilder,
72
98
  SelectFromBuilder,
99
+ SelectWhereBuilder,
100
+ SelectOrderBuilder,
73
101
  InsertBuilder,
74
102
  InsertValuesBuilder,
75
103
  SqlSessionOptions,
104
+ SqlPageOptions,
76
105
  WhereMap,
77
106
  } from "./store/sql-session.ts";
78
107
 
79
- export {
80
- createStoreRuntime,
81
- putTier2,
82
- } from "./store/runtime.ts";
108
+ export { createStoreRuntime, putTier2 } from "./store/runtime.ts";
83
109
  export type {
84
110
  StoreRuntime,
85
111
  StoreDriverBundle,
@@ -92,9 +118,5 @@ export type {
92
118
  IndexStoreFxHandle,
93
119
  } from "./store/runtime.ts";
94
120
 
95
- export {
96
- fileKeyWarnings,
97
- contentAddressedKey,
98
- projectFileKeys,
99
- } from "./store/files-policy.ts";
121
+ export { fileKeyWarnings, contentAddressedKey, projectFileKeys } from "./store/files-policy.ts";
100
122
  export type { FileKeyWarning } from "./store/files-policy.ts";
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Canonical vault compose-env path resolution — shared by app boot and Console.
3
+ *
4
+ * Compose credentials live at `docker/.env.docker`. Legacy project-root
5
+ * `.env.docker` is consulted when absent (soft-compat).
6
+ */
7
+
8
+ import { existsSync } from "node:fs";
9
+ import { resolve } from "node:path";
10
+ import type { VaultResolutionSource } from "./runtime.ts";
11
+
12
+ /** Canonical relative path for compose stack credentials. */
13
+ export const COMPOSE_ENV_REL = "docker/.env.docker";
14
+
15
+ /**
16
+ * Resolve the compose-env path: prefer `docker/.env.docker`, then legacy
17
+ * project-root `.env.docker`.
18
+ *
19
+ * @param root - Project root
20
+ */
21
+ export function resolveComposeEnvPath(root: string): {
22
+ readonly path: string;
23
+ readonly source: Extract<VaultResolutionSource, ".env.docker">;
24
+ } {
25
+ const dockerPath = resolve(root, COMPOSE_ENV_REL);
26
+ if (existsSync(dockerPath)) {
27
+ return { path: dockerPath, source: ".env.docker" };
28
+ }
29
+ const legacyDocker = resolve(root, ".env.docker");
30
+ if (existsSync(legacyDocker)) {
31
+ return { path: legacyDocker, source: ".env.docker" };
32
+ }
33
+ return { path: dockerPath, source: ".env.docker" };
34
+ }
@@ -41,10 +41,7 @@ export interface VaultSecretDecl {
41
41
  * @param name - Secret name
42
42
  * @param options - Description / rotate / schema / dev fallback
43
43
  */
44
- function declareSecret(
45
- name: string,
46
- options: VaultSecretOptions = {},
47
- ): VaultSecretDecl {
44
+ function declareSecret(name: string, options: VaultSecretOptions = {}): VaultSecretDecl {
48
45
  if (!name) {
49
46
  throw new TypeError("vault.secret: name is required");
50
47
  }
@@ -52,9 +49,7 @@ function declareSecret(
52
49
  kind: "secret",
53
50
  name,
54
51
  sensitive: options.sensitive ?? true,
55
- ...(options.description !== undefined
56
- ? { description: options.description }
57
- : {}),
52
+ ...(options.description !== undefined ? { description: options.description } : {}),
58
53
  ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
59
54
  ...(options.schema !== undefined ? { schema: options.schema } : {}),
60
55
  ...(options.dev !== undefined ? { dev: options.dev } : {}),
@@ -67,10 +62,7 @@ function declareSecret(
67
62
  * @param name - Config name
68
63
  * @param options - Description / schema / dev fallback
69
64
  */
70
- function declareConfig(
71
- name: string,
72
- options: VaultSecretOptions = {},
73
- ): VaultSecretDecl {
65
+ function declareConfig(name: string, options: VaultSecretOptions = {}): VaultSecretDecl {
74
66
  if (!name) {
75
67
  throw new TypeError("vault.config: name is required");
76
68
  }
@@ -78,9 +70,7 @@ function declareConfig(
78
70
  kind: "config",
79
71
  name,
80
72
  sensitive: options.sensitive ?? false,
81
- ...(options.description !== undefined
82
- ? { description: options.description }
83
- : {}),
73
+ ...(options.description !== undefined ? { description: options.description } : {}),
84
74
  ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
85
75
  ...(options.schema !== undefined ? { schema: options.schema } : {}),
86
76
  ...(options.dev !== undefined ? { dev: options.dev } : {}),
@@ -88,41 +78,41 @@ function declareConfig(
88
78
  }
89
79
 
90
80
  /**
91
- * Marker prefix for {@link vault.fromStack} dev fallbacks.
92
- * Resolved from `.env.stack` by `oke dev --stack` / vault boot.
81
+ * Marker prefix for {@link vault.fromDocker} local fallbacks.
82
+ * Resolved from `docker/.env.docker` by `oke dev --docker` / vault boot.
93
83
  */
94
- export const FROM_STACK_PREFIX = "__oke_from_stack__:";
84
+ export const FROM_DOCKER_PREFIX = "__oke_from_docker__:";
95
85
 
96
86
  /**
97
- * Dev fallback that reads the URL built by the image recipe for `role`.
87
+ * Local fallback that reads the URL built by the image recipe for `role`.
98
88
  * The kernel never sees the underlying env-var names — only the URL.
99
89
  *
100
90
  * @param role - Image role (`store.sql`, …)
101
91
  */
102
- export function fromStack(role: string): string {
103
- if (!role) throw new TypeError("vault.fromStack: role is required");
104
- return `${FROM_STACK_PREFIX}${role}`;
92
+ export function fromDocker(role: string): string {
93
+ if (!role) throw new TypeError("vault.fromDocker: role is required");
94
+ return `${FROM_DOCKER_PREFIX}${role}`;
105
95
  }
106
96
 
107
97
  /**
108
- * Whether a dev fallback is a {@link fromStack} marker.
98
+ * Whether a local fallback is a {@link fromDocker} marker.
109
99
  *
110
100
  * @param value - Candidate
111
101
  */
112
- export function isFromStack(value: string): boolean {
113
- return value.startsWith(FROM_STACK_PREFIX);
102
+ export function isFromDocker(value: string): boolean {
103
+ return value.startsWith(FROM_DOCKER_PREFIX);
114
104
  }
115
105
 
116
106
  /**
117
- * Role encoded in a {@link fromStack} marker.
107
+ * Role encoded in a {@link fromDocker} marker.
118
108
  *
119
- * @param value - Marker from {@link fromStack}
109
+ * @param value - Marker from {@link fromDocker}
120
110
  */
121
- export function fromStackRole(value: string): string {
122
- if (!isFromStack(value)) {
123
- throw new TypeError(`vault: not a fromStack marker: ${value}`);
111
+ export function fromDockerRole(value: string): string {
112
+ if (!isFromDocker(value)) {
113
+ throw new TypeError(`vault: not a fromDocker marker: ${value}`);
124
114
  }
125
- return value.slice(FROM_STACK_PREFIX.length);
115
+ return value.slice(FROM_DOCKER_PREFIX.length);
126
116
  }
127
117
 
128
118
  /**
@@ -135,9 +125,9 @@ export const vault: {
135
125
  (name: string, options?: VaultSecretOptions): VaultSecretDecl;
136
126
  secret(name: string, options?: VaultSecretOptions): VaultSecretDecl;
137
127
  config(name: string, options?: VaultSecretOptions): VaultSecretDecl;
138
- fromStack(role: string): string;
128
+ fromDocker(role: string): string;
139
129
  } = Object.assign(declareSecret, {
140
130
  secret: declareSecret,
141
131
  config: declareConfig,
142
- fromStack,
132
+ fromDocker,
143
133
  });
@@ -8,13 +8,8 @@
8
8
  * @param value - Cleartext secret
9
9
  */
10
10
  export async function fingerprintSecret(value: string): Promise<string> {
11
- const digest = await crypto.subtle.digest(
12
- "SHA-256",
13
- new TextEncoder().encode(value),
14
- );
15
- const hex = [...new Uint8Array(digest)]
16
- .map((b) => b.toString(16).padStart(2, "0"))
17
- .join("");
11
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
12
+ const hex = [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
18
13
  return `sha256:${hex.slice(0, 16)}`;
19
14
  }
20
15
 
@@ -11,17 +11,13 @@ export const SECRET_MASK = "[redacted:secret]";
11
11
  *
12
12
  * @param secrets - Cleartext values currently loaded
13
13
  */
14
- export function createSecretRedactor(
15
- secrets: Iterable<string>,
16
- ): {
14
+ export function createSecretRedactor(secrets: Iterable<string>): {
17
15
  /** Redact a free-form string. */
18
16
  redactString(input: string): string;
19
17
  /** Deep-redact a JSON-like value. */
20
18
  redact(value: unknown): unknown;
21
19
  } {
22
- const values = [...secrets]
23
- .filter((v) => v.length > 0)
24
- .sort((a, b) => b.length - a.length);
20
+ const values = [...secrets].filter((v) => v.length > 0).sort((a, b) => b.length - a.length);
25
21
 
26
22
  function redactString(input: string): string {
27
23
  let out = input;
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import type { VaultBag, VaultDriver } from "../../drivers/vault-types.ts";
6
- import { fromStackRole, isFromStack } from "./declare.ts";
6
+ import { fromDockerRole, isFromDocker } from "./declare.ts";
7
7
  import type { VaultSecretDecl } from "./declare.ts";
8
8
  import { fingerprintSecretSync } from "./fingerprint.ts";
9
9
  import { createSecretRedactor, SECRET_MASK } from "./redact.ts";
@@ -25,13 +25,8 @@ export class VaultBootError extends Error {
25
25
  * @param gaps - Missing secrets
26
26
  */
27
27
  constructor(gaps: readonly VaultGap[]) {
28
- const lines = gaps.map(
29
- (g) =>
30
- ` - ${g.name}${g.description ? `: ${g.description}` : ""}`,
31
- );
32
- super(
33
- `vault boot failed — ${gaps.length} missing secret(s):\n${lines.join("\n")}`,
34
- );
28
+ const lines = gaps.map((g) => ` - ${g.name}${g.description ? `: ${g.description}` : ""}`);
29
+ super(`vault boot failed — ${gaps.length} missing secret(s):\n${lines.join("\n")}`);
35
30
  this.name = "VaultBootError";
36
31
  this.gaps = gaps;
37
32
  }
@@ -39,12 +34,12 @@ export class VaultBootError extends Error {
39
34
 
40
35
  /**
41
36
  * Named layer in the resolution chain (console §9.8).
42
- * Spec order: process.env → .env.local → .env.stack → driver → dev-fallback.
37
+ * Spec order: process.env → .env.local → .env.docker → driver → dev-fallback.
43
38
  */
44
39
  export type VaultResolutionSource =
45
40
  | "process.env"
46
41
  | ".env.local"
47
- | ".env.stack"
42
+ | ".env.docker"
48
43
  | "driver"
49
44
  | "dev-fallback";
50
45
 
@@ -76,7 +71,7 @@ export interface CreateVaultRuntimeOptions {
76
71
  readonly secrets?: readonly VaultSecretDecl[];
77
72
  /**
78
73
  * Resolution chain — first hit wins.
79
- * Default for prod: `[sops]`; for tests callers pass memory/env layers.
74
+ * Callers pass the env-appropriate layers (env / openbao / memory / …).
80
75
  */
81
76
  readonly chain?: readonly VaultChainLayer[];
82
77
  /**
@@ -173,9 +168,7 @@ export interface VaultRuntime {
173
168
  *
174
169
  * @param options - Contracts + resolution chain
175
170
  */
176
- export function createVaultRuntime(
177
- options: CreateVaultRuntimeOptions = {},
178
- ): VaultRuntime {
171
+ export function createVaultRuntime(options: CreateVaultRuntimeOptions = {}): VaultRuntime {
179
172
  const contracts = new Map<string, VaultSecretDecl>();
180
173
  for (const s of options.secrets ?? []) {
181
174
  contracts.set(s.name, s);
@@ -236,9 +229,7 @@ export function createVaultRuntime(
236
229
  if (value === undefined || value.length === 0) {
237
230
  gaps.push({
238
231
  name: c.name,
239
- ...(c.description !== undefined
240
- ? { description: c.description }
241
- : {}),
232
+ ...(c.description !== undefined ? { description: c.description } : {}),
242
233
  });
243
234
  }
244
235
  }
@@ -384,17 +375,15 @@ export function createVaultRuntime(
384
375
  *
385
376
  * @param layer - Chain layer
386
377
  */
387
- export function resolveLayerSource(
388
- layer: VaultChainLayer,
389
- ): VaultResolutionSource {
378
+ export function resolveLayerSource(layer: VaultChainLayer): VaultResolutionSource {
390
379
  if (layer.source) return layer.source;
391
380
  const path = layer.options?.path;
392
381
  if (typeof path === "string") {
393
382
  if (path.endsWith(".env.local") || path.includes("/.env.local")) {
394
383
  return ".env.local";
395
384
  }
396
- if (path.endsWith(".env.stack") || path.includes("/.env.stack")) {
397
- return ".env.stack";
385
+ if (path.endsWith(".env.docker") || path.includes("/.env.docker")) {
386
+ return ".env.docker";
398
387
  }
399
388
  }
400
389
  if (layer.driver.id === "env" && path === undefined) {
@@ -404,25 +393,25 @@ export function resolveLayerSource(
404
393
  }
405
394
 
406
395
  /**
407
- * Resolve a `dev` fallback, expanding {@link import("./declare.ts").fromStack}
408
- * markers via stack env (`OKE_<ROLE>_URL`) without teaching the kernel
396
+ * Resolve a `dev` fallback, expanding {@link import("./declare.ts").fromDocker}
397
+ * markers via docker env (`OKE_<ROLE>_URL`) without teaching the kernel
409
398
  * image-specific env-var names.
410
399
  *
411
400
  * @param dev - Declared fallback
412
401
  */
413
402
  function resolveDevFallback(dev: string): string | undefined {
414
- if (!isFromStack(dev)) return dev;
415
- const role = fromStackRole(dev);
403
+ if (!isFromDocker(dev)) return dev;
404
+ const role = fromDockerRole(dev);
416
405
  const key = `OKE_${role.replaceAll(".", "_").toUpperCase()}_URL`;
417
406
  const fromEnv =
418
407
  (typeof Bun !== "undefined" ? Bun.env[key] : undefined) ??
419
408
  process.env[key] ??
420
409
  (role === "store.sql"
421
- ? (typeof Bun !== "undefined" ? Bun.env.DATABASE_URL : undefined) ??
422
- process.env.DATABASE_URL
410
+ ? ((typeof Bun !== "undefined" ? Bun.env.DATABASE_URL : undefined) ??
411
+ process.env.DATABASE_URL)
423
412
  : undefined);
424
413
  if (fromEnv && fromEnv.length > 0) return fromEnv;
425
- // Dev/test without `oke dev --stack`: still satisfy url-shaped contracts.
414
+ // Local/test without `oke dev --docker`: still satisfy url-shaped contracts.
426
415
  if (role === "store.sql") return "postgres://localhost/oke";
427
416
  return undefined;
428
417
  }
@@ -431,10 +420,7 @@ function resolveDevFallback(dev: string): string | undefined {
431
420
  * @param contracts - Declared contracts
432
421
  * @param name - Contract name
433
422
  */
434
- function isSensitiveName(
435
- contracts: ReadonlyMap<string, VaultSecretDecl>,
436
- name: string,
437
- ): boolean {
423
+ function isSensitiveName(contracts: ReadonlyMap<string, VaultSecretDecl>, name: string): boolean {
438
424
  const c = contracts.get(name);
439
425
  if (!c) return true;
440
426
  return c.sensitive;
@@ -4,17 +4,10 @@
4
4
  * - a secret value never appears in a log or trace even when passed to fx.log
5
5
  * - fingerprints instead of values
6
6
  * - resolution chain (first hit wins)
7
- * - sops/age via Typage (in-process, no Go binary)
8
7
  */
9
8
 
10
9
  import { describe, expect, test } from "bun:test";
11
- import * as age from "age-encryption";
12
- import {
13
- buildSopsFixture,
14
- envVaultDriver,
15
- memoryVaultDriver,
16
- sopsVaultDriver,
17
- } from "../drivers/index.ts";
10
+ import { envVaultDriver, memoryVaultDriver } from "../drivers/index.ts";
18
11
  import { createFx } from "../kernel/fx.ts";
19
12
  import {
20
13
  createVaultRuntime,
@@ -43,27 +36,23 @@ describe("vault declaration", () => {
43
36
  expect(cfg.kind).toBe("config");
44
37
  expect(cfg.sensitive).toBe(false);
45
38
 
46
- const fromStack = vault.fromStack("store.sql");
47
- expect(fromStack).toStartWith("__oke_from_stack__:");
48
- const c = vault.secret("DATABASE_URL", { dev: fromStack });
49
- expect(c.dev).toBe(fromStack);
39
+ const fromDocker = vault.fromDocker("store.sql");
40
+ expect(fromDocker).toStartWith("__oke_from_docker__:");
41
+ const c = vault.secret("DATABASE_URL", { dev: fromDocker });
42
+ expect(c.dev).toBe(fromDocker);
50
43
  });
51
44
 
52
- test("fromStack resolves via OKE_<ROLE>_URL without env-var names in the kernel", async () => {
45
+ test("fromDocker resolves via OKE_<ROLE>_URL without env-var names in the kernel", async () => {
53
46
  const prev = process.env.OKE_STORE_SQL_URL;
54
47
  process.env.OKE_STORE_SQL_URL = "postgres://oke:x@127.0.0.1:5432/oke";
55
48
  try {
56
49
  const runtime = createVaultRuntime({
57
- secrets: [
58
- vault.secret("DATABASE_URL", { dev: vault.fromStack("store.sql") }),
59
- ],
50
+ secrets: [vault.secret("DATABASE_URL", { dev: vault.fromDocker("store.sql") })],
60
51
  chain: [],
61
52
  allowDevFallbacks: true,
62
53
  });
63
54
  await runtime.boot();
64
- expect(runtime.read("DATABASE_URL")).toBe(
65
- "postgres://oke:x@127.0.0.1:5432/oke",
66
- );
55
+ expect(runtime.read("DATABASE_URL")).toBe("postgres://oke:x@127.0.0.1:5432/oke");
67
56
  } finally {
68
57
  if (prev === undefined) delete process.env.OKE_STORE_SQL_URL;
69
58
  else process.env.OKE_STORE_SQL_URL = prev;
@@ -94,10 +83,7 @@ describe("boot lists every missing secret", () => {
94
83
  expect(err).toBeInstanceOf(VaultBootError);
95
84
  const boot = err as VaultBootError;
96
85
  expect(boot.gaps).toHaveLength(2);
97
- expect(boot.gaps.map((g) => g.name).sort()).toEqual([
98
- "DATABASE_URL",
99
- "STRIPE_KEY",
100
- ]);
86
+ expect(boot.gaps.map((g) => g.name).sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
101
87
  expect(boot.message).toContain("STRIPE_KEY");
102
88
  expect(boot.message).toContain("Payments gateway key");
103
89
  expect(boot.message).toContain("DATABASE_URL");
@@ -181,10 +167,7 @@ describe("resolution chain", () => {
181
167
 
182
168
  test("config cleartext is exposed; secrets are not", async () => {
183
169
  const runtime = createVaultRuntime({
184
- secrets: [
185
- vault.secret("STRIPE_KEY"),
186
- vault.config("PUBLIC_URL"),
187
- ],
170
+ secrets: [vault.secret("STRIPE_KEY"), vault.config("PUBLIC_URL")],
188
171
  chain: [
189
172
  {
190
173
  driver: memoryVaultDriver,
@@ -210,14 +193,11 @@ describe("redaction + fingerprints", () => {
210
193
  const secret = "sk_live_super_secret_value_do_not_leak";
211
194
  const runtime = createVaultRuntime({
212
195
  secrets: [vault("STRIPE_KEY")],
213
- chain: [
214
- { driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } },
215
- ],
196
+ chain: [{ driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } }],
216
197
  });
217
198
  await runtime.boot();
218
199
 
219
- const lines: Array<{ message: string; data?: Record<string, unknown> }> =
220
- [];
200
+ const lines: Array<{ message: string; data?: Record<string, unknown> }> = [];
221
201
  const { fx } = createFxContextWithVault(runtime, lines);
222
202
 
223
203
  const value = fx.vault("STRIPE_KEY");
@@ -252,29 +232,6 @@ describe("redaction + fingerprints", () => {
252
232
  });
253
233
  });
254
234
 
255
- describe("sops / age (Typage)", () => {
256
- test("decrypts SOPS JSON in-process with age-encryption", async () => {
257
- const identity = await age.generateIdentity();
258
- const recipient = await age.identityToRecipient(identity);
259
- const { json } = await buildSopsFixture(
260
- { STRIPE_KEY: "sk_sops_decrypted" },
261
- recipient,
262
- );
263
-
264
- const runtime = createVaultRuntime({
265
- secrets: [vault("STRIPE_KEY")],
266
- chain: [
267
- {
268
- driver: sopsVaultDriver,
269
- options: { ciphertext: json, ageIdentity: identity },
270
- },
271
- ],
272
- });
273
- await runtime.boot();
274
- expect(runtime.read("STRIPE_KEY")).toBe("sk_sops_decrypted");
275
- });
276
- });
277
-
278
235
  /**
279
236
  * Helper — createFx with vault runtime + log sink.
280
237
  */