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
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Ensure a mode-aware `drizzle.config.ts` exists — created when absent,
3
+ * never overwritten when the user customised it.
4
+ */
5
+
6
+ import { resolve } from "node:path";
7
+
8
+ /** Mode-aware template (matches `packages/create-oke/template/drizzle.config.ts`). */
9
+ const DRIZZLE_CONFIG_TEMPLATE = `import { defineConfig } from "drizzle-kit";
10
+
11
+ /**
12
+ * Domain schema sync for \`oke db push|generate|migrate\`.
13
+ *
14
+ * Dialect comes from OKE's \`store.sql\` driver map (resolved by the CLI and
15
+ * injected as \`OKE_DRIZZLE_DIALECT\`) — never inferred from \`DATABASE_URL\`
16
+ * presence. \`src/schema.generated.ts\` is emitted from \`src/schema.decl.ts\`
17
+ * for the active dialect as a pre-step of \`oke db\` / \`oke dev\`.
18
+ *
19
+ * Versioned prod migrations land in \`./drizzle\` — never mix with \`.oke/\`.
20
+ */
21
+ const dialect = (process.env.OKE_DRIZZLE_DIALECT ?? "sqlite") as "sqlite" | "postgresql";
22
+
23
+ export default defineConfig({
24
+ dialect,
25
+ schema: "./src/schema.generated.ts",
26
+ out: "./drizzle",
27
+ dbCredentials: {
28
+ url:
29
+ dialect === "postgresql"
30
+ ? (process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL!)
31
+ : (process.env.OKE_SQLITE_URL ?? "file:.oke/app.sqlite"),
32
+ },
33
+ });
34
+ `;
35
+
36
+ /**
37
+ * Create `drizzle.config.ts` at the project root when it does not exist.
38
+ * Returns the absolute path and whether it was created.
39
+ *
40
+ * @param cwd - Project root
41
+ */
42
+ export async function ensureDrizzleConfig(
43
+ cwd: string,
44
+ ): Promise<{ readonly path: string; readonly created: boolean }> {
45
+ const path = resolve(cwd, "drizzle.config.ts");
46
+ const file = Bun.file(path);
47
+ if (await file.exists()) return { path, created: false };
48
+ await Bun.write(path, DRIZZLE_CONFIG_TEMPLATE);
49
+ return { path, created: true };
50
+ }
package/src/cli/eval.ts CHANGED
@@ -3,11 +3,7 @@
3
3
  */
4
4
 
5
5
  import { resolve } from "node:path";
6
- import {
7
- parseEvalJsonl,
8
- runPromptEvals,
9
- type EvalCase,
10
- } from "../elements/ai/eval.ts";
6
+ import { parseEvalJsonl, runPromptEvals, type EvalCase } from "../elements/ai/eval.ts";
11
7
  import type { Manifest } from "../manifest/types.ts";
12
8
 
13
9
  /** Options for {@link runOkeEval}. */
@@ -35,9 +31,7 @@ export interface OkeEvalOptions {
35
31
  * @param options - Manifest + ask wiring
36
32
  * @returns Exit code (1 on any failure)
37
33
  */
38
- export async function runOkeEval(
39
- options: OkeEvalOptions = {},
40
- ): Promise<number> {
34
+ export async function runOkeEval(options: OkeEvalOptions = {}): Promise<number> {
41
35
  const write = options.write ?? ((t) => process.stdout.write(t));
42
36
  let manifest = options.manifest;
43
37
  if (!manifest) {
@@ -57,9 +51,7 @@ export async function runOkeEval(
57
51
  return 0;
58
52
  }
59
53
 
60
- const load =
61
- options.loadEvals ??
62
- (async (p: string) => Bun.file(resolve(p)).text());
54
+ const load = options.loadEvals ?? (async (p: string) => Bun.file(resolve(p)).text());
63
55
 
64
56
  let failed = 0;
65
57
  for (const name of names) {
@@ -69,9 +61,7 @@ export async function runOkeEval(
69
61
  continue;
70
62
  }
71
63
  if (!options.ask) {
72
- console.error(
73
- `oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`,
74
- );
64
+ console.error(`oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`);
75
65
  return 1;
76
66
  }
77
67
  let cases: EvalCase[];
@@ -3,10 +3,7 @@
3
3
  */
4
4
 
5
5
  import { resolve } from "node:path";
6
- import {
7
- deriveModuleActions,
8
- formatGatesList,
9
- } from "../elements/gate/permissions.ts";
6
+ import { deriveModuleActions, formatGatesList } from "../elements/gate/permissions.ts";
10
7
  import type { Manifest } from "../manifest/types.ts";
11
8
  import { wantsJson } from "./args.ts";
12
9
  import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
@@ -15,31 +15,29 @@ import {
15
15
  const SAMPLE: OkeConfig = {
16
16
  drivers: {
17
17
  store: {
18
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
19
- kv: { dev: "memory", stack: "redis", prod: "redis" },
18
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
19
+ kv: { local: "memory", docker: "redis", prod: "redis" },
20
20
  },
21
- signal: { dev: "memory", stack: "postgres", prod: "postgres" },
22
- clock: { dev: "memory", stack: "postgres", prod: "postgres" },
23
- vault: { dev: "dotenv", stack: "dotenv", prod: "sops" },
21
+ signal: { local: "memory", docker: "postgres", prod: "postgres" },
22
+ clock: { local: "memory", docker: "postgres", prod: "postgres" },
23
+ vault: { local: "dotenv", docker: "openbao", prod: "openbao" },
24
24
  channel: {
25
- email: { dev: "console", stack: "smtp", prod: "smtp" },
25
+ email: { local: "console", docker: "smtp", prod: "smtp" },
26
26
  },
27
- ai: { dev: "mock", stack: "mock" },
27
+ ai: { local: "mock", docker: "mock" },
28
28
  },
29
29
  };
30
30
 
31
31
  describe("hero-meta", () => {
32
- test("resolveDevProfile maps stack and NODE_ENV", () => {
33
- expect(resolveDevProfile({ stack: false })).toBe("local");
34
- expect(resolveDevProfile({ stack: true })).toBe("local-server");
35
- expect(resolveDevProfile({ stack: false, nodeEnv: "test" })).toBe("test");
36
- expect(resolveDevProfile({ stack: false, nodeEnv: "production" })).toBe(
37
- "production",
38
- );
32
+ test("resolveDevProfile maps docker and NODE_ENV", () => {
33
+ expect(resolveDevProfile({ docker: false })).toBe("local");
34
+ expect(resolveDevProfile({ docker: true })).toBe("docker");
35
+ expect(resolveDevProfile({ docker: false, nodeEnv: "test" })).toBe("test");
36
+ expect(resolveDevProfile({ docker: false, nodeEnv: "production" })).toBe("production");
39
37
  });
40
38
 
41
39
  test("resolveHeroElements lists eight elements with drivers", () => {
42
- const rows = resolveHeroElements(SAMPLE, { stack: false });
40
+ const rows = resolveHeroElements(SAMPLE, { docker: false });
43
41
  expect(rows.map((r) => r.element)).toEqual([
44
42
  "flow",
45
43
  "signal",
@@ -54,9 +52,9 @@ describe("hero-meta", () => {
54
52
  expect(rows.find((r) => r.element === "flow")?.detail).toBe("●");
55
53
  });
56
54
 
57
- test("stack profile applies to every element", () => {
55
+ test("docker profile applies to every element", () => {
58
56
  const rows = resolveHeroElements(SAMPLE, {
59
- stack: true,
57
+ docker: true,
60
58
  sqlDriver: "postgres",
61
59
  kvDriver: "redis",
62
60
  });
@@ -72,13 +70,13 @@ describe("hero-meta", () => {
72
70
  test("encode/decode round-trips", () => {
73
71
  const snap = buildDevHeroSnapshot({
74
72
  config: SAMPLE,
75
- stack: true,
73
+ docker: true,
76
74
  sqlDriver: "postgres",
77
75
  kvDriver: "redis",
78
76
  version: "0.2.4",
79
77
  nodeEnv: "development",
80
78
  });
81
- expect(snap.profile).toBe("local-server");
79
+ expect(snap.profile).toBe("docker");
82
80
  expect(snap.runtimeEnv).toBe("local");
83
81
  expect(decodeHeroSnapshot(encodeHeroSnapshot(snap))).toEqual(snap);
84
82
  });
@@ -11,11 +11,7 @@ import {
11
11
  } from "../config/index.ts";
12
12
 
13
13
  /** How the process is running (local laptop → production). */
14
- export type DevRuntimeProfile =
15
- | "local"
16
- | "local-server"
17
- | "test"
18
- | "production";
14
+ export type DevRuntimeProfile = "local" | "docker" | "test" | "production";
19
15
 
20
16
  /** Data plane: still on a laptop vs real production. */
21
17
  export type DevRuntimeEnv = "local" | "production";
@@ -61,16 +57,16 @@ export function formatHeroSystemLine(
61
57
  /**
62
58
  * Profile for an `oke dev` session.
63
59
  *
64
- * @param options - Stack / NODE_ENV hints
60
+ * @param options - Docker / NODE_ENV hints
65
61
  */
66
62
  export function resolveDevProfile(options: {
67
- readonly stack: boolean;
63
+ readonly docker: boolean;
68
64
  /** Explicit role — do not infer from ambient `NODE_ENV` (tests set `test`). */
69
65
  readonly nodeEnv?: string;
70
66
  }): DevRuntimeProfile {
71
67
  if (options.nodeEnv === "test") return "test";
72
68
  if (options.nodeEnv === "production") return "production";
73
- return options.stack ? "local-server" : "local";
69
+ return options.docker ? "docker" : "local";
74
70
  }
75
71
 
76
72
  /**
@@ -78,9 +74,7 @@ export function resolveDevProfile(options: {
78
74
  *
79
75
  * @param profile - Runtime profile
80
76
  */
81
- export function resolveDevRuntimeEnv(
82
- profile: DevRuntimeProfile,
83
- ): DevRuntimeEnv {
77
+ export function resolveDevRuntimeEnv(profile: DevRuntimeProfile): DevRuntimeEnv {
84
78
  return profile === "production" ? "production" : "local";
85
79
  }
86
80
 
@@ -89,7 +83,7 @@ export function resolveDevRuntimeEnv(
89
83
  *
90
84
  * @param map - Env driver map
91
85
  * @param env - Config env key
92
- * @param prefer - Override (stack sql/kv)
86
+ * @param prefer - Override (docker sql/kv)
93
87
  */
94
88
  function driverOr(
95
89
  map: Parameters<typeof resolveDriverId>[0],
@@ -106,10 +100,7 @@ function driverOr(
106
100
  * @param channel - Channel driver maps
107
101
  * @param env - Config env
108
102
  */
109
- function channelDetail(
110
- channel: DriversConfig["channel"],
111
- env: ConfigEnv,
112
- ): string {
103
+ function channelDetail(channel: DriversConfig["channel"], env: ConfigEnv): string {
113
104
  if (!channel) return "—";
114
105
  const parts: string[] = [];
115
106
  for (const medium of ["email", "sms", "whatsapp", "push"] as const) {
@@ -120,11 +111,11 @@ function channelDetail(
120
111
  }
121
112
 
122
113
  /**
123
- * Summarize store facets for the active (or stack-overridden) drivers.
114
+ * Summarize store facets for the active (or docker-overridden) drivers.
124
115
  *
125
116
  * @param store - Store driver maps
126
117
  * @param env - Config env for non-overridden facets
127
- * @param overrides - Stack sql/kv ids
118
+ * @param overrides - Docker sql/kv ids
128
119
  */
129
120
  function storeDetail(
130
121
  store: DriversConfig["store"],
@@ -145,26 +136,25 @@ function storeDetail(
145
136
  }
146
137
 
147
138
  /**
148
- * Resolve eight-element rows from `oke.config` + stack overrides.
139
+ * Resolve eight-element rows from `oke.config` + docker overrides.
149
140
  *
150
141
  * @param config - Loaded config (or null)
151
- * @param options - Stack driver overrides; config env for maps
142
+ * @param options - Docker driver overrides; config env for maps
152
143
  */
153
144
  export function resolveHeroElements(
154
145
  config: OkeConfig | null | undefined,
155
146
  options: {
156
- /** Use prod store ids from stack (`oke dev -s`). */
157
- readonly stack: boolean;
147
+ /** Use docker store ids from stack (`oke dev -d`). */
148
+ readonly docker: boolean;
158
149
  readonly sqlDriver?: string;
159
150
  readonly kvDriver?: string;
160
- /** Which driver map column to read (default `dev`). */
151
+ /** Which driver map column to read (default `local`). */
161
152
  readonly configEnv?: ConfigEnv;
162
153
  },
163
154
  ): readonly HeroElementRow[] {
164
155
  const drivers = config?.drivers;
165
- // `-s` reads the `stack` profile for every element (not a store-only override).
166
- const configEnv: ConfigEnv =
167
- options.configEnv ?? (options.stack ? "stack" : "dev");
156
+ // `-d` reads the `docker` profile for every element (not a store-only override).
157
+ const configEnv: ConfigEnv = options.configEnv ?? (options.docker ? "docker" : "local");
168
158
 
169
159
  const byName: Record<string, string> = {
170
160
  flow: "●",
@@ -189,18 +179,18 @@ export function resolveHeroElements(
189
179
  /**
190
180
  * Build the full hero snapshot for banner / soft reload.
191
181
  *
192
- * @param options - Config, stack, versions
182
+ * @param options - Config, docker, versions
193
183
  */
194
184
  export function buildDevHeroSnapshot(options: {
195
185
  readonly config?: OkeConfig | null;
196
- readonly stack: boolean;
186
+ readonly docker: boolean;
197
187
  readonly sqlDriver?: string;
198
188
  readonly kvDriver?: string;
199
189
  readonly version?: string;
200
190
  readonly nodeEnv?: string;
201
191
  }): DevHeroSnapshot {
202
192
  const profile = resolveDevProfile({
203
- stack: options.stack,
193
+ docker: options.docker,
204
194
  nodeEnv: options.nodeEnv,
205
195
  });
206
196
  return {
@@ -208,7 +198,7 @@ export function buildDevHeroSnapshot(options: {
208
198
  runtimeEnv: resolveDevRuntimeEnv(profile),
209
199
  system: formatHeroSystemLine(),
210
200
  elements: resolveHeroElements(options.config, {
211
- stack: options.stack,
201
+ docker: options.docker,
212
202
  sqlDriver: options.sqlDriver,
213
203
  kvDriver: options.kvDriver,
214
204
  }),
package/src/cli/images.ts CHANGED
@@ -54,9 +54,7 @@ export interface ImagesPinOptions {
54
54
  *
55
55
  * @param options - Config / images
56
56
  */
57
- export async function runImagesList(
58
- options: ImagesListOptions = {},
59
- ): Promise<number> {
57
+ export async function runImagesList(options: ImagesListOptions = {}): Promise<number> {
60
58
  const write = options.write ?? ((t) => process.stdout.write(t));
61
59
  const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
62
60
  const json = options.json ?? false;
@@ -113,8 +111,7 @@ export function buildImagesListRows(
113
111
  } catch {
114
112
  // Unknown image — still list the row; recipe stays "-".
115
113
  }
116
- const digest =
117
- lock?.images[role]?.digest ?? digestFromRef ?? "-";
114
+ const digest = lock?.images[role]?.digest ?? digestFromRef ?? "-";
118
115
  return {
119
116
  role,
120
117
  recipe,
@@ -150,9 +147,7 @@ export function formatImagesList(rows: readonly ImagesListRow[]): string {
150
147
  *
151
148
  * @param options - Config / resolver
152
149
  */
153
- export async function runImagesPin(
154
- options: ImagesPinOptions = {},
155
- ): Promise<number> {
150
+ export async function runImagesPin(options: ImagesPinOptions = {}): Promise<number> {
156
151
  const write = options.write ?? ((t) => process.stdout.write(t));
157
152
  const cwd = options.cwd ?? process.cwd();
158
153
  let images = options.images;
package/src/cli/index.ts CHANGED
@@ -7,6 +7,7 @@ import { branchCli } from "./branch.ts";
7
7
  import { buildCli } from "./build.ts";
8
8
  import { clientAddCli } from "./client-add.ts";
9
9
  import { completionCli } from "./completion.ts";
10
+ import { dbCli } from "./db.ts";
10
11
  import { devCli } from "./dev.ts";
11
12
  import { doctorCli } from "./doctor.ts";
12
13
  import { dockerCli } from "./docker.ts";
@@ -14,6 +15,7 @@ import { evalCli } from "./eval.ts";
14
15
  import { EXIT_CODE_HELP, EXIT_OK, EXIT_USAGE } from "./exit.ts";
15
16
  import { gatesListCli } from "./gates-list.ts";
16
17
  import { imagesCli } from "./images.ts";
18
+ import { modeCli } from "./mode.ts";
17
19
  import { privacyEraseCli } from "./privacy-erase.ts";
18
20
  import { formatOkeHelp } from "./registry.ts";
19
21
  import { schemaCli } from "./schema.ts";
@@ -29,6 +31,10 @@ if (cmd === "dev") {
29
31
  process.exit(await devCli(sub ? [sub, ...rest] : rest));
30
32
  }
31
33
 
34
+ if (cmd === "mode") {
35
+ process.exit(await modeCli(sub ? [sub, ...rest] : rest));
36
+ }
37
+
32
38
  if (cmd === "start") {
33
39
  process.exit(await startCli(sub ? [sub, ...rest] : rest));
34
40
  }
@@ -45,6 +51,10 @@ if (cmd === "schema") {
45
51
  process.exit(await schemaCli(sub ? [sub, ...rest] : rest));
46
52
  }
47
53
 
54
+ if (cmd === "db") {
55
+ process.exit(await dbCli(sub ? [sub, ...rest] : rest));
56
+ }
57
+
48
58
  if (cmd === "client" && sub === "add") {
49
59
  process.exit(await clientAddCli(rest));
50
60
  }
@@ -91,8 +101,7 @@ if (cmd === "completion") {
91
101
 
92
102
  if (cmd === undefined || cmd === "--help" || cmd === "-h" || cmd === "help") {
93
103
  // Bare `oke` — commands only. Exit-code table only on explicit --help.
94
- const help =
95
- cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
104
+ const help = cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
96
105
  console.log(help);
97
106
  process.exit(cmd ? EXIT_OK : EXIT_USAGE);
98
107
  }
@@ -6,7 +6,7 @@ import { describe, expect, test } from "bun:test";
6
6
  import {
7
7
  defaultImagesFromConfig,
8
8
  resolveImages,
9
- stackDevDriverMismatches,
9
+ dockerDevDriverMismatches,
10
10
  } from "./load-config.ts";
11
11
 
12
12
  describe("defaultImagesFromConfig", () => {
@@ -75,14 +75,14 @@ describe("resolveImages", () => {
75
75
  });
76
76
  });
77
77
 
78
- describe("stackDevDriverMismatches", () => {
79
- test("flags stack/prod sqlite/memory when containers are up", () => {
80
- const mismatches = stackDevDriverMismatches(
78
+ describe("dockerDevDriverMismatches", () => {
79
+ test("flags docker/prod sqlite/memory when containers are up", () => {
80
+ const mismatches = dockerDevDriverMismatches(
81
81
  {
82
82
  drivers: {
83
83
  store: {
84
- sql: { dev: "sqlite", stack: "sqlite", prod: "sqlite" },
85
- kv: { dev: "memory", stack: "memory", prod: "memory" },
84
+ sql: { local: "sqlite", docker: "sqlite", prod: "sqlite" },
85
+ kv: { local: "memory", docker: "memory", prod: "memory" },
86
86
  },
87
87
  },
88
88
  },
@@ -94,13 +94,13 @@ describe("stackDevDriverMismatches", () => {
94
94
  ]);
95
95
  });
96
96
 
97
- test("silent when stack profile matches containers", () => {
98
- const mismatches = stackDevDriverMismatches(
97
+ test("silent when docker profile matches containers", () => {
98
+ const mismatches = dockerDevDriverMismatches(
99
99
  {
100
100
  drivers: {
101
101
  store: {
102
- sql: { dev: "sqlite", stack: "postgres", prod: "postgres" },
103
- kv: { dev: "memory", stack: "redis", prod: "redis" },
102
+ sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
103
+ kv: { local: "memory", docker: "redis", prod: "redis" },
104
104
  },
105
105
  },
106
106
  },
@@ -109,13 +109,13 @@ describe("stackDevDriverMismatches", () => {
109
109
  expect(mismatches).toEqual([]);
110
110
  });
111
111
 
112
- test("silent when only prod is set (stack falls back to prod)", () => {
113
- const mismatches = stackDevDriverMismatches(
112
+ test("silent when only prod is set (docker falls back to prod)", () => {
113
+ const mismatches = dockerDevDriverMismatches(
114
114
  {
115
115
  drivers: {
116
116
  store: {
117
- sql: { dev: "sqlite", prod: "postgres" },
118
- kv: { dev: "memory", prod: "redis" },
117
+ sql: { local: "sqlite", prod: "postgres" },
118
+ kv: { local: "memory", prod: "redis" },
119
119
  },
120
120
  },
121
121
  },
@@ -10,6 +10,7 @@ import type { Manifest } from "../manifest/types.ts";
10
10
  const DEFAULT_SQL_IMAGE = "postgres:18-alpine";
11
11
  const DEFAULT_PGVECTOR_IMAGE = "pgvector/pgvector:pg17";
12
12
  const DEFAULT_KV_IMAGE = "redis:8-alpine";
13
+ const DEFAULT_VAULT_IMAGE = "openbao/openbao:2.6.1";
13
14
 
14
15
  /**
15
16
  * Extract protocol id from a driver ref.
@@ -22,33 +23,31 @@ function driverId(ref: DriverRef | undefined): string | undefined {
22
23
  }
23
24
 
24
25
  /**
25
- * Prefer `stack` then `prod` for a driver map (local server ≈ production).
26
+ * Prefer `docker` then `prod` for a driver map (compose infra ≈ production).
26
27
  *
27
28
  * @param map - Env driver map
28
29
  */
29
- function stackOrProdId(
30
- map: { readonly stack?: DriverRef; readonly prod?: DriverRef } | undefined,
30
+ function dockerOrProdId(
31
+ map: { readonly docker?: DriverRef; readonly prod?: DriverRef } | undefined,
31
32
  ): string | undefined {
32
- return driverId(map?.stack) ?? driverId(map?.prod);
33
+ return driverId(map?.docker) ?? driverId(map?.prod);
33
34
  }
34
35
 
35
36
  /**
36
- * Derive default image pins from stack/prod driver protocols.
37
+ * Derive default image pins from docker/prod driver protocols.
37
38
  *
38
39
  * Used when `oke.config.ts` omits `images` but declares postgres/redis (etc.)
39
- * so `oke dev -s` / `oke stack` / `oke docker` have something to run.
40
+ * so `oke dev -d` / `oke stack` / `oke docker` have something to run.
40
41
  *
41
42
  * @param config - Loaded config
42
43
  */
43
- export function defaultImagesFromConfig(
44
- config: OkeConfig,
45
- ): Readonly<Record<string, string>> {
44
+ export function defaultImagesFromConfig(config: OkeConfig): Readonly<Record<string, string>> {
46
45
  const out: Record<string, string> = {};
47
- const sql = stackOrProdId(config.drivers?.store?.sql);
48
- const index = stackOrProdId(config.drivers?.store?.index);
49
- const kv = stackOrProdId(config.drivers?.store?.kv);
50
- const signal = stackOrProdId(config.drivers?.signal);
51
- const clock = stackOrProdId(config.drivers?.clock);
46
+ const sql = dockerOrProdId(config.drivers?.store?.sql);
47
+ const index = dockerOrProdId(config.drivers?.store?.index);
48
+ const kv = dockerOrProdId(config.drivers?.store?.kv);
49
+ const signal = dockerOrProdId(config.drivers?.signal);
50
+ const clock = dockerOrProdId(config.drivers?.clock);
52
51
 
53
52
  const needsSql =
54
53
  sql === "postgres" ||
@@ -56,23 +55,23 @@ export function defaultImagesFromConfig(
56
55
  index === "pgvector" ||
57
56
  signal === "postgres" ||
58
57
  clock === "postgres" ||
59
- (config.drivers?.prod ?? []).some(
60
- (p) => p === "postgres" || p === "pgvector",
61
- );
58
+ (config.drivers?.prod ?? []).some((p) => p === "postgres" || p === "pgvector");
62
59
 
63
60
  if (needsSql) {
64
61
  out["store.sql"] =
65
- sql === "pgvector" || index === "pgvector"
66
- ? DEFAULT_PGVECTOR_IMAGE
67
- : DEFAULT_SQL_IMAGE;
62
+ sql === "pgvector" || index === "pgvector" ? DEFAULT_PGVECTOR_IMAGE : DEFAULT_SQL_IMAGE;
68
63
  }
69
64
 
70
- const needsKv =
71
- kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
65
+ const needsKv = kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
72
66
  if (needsKv) {
73
67
  out["store.kv"] = DEFAULT_KV_IMAGE;
74
68
  }
75
69
 
70
+ const vault = dockerOrProdId(config.drivers?.vault);
71
+ if (vault === "openbao") {
72
+ out.vault = DEFAULT_VAULT_IMAGE;
73
+ }
74
+
76
75
  return out;
77
76
  }
78
77
 
@@ -109,9 +108,7 @@ export async function loadOkeConfig(
109
108
  }
110
109
  return { config: mod.default, path };
111
110
  }
112
- throw new Error(
113
- `oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`,
114
- );
111
+ throw new Error(`oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`);
115
112
  }
116
113
 
117
114
  /**
@@ -131,7 +128,7 @@ export async function loadManifest(path: string): Promise<Manifest> {
131
128
  * Resolve images map from config or Manifest.
132
129
  *
133
130
  * When neither declares `images`, derive defaults from prod driver protocols
134
- * so `oke dev -s` works on scaffolded templates without an explicit pin map.
131
+ * so `oke dev -d` works on scaffolded templates without an explicit pin map.
135
132
  *
136
133
  * @param config - Optional config
137
134
  * @param manifest - Optional manifest
@@ -150,49 +147,44 @@ export function resolveImages(
150
147
  export type StackDriverMismatch = {
151
148
  /** Short label (`sql`, `kv`). */
152
149
  readonly label: string;
153
- /** Active `drivers.*.stack` (→ prod) id. */
150
+ /** Active `drivers.*.docker` (→ prod) id. */
154
151
  readonly using: string;
155
152
  /** Driver that would use the container. */
156
153
  readonly container: string;
157
154
  };
158
155
 
159
156
  /**
160
- * Detect when `oke dev -s` containers will not back the app because the
161
- * `stack` driver profile still points at local/memory backends.
157
+ * Detect when `oke dev -d` containers will not back the app because the
158
+ * `docker` driver profile still points at local/memory backends.
162
159
  *
163
160
  * @param config - Loaded config
164
161
  * @param stackRoles - Roles being composed
165
162
  */
166
- export function stackDevDriverMismatches(
163
+ export function dockerDevDriverMismatches(
167
164
  config: OkeConfig,
168
165
  stackRoles: readonly string[],
169
166
  ): readonly StackDriverMismatch[] {
170
167
  const roles = new Set(stackRoles);
171
168
  const out: StackDriverMismatch[] = [];
172
- const sqlStack =
173
- driverId(config.drivers?.store?.sql?.stack) ??
174
- driverId(config.drivers?.store?.sql?.prod);
175
- const kvStack =
176
- driverId(config.drivers?.store?.kv?.stack) ??
177
- driverId(config.drivers?.store?.kv?.prod);
169
+ const sqlDocker =
170
+ driverId(config.drivers?.store?.sql?.docker) ?? driverId(config.drivers?.store?.sql?.prod);
171
+ const kvDocker =
172
+ driverId(config.drivers?.store?.kv?.docker) ?? driverId(config.drivers?.store?.kv?.prod);
178
173
 
179
174
  if (
180
175
  roles.has("store.sql") &&
181
- (sqlStack === "sqlite" || sqlStack === "memory" || sqlStack === undefined)
176
+ (sqlDocker === "sqlite" || sqlDocker === "memory" || sqlDocker === undefined)
182
177
  ) {
183
178
  out.push({
184
179
  label: "sql",
185
- using: sqlStack ?? "unset",
180
+ using: sqlDocker ?? "unset",
186
181
  container: "postgres",
187
182
  });
188
183
  }
189
- if (
190
- roles.has("store.kv") &&
191
- (kvStack === "memory" || kvStack === undefined)
192
- ) {
184
+ if (roles.has("store.kv") && (kvDocker === "memory" || kvDocker === undefined)) {
193
185
  out.push({
194
186
  label: "kv",
195
- using: kvStack ?? "memory",
187
+ using: kvDocker ?? "memory",
196
188
  container: "redis",
197
189
  });
198
190
  }
@@ -200,7 +192,17 @@ export function stackDevDriverMismatches(
200
192
  }
201
193
 
202
194
  /**
203
- * @deprecated Use {@link stackDevDriverMismatches} — kept for older call sites.
195
+ * @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
196
+ */
197
+ export function stackDevDriverMismatches(
198
+ config: OkeConfig,
199
+ stackRoles: readonly string[],
200
+ ): readonly StackDriverMismatch[] {
201
+ return dockerDevDriverMismatches(config, stackRoles);
202
+ }
203
+
204
+ /**
205
+ * @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
204
206
  * @param config - Loaded config
205
207
  * @param stackRoles - Roles being composed
206
208
  */
@@ -208,7 +210,5 @@ export function stackDevDriverWarnings(
208
210
  config: OkeConfig,
209
211
  stackRoles: readonly string[],
210
212
  ): readonly string[] {
211
- return stackDevDriverMismatches(config, stackRoles).map(
212
- (m) => `${m.label}: ${m.using}`,
213
- );
213
+ return dockerDevDriverMismatches(config, stackRoles).map((m) => `${m.label}: ${m.using}`);
214
214
  }
@@ -4,10 +4,7 @@
4
4
  * Used by `oke dev` so port 6535 is not a separate mock context.
5
5
  */
6
6
 
7
- import {
8
- createFileDiff,
9
- emitStructuralDiff,
10
- } from "../console/server/structural.ts";
7
+ import { createFileDiff, emitStructuralDiff } from "../console/server/structural.ts";
11
8
  import type { Manifest } from "../manifest/types.ts";
12
9
  import type { WideEvent } from "../runs/types.ts";
13
10
  import type { McpContext } from "../mcp/tools.ts";