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
@@ -4,13 +4,11 @@
4
4
 
5
5
  import { resolveDomainDdlMode, resolveDriverId, type ConfigEnv } from "../../config/index.ts";
6
6
  import {
7
- dockerFlagDefaults,
8
7
  STORE_FILES_DEFAULTS,
9
8
  STORE_KV_DEFAULTS,
10
9
  STORE_SQL_DEFAULTS,
11
10
  } from "../../config/driver-defaults.ts";
12
11
  import { fsDriver } from "../../drivers/fs.ts";
13
- import { libsqlDriver, libsqlIndexDriver } from "../../drivers/libsql.ts";
14
12
  import { meilisearchDriver } from "../../drivers/meilisearch.ts";
15
13
  import { memoryDrivers } from "../../drivers/memory.ts";
16
14
  import { pgliteDriver } from "../../drivers/pglite.ts";
@@ -18,7 +16,6 @@ import { pgvectorDriver } from "../../drivers/pgvector.ts";
18
16
  import { postgresDriver } from "../../drivers/postgres.ts";
19
17
  import { redisDriver } from "../../drivers/redis.ts";
20
18
  import { s3Driver } from "../../drivers/s3.ts";
21
- import { sqliteDriver } from "../../drivers/sqlite.ts";
22
19
  import type { FilesDriver, IndexDriver, KvDriver, SqlDriver } from "../../drivers/types.ts";
23
20
  import { createStoreRuntime, type StoreRuntime } from "../../elements/store.ts";
24
21
  import type { StoreDecl } from "../../elements/store/declare.ts";
@@ -28,8 +25,8 @@ import type { BootOptions } from "../boot.ts"; // type-only — no cycle at runt
28
25
  /**
29
26
  * Construct a Store runtime and register facet declarations.
30
27
  *
31
- * In docker mode (`env === "docker"` / `OKE_DOCKER=1`), SQL/KV resolve from the
32
- * `docker` driver map (falling back to `prod`) and URLs from `docker/.env.docker`.
28
+ * With compose infra (`OKE_DOCKER=1` / `oke dev`), SQL/KV URLs come from
29
+ * `docker/.env.docker`. `env: "test"` uses PGLite (`memory://` by default).
33
30
  *
34
31
  * @param options - Boot options
35
32
  * @param env - Active environment
@@ -68,7 +65,7 @@ export function bindStore(
68
65
  const filesId = resolveFilesDriverId(options, env, docker);
69
66
  const indexId = resolveIndexDriverId(options, env, docker);
70
67
  if (filesId === "fs") warnFilesFsMultiInstance();
71
- const sqlUrl = sqlUrlFor(sqlId, docker);
68
+ const sqlUrl = sqlUrlFor(sqlId, docker, env);
72
69
  const kvUrl = kvUrlFor(kvId, docker);
73
70
  const filesRoot = filesRootFor(filesId);
74
71
 
@@ -145,11 +142,7 @@ export function resolveSqlDriverId(options: BootOptions, env: ConfigEnv, docker:
145
142
  const fromEnv = process.env.OKE_SQL_DRIVER?.trim();
146
143
  if (docker && fromEnv) return fromEnv;
147
144
  // Defaults cover every ConfigEnv key, so this is never undefined.
148
- return resolveDriverId(
149
- options.config?.drivers?.store?.sql,
150
- env,
151
- dockerFlagDefaults(STORE_SQL_DEFAULTS, docker),
152
- )!;
145
+ return resolveDriverId(options.config?.drivers?.store?.sql, env, STORE_SQL_DEFAULTS)!;
153
146
  }
154
147
 
155
148
  /**
@@ -161,11 +154,7 @@ export function resolveKvDriverId(options: BootOptions, env: ConfigEnv, docker:
161
154
  const fromEnv = process.env.OKE_KV_DRIVER?.trim();
162
155
  if (docker && fromEnv) return fromEnv;
163
156
  // Defaults cover every ConfigEnv key, so this is never undefined.
164
- return resolveDriverId(
165
- options.config?.drivers?.store?.kv,
166
- env,
167
- dockerFlagDefaults(STORE_KV_DEFAULTS, docker),
168
- )!;
157
+ return resolveDriverId(options.config?.drivers?.store?.kv, env, STORE_KV_DEFAULTS)!;
169
158
  }
170
159
 
171
160
  /**
@@ -181,17 +170,13 @@ export function resolveFilesDriverId(
181
170
  const fromEnv = process.env.OKE_FILES_DRIVER?.trim();
182
171
  if (docker && fromEnv) return fromEnv;
183
172
  // Defaults cover every ConfigEnv key, so this is never undefined.
184
- return resolveDriverId(
185
- options.config?.drivers?.store?.files,
186
- env,
187
- dockerFlagDefaults(STORE_FILES_DEFAULTS, docker),
188
- )!;
173
+ return resolveDriverId(options.config?.drivers?.store?.files, env, STORE_FILES_DEFAULTS)!;
189
174
  }
190
175
 
191
176
  /**
192
177
  * Index driver — same resolution chain as sql/kv/files. Defaults to `memory`;
193
- * a configured `pgvector` / `libsql` is honoured at real boot (and fails loud
194
- * if its SQL engine or peer is missing — never silently back to memory).
178
+ * a configured `pgvector` is honoured at real boot (and fails loud if its
179
+ * SQL engine or peer is missing — never silently back to memory).
195
180
  *
196
181
  * @param options - Boot options
197
182
  * @param env - Active env
@@ -213,10 +198,6 @@ function sqlDriverFor(id: string): SqlDriver {
213
198
  switch (id) {
214
199
  case "postgres":
215
200
  return postgresDriver;
216
- case "sqlite":
217
- return sqliteDriver;
218
- case "libsql":
219
- return libsqlDriver;
220
201
  case "pglite":
221
202
  return pgliteDriver;
222
203
  case "memory":
@@ -260,8 +241,6 @@ export function indexDriverFor(id: string): IndexDriver {
260
241
  return memoryDrivers.index;
261
242
  case "pgvector":
262
243
  return pgvectorDriver;
263
- case "libsql":
264
- return libsqlIndexDriver;
265
244
  case "meilisearch":
266
245
  return meilisearchDriver;
267
246
  default:
@@ -269,28 +248,24 @@ export function indexDriverFor(id: string): IndexDriver {
269
248
  }
270
249
  }
271
250
 
272
- function sqlUrlFor(sqlId: string, docker: boolean): string {
251
+ function sqlUrlFor(sqlId: string, docker: boolean, env: ConfigEnv): string {
273
252
  if (sqlId === "postgres") {
274
253
  const url = process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
275
254
  if (!url) {
276
255
  throw new Error(
277
256
  docker
278
- ? "oke boot: postgres driver needs DATABASE_URL (did `oke dev -d` write docker/.env.docker?)"
257
+ ? "oke boot: postgres driver needs DATABASE_URL (did `oke dev` write docker/.env.docker?)"
279
258
  : "oke boot: postgres driver needs DATABASE_URL",
280
259
  );
281
260
  }
282
261
  return url;
283
262
  }
284
- if (sqlId === "sqlite") {
285
- return process.env.OKE_SQLITE_URL ?? ".oke/app.sqlite";
286
- }
287
- if (sqlId === "libsql") {
288
- return process.env.OKE_LIBSQL_URL ?? ".oke/app.libsql";
289
- }
290
263
  if (sqlId === "pglite") {
291
- return process.env.OKE_PGLITE_URL ?? ".oke/pgdata";
264
+ return process.env.OKE_PGLITE_URL ?? (env === "test" ? "memory://" : ".oke/pgdata");
292
265
  }
293
- return ":memory:";
266
+ // In-process `memory` SQL driver ignores URL; keep a non-path token so a
267
+ // mis-wired pglite connect never creates a literal `./:memory:` datadir.
268
+ return "memory://";
294
269
  }
295
270
 
296
271
  function kvUrlFor(kvId: string, docker: boolean): string | undefined {
@@ -299,7 +274,7 @@ function kvUrlFor(kvId: string, docker: boolean): string | undefined {
299
274
  if (!url) {
300
275
  throw new Error(
301
276
  docker
302
- ? "oke boot: redis driver needs REDIS_URL (did `oke dev -d` write docker/.env.docker?)"
277
+ ? "oke boot: redis driver needs REDIS_URL (did `oke dev` write docker/.env.docker?)"
303
278
  : "oke boot: redis driver needs REDIS_URL",
304
279
  );
305
280
  }
@@ -317,7 +292,7 @@ function indexUrlFor(docker: boolean): string {
317
292
  if (!url) {
318
293
  throw new Error(
319
294
  docker
320
- ? "oke boot: meilisearch index needs OKE_STORE_INDEX_URL (did `oke dev -d` write docker/.env.docker?)"
295
+ ? "oke boot: meilisearch index needs OKE_STORE_INDEX_URL (did `oke dev` write docker/.env.docker?)"
321
296
  : "oke boot: meilisearch index needs OKE_STORE_INDEX_URL",
322
297
  );
323
298
  }
@@ -4,7 +4,13 @@
4
4
 
5
5
  import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
6
6
  import { VAULT_DEFAULTS } from "../../config/driver-defaults.ts";
7
- import { createVaultRuntime, type VaultRuntime } from "../../elements/vault.ts";
7
+ import {
8
+ createVaultRuntime,
9
+ listRequiredEnvNames,
10
+ requiredEnvGaps,
11
+ VaultBootError,
12
+ type VaultRuntime,
13
+ } from "../../elements/vault.ts";
8
14
  import { buildVaultBootChain, normalizeVaultDriverId } from "../../elements/vault/boot-chain.ts";
9
15
  import type { BootOptions } from "../boot.ts";
10
16
 
@@ -30,6 +36,14 @@ export function resolveVaultDriverId(options: BootOptions, env: ConfigEnv): stri
30
36
  */
31
37
  export async function bindVault(options: BootOptions, env: ConfigEnv): Promise<VaultRuntime> {
32
38
  const vaultSecrets = options.vault?.secrets ?? options.secrets ?? [];
39
+ const requiredEnv = options.vault?.requiredEnv ?? listRequiredEnvNames();
40
+ // Fail before the chain is built: the builtin `vault` driver opens SQL at
41
+ // `open()`, and a boot that is already doomed by a missing env var should
42
+ // never pay for (or leak) a database connection first.
43
+ const envGaps = requiredEnvGaps(requiredEnv, new Set(vaultSecrets.map((s) => s.name)));
44
+ if (envGaps.length > 0) {
45
+ throw new VaultBootError(envGaps);
46
+ }
33
47
  const chain =
34
48
  options.vault?.chain ??
35
49
  buildVaultBootChain({
@@ -40,6 +54,7 @@ export async function bindVault(options: BootOptions, env: ConfigEnv): Promise<V
40
54
  });
41
55
  const vault = createVaultRuntime({
42
56
  secrets: vaultSecrets,
57
+ requiredEnv,
43
58
  chain,
44
59
  allowDevFallbacks: options.vault?.allowDevFallbacks ?? env !== "prod",
45
60
  now: options.vault?.now,
@@ -79,7 +79,7 @@ describe("boot — lazy element needs", () => {
79
79
  expect(needs.signal).toBe(false);
80
80
  });
81
81
 
82
- test("oke() Store-only graph stays under the prior 54.3 kB baseline", async () => {
82
+ test("oke() Store-only graph stays under the prior 39 kB baseline", async () => {
83
83
  const dir = await mkdtemp(join(tmpdir(), "oke-store-only-"));
84
84
  const entry = join(dir, "entry.ts");
85
85
  const appPath = join(import.meta.dir, "app.ts");
@@ -116,22 +116,9 @@ describe("boot — lazy element needs", () => {
116
116
  if (raw.byteLength === 0) continue;
117
117
  total += Bun.gzipSync(new Uint8Array(raw)).byteLength;
118
118
  }
119
- // Rebased after fx.sendOtp/verifyOtp on the shared fx surface (~50.1 kB
120
- // gzip), durable-journal lease surface (~51.2 kB), fx.deliverOtp +
121
- // unified otp() (~50.9 kB → 53 kB), then fx.runs / SLO window on the
122
- // shared surface (~53.3 kB → 54 kB cap). Clock/channel/journal drivers
123
- // stay lazy-bound; far below eager bind. Rebased again for the
124
- // store/vault/signal/channel auto-registry drain (`element-registries.ts`
125
- // + the `oke()` merge/dedup logic) — every app now carries this
126
- // regardless of which elements it uses, since the drain must run
127
- // synchronously at construction (same isolation guarantee as the
128
- // `on()` binding registry) and can't be deferred behind a lazy import
129
- // (~54.0 kB → 54.3 kB cap). Rebased again for `assertAdoptBarrelFresh`
130
- // + `tryListFlowsUnits` in `boot.ts` (`.adopt()` barrel staleness
131
- // check, OKE1009) — part of the already-lazily-loaded boot graph, not
132
- // the `oke()` construction path, but `Bun.build` still traces and
133
- // sums the dynamic-import chunk (~54.3 kB → 54.7 kB cap).
134
- expect(total).toBeLessThan(54_700);
119
+ // Rebased after lazy `gate.auth` / auth-config chunks + `gate.public`
120
+ // decoupling from kv-lua strategies (~38.9 kB gzip with export externals).
121
+ expect(total).toBeLessThan(40_000);
135
122
  } finally {
136
123
  await rm(dir, { recursive: true, force: true });
137
124
  }
@@ -273,11 +260,18 @@ describe("boot — cron autostart via real timer loop", () => {
273
260
  }),
274
261
  );
275
262
 
276
- // env: "local" → startScheduler defaults ON. No createTestApp / advance.
263
+ // Non-test env → startScheduler defaults ON. No createTestApp / advance.
277
264
  const app = oke({
278
265
  name: "cron-autostart",
279
- env: "local",
266
+ env: "dev",
280
267
  schedulerIntervalMs: 1000,
268
+ config: {
269
+ drivers: {
270
+ clock: { dev: "memory" },
271
+ store: { sql: { dev: "memory" }, kv: { dev: "memory" } },
272
+ channel: { email: { dev: "console" } },
273
+ },
274
+ },
281
275
  });
282
276
  await app.boot();
283
277
 
@@ -216,7 +216,9 @@ export interface ElementNeeds {
216
216
  export function resolveElementNeeds(options: BootOptions): ElementNeeds {
217
217
  const pre = options.elements ?? {};
218
218
  let vault =
219
- pre.vault !== undefined || (options.vault?.secrets ?? options.secrets ?? []).length > 0;
219
+ pre.vault !== undefined ||
220
+ (options.vault?.secrets ?? options.secrets ?? []).length > 0 ||
221
+ (options.vault?.requiredEnv?.length ?? 0) > 0;
220
222
  let store = pre.store !== undefined || (options.stores?.length ?? 0) > 0;
221
223
  let signal = pre.signal !== undefined || (options.signals?.length ?? 0) > 0;
222
224
  let clock = pre.clock !== undefined || (options.clocks?.length ?? 0) > 0;
@@ -283,9 +285,10 @@ async function loadBind<T>(name: string): Promise<T> {
283
285
  export async function bootApplication(input: BootOptions = {}): Promise<BootResult> {
284
286
  const docker =
285
287
  input.docker === true || (input.docker !== false && process.env.OKE_DOCKER === "1");
286
- // `-d` always selects the `docker` driver profile not a mix of local/test +
287
- // prod store overrides when `$options.env` is unset.
288
- const env: ConfigEnv = input.env ?? (docker ? "docker" : "local");
288
+ // Three targets: `prod` when NODE_ENV=production; `dev` when compose infra
289
+ // is up (`oke dev` / `OKE_DOCKER=1`); otherwise `test` (PGLite / memory).
290
+ const env: ConfigEnv =
291
+ input.env ?? (process.env.NODE_ENV === "production" ? "prod" : docker ? "dev" : "test");
289
292
  let config = input.config;
290
293
  if (config === undefined) {
291
294
  try {
@@ -482,12 +485,13 @@ export async function bootApplication(input: BootOptions = {}): Promise<BootResu
482
485
  const capabilities = await mintCapabilities(options.flows ?? [], env, {
483
486
  manifest: options.manifest,
484
487
  rootDir: options.rootDir,
488
+ docker,
485
489
  });
486
490
 
487
491
  // 9. `.adopt()` barrel freshness — opt-in only (same `rootDir` gate as
488
492
  // capability minting above; never a filesystem read the kernel performs
489
493
  // on its own).
490
- await assertAdoptBarrelFresh(options.flows ?? [], env, options.rootDir);
494
+ await assertAdoptBarrelFresh(options.flows ?? [], env, options.rootDir, docker);
491
495
 
492
496
  return {
493
497
  vault,
@@ -556,10 +560,9 @@ async function tryAutoExtractManifest(rootDir: string): Promise<Manifest | undef
556
560
  * an explicit {@link BootOptions.manifest}, or a lazy AoT extract from
557
561
  * {@link BootOptions.rootDir} / `OKE_ROOT_DIR`.
558
562
  *
559
- * When neither is available: `local` / `test` stay open (today's dev-loop
560
- * behavior, unbroken) with a once-per-process `oke boot:` warning; `docker`
561
- * / `prod` fail loud (`OKE1008`) — docker mirrors prod's posture, never a
562
- * silent open door in a deploy-shaped environment.
563
+ * When neither is available: `test` stays open with a once-per-process
564
+ * `oke boot:` warning; `dev` with compose infra and `prod` fail loud
565
+ * (`OKE1008`) — never a silent open door in a deploy-shaped environment.
563
566
  *
564
567
  * @param flows - Adopted flows
565
568
  * @param env - Resolved {@link ConfigEnv}
@@ -567,8 +570,12 @@ async function tryAutoExtractManifest(rootDir: string): Promise<Manifest | undef
567
570
  */
568
571
  export async function mintCapabilities(
569
572
  flows: readonly AnyFlowDef[],
570
- env: ConfigEnv = "local",
571
- options: { readonly manifest?: Manifest; readonly rootDir?: string } = {},
573
+ env: ConfigEnv = "test",
574
+ options: {
575
+ readonly manifest?: Manifest;
576
+ readonly rootDir?: string;
577
+ readonly docker?: boolean;
578
+ } = {},
572
579
  ): Promise<Map<string, CapabilityToken>> {
573
580
  const map = new Map<string, CapabilityToken>();
574
581
 
@@ -591,7 +598,8 @@ export async function mintCapabilities(
591
598
  continue;
592
599
  }
593
600
 
594
- if (env === "docker" || env === "prod") {
601
+ const strict = env === "prod" || (env === "dev" && options.docker === true);
602
+ if (strict) {
595
603
  throwOke("NO_EFFECTS_DECLARED", { flow: f.name });
596
604
  }
597
605
  if (!noEffectsWarned) {
@@ -600,7 +608,7 @@ export async function mintCapabilities(
600
608
  `oke boot: flow "${f.name}" (and possibly others) has no declared effects and no ` +
601
609
  "Manifest-derived effects — running with an OPEN capability token (every access " +
602
610
  "allowed, ledgered but not gated). Run `oke build`, or boot with `manifest` / " +
603
- "`rootDir`, before deploying — docker/prod refuse to boot this way.",
611
+ "`rootDir`, before deploying — dev+compose/prod refuse to boot this way.",
604
612
  );
605
613
  }
606
614
  map.set(f.name, createCapabilityToken(f.name, undefined));
@@ -645,18 +653,21 @@ async function tryListFlowsUnits(rootDir: string): Promise<readonly string[] | u
645
653
  *
646
654
  * Opt-in only via {@link BootOptions.rootDir} / `OKE_ROOT_DIR` (same gate as
647
655
  * {@link mintCapabilities}'s Manifest fallback) — never a filesystem read
648
- * the kernel performs on its own. `local` / `test` warn once per process;
649
- * `docker` / `prod` fail loud (`OKE1009`) — same class as `NO_EFFECTS_DECLARED`,
650
- * never a silently-incomplete route table in a deploy-shaped environment.
656
+ * the kernel performs on its own. `test` warns once per process; `prod`
657
+ * (and `dev` with compose) fail loud (`OKE1009`) — same class as
658
+ * `NO_EFFECTS_DECLARED`, never a silently-incomplete route table in a
659
+ * deploy-shaped environment.
651
660
  *
652
661
  * @param flows - Adopted flows
653
662
  * @param env - Resolved {@link ConfigEnv}
654
663
  * @param rootDir - Explicit project root (falls back to `OKE_ROOT_DIR`)
664
+ * @param docker - Compose infra active (`oke dev`)
655
665
  */
656
666
  export async function assertAdoptBarrelFresh(
657
667
  flows: readonly AnyFlowDef[],
658
- env: ConfigEnv = "local",
668
+ env: ConfigEnv = "test",
659
669
  rootDir?: string,
670
+ docker = false,
660
671
  ): Promise<void> {
661
672
  const dir = rootDir ?? process.env["OKE_ROOT_DIR"];
662
673
  if (!dir) return;
@@ -670,7 +681,8 @@ export async function assertAdoptBarrelFresh(
670
681
  const missing = diskUnits.filter((u) => !adoptedUnits.has(u));
671
682
  if (missing.length === 0) return;
672
683
 
673
- if (env === "docker" || env === "prod") {
684
+ const strict = env === "prod" || (env === "dev" && docker);
685
+ if (strict) {
674
686
  throwOke("ADOPT_BARREL_STALE", { unit: missing[0]! });
675
687
  }
676
688
  if (!staleAdoptBarrelWarned) {
@@ -678,7 +690,7 @@ export async function assertAdoptBarrelFresh(
678
690
  emitBootWarn(
679
691
  `oke boot: src/flows/${missing[0]} exists on disk but adopted no flows — the ` +
680
692
  '.adopt() barrel ("src/flows/generated.ts") is stale. Run `oke dev` or `oke build` ' +
681
- "to regenerate it — docker/prod refuse to boot this way.",
693
+ "to regenerate it — dev+compose/prod refuse to boot this way.",
682
694
  );
683
695
  }
684
696
  }
@@ -14,7 +14,7 @@ import { flow } from "./flow.ts";
14
14
  import { createFx } from "./fx.ts";
15
15
  import { mergeHooks, runPipeline } from "./hooks.ts";
16
16
  import { on, resetBindings } from "./on.ts";
17
- import { createRouter } from "./router.ts";
17
+ import { createEdgeRouter as createRouter } from "./router/create-edge.ts";
18
18
  import { http } from "./triggers.ts";
19
19
 
20
20
  /**