okengine 0.10.3 → 0.11.1

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 (323) hide show
  1. package/package.json +76 -10
  2. package/site/content/docs/deployment/docker-swarm.mdx +48 -111
  3. package/site/content/docs/deployment/docker.mdx +43 -36
  4. package/site/content/docs/deployment/index.mdx +9 -9
  5. package/site/content/docs/deployment/kubernetes.mdx +4 -4
  6. package/site/content/docs/elements/ai.mdx +7 -7
  7. package/site/content/docs/elements/channel.mdx +9 -7
  8. package/site/content/docs/elements/clock.mdx +8 -8
  9. package/site/content/docs/elements/flow.mdx +46 -47
  10. package/site/content/docs/elements/gate.mdx +6 -5
  11. package/site/content/docs/elements/signal.mdx +2 -2
  12. package/site/content/docs/elements/store.mdx +71 -78
  13. package/site/content/docs/elements/vault.mdx +89 -70
  14. package/site/content/docs/get-started/basic-usage.mdx +8 -8
  15. package/site/content/docs/get-started/installation.mdx +36 -36
  16. package/site/content/docs/get-started/introduction.mdx +11 -0
  17. package/site/content/docs/get-started/why.mdx +2 -2
  18. package/site/content/docs/plugins/anonymous.mdx +1 -1
  19. package/site/content/docs/plugins/magic-link.mdx +11 -11
  20. package/site/content/docs/plugins/otp.mdx +2 -2
  21. package/site/content/docs/plugins/passkey.mdx +1 -1
  22. package/site/content/docs/plugins/two-factor.mdx +1 -1
  23. package/site/content/docs/plugins/username.mdx +1 -1
  24. package/site/content/docs/recipes/caddy.mdx +1 -1
  25. package/site/content/docs/recipes/cockroachdb.mdx +2 -2
  26. package/site/content/docs/recipes/dragonfly.mdx +1 -1
  27. package/site/content/docs/recipes/index.mdx +1 -2
  28. package/site/content/docs/recipes/llama-cpp.mdx +21 -23
  29. package/site/content/docs/recipes/mailpit.mdx +11 -11
  30. package/site/content/docs/recipes/meilisearch.mdx +10 -10
  31. package/site/content/docs/recipes/meta.json +0 -1
  32. package/site/content/docs/recipes/ollama.mdx +1 -1
  33. package/site/content/docs/recipes/pgdog.mdx +12 -9
  34. package/site/content/docs/recipes/postgres.mdx +3 -3
  35. package/site/content/docs/recipes/redis.mdx +2 -2
  36. package/site/content/docs/recipes/rustfs.mdx +10 -7
  37. package/site/content/docs/recipes/sglang.mdx +1 -1
  38. package/site/content/docs/recipes/supabase-docker.mdx +1 -1
  39. package/site/content/docs/recipes/timescale.mdx +2 -2
  40. package/site/content/docs/recipes/valkey.mdx +1 -1
  41. package/site/content/docs/recipes/vllm.mdx +1 -1
  42. package/site/content/docs/recipes/yugabytedb.mdx +2 -2
  43. package/site/content/docs/reference/cli.md +61 -38
  44. package/site/content/docs/reference/configuration.mdx +145 -70
  45. package/site/content/docs/reference/environment-variables.mdx +36 -28
  46. package/site/content/docs/reference/errors.mdx +28 -29
  47. package/site/content/docs/reference/fx.mdx +11 -4
  48. package/site/content/docs/reference/i18n.mdx +17 -6
  49. package/site/content/docs/reference/index.mdx +5 -0
  50. package/site/content/docs/reference/meta.json +1 -0
  51. package/site/content/docs/reference/migrating-environments.mdx +158 -0
  52. package/site/content/docs/reference/plugins.mdx +2 -2
  53. package/src/auth/gate-auth.test.ts +12 -10
  54. package/src/cli/ai-setup/ai-setup.test.ts +27 -15
  55. package/src/cli/ai-setup/apply.ts +111 -15
  56. package/src/cli/ai-setup/catalog.ts +3 -3
  57. package/src/cli/ai-setup/index.ts +1 -1
  58. package/src/cli/ai-setup/prompts.ts +1 -1
  59. package/src/cli/ai-setup/recommend.test.ts +1 -1
  60. package/src/cli/ask-seed.test.ts +3 -3
  61. package/src/cli/build.ts +1 -1
  62. package/src/cli/db-auto-push.test.ts +6 -3
  63. package/src/cli/db-auto-push.ts +7 -5
  64. package/src/cli/db-seed.ts +7 -8
  65. package/src/cli/db.test.ts +70 -71
  66. package/src/cli/db.ts +86 -12
  67. package/src/cli/dev-controller.test.ts +35 -0
  68. package/src/cli/dev-controller.ts +298 -0
  69. package/src/cli/dev-controls.ts +11 -65
  70. package/src/cli/dev-db-push.test.ts +47 -15
  71. package/src/cli/dev-schema-sync.test.ts +11 -11
  72. package/src/cli/dev-schema-sync.ts +10 -10
  73. package/src/cli/dev-session-lock.test.ts +106 -0
  74. package/src/cli/dev-session-lock.ts +209 -0
  75. package/src/cli/dev.test.ts +166 -121
  76. package/src/cli/dev.ts +138 -192
  77. package/src/cli/doc-staleness.test.ts +3 -6
  78. package/src/cli/docker-clean.test.ts +33 -1
  79. package/src/cli/docker-clean.ts +28 -33
  80. package/src/cli/docker-cli.test.ts +12 -11
  81. package/src/cli/docker.ts +95 -20
  82. package/src/cli/doctor.test.ts +40 -0
  83. package/src/cli/doctor.ts +55 -15
  84. package/src/cli/drizzle-env.test.ts +11 -13
  85. package/src/cli/drizzle-env.ts +18 -11
  86. package/src/cli/ensure-drizzle-config.ts +11 -14
  87. package/src/cli/hero-meta.test.ts +15 -15
  88. package/src/cli/hero-meta.ts +10 -9
  89. package/src/cli/index.ts +36 -6
  90. package/src/cli/load-config.images.test.ts +16 -12
  91. package/src/cli/load-config.source.test.ts +50 -0
  92. package/src/cli/load-config.ts +34 -28
  93. package/src/cli/meilisearch-local.ts +1 -2
  94. package/src/cli/mode.ts +7 -58
  95. package/src/cli/registry.ts +175 -19
  96. package/src/cli/resolve-dev-sql-env.test.ts +8 -16
  97. package/src/cli/resolve-dev-sql-env.ts +13 -15
  98. package/src/cli/safe-defaults.test.ts +28 -10
  99. package/src/cli/schema.ts +65 -16
  100. package/src/cli/test.ts +58 -0
  101. package/src/cli/tui/App.tsx +252 -0
  102. package/src/cli/tui/DevLive.tsx +116 -0
  103. package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
  104. package/src/cli/tui/components/HeaderBar.tsx +67 -0
  105. package/src/cli/tui/components/LogStream.tsx +47 -0
  106. package/src/cli/tui/components/PanelCard.tsx +39 -0
  107. package/src/cli/tui/components/SelectRow.tsx +37 -0
  108. package/src/cli/tui/components/SlashPalette.tsx +172 -0
  109. package/src/cli/tui/components/Spinner.tsx +32 -0
  110. package/src/cli/tui/components/StatusBar.tsx +51 -0
  111. package/src/cli/tui/components/StatusDot.tsx +37 -0
  112. package/src/cli/tui/components/TabBar.tsx +49 -0
  113. package/src/cli/tui/components/Wordmark.tsx +43 -0
  114. package/src/cli/tui/format.ts +38 -0
  115. package/src/cli/tui/keys.test.ts +18 -0
  116. package/src/cli/tui/keys.ts +26 -0
  117. package/src/cli/tui/launch.test.ts +18 -0
  118. package/src/cli/tui/launch.ts +57 -0
  119. package/src/cli/tui/panels/Dashboard.tsx +201 -0
  120. package/src/cli/tui/panels/Database.tsx +198 -0
  121. package/src/cli/tui/panels/Dev.tsx +257 -0
  122. package/src/cli/tui/panels/Docker.tsx +357 -0
  123. package/src/cli/tui/panels/Navigator.test.ts +22 -0
  124. package/src/cli/tui/panels/Navigator.tsx +213 -0
  125. package/src/cli/tui/slash-catalog.test.ts +31 -0
  126. package/src/cli/tui/slash-catalog.ts +184 -0
  127. package/src/cli/tui/slash-run.ts +54 -0
  128. package/src/cli/tui/state/ports.ts +95 -0
  129. package/src/cli/tui/theme.ts +24 -0
  130. package/src/cli/vault-cmd.test.ts +402 -0
  131. package/src/cli/vault-cmd.ts +727 -69
  132. package/src/cli/vault-secure-input.test.ts +56 -0
  133. package/src/cli/vault-secure-input.ts +124 -0
  134. package/src/compiler/effects-infer.ts +7 -0
  135. package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
  136. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
  137. package/src/compiler/fixtures/skyport.expected.json +1 -1
  138. package/src/compiler-entry.ts +7 -0
  139. package/src/config/define-config.test.ts +111 -47
  140. package/src/config/driver-defaults.test.ts +16 -23
  141. package/src/config/driver-defaults.ts +33 -63
  142. package/src/config/index.ts +169 -144
  143. package/src/config/resolve-driver.test.ts +14 -19
  144. package/src/console/server/app.ts +4 -2
  145. package/src/console/server/console.test.ts +58 -1
  146. package/src/console/server/flows.ts +22 -2
  147. package/src/console/server/index.ts +3 -0
  148. package/src/console/server/operator-db.test.ts +55 -13
  149. package/src/console/server/operator-db.ts +305 -263
  150. package/src/console/server/serve.ts +16 -7
  151. package/src/console/server/state.ts +31 -9
  152. package/src/console/server/vault.test.ts +120 -5
  153. package/src/console/server/vault.ts +208 -12
  154. package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
  155. package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
  156. package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
  157. package/src/console/ui/dist/index.html +2 -2
  158. package/src/console/ui/shell/client.ts +16 -0
  159. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
  160. package/src/console/ui/vault/VaultA11yView.tsx +33 -1
  161. package/src/console/ui/vault/backend.test.ts +75 -0
  162. package/src/console/ui/vault/backend.ts +117 -0
  163. package/src/console/ui/vault/fixture.ts +21 -2
  164. package/src/console/ui/vault/index.ts +11 -1
  165. package/src/console/ui/vault/types.ts +26 -0
  166. package/src/docker/compose.ts +164 -61
  167. package/src/docker/derive.ts +106 -12
  168. package/src/docker/docker.test.ts +156 -110
  169. package/src/docker/helpers.ts +98 -0
  170. package/src/docker/images-config.test.ts +3 -8
  171. package/src/docker/index.ts +30 -5
  172. package/src/docker/recipes/index.ts +0 -3
  173. package/src/docker/recipes/llama-cpp.ts +4 -4
  174. package/src/docker/recipes/pgdog.ts +9 -2
  175. package/src/docker/resources.test.ts +71 -0
  176. package/src/docker/resources.ts +176 -0
  177. package/src/docker/stack-id.test.ts +11 -4
  178. package/src/docker/stack-id.ts +42 -32
  179. package/src/docker/stack.integration.test.ts +4 -15
  180. package/src/docker/types.ts +35 -3
  181. package/src/drivers/ai-ollama.integration.test.ts +2 -2
  182. package/src/drivers/conformance.test.ts +11 -12
  183. package/src/drivers/drizzle-dialect.test.ts +0 -4
  184. package/src/drivers/drizzle-dialect.ts +7 -13
  185. package/src/drivers/index.ts +24 -7
  186. package/src/drivers/journal-postgres.test.ts +3 -1
  187. package/src/drivers/journal-postgres.ts +4 -2
  188. package/src/drivers/meilisearch.ts +1 -1
  189. package/src/drivers/pglite.ts +28 -5
  190. package/src/drivers/types.ts +9 -11
  191. package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
  192. package/src/drivers/vault-aws-secrets-manager.ts +333 -0
  193. package/src/drivers/vault-builtin.test.ts +110 -0
  194. package/src/drivers/vault-builtin.ts +184 -0
  195. package/src/drivers/vault-driver-removal.test.ts +13 -0
  196. package/src/drivers/vault-managed.test.ts +95 -0
  197. package/src/drivers/vault-managed.ts +101 -25
  198. package/src/drivers/vault-types.ts +25 -5
  199. package/src/elements/ai/runtime.ts +1 -1
  200. package/src/elements/clock/chaos.test.ts +4 -1
  201. package/src/elements/clock/durable.ts +57 -4
  202. package/src/elements/clock.test.ts +13 -14
  203. package/src/elements/gate/config.ts +13 -3
  204. package/src/elements/gate/constants.ts +18 -0
  205. package/src/elements/gate/declare.ts +1 -1
  206. package/src/elements/gate/strategies.ts +2 -12
  207. package/src/elements/gate.test.ts +1 -1
  208. package/src/elements/gate.ts +2 -2
  209. package/src/elements/store/domain-ddl.test.ts +5 -12
  210. package/src/elements/store/emit-drizzle.ts +44 -19
  211. package/src/elements/store/index-boot.test.ts +15 -116
  212. package/src/elements/store/load-plugin-tables.ts +1 -1
  213. package/src/elements/store/resource-list-docs.fixture.ts +12 -6
  214. package/src/elements/store/resource-list-docs.test.ts +64 -44
  215. package/src/elements/store/resource.test.ts +17 -10
  216. package/src/elements/store/runtime.ts +9 -12
  217. package/src/elements/store/schema-decl.test.ts +16 -32
  218. package/src/elements/store/seed.test.ts +1 -2
  219. package/src/elements/store/seed.ts +7 -8
  220. package/src/elements/store/sql-condition.test.ts +2 -2
  221. package/src/elements/store/sql-session.test.ts +8 -10
  222. package/src/elements/store/sql-session.ts +10 -2
  223. package/src/elements/store.test.ts +13 -13
  224. package/src/elements/vault/audit.ts +233 -0
  225. package/src/elements/vault/boot-chain.test.ts +78 -0
  226. package/src/elements/vault/boot-chain.ts +43 -39
  227. package/src/elements/vault/builtin-adapter.test.ts +479 -0
  228. package/src/elements/vault/builtin-adapter.ts +1184 -0
  229. package/src/elements/vault/crypto.test.ts +237 -0
  230. package/src/elements/vault/crypto.ts +431 -0
  231. package/src/elements/vault/declare.ts +164 -3
  232. package/src/elements/vault/errors.ts +56 -0
  233. package/src/elements/vault/kms-unseal.test.ts +76 -0
  234. package/src/elements/vault/kms-unseal.ts +181 -0
  235. package/src/elements/vault/path.ts +90 -0
  236. package/src/elements/vault/resilience.test.ts +102 -0
  237. package/src/elements/vault/resilience.ts +107 -0
  238. package/src/elements/vault/runtime.ts +36 -4
  239. package/src/elements/vault/security-checklist.test.ts +130 -0
  240. package/src/elements/vault/storage.ts +448 -0
  241. package/src/elements/vault/types.ts +288 -0
  242. package/src/elements/vault/unseal.ts +150 -0
  243. package/src/elements/vault.test.ts +72 -4
  244. package/src/elements/vault.ts +91 -2
  245. package/src/full.ts +248 -0
  246. package/src/http.ts +41 -0
  247. package/src/i18n/interpolate-simple.ts +37 -0
  248. package/src/i18n/messages.ts +51 -4
  249. package/src/i18n-entry.ts +7 -0
  250. package/src/index.ts +35 -145
  251. package/src/journal-entry.ts +20 -0
  252. package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
  253. package/src/kernel/app-auth.ts +98 -0
  254. package/src/kernel/app.ts +77 -110
  255. package/src/kernel/auto-registry.test.ts +2 -2
  256. package/src/kernel/boot-bind/ai.test.ts +5 -5
  257. package/src/kernel/boot-bind/ai.ts +2 -1
  258. package/src/kernel/boot-bind/channel.test.ts +6 -6
  259. package/src/kernel/boot-bind/channel.ts +3 -10
  260. package/src/kernel/boot-bind/clock.ts +2 -2
  261. package/src/kernel/boot-bind/gate.ts +5 -9
  262. package/src/kernel/boot-bind/honor-config.test.ts +42 -42
  263. package/src/kernel/boot-bind/journal.ts +2 -2
  264. package/src/kernel/boot-bind/store.test.ts +43 -44
  265. package/src/kernel/boot-bind/store.ts +16 -41
  266. package/src/kernel/boot-bind/vault.ts +16 -1
  267. package/src/kernel/boot.test.ts +13 -19
  268. package/src/kernel/boot.ts +31 -19
  269. package/src/kernel/budget-entry.ts +1 -1
  270. package/src/kernel/compensate.test.ts +288 -1
  271. package/src/kernel/compensate.ts +126 -0
  272. package/src/kernel/concurrency.test.ts +10 -9
  273. package/src/kernel/effects-stamping.test.ts +27 -2
  274. package/src/kernel/element-registries.ts +5 -3
  275. package/src/kernel/flow.ts +4 -2
  276. package/src/kernel/fx.test.ts +119 -3
  277. package/src/kernel/fx.ts +215 -40
  278. package/src/kernel/index.ts +14 -0
  279. package/src/kernel/journal.ts +130 -7
  280. package/src/kernel/pipeline.test.ts +20 -6
  281. package/src/kernel/redacted.test.ts +35 -0
  282. package/src/kernel/redacted.ts +24 -2
  283. package/src/kernel/router/create-default.ts +16 -0
  284. package/src/kernel/router/create-edge.ts +18 -0
  285. package/src/kernel/router/create.ts +23 -0
  286. package/src/kernel/router/index.ts +23 -0
  287. package/src/kernel/router/linear.ts +88 -0
  288. package/src/kernel/router/regexp.ts +188 -0
  289. package/src/kernel/router/smart.ts +120 -0
  290. package/src/kernel/router/trie.ts +108 -0
  291. package/src/kernel/router/types.ts +56 -0
  292. package/src/kernel/router.ts +18 -532
  293. package/src/kernel-entry.ts +43 -0
  294. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  295. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  296. package/src/plugins/config-source.test.ts +7 -7
  297. package/src/release/build-lib.ts +61 -0
  298. package/src/release/exports.test.ts +4 -2
  299. package/src/release/exports.ts +30 -4
  300. package/src/release/measure.ts +101 -22
  301. package/src/runs/duckdb.ts +7 -2
  302. package/src/shared/lazy-src.ts +79 -0
  303. package/src/shared/optional-peer.ts +41 -0
  304. package/src/term.test.ts +3 -44
  305. package/src/test/create-test-app.ts +12 -0
  306. package/src/test/provisions.integration.test.ts +1 -1
  307. package/src/test/reset-element-registries.ts +2 -0
  308. package/src/upgrade/codemods.test.ts +7 -20
  309. package/src/upgrade/codemods.ts +93 -60
  310. package/site/content/docs/recipes/openbao.mdx +0 -141
  311. package/src/cli/ask-dev-mode.ts +0 -40
  312. package/src/cli/dev-mode.test.ts +0 -45
  313. package/src/cli/dev-mode.ts +0 -78
  314. package/src/cli/openbao-bootstrap.test.ts +0 -150
  315. package/src/cli/openbao-bootstrap.ts +0 -321
  316. package/src/cli/openbao-restart.integration.test.ts +0 -145
  317. package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
  318. package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
  319. package/src/docker/recipes/openbao.ts +0 -47
  320. package/src/drivers/libsql.ts +0 -179
  321. package/src/drivers/sqlite.ts +0 -44
  322. package/src/drivers/vault-openbao.test.ts +0 -97
  323. package/src/drivers/vault-openbao.ts +0 -143
@@ -5,7 +5,7 @@ icon: "Database"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
- Postgres is the default `store.sql` image in docker and prod. `oke docker` matches
8
+ Postgres is the default `store.sql` image in `dev` and `prod`. `oke docker` matches
9
9
  any image whose reference contains `postgres` or `pgvector` (after more specific
10
10
  recipes), then derives env, healthcheck, and connection URL.
11
11
 
@@ -33,7 +33,7 @@ images: {
33
33
  ### Bring the stack up
34
34
 
35
35
  ```bash
36
- oke dev --docker
36
+ oke dev
37
37
  ```
38
38
 
39
39
  `oke docker` writes `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` into
@@ -105,7 +105,7 @@ Scale out with [PgDog](/docs/recipes/pgdog) so `N × Bun.SQL pool` does not exha
105
105
  <Accordion title="oke boot: postgres driver needs DATABASE_URL">
106
106
 
107
107
  The `postgres` driver fails boot when neither `DATABASE_URL` nor `OKE_STORE_SQL_URL` is
108
- set. Re-run `oke dev --docker` so the stack writes `docker/.env.docker`, or export
108
+ set. Re-run `oke dev` so the stack writes `docker/.env.docker`, or export
109
109
  `DATABASE_URL` yourself when pointing at a managed host.
110
110
 
111
111
  </Accordion>
@@ -5,7 +5,7 @@ icon: "Zap"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
- Redis is the default `store.kv` image in docker and prod. `oke docker` matches image
8
+ Redis is the default `store.kv` image in `dev` and `prod`. `oke docker` matches image
9
9
  references containing `redis` or `keydb` and derives a password-required server — no
10
10
  unauthenticated instance.
11
11
 
@@ -99,7 +99,7 @@ Multi-replica Gate rate counters and Signal need a **shared** Redis URL — an i
99
99
  <Accordion title="oke boot: redis driver needs REDIS_URL">
100
100
 
101
101
  Missing `REDIS_URL` fails boot loudly — never a silent fallback to `memory`. Re-run
102
- `oke dev --docker` or export `REDIS_URL` when using a managed host. In docker mode the
102
+ `oke dev` or export `REDIS_URL` when using a managed host. Under Compose the
103
103
  message asks whether `oke dev -d` wrote `docker/.env.docker`.
104
104
 
105
105
  </Accordion>
@@ -5,9 +5,8 @@ icon: "HardDrive"
5
5
  source: "docs/spec/unified-theory.md"
6
6
  ---
7
7
 
8
- RustFS is the default docker `store.files` image — an Apache-2.0 S3-compatible object
9
- store (MinIO alternative). Driver id stays `s3`; Bun binds `Bun.S3Client` against the
10
- endpoint.
8
+ RustFS is the default `oke dev` / prod `store.files` image — an Apache-2.0 S3-compatible
9
+ object store. Driver id stays `s3`; Bun binds `Bun.S3Client` against the endpoint.
11
10
 
12
11
  <Callout title="The one rule">
13
12
  Protocol name is `s3` — vendor choice is the image pin (`rustfs/rustfs:…`) plus `S3_ENDPOINT`.
@@ -24,11 +23,11 @@ endpoint.
24
23
  ```typescript title="oke.config.ts"
25
24
  drivers: {
26
25
  store: {
27
- files: { local: "fs", docker: "s3", test: "memory", prod: "s3" },
26
+ files: { dev: "s3", test: "memory", prod: "s3" },
28
27
  },
29
28
  },
30
29
  images: {
31
- "store.files": "rustfs/rustfs:1.0.0-beta.11",
30
+ store: { files: "rustfs/rustfs:1.0.0-beta.11" },
32
31
  },
33
32
  ```
34
33
 
@@ -116,7 +115,7 @@ the recipe enables the console for local ops.
116
115
  <Accordion title="oke boot: redis / meilisearch / S3 URL missing — S3_BUCKET">
117
116
 
118
117
  Files on the `s3` driver need `S3_BUCKET` (or `OKE_STORE_FILES_DB`). Without it the
119
- facet cannot open. Re-run `oke dev --docker` so stack env fills `S3_*`, or export them
118
+ facet cannot open. Re-run `oke dev` so stack env fills `S3_*`, or export them
120
119
  for a managed bucket.
121
120
 
122
121
  </Accordion>
@@ -143,6 +142,10 @@ running service; confirm health at `/health` before debugging client signatures.
143
142
  description="SMTP catcher for the same stack."
144
143
  href="/docs/recipes/mailpit"
145
144
  />
146
- <Card title="OpenBao" description="Vault for secrets." href="/docs/recipes/openbao" />
145
+ <Card
146
+ title="Vault"
147
+ description="Secrets and built-in encrypted store."
148
+ href="/docs/elements/vault"
149
+ />
147
150
  <Card title="Store" description="Files facet details." href="/docs/elements/store" />
148
151
  </Cards>
@@ -23,7 +23,7 @@ production apps. For general multi-user serving, prefer [vLLM](/docs/recipes/vll
23
23
 
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
- ai: { docker: "openai-compatible", prod: "openai-compatible", test: "mock" },
26
+ ai: { dev: "openai-compatible", test: "mock", prod: "openai-compatible" },
27
27
  },
28
28
  images: {
29
29
  ai: "lmsysorg/sglang:v0.5.16-runtime", // never :latest
@@ -44,7 +44,7 @@ refs from `OKE_STORE_SQL_*`. Driver id stays `postgres`.
44
44
  ```typescript
45
45
  drivers: {
46
46
  store: {
47
- index: { local: "memory", docker: "pgvector", prod: "pgvector" },
47
+ index: { test: "memory", prod: "pgvector" },
48
48
  },
49
49
  },
50
50
  ```
@@ -33,7 +33,7 @@ images: {
33
33
  ### Bring the stack up
34
34
 
35
35
  ```bash
36
- oke dev --docker
36
+ oke dev
37
37
  ```
38
38
 
39
39
  Same credential contract as [Postgres](/docs/recipes/postgres):
@@ -104,7 +104,7 @@ re-derive, then `CREATE EXTENSION timescaledb`.
104
104
  </Accordion>
105
105
  <Accordion title="oke boot: postgres driver needs DATABASE_URL">
106
106
 
107
- Same as Postgres — re-run `oke dev --docker` or export `DATABASE_URL` for a remote
107
+ Same as Postgres — re-run `oke dev` or export `DATABASE_URL` for a remote
108
108
  host.
109
109
 
110
110
  </Accordion>
@@ -90,7 +90,7 @@ see [DigitalOcean Managed Caching](/docs/providers/digitalocean-caching).
90
90
  <Accordion title="oke boot: redis driver needs REDIS_URL">
91
91
 
92
92
  Same loud failure as Redis — the driver id is still `redis`. Export `REDIS_URL` or let
93
- `oke dev --docker` write it.
93
+ `oke dev` write it.
94
94
 
95
95
  </Accordion>
96
96
  <Accordion title="Healthcheck uses redis-cli and fails">
@@ -23,7 +23,7 @@ you choose to self-host inference instead of a managed provider. Driver id stays
23
23
 
24
24
  ```typescript title="oke.config.ts"
25
25
  drivers: {
26
- ai: { docker: "openai-compatible", prod: "openai-compatible", test: "mock" },
26
+ ai: { dev: "openai-compatible", test: "mock", prod: "openai-compatible" },
27
27
  },
28
28
  images: {
29
29
  ai: "vllm/vllm-openai:v0.26.0", // never :latest
@@ -33,7 +33,7 @@ images: {
33
33
  ### Bring the stack up
34
34
 
35
35
  ```bash
36
- oke dev --docker
36
+ oke dev
37
37
  ```
38
38
 
39
39
  `oke docker` injects `YSQL_USER` / `YSQL_PASSWORD` / `YSQL_DB` from `OKE_STORE_SQL_*`
@@ -105,7 +105,7 @@ Receiver or remap that port in `compose.override.yml` if you need the UI.
105
105
  <Accordion title="password authentication failed">
106
106
 
107
107
  `YSQL_PASSWORD` must match `DATABASE_URL`. Regenerate `docker/.env.docker` with
108
- `oke dev --docker`. Auth is off only when `YSQL_PASSWORD` is unset — this recipe
108
+ `oke dev`. Auth is off only when `YSQL_PASSWORD` is unset — this recipe
109
109
  always sets it.
110
110
 
111
111
  </Accordion>
@@ -11,34 +11,41 @@ source: "docs/cli.md"
11
11
  bun add okengine # ONE package (project)
12
12
  bun install -g okengine # global `oke` on PATH
13
13
 
14
+ oke # interactive TUI (TTY) — Dashboard · Dev · Database · Docker · Navigator
15
+ oke --tui # force TUI even when other args were passed
16
+ oke --help # command list (also what bare `oke` prints when non-TTY / CI)
17
+
14
18
  oke dev # watch · hot reload · Console :6533 · app :6530 · MCP :6535 · docs MCP :6536
15
- # → client types + domain schema push on save (local)
16
- oke dev --local # -l session-only local (in-memory; never writes .oke/mode)
19
+ # → always Docker Compose under docker/ + host Bun
20
+ # → client types + domain schema push on save
17
21
  oke dev --no-db-push # opt out of auto oke db push on schema input save
18
- oke dev --docker # -d infra compose under docker/ (no app container; host Bun)
19
- # Ctrl-C / close terminal docker compose stop (volumes kept)
20
- oke dev -d store.sql,signal # partial: only these roles get real backends
21
- oke mode local|docker # get/set default oke dev mode (saved in .oke/mode)
22
+ oke dev -d store.sql,signal # optional role filter (still Compose; requires Docker)
23
+ oke test # bun test with PGLite posture (NODE_ENV=test, OKE_PGLITE_URL=memory://)
24
+ # does not start Docker Compose
25
+ oke mode # removed prints error; use oke dev (Compose) / oke test (PGLite)
22
26
 
23
27
  oke start # runs exactly what production runs (this is the Docker CMD)
24
28
  oke doctor # verify secrets, ports, drivers, tenancy, schema drift
25
29
  oke stack # preview resolved images/tags/ports — writes nothing
26
30
 
27
- oke schema generate # core + plugin stubs → schema/oke.ts (--check in CI)
28
- oke db push # domain schema.ts → live local DB (dev; drizzle-kit)
31
+ oke schema generate # core + plugin stubs → .oke/schema/oke.ts (--check in CI)
32
+ oke db push # domain schema.ts → live DB (dev; drizzle-kit)
29
33
  oke db generate # versioned SQL under drizzle/ (review)
30
34
  oke db migrate # apply migrations (explicit; never auto in prod)
31
35
  oke db seed # defineSeed (essential + env category); never at boot
32
- oke db seed --env prod --force # CI: skip docker/prod confirmation prompt
36
+ oke db seed --env prod --force # CI: skip prod confirmation prompt
37
+ oke db studio # drizzle-kit Studio (long-running)
33
38
  oke vault set STRIPE_KEY # also: list · import .env · key rotate
34
39
  oke client add <url> # types for a separate frontend repo
35
40
 
36
- oke docker # docker/Dockerfile + compose.yml + compose.<role>.yml + compose.all.yml ·
37
- # opt-in images.proxy Caddyfile (caddy) or Traefik labels + socket-proxy
38
- oke docker --prod # + compose.prod.yml (HEALTHCHECK /_/ready, deploy, limits); folded into compose.all.yml
39
- oke docker clean # TTY: pick oke-dev-* stacks down -v (containers, networks, volumes)
40
- oke docker clean --yes # non-TTY: current project stack only
41
- oke docker clean --all --yes # non-TTY: every oke-dev-* stack on this machine
41
+ oke docker # docker/Dockerfile + docker-compose.yml (prod-grade; 4 CPU / 8 GiB budget)
42
+ oke docker --split # layered compose.yml + compose.<role>.yml + compose.prod.yml
43
+ oke docker --stack # docker-stack.yml for docker stack deploy
44
+ oke docker --cpus 8 --memory 16 # override host budget used for deploy.resources
45
+ oke docker --no-prod # skip readiness / deploy / resource budget
46
+ oke docker clean # TTY: pick oke-dev-* projects down -v (containers, networks, volumes)
47
+ oke docker clean --yes # non-TTY: current project only
48
+ oke docker clean --all --yes # non-TTY: every oke-dev-* project on this machine
42
49
  oke images pin # tags → digests in oke.images.lock
43
50
 
44
51
  oke build --target edge # < 15 kB kernel profile
@@ -58,20 +65,31 @@ In development, app, Console, MCP, and docs MCP prefer the canonical ports and m
58
65
  when occupied. Docker infrastructure uses stable per-project offsets in disjoint ranges for
59
66
  each built-in service, preventing one service's offset port from overlapping another's.
60
67
 
61
- `oke dev` boot chrome prints immediately (wordmark + Starting + profile), then
62
- streams background work (compose up, vault, per-service health, AI probe) in a
63
- live progress pane no blank multi-second wait. That pane clears before the
64
- elements + Docker board. Status is green ready · yellow pending/loading ·
65
- red error · dim idle. Compose health keeps polling (`docker compose ps -a`)
66
- so updates live if you stop a container; AI tracks model phase while the
67
- AI container is up. Boot does not wait for the model to become ready.
68
-
69
- On a TTY with `-d`, keyboard controls stay active under Logs. Status ● for
70
- compose/AI live on the board **above** Logs (not as log lines) it already
71
- lists every service, so refresh is enough to see the stack; there is no
72
- separate services panel. Press `r` to clear the log pane and reprint the
73
- latest board. `?` also refreshes first so the help panel is not mixed into
74
- request logs.
68
+ Bare `oke` on a TTY opens an Ink interactive shell (optional deps `ink` +
69
+ `react`). The viewport is cleared before render so boot logs never sit above the
70
+ frame. Chrome matches `oke dev`: green OKE wordmark on Dashboard, green active
71
+ tabs, cyan focus rows. Panels cover live ports (App / Console / MCP / Docs MCP),
72
+ Dev start/stop/attach with live logs, Database action cards (including Studio),
73
+ Docker compose status, and a Manifest navigator. **Tab** / **←→** (on the tab
74
+ strip) switch panels; **↑↓** navigate inside a panel; **Esc** returns to the tab
75
+ strip, then confirms quit when a managed `oke dev` is running; **1–5** jump
76
+ panels from any focus. Press `/` for the **command palette** (Tab autofill,
77
+ Enter runs `oke …`; status shows in the global footer). If `oke dev` is already
78
+ running, the TUI shows **Connected** via `.oke/dev.json` + port probes and will
79
+ not spawn a second stack. Non-TTY / CI keeps the classic help listing
80
+ (`EXIT_USAGE`).
81
+
82
+ `oke dev` always starts Compose (requires a running Docker daemon). Boot chrome
83
+ prints immediately (wordmark + Starting + profile), then streams background work
84
+ (compose up, vault, per-service health, AI probe). Status ● is green ready ·
85
+ yellow pending/loading · red error · dim idle. Compose health keeps polling
86
+ (`docker compose ps -a`); AI ● tracks model phase while the AI container is up.
87
+ Boot does not wait for the model to become ready. A successful session writes
88
+ `.oke/dev.json` (pid · ports · startedAt) and clears it on stop.
89
+
90
+ On a TTY, Ink keyboard controls stay active after boot (`useInput` — same
91
+ shortcuts as before). Press `r` to clear the log pane and reprint the latest
92
+ board.
75
93
 
76
94
  | Key | Action |
77
95
  | --------- | ----------------------------------- |
@@ -83,6 +101,12 @@ request logs.
83
101
  Compose stays quiet unless it fails. Process-local boot notices print once under
84
102
  the hero (not once per process).
85
103
 
104
+ `oke test` sets `NODE_ENV=test` and `OKE_PGLITE_URL=memory://` when unset, checks
105
+ that `@electric-sql/pglite` resolves, then forwards argv to `bun test`.
106
+
107
+ `oke mode` and `oke dev --local` / `-l` are removed — they exit with an error.
108
+ See [Migrating environments](/docs/reference/migrating-environments).
109
+
86
110
  ### create-oke
87
111
 
88
112
  ```bash
@@ -95,13 +119,10 @@ bunx create-oke@latest my-app --no-ai
95
119
  ```
96
120
 
97
121
  On a TTY: pick **standard** or **advanced**, then recommended defaults or
98
- customize. Customize asks **local** or **docker** first, walks facets for that
99
- side only (including `store.index` with a `none` opt-out no separate enable
100
- prompt), then whether to customize the other (defaults if no). **AI setup**
101
- offers Recommended (llama.cpp) · Customize · Off. Writes user-global
102
- `~/.oke/create-defaults.json` (reuse only when `template` matches). Scaffold
103
- writes `.oke/mode` from the primary side. Non-TTY / `--yes` / explicit
104
- `--template` never prompt.
122
+ customize. Customize walks **Docker-first** facets once (including `store.index`
123
+ with a `none` opt-out), then **AI setup**: Recommended (llama.cpp) · Customize ·
124
+ Off. Writes user-global `~/.oke/create-defaults.json` (reuse only when `template`
125
+ matches). Non-TTY / `--yes` / explicit `--template` never prompt.
105
126
 
106
127
  ### Additional commands
107
128
 
@@ -132,8 +153,7 @@ Long form is canonical in docs; short form is convenience only. Shared letters f
132
153
 
133
154
  | Long | Short | Where |
134
155
  | -------------------- | ----- | ---------------------------------------------- |
135
- | `--local` | `-l` | `dev` |
136
- | `--docker` | `-d` | `dev` |
156
+ | `--docker` | `-d` | `dev` (optional Compose **role filter**) |
137
157
  | `--no-db-push` | | `dev` |
138
158
  | `--prod` | `-p` | `docker` |
139
159
  | `--yes` | `-y` | `docker clean` |
@@ -156,6 +176,9 @@ Long form is canonical in docs; short form is convenience only. Shared letters f
156
176
  | `--subject` | `-s` | `privacy erase` |
157
177
  | `--before` | `-b` | `doctor --diff` |
158
178
  | `--base` | `-B` | `doctor --diff` |
179
+ | `--env` | | `db *` (`dev` \| `test` \| `prod`) |
180
+ | `--force` | | `db seed` |
181
+ | `--local` / `-l` | | **removed** on `dev` (use `oke test`) |
159
182
 
160
183
  ### Exit codes
161
184
 
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  title: "Configuration"
3
- description: "Every option in oke.config.ts — drivers per environment, images, i18n, tenancy, privacy, db sync, topology, ports, and console."
3
+ description: "Every option in oke.config.ts — three environments (dev · test · prod), drivers, images, i18n, tenancy, privacy, db sync, topology, ports, and console."
4
4
  icon: "Settings2"
5
5
  ---
6
6
 
7
- Complete reference for `oke.config.ts`. Every option below is verified against `defineConfig`; the four environment keys everywhere are `local` · `docker` · `test` · `prod`.
7
+ Complete reference for `oke.config.ts`. Options below match `defineConfig`. Driver maps use three keys: **dev** · **test** · **prod**.
8
8
 
9
9
  ```typescript title="oke.config.ts"
10
10
  import { defineConfig } from "okengine/config";
@@ -14,38 +14,104 @@ export default defineConfig({
14
14
  });
15
15
  ```
16
16
 
17
- ## drivers
17
+ <Callout title="Philosophy">
18
+ We test on what we deploy. Local development runs the same stack as production via Docker. Tests
19
+ use PGLite for speed without sacrificing Postgres correctness.
20
+ </Callout>
18
21
 
19
- Which backend each element talks to, per environment. A value is either a driver id string or a rich object:
22
+ ## Environments
23
+
24
+ | Key | When | Typical backends |
25
+ | ------ | -------------------------- | ----------------------------------------------------- |
26
+ | `dev` | `oke dev` (Docker Compose) | Same protocols as prod (Postgres, Redis, S3, SMTP, …) |
27
+ | `test` | `oke test` / `bun test` | PGLite for SQL; memory / frozen / console elsewhere |
28
+ | `prod` | Production deploy | Shared durable backends |
29
+
30
+ Missing `dev` pins fill from `prod` (`fillDevFromProd`). Only `dev` / `test` / `prod` keys are
31
+ valid — see [Migrating environments](/docs/reference/migrating-environments) if you still have
32
+ `local` / `docker` maps.
33
+
34
+ ## Quick start
35
+
36
+ <Steps>
37
+
38
+ <Step>
39
+ ### Pin drivers for three envs
40
+
41
+ Pin **only the env keys that differ** from the built-in defaults — omitted keys
42
+ keep `DRIVER_DEFAULTS`. create-oke templates ship that sparse shape:
43
+
44
+ ```typescript title="oke.config.ts"
45
+ import { defineConfig } from "okengine/config";
46
+
47
+ export default defineConfig({
48
+ drivers: {
49
+ // Default vault.dev is "env"; pin the built-in store for Docker-first apps.
50
+ vault: { dev: "vault" },
51
+ },
52
+ });
53
+ ```
54
+
55
+ </Step>
56
+
57
+ <Step>
58
+ ### Or use a string shorthand
59
+
60
+ A bare string (or `{ driver, … }` object) expands to all three envs:
20
61
 
21
62
  ```typescript
22
63
  drivers: {
23
- store: {
24
- sql: { local: "sqlite", docker: "postgres", test: "memory", prod: "postgres" },
25
- kv: { local: "memory", docker: "redis", test: "memory", prod: "redis" },
26
- files: { local: "fs", docker: "s3", test: "memory", prod: "s3" },
27
- },
28
- signal: { local: "memory", docker: "redis", test: "memory", prod: "redis" },
29
- clock: { local: "memory", docker: "postgres", test: "frozen", prod: "postgres" },
30
- journal: { local: "memory", docker: "postgres", test: "memory", prod: "postgres" },
31
- vault: { local: "env", docker: "openbao", test: "memory", prod: "openbao" },
32
- channel: {
33
- email: { local: "console", docker: "smtp", test: "console", prod: "smtp" },
34
- sms: { local: "console", docker: "taqnyat", test: "console", prod: "taqnyat" },
35
- },
64
+ signal: "redis", // → { dev: "redis", test: "redis", prod: "redis" }
36
65
  },
37
66
  ```
38
67
 
39
- | Key | Shape | Driver ids (verified) |
68
+ Prefer an explicit `{ dev, test, prod }` map (or a partial override) when test
69
+ should differ from the default for that driver.
70
+
71
+ </Step>
72
+
73
+ <Step>
74
+ ### Run and test
75
+
76
+ ```bash title="Terminal"
77
+ oke dev # Docker Compose + host Bun · drivers.dev
78
+ oke test # bun test · NODE_ENV=test · OKE_PGLITE_URL=memory://
79
+ ```
80
+
81
+ </Step>
82
+
83
+ </Steps>
84
+
85
+ ## Default driver maps
86
+
87
+ Built-in defaults (`DRIVER_DEFAULTS`) when a key is omitted:
88
+
89
+ | Map | `dev` | `test` | `prod` |
90
+ | --------------- | ---------- | --------- | ---------- |
91
+ | `store.sql` | `postgres` | `pglite` | `postgres` |
92
+ | `store.kv` | `redis` | `memory` | `redis` |
93
+ | `store.files` | `s3` | `memory` | `s3` |
94
+ | `signal` | `redis` | `memory` | `redis` |
95
+ | `clock` | `postgres` | `frozen` | `postgres` |
96
+ | `journal` | `postgres` | `memory` | `postgres` |
97
+ | `vault` | `env` | `memory` | `vault` |
98
+ | `channel.email` | `smtp` | `console` | `smtp` |
99
+ | `channel.sms` | — (opt-in) | — | — |
100
+
101
+ `store.index`, `channel.whatsapp` / `push`, and `ai` have no single three-env default table — set them explicitly when you need them. create-oke templates pin `vault.dev: "vault"` (built-in) because the default `dev` driver is `env`.
102
+
103
+ ## Driver keys and ids
104
+
105
+ | Key | Shape | Driver ids |
40
106
  | ------------------ | -------------- | ---------------------------------------------------------------------------- |
41
- | `store.sql` | env driver map | `sqlite` · `postgres` · `libsql` · `pglite` · `memory` |
107
+ | `store.sql` | env driver map | `postgres` · `pglite` · `memory` |
42
108
  | `store.kv` | env driver map | `memory` · `redis` |
43
109
  | `store.files` | env driver map | `memory` · `fs` · `s3` |
44
- | `store.index` | env driver map | `memory` · `pgvector` · `libsql` · `meilisearch` |
110
+ | `store.index` | env driver map | `memory` · `pgvector` · `meilisearch` |
45
111
  | `signal` | env driver map | `memory` · `redis` (boot); `postgres` · `nats` fail loud until clients bind |
46
112
  | `clock` | env driver map | `memory` · `postgres` · `file` · `frozen` |
47
113
  | `journal` | env driver map | `memory` · `file` · `postgres` |
48
- | `vault` | env driver map | `env` · `openbao` · `memory` · `managed` |
114
+ | `vault` | env driver map | `env` · `vault` · `memory` · `managed` |
49
115
  | `channel.email` | env driver map | `console` · `smtp` · `resend` · `sndr` · `taqnyat-mail` |
50
116
  | `channel.sms` | env driver map | `console` · `taqnyat` · `msegat` · `unifonic` |
51
117
  | `channel.whatsapp` | env driver map | `console` · `wa-cloud` |
@@ -54,7 +120,14 @@ drivers: {
54
120
  | `runs` | env driver map | runs-store driver (distinct from top-level `runs`) |
55
121
  | `prod` | `string[]` | flat protocol list for the Manifest — nested maps are preferred |
56
122
 
57
- When `docker` is omitted it inherits the `prod` driver. The rich object form adds connection detail:
123
+ ### Safety rules
124
+
125
+ `defineConfig` rejects unsafe pins:
126
+
127
+ - **`sqlite` is removed** — use `postgres` (dev/prod) or `pglite` (test).
128
+ - **`drivers.store.sql.test` must be `pglite`** when set — real Postgres semantics in tests.
129
+
130
+ ### Rich driver objects
58
131
 
59
132
  ```typescript
60
133
  sql: {
@@ -70,59 +143,41 @@ sql: {
70
143
 
71
144
  ## images
72
145
 
73
- Container image pins keyed by element role — vendor choice lives here, never in driver ids:
146
+ Nested pins by element role — vendor choice lives here, never in driver ids:
74
147
 
75
148
  ```typescript
76
149
  images: {
77
- "store.sql": "postgres:18",
150
+ store: {
151
+ sql: "postgres:18-alpine",
152
+ kv: "redis:8-alpine",
153
+ files: "rustfs/rustfs:1.0.0-beta.11",
154
+ },
155
+ channel: { email: "axllent/mailpit:v1.22.3" },
78
156
  pgdog: "ghcr.io/pgdogdev/pgdog:v0.1.51",
79
- "store.kv": "redis:8",
80
- // or: "valkey/valkey:8-alpine"
81
- // or: "docker.dragonflydb.io/dragonflydb/dragonfly"
82
- "store.files": "rustfs/rustfs:1.0.0-beta.11",
83
- "channel.email": "axllent/mailpit:v1.22.3",
84
- vault: "openbao/openbao:2.6.1",
85
- ai: "ghcr.io/ggml-org/llama.cpp:server-b10290", // default; or ollama/ollama:0.32.6
86
- // opt-in TLS edge — omit for the default (app publishes 6530):
87
- // proxy: "caddy:2-alpine", // simplest automatic HTTPS
88
- // proxy: "traefik:v3.3", // label auto-discovery for --scale app=N
157
+ // ai: "ghcr.io/ggml-org/llama.cpp:server-b10290",
158
+ // proxy: "caddy:2-alpine",
89
159
  },
90
160
  ```
91
161
 
92
- When both `store.sql` and `pgdog` are pinned, `DATABASE_URL` points at PgDog
93
- (`6432`) — wire-protocol transparent to Bun.SQL / Drizzle. See
94
- [Store · Multiple environments](/docs/elements/store#multiple-environments).
95
-
96
- For `store.kv`, pin Redis (default), Valkey, or Dragonfly — driver id stays
97
- `redis`, same `REDIS_URL`. Image table + licenses: [Store · KV](/docs/elements/store#kv).
98
-
99
- For `ai`, default is [llama.cpp](/docs/recipes/llama-cpp) (`OKE_AI_URL` →
100
- `/v1`, curated Docker Hub `ai/` model). Ollama / vLLM / SGLang are explicit
101
- alternatives — see [Recipes · AI](/docs/recipes#ai-local--self-hosted).
162
+ Omitted image keys mean no container for that role. When both `store.sql` and `pgdog` are pinned, `DATABASE_URL` points at PgDog — see [Store](/docs/elements/store#multiple-environments).
102
163
 
103
- For `proxy`, pin **either** Caddy or Traefiknever both. Opt-in only; see
104
- [Reverse proxy](/docs/deployment/reverse-proxy).
164
+ For `store.kv`, pin Redis (default), Valkey, or Dragonflydriver id stays `redis`. For `ai`, see [Recipes · AI](/docs/recipes#ai-local--self-hosted). For `proxy`, see [Reverse proxy](/docs/deployment/reverse-proxy).
105
165
 
106
166
  ## i18n
107
167
 
108
- | Option | Type | Default | Meaning |
109
- | --------- | ---------- | ------- | ------------------------------------------- |
110
- | `locales` | `string[]` | | Supported locales |
111
- | `default` | string | | Fallback locale (channel templates, `fx.t`) |
112
- | `dir` | record | — | Per-locale direction: `"ltr"` \| `"rtl"` |
168
+ | Option | Type | Default | Meaning |
169
+ | --------- | ---------- | --------------------- | ------------------------------------------- |
170
+ | `locales` | `string[]` | `["en"]` when omitted | Supported locales |
171
+ | `default` | string | `"en"` when omitted | Fallback locale (channel templates, `fx.t`) |
172
+ | `dir` | record | — | Per-locale direction: `"ltr"` \| `"rtl"` |
113
173
 
114
174
  ```typescript
115
- i18n: { locales: ["en", "ar"], default: "en", dir: { ar: "rtl" } },
175
+ i18n: { locales: ["en"], default: "en" },
176
+ // or with Arabic: { locales: ["en", "ar"], default: "en", dir: { ar: "rtl" } }
116
177
  ```
117
178
 
118
- `fx.t` catalogs are ICU strings from `defineLocale` / `defineMessages` — see
119
- [i18n](/docs/reference/i18n). Built-ins also cover failure `error.message` and
120
- OKE cause/fix; Channel templates keep separate `locales` + `{{field}}` bodies.
121
-
122
179
  ## tenancy
123
180
 
124
- Multi-tenant isolation policy.
125
-
126
181
  | Option | Type | Meaning |
127
182
  | ----------- | --------------------------------- | ---------------------------------------- |
128
183
  | `isolation` | `"row" \| "schema" \| "database"` | How tenants are separated in the store |
@@ -130,7 +185,7 @@ Multi-tenant isolation policy.
130
185
 
131
186
  ## privacy
132
187
 
133
- Presence of this block turns the CORE privacy tooling on in the Console — masking, classification surfaces. It is not a `.plug()` call.
188
+ Presence of this block turns CORE privacy tooling on in the Console — not a `.plug()` call.
134
189
 
135
190
  ```typescript
136
191
  privacy: {},
@@ -138,7 +193,7 @@ privacy: {},
138
193
 
139
194
  ## runs
140
195
 
141
- Runs retention and redaction at the config surface — **not** the same key as `drivers.runs`.
196
+ Runs retention and redaction — **not** the same key as `drivers.runs`.
142
197
 
143
198
  | Option | Type | Meaning |
144
199
  | -------- | ------------------------ | ----------------------------------------------------- |
@@ -148,13 +203,13 @@ Runs retention and redaction at the config surface — **not** the same key as `
148
203
 
149
204
  Domain schema sync for `oke db push | generate | migrate` (Drizzle). Unrelated to `oke schema generate`.
150
205
 
151
- | Option | Default | Meaning |
152
- | ----------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------- |
153
- | `autoPush` | `true` (local only) | Auto-run `db push` when schema inputs change in `oke dev` (not on emit of `generated`); forced off in docker/prod |
154
- | `config` | `"drizzle.config.ts"` | Path to the drizzle-kit config |
155
- | `declare` | `"src/schema.decl.ts"` | Abstract schema module (`store.schema.table` exports) |
156
- | `generated` | `"src/schema.generated.ts"` | Where `oke db` emits dialect Drizzle |
157
- | `entry` | `src/app.ts` | App entry for collecting plugin table contributions |
206
+ | Option | Default | Meaning |
207
+ | ----------- | ---------------------------- | ------------------------------------------------------------------------- |
208
+ | `autoPush` | `true` | Auto-run `db push` on schema change under `oke dev`; forced off in `prod` |
209
+ | `config` | `"drizzle.config.ts"` | Path to the drizzle-kit config |
210
+ | `declare` | `"src/db/schema.decl.ts"` | Abstract schema module (`store.schema.table` exports) |
211
+ | `generated` | `"src/db/schema.drizzle.ts"` | Where `oke db` emits dialect Drizzle |
212
+ | `entry` | `src/app.ts` | App entry for collecting plugin table contributions |
158
213
 
159
214
  ## topology
160
215
 
@@ -173,15 +228,35 @@ Domain schema sync for `oke db push | generate | migrate` (Drizzle). Unrelated t
173
228
 
174
229
  ## console
175
230
 
176
- Production Console exposure.
177
-
178
231
  | Option | Type | Default | Meaning |
179
232
  | -------------- | ------------------------------------ | ------- | ------------------------- |
180
233
  | `prod.enabled` | boolean | — | Serve the Console in prod |
181
234
  | `prod.auth` | `"required" \| "optional" \| "none"` | — | Access requirement |
182
235
 
236
+ ## Troubleshooting
237
+
238
+ <Accordions>
239
+
240
+ <Accordion title='oke.config: … uses removed driver "sqlite"'>
241
+ The `sqlite` driver is gone. Pin `postgres` for `dev`/`prod` and `pglite` for `test`. Edit the
242
+ file by hand — see [Migrating environments](/docs/reference/migrating-environments).
243
+ </Accordion>
244
+
245
+ <Accordion title='drivers.store.sql.test must be "pglite"'>
246
+ Tests use PGLite so SQL semantics match Postgres. Set `test: "pglite"` (or omit the key and keep
247
+ the default). Do not use `memory` or `postgres` for `store.sql.test`.
248
+ </Accordion>
249
+
250
+ <Accordion title='CLI error: "local" / "sqlite" is no longer valid'>
251
+ There is no soft-compat. Rename env keys to `dev` / `test` / `prod` and replace `sqlite` with
252
+ `postgres` / `pglite`. `oke mode` was removed — `oke dev` always starts Docker Compose.
253
+ </Accordion>
254
+
255
+ </Accordions>
256
+
183
257
  ## Learn more
184
258
 
185
- - [CLI Reference](/docs/reference/cli) — `oke dev` · `oke db` · `oke docker`
259
+ - [Migrating environments](/docs/reference/migrating-environments) — four-key maps `dev`/`test`/`prod`
260
+ - [CLI Reference](/docs/reference/cli) — `oke dev` · `oke test` · `oke db`
186
261
  - [Environment Variables](/docs/reference/environment-variables) — URL and secret resolution
187
262
  - [Store](/docs/elements/store) — what the store drivers back