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
@@ -2,26 +2,82 @@
2
2
  * Lazy channel binder — loaded only when Channel is declared.
3
3
  */
4
4
 
5
+ import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
5
6
  import { openConsoleChannel } from "../../drivers/channel-console.ts";
6
- import {
7
- createChannelRuntime,
8
- type ChannelRuntime,
9
- } from "../../elements/channel.ts";
7
+ import { openSmtpChannel } from "../../drivers/channel-smtp.ts";
8
+ import type { ChannelDriver, ChannelOpenOptions } from "../../drivers/channel-types.ts";
9
+ import { createChannelRuntime, type ChannelRuntime } from "../../elements/channel.ts";
10
10
  import type { BootOptions } from "../boot.ts";
11
11
 
12
12
  /**
13
13
  * Construct a Channel runtime (console inbox default).
14
14
  *
15
15
  * @param options - Boot options
16
+ * @param env - Active environment
16
17
  * @param now - Clock
18
+ * @param docker - Prefer compose SMTP when active
17
19
  */
18
20
  export function bindChannel(
19
21
  options: BootOptions,
22
+ env: ConfigEnv,
20
23
  now: () => number,
24
+ docker = false,
21
25
  ): ChannelRuntime {
22
26
  return createChannelRuntime({
23
27
  ...(options.channel ?? {}),
24
- drivers: options.channel?.drivers ?? [openConsoleChannel()],
28
+ drivers: options.channel?.drivers ?? [channelDriverFor(options, env, docker)],
25
29
  now,
26
30
  });
27
31
  }
32
+
33
+ function channelDriverFor(options: BootOptions, env: ConfigEnv, docker: boolean): ChannelDriver {
34
+ const id = resolveEmailDriverId(options, env, docker);
35
+ if (id === "console") return openConsoleChannel();
36
+ if (id === "smtp") return openSmtpChannel(smtpOptionsFromEnv(docker));
37
+ throw new Error(`oke boot: unknown email channel driver "${id}"`);
38
+ }
39
+
40
+ /**
41
+ * Resolve the configured email driver for one environment.
42
+ *
43
+ * @param options - Boot options
44
+ * @param env - Active environment
45
+ * @param docker - Docker mode
46
+ */
47
+ export function resolveEmailDriverId(
48
+ options: BootOptions,
49
+ env: ConfigEnv,
50
+ docker: boolean,
51
+ ): string {
52
+ return (
53
+ resolveDriverId(options.config?.drivers?.channel?.email, env) ?? (docker ? "smtp" : "console")
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Resolve SMTP connection options from `SMTP_URL` plus optional auth overrides.
59
+ *
60
+ * @param docker - Whether to include the docker-specific missing URL hint
61
+ */
62
+ export function smtpOptionsFromEnv(docker = false): ChannelOpenOptions {
63
+ const raw = process.env.SMTP_URL ?? process.env.OKE_CHANNEL_EMAIL_URL;
64
+ if (!raw) {
65
+ throw new Error(
66
+ docker
67
+ ? "oke boot: smtp driver needs SMTP_URL (did `oke dev -d` write docker/.env.docker?)"
68
+ : "oke boot: smtp driver needs SMTP_URL",
69
+ );
70
+ }
71
+ const url = new URL(raw);
72
+ if (url.protocol !== "smtp:") throw new Error(`oke boot: SMTP_URL must use smtp://`);
73
+ const urlUser = url.username ? decodeURIComponent(url.username) : undefined;
74
+ const urlPass = url.password ? decodeURIComponent(url.password) : undefined;
75
+ const user = process.env.SMTP_USER ?? urlUser;
76
+ const pass = process.env.SMTP_PASSWORD ?? urlPass;
77
+ return {
78
+ host: url.hostname,
79
+ port: url.port ? Number(url.port) : 25,
80
+ ...(user ? { user } : {}),
81
+ ...(pass ? { pass } : {}),
82
+ };
83
+ }
@@ -9,10 +9,7 @@ import {
9
9
  type ClockDecl,
10
10
  type ClockRuntime,
11
11
  } from "../../elements/clock.ts";
12
- import {
13
- resolveDriverId,
14
- type ConfigEnv,
15
- } from "../../config/index.ts";
12
+ import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
16
13
  import type { BootOptions } from "../boot.ts";
17
14
 
18
15
  /** Result of binding a clock runtime. */
@@ -36,8 +33,7 @@ export async function bindClock(
36
33
  prebuilt?: ClockRuntime,
37
34
  ): Promise<BindClockResult> {
38
35
  const clockDriver =
39
- resolveDriverId(options.config?.drivers?.clock, env) ??
40
- (env === "test" ? "frozen" : "memory");
36
+ resolveDriverId(options.config?.drivers?.clock, env) ?? (env === "test" ? "frozen" : "memory");
41
37
  const clock =
42
38
  prebuilt ??
43
39
  (clockDriver === "frozen" || env === "test"
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { memoryDrivers } from "../../drivers/memory.ts";
6
- import {
7
- createGateRuntime,
8
- type GateRuntime,
9
- } from "../../elements/gate.ts";
6
+ import { createGateRuntime, type GateRuntime } from "../../elements/gate.ts";
10
7
  import type { BootOptions } from "../boot.ts";
11
8
 
12
9
  /**
@@ -15,10 +12,7 @@ import type { BootOptions } from "../boot.ts";
15
12
  * @param options - Boot options
16
13
  * @param now - Clock
17
14
  */
18
- export async function bindGate(
19
- options: BootOptions,
20
- now: () => number,
21
- ): Promise<GateRuntime> {
15
+ export async function bindGate(options: BootOptions, now: () => number): Promise<GateRuntime> {
22
16
  const kvNs = await memoryDrivers.kv.open({ name: "oke:gates" });
23
17
  return createGateRuntime({
24
18
  gates: options.gates ?? [],
@@ -14,9 +14,7 @@ import {
14
14
  *
15
15
  * @param options - Create options (when not already a runtime)
16
16
  */
17
- export async function bindRuns(
18
- options?: CreateRunsRuntimeOptions,
19
- ): Promise<RunsRuntime> {
17
+ export async function bindRuns(options?: CreateRunsRuntimeOptions): Promise<RunsRuntime> {
20
18
  const runs = createRunsRuntime({
21
19
  driver: options?.driver ?? memoryRunsDriver,
22
20
  ...(options ?? {}),
@@ -3,14 +3,8 @@
3
3
  */
4
4
 
5
5
  import { memorySignalDriver } from "../../drivers/signal-memory.ts";
6
- import {
7
- createSignalRuntime,
8
- type SignalRuntime,
9
- } from "../../elements/signal.ts";
10
- import {
11
- resolveDriverId,
12
- type ConfigEnv,
13
- } from "../../config/index.ts";
6
+ import { createSignalRuntime, type SignalRuntime } from "../../elements/signal.ts";
7
+ import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
14
8
  import type { BootOptions } from "../boot.ts";
15
9
 
16
10
  /**
@@ -25,8 +19,7 @@ export async function bindSignal(
25
19
  env: ConfigEnv,
26
20
  now: () => number,
27
21
  ): Promise<SignalRuntime> {
28
- const signalId =
29
- resolveDriverId(options.config?.drivers?.signal, env) ?? "memory";
22
+ const signalId = resolveDriverId(options.config?.drivers?.signal, env) ?? "memory";
30
23
  void signalId;
31
24
  const signal = createSignalRuntime({
32
25
  driver: memorySignalDriver,
@@ -1,60 +1,69 @@
1
1
  /**
2
- * Store binder — stack profile (+ env overrides).
2
+ * Store binder — docker profile (+ env overrides).
3
3
  */
4
4
 
5
5
  import { afterEach, describe, expect, test } from "bun:test";
6
- import { resolveKvDriverId, resolveSqlDriverId } from "./store.ts";
6
+ import { resolveFilesDriverId, resolveKvDriverId, resolveSqlDriverId } from "./store.ts";
7
7
 
8
8
  describe("bindStore driver resolution", () => {
9
9
  const prev = {
10
- stack: process.env.OKE_STACK,
10
+ docker: process.env.OKE_DOCKER,
11
11
  sql: process.env.OKE_SQL_DRIVER,
12
12
  kv: process.env.OKE_KV_DRIVER,
13
+ files: process.env.OKE_FILES_DRIVER,
13
14
  };
14
15
 
15
16
  afterEach(() => {
16
- if (prev.stack === undefined) delete process.env.OKE_STACK;
17
- else process.env.OKE_STACK = prev.stack;
17
+ if (prev.docker === undefined) delete process.env.OKE_DOCKER;
18
+ else process.env.OKE_DOCKER = prev.docker;
18
19
  if (prev.sql === undefined) delete process.env.OKE_SQL_DRIVER;
19
20
  else process.env.OKE_SQL_DRIVER = prev.sql;
20
21
  if (prev.kv === undefined) delete process.env.OKE_KV_DRIVER;
21
22
  else process.env.OKE_KV_DRIVER = prev.kv;
23
+ if (prev.files === undefined) delete process.env.OKE_FILES_DRIVER;
24
+ else process.env.OKE_FILES_DRIVER = prev.files;
22
25
  });
23
26
 
24
- test("dev env keeps sqlite / memory from config", () => {
27
+ test("local env keeps sqlite / memory from config", () => {
25
28
  const options = {
26
29
  config: {
27
30
  drivers: {
28
31
  store: {
29
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
30
- kv: { dev: "memory", stack: "redis", prod: "redis" },
32
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
33
+ kv: { local: "memory", docker: "redis", prod: "redis" },
34
+ files: { local: "fs", docker: "s3", prod: "s3" },
31
35
  },
32
36
  },
33
37
  },
34
38
  };
35
- expect(resolveSqlDriverId(options, "dev", false)).toBe("sqlite");
36
- expect(resolveKvDriverId(options, "dev", false)).toBe("memory");
39
+ expect(resolveSqlDriverId(options, "local", false)).toBe("sqlite");
40
+ expect(resolveKvDriverId(options, "local", false)).toBe("memory");
41
+ expect(resolveFilesDriverId(options, "local", false)).toBe("fs");
37
42
  });
38
43
 
39
- test("stack env uses stack profile (falls back to prod)", () => {
44
+ test("docker env uses docker profile (falls back to prod)", () => {
40
45
  const options = {
41
46
  config: {
42
47
  drivers: {
43
48
  store: {
44
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
45
- kv: { dev: "memory", prod: "redis" },
49
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
50
+ kv: { local: "memory", prod: "redis" },
51
+ files: { local: "fs", prod: "s3" },
46
52
  },
47
53
  },
48
54
  },
49
55
  };
50
- expect(resolveSqlDriverId(options, "stack", true)).toBe("postgres");
51
- expect(resolveKvDriverId(options, "stack", true)).toBe("redis");
56
+ expect(resolveSqlDriverId(options, "docker", true)).toBe("postgres");
57
+ expect(resolveKvDriverId(options, "docker", true)).toBe("redis");
58
+ expect(resolveFilesDriverId(options, "docker", true)).toBe("s3");
52
59
  });
53
60
 
54
- test("stack mode honours OKE_*_DRIVER overrides", () => {
61
+ test("docker mode honours OKE_*_DRIVER overrides", () => {
55
62
  process.env.OKE_SQL_DRIVER = "postgres";
56
63
  process.env.OKE_KV_DRIVER = "redis";
57
- expect(resolveSqlDriverId({}, "stack", true)).toBe("postgres");
58
- expect(resolveKvDriverId({}, "stack", true)).toBe("redis");
64
+ process.env.OKE_FILES_DRIVER = "s3";
65
+ expect(resolveSqlDriverId({}, "docker", true)).toBe("postgres");
66
+ expect(resolveKvDriverId({}, "docker", true)).toBe("redis");
67
+ expect(resolveFilesDriverId({}, "docker", true)).toBe("s3");
59
68
  });
60
69
  });
@@ -2,49 +2,45 @@
2
2
  * Lazy store binder — loaded only when Store is declared.
3
3
  */
4
4
 
5
- import {
6
- resolveDriverId,
7
- type ConfigEnv,
8
- } from "../../config/index.ts";
5
+ import { resolveDomainDdlMode, resolveDriverId, type ConfigEnv } from "../../config/index.ts";
6
+ import { fsDriver } from "../../drivers/fs.ts";
9
7
  import { memoryDrivers } from "../../drivers/memory.ts";
10
8
  import { postgresDriver } from "../../drivers/postgres.ts";
11
9
  import { redisDriver } from "../../drivers/redis.ts";
10
+ import { s3Driver } from "../../drivers/s3.ts";
12
11
  import { sqliteDriver } from "../../drivers/sqlite.ts";
13
- import type { KvDriver, SqlDriver } from "../../drivers/types.ts";
14
- import {
15
- createStoreRuntime,
16
- type StoreRuntime,
17
- } from "../../elements/store.ts";
12
+ import type { FilesDriver, KvDriver, SqlDriver } from "../../drivers/types.ts";
13
+ import { createStoreRuntime, type StoreRuntime } from "../../elements/store.ts";
18
14
  import type { StoreDecl } from "../../elements/store/declare.ts";
19
15
  import type { BootOptions } from "../boot.ts"; // type-only — no cycle at runtime
20
16
 
21
17
  /**
22
18
  * Construct a Store runtime and register facet declarations.
23
19
  *
24
- * In stack mode (`env === "stack"` / `OKE_STACK=1`), SQL/KV resolve from the
25
- * `stack` driver map (falling back to `prod`) and URLs from `.env.stack`.
20
+ * In docker mode (`env === "docker"` / `OKE_DOCKER=1`), SQL/KV resolve from the
21
+ * `docker` driver map (falling back to `prod`) and URLs from `docker/.env.docker`.
26
22
  *
27
23
  * @param options - Boot options
28
24
  * @param env - Active environment
29
25
  * @param now - Clock
30
- * @param stack - Prefer compose URLs when opening postgres/redis
26
+ * @param docker - Prefer compose URLs when opening postgres/redis
31
27
  */
32
28
  export function bindStore(
33
29
  options: BootOptions,
34
30
  env: ConfigEnv,
35
31
  now: () => number,
36
- stack = false,
32
+ docker = false,
37
33
  ): StoreRuntime {
38
- const sqlId = resolveSqlDriverId(options, env, stack);
39
- const kvId = resolveKvDriverId(options, env, stack);
40
- const sqlUrl = sqlUrlFor(sqlId, stack);
41
- const kvUrl = kvUrlFor(kvId, stack);
42
-
43
- const sqlBindings: Record<
44
- string,
45
- { name: string; primary: { url: string } }
46
- > = {};
34
+ const sqlId = resolveSqlDriverId(options, env, docker);
35
+ const kvId = resolveKvDriverId(options, env, docker);
36
+ const filesId = resolveFilesDriverId(options, env, docker);
37
+ const sqlUrl = sqlUrlFor(sqlId, docker);
38
+ const kvUrl = kvUrlFor(kvId, docker);
39
+ const filesRoot = filesRootFor(filesId);
40
+
41
+ const sqlBindings: Record<string, { name: string; primary: { url: string } }> = {};
47
42
  const kvBindings: Record<string, { url?: string }> = {};
43
+ const filesBindings: Record<string, { root?: string }> = {};
48
44
 
49
45
  for (const decl of options.stores ?? []) {
50
46
  if (isSqlDecl(decl)) {
@@ -54,19 +50,26 @@ export function bindStore(
54
50
  };
55
51
  } else if (isKvDecl(decl)) {
56
52
  kvBindings[decl.name] = kvUrl !== undefined ? { url: kvUrl } : {};
53
+ } else if (isFilesDecl(decl)) {
54
+ filesBindings[decl.name] = filesRoot !== undefined ? { root: filesRoot } : {};
57
55
  }
58
56
  }
59
57
 
58
+ const autoPush = resolveAutoPush(options);
59
+ const domainDdl = resolveDomainDdlMode(env, autoPush);
60
+
60
61
  const store = createStoreRuntime({
61
62
  drivers: {
62
63
  sql: sqlDriverFor(sqlId),
63
64
  kv: kvDriverFor(kvId),
64
- files: memoryDrivers.files,
65
+ files: filesDriverFor(filesId),
65
66
  index: memoryDrivers.index,
66
67
  },
67
68
  sql: sqlBindings,
68
69
  kv: kvBindings,
70
+ files: filesBindings,
69
71
  now,
72
+ domainDdl,
70
73
  });
71
74
  for (const decl of options.stores ?? []) {
72
75
  store.register?.(decl);
@@ -74,38 +77,59 @@ export function bindStore(
74
77
  return store;
75
78
  }
76
79
 
80
+ /**
81
+ * Effective `db.autoPush` — config default true; `OKE_DB_AUTO_PUSH=0` opts out.
82
+ *
83
+ * @param options - Boot options
84
+ */
85
+ function resolveAutoPush(options: BootOptions): boolean {
86
+ const fromEnv = process.env.OKE_DB_AUTO_PUSH?.trim();
87
+ if (fromEnv === "0" || fromEnv === "false") return false;
88
+ if (fromEnv === "1" || fromEnv === "true") return true;
89
+ return options.config?.db?.autoPush !== false;
90
+ }
91
+
77
92
  /**
78
93
  * @param options - Boot options
79
94
  * @param env - Active env
80
- * @param stack - Stack mode
95
+ * @param docker - Docker mode
81
96
  */
82
- export function resolveSqlDriverId(
83
- options: BootOptions,
84
- env: ConfigEnv,
85
- stack: boolean,
86
- ): string {
97
+ export function resolveSqlDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
87
98
  const fromEnv = process.env.OKE_SQL_DRIVER?.trim();
88
- if (stack && fromEnv) return fromEnv;
99
+ if (docker && fromEnv) return fromEnv;
89
100
  const resolved = resolveDriverId(options.config?.drivers?.store?.sql, env);
90
101
  if (resolved) return resolved;
91
- return stack ? "postgres" : "memory";
102
+ return docker ? "postgres" : "memory";
103
+ }
104
+
105
+ /**
106
+ * @param options - Boot options
107
+ * @param env - Active env
108
+ * @param docker - Docker mode
109
+ */
110
+ export function resolveKvDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
111
+ const fromEnv = process.env.OKE_KV_DRIVER?.trim();
112
+ if (docker && fromEnv) return fromEnv;
113
+ const resolved = resolveDriverId(options.config?.drivers?.store?.kv, env);
114
+ if (resolved) return resolved;
115
+ return docker ? "redis" : "memory";
92
116
  }
93
117
 
94
118
  /**
95
119
  * @param options - Boot options
96
120
  * @param env - Active env
97
- * @param stack - Stack mode
121
+ * @param docker - Docker mode
98
122
  */
99
- export function resolveKvDriverId(
123
+ export function resolveFilesDriverId(
100
124
  options: BootOptions,
101
125
  env: ConfigEnv,
102
- stack: boolean,
126
+ docker: boolean,
103
127
  ): string {
104
- const fromEnv = process.env.OKE_KV_DRIVER?.trim();
105
- if (stack && fromEnv) return fromEnv;
106
- const resolved = resolveDriverId(options.config?.drivers?.store?.kv, env);
128
+ const fromEnv = process.env.OKE_FILES_DRIVER?.trim();
129
+ if (docker && fromEnv) return fromEnv;
130
+ const resolved = resolveDriverId(options.config?.drivers?.store?.files, env);
107
131
  if (resolved) return resolved;
108
- return stack ? "redis" : "memory";
132
+ return docker ? "s3" : "memory";
109
133
  }
110
134
 
111
135
  function sqlDriverFor(id: string): SqlDriver {
@@ -132,14 +156,26 @@ function kvDriverFor(id: string): KvDriver {
132
156
  }
133
157
  }
134
158
 
135
- function sqlUrlFor(sqlId: string, stack: boolean): string {
159
+ function filesDriverFor(id: string): FilesDriver {
160
+ switch (id) {
161
+ case "s3":
162
+ return s3Driver;
163
+ case "fs":
164
+ return fsDriver;
165
+ case "memory":
166
+ return memoryDrivers.files;
167
+ default:
168
+ throw new Error(`oke boot: unknown files driver "${id}"`);
169
+ }
170
+ }
171
+
172
+ function sqlUrlFor(sqlId: string, docker: boolean): string {
136
173
  if (sqlId === "postgres") {
137
- const url =
138
- process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
174
+ const url = process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
139
175
  if (!url) {
140
176
  throw new Error(
141
- stack
142
- ? "oke boot: postgres driver needs DATABASE_URL (did `oke dev -s` write .env.stack?)"
177
+ docker
178
+ ? "oke boot: postgres driver needs DATABASE_URL (did `oke dev -d` write docker/.env.docker?)"
143
179
  : "oke boot: postgres driver needs DATABASE_URL",
144
180
  );
145
181
  }
@@ -151,27 +187,32 @@ function sqlUrlFor(sqlId: string, stack: boolean): string {
151
187
  return ":memory:";
152
188
  }
153
189
 
154
- function kvUrlFor(kvId: string, stack: boolean): string | undefined {
190
+ function kvUrlFor(kvId: string, docker: boolean): string | undefined {
155
191
  if (kvId !== "redis") return undefined;
156
192
  const url = process.env.REDIS_URL ?? process.env.OKE_STORE_KV_URL ?? undefined;
157
193
  if (!url) {
158
194
  throw new Error(
159
- stack
160
- ? "oke boot: redis driver needs REDIS_URL (did `oke dev -s` write .env.stack?)"
195
+ docker
196
+ ? "oke boot: redis driver needs REDIS_URL (did `oke dev -d` write docker/.env.docker?)"
161
197
  : "oke boot: redis driver needs REDIS_URL",
162
198
  );
163
199
  }
164
200
  return url;
165
201
  }
166
202
 
167
- function isSqlDecl(
168
- decl: StoreDecl,
169
- ): decl is Extract<StoreDecl, { facet: "sql" }> {
203
+ function filesRootFor(filesId: string): string | undefined {
204
+ if (filesId !== "s3") return undefined;
205
+ return process.env.S3_BUCKET ?? process.env.OKE_STORE_FILES_DB ?? undefined;
206
+ }
207
+
208
+ function isSqlDecl(decl: StoreDecl): decl is Extract<StoreDecl, { facet: "sql" }> {
170
209
  return decl.facet === "sql";
171
210
  }
172
211
 
173
- function isKvDecl(
174
- decl: StoreDecl,
175
- ): decl is Extract<StoreDecl, { facet: "kv" }> {
212
+ function isKvDecl(decl: StoreDecl): decl is Extract<StoreDecl, { facet: "kv" }> {
176
213
  return decl.facet === "kv";
177
214
  }
215
+
216
+ function isFilesDecl(decl: StoreDecl): decl is Extract<StoreDecl, { facet: "files" }> {
217
+ return decl.facet === "files";
218
+ }
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { memoryVaultDriver } from "../../drivers/vault-memory.ts";
6
- import {
7
- createVaultRuntime,
8
- type VaultRuntime,
9
- } from "../../elements/vault.ts";
6
+ import { createVaultRuntime, type VaultRuntime } from "../../elements/vault.ts";
10
7
  import type { ConfigEnv } from "../../config/index.ts";
11
8
  import type { BootOptions } from "../boot.ts";
12
9
 
@@ -16,10 +13,7 @@ import type { BootOptions } from "../boot.ts";
16
13
  * @param options - Boot options
17
14
  * @param env - Active environment
18
15
  */
19
- export async function bindVault(
20
- options: BootOptions,
21
- env: ConfigEnv,
22
- ): Promise<VaultRuntime> {
16
+ export async function bindVault(options: BootOptions, env: ConfigEnv): Promise<VaultRuntime> {
23
17
  const vaultSecrets = options.vault?.secrets ?? options.secrets ?? [];
24
18
  const vault = createVaultRuntime({
25
19
  secrets: vaultSecrets,
@@ -38,10 +38,7 @@ describe("boot — vault gaps", () => {
38
38
  } catch (err) {
39
39
  expect(err).toBeInstanceOf(VaultBootError);
40
40
  const boot = err as VaultBootError;
41
- expect(boot.gaps.map((g) => g.name).sort()).toEqual([
42
- "DATABASE_URL",
43
- "STRIPE_KEY",
44
- ]);
41
+ expect(boot.gaps.map((g) => g.name).sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
45
42
  expect(boot.message).toContain("STRIPE_KEY");
46
43
  expect(boot.message).toContain("DATABASE_URL");
47
44
  }
@@ -103,7 +100,6 @@ describe("boot — lazy element needs", () => {
103
100
  external: [
104
101
  "@duckdb/node-api",
105
102
  "@duckdb/*",
106
- "age-encryption",
107
103
  "sently",
108
104
  "sently/*",
109
105
  "ajv",
@@ -206,9 +202,7 @@ describe("boot — HTTP gate wiring lives behind boot", () => {
206
202
  }),
207
203
  );
208
204
  const app = oke({ name: "legacy" });
209
- const res = await app.fetch(
210
- new Request("http://localhost/ping", { method: "GET" }),
211
- );
205
+ const res = await app.fetch(new Request("http://localhost/ping", { method: "GET" }));
212
206
  expect(res.status).toBe(200);
213
207
  });
214
208
  });
@@ -234,10 +228,10 @@ describe("boot — cron autostart via real timer loop", () => {
234
228
  }),
235
229
  );
236
230
 
237
- // env: "dev" → startScheduler defaults ON. No createTestApp / advance.
231
+ // env: "local" → startScheduler defaults ON. No createTestApp / advance.
238
232
  const app = oke({
239
233
  name: "cron-autostart",
240
- env: "dev",
234
+ env: "local",
241
235
  schedulerIntervalMs: 1000,
242
236
  });
243
237
  await app.boot();