okengine 0.10.2 → 0.11.0

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 (343) hide show
  1. package/package.json +76 -10
  2. package/site/content/docs/ai/mcp.mdx +0 -1
  3. package/site/content/docs/deployment/docker-swarm.mdx +48 -111
  4. package/site/content/docs/deployment/docker.mdx +43 -36
  5. package/site/content/docs/deployment/index.mdx +9 -9
  6. package/site/content/docs/deployment/kubernetes.mdx +4 -4
  7. package/site/content/docs/elements/ai.mdx +7 -13
  8. package/site/content/docs/elements/channel.mdx +9 -13
  9. package/site/content/docs/elements/clock.mdx +8 -14
  10. package/site/content/docs/elements/flow.mdx +46 -54
  11. package/site/content/docs/elements/gate.mdx +6 -11
  12. package/site/content/docs/elements/signal.mdx +2 -8
  13. package/site/content/docs/elements/store.mdx +79 -93
  14. package/site/content/docs/elements/vault.mdx +89 -76
  15. package/site/content/docs/get-started/basic-usage.mdx +8 -14
  16. package/site/content/docs/get-started/installation.mdx +36 -36
  17. package/site/content/docs/get-started/introduction.mdx +11 -0
  18. package/site/content/docs/get-started/why.mdx +3 -4
  19. package/site/content/docs/index.mdx +0 -1
  20. package/site/content/docs/meta.json +0 -1
  21. package/site/content/docs/plugins/anonymous.mdx +1 -1
  22. package/site/content/docs/plugins/magic-link.mdx +11 -11
  23. package/site/content/docs/plugins/otp.mdx +2 -2
  24. package/site/content/docs/plugins/passkey.mdx +1 -1
  25. package/site/content/docs/plugins/two-factor.mdx +1 -1
  26. package/site/content/docs/plugins/username.mdx +1 -1
  27. package/site/content/docs/recipes/caddy.mdx +1 -1
  28. package/site/content/docs/recipes/cockroachdb.mdx +2 -2
  29. package/site/content/docs/recipes/dragonfly.mdx +1 -1
  30. package/site/content/docs/recipes/index.mdx +1 -2
  31. package/site/content/docs/recipes/llama-cpp.mdx +21 -23
  32. package/site/content/docs/recipes/mailpit.mdx +11 -11
  33. package/site/content/docs/recipes/meilisearch.mdx +10 -10
  34. package/site/content/docs/recipes/meta.json +0 -1
  35. package/site/content/docs/recipes/ollama.mdx +1 -1
  36. package/site/content/docs/recipes/pgdog.mdx +12 -9
  37. package/site/content/docs/recipes/postgres.mdx +3 -3
  38. package/site/content/docs/recipes/redis.mdx +2 -2
  39. package/site/content/docs/recipes/rustfs.mdx +10 -7
  40. package/site/content/docs/recipes/sglang.mdx +1 -1
  41. package/site/content/docs/recipes/supabase-docker.mdx +1 -1
  42. package/site/content/docs/recipes/timescale.mdx +2 -2
  43. package/site/content/docs/recipes/valkey.mdx +1 -1
  44. package/site/content/docs/recipes/vllm.mdx +1 -1
  45. package/site/content/docs/recipes/yugabytedb.mdx +2 -2
  46. package/site/content/docs/reference/cli.md +61 -38
  47. package/site/content/docs/reference/configuration.mdx +145 -70
  48. package/site/content/docs/reference/environment-variables.mdx +36 -28
  49. package/site/content/docs/reference/errors.mdx +28 -29
  50. package/site/content/docs/reference/fx.mdx +14 -7
  51. package/site/content/docs/reference/i18n.mdx +17 -6
  52. package/site/content/docs/reference/index.mdx +5 -0
  53. package/site/content/docs/reference/meta.json +1 -0
  54. package/site/content/docs/reference/migrating-environments.mdx +158 -0
  55. package/site/content/docs/reference/plugins.mdx +2 -2
  56. package/src/auth/gate-auth.test.ts +12 -10
  57. package/src/cli/ai-setup/ai-setup.test.ts +30 -16
  58. package/src/cli/ai-setup/apply.ts +111 -15
  59. package/src/cli/ai-setup/catalog.ts +3 -3
  60. package/src/cli/ai-setup/index.ts +1 -1
  61. package/src/cli/ai-setup/prompts.ts +1 -1
  62. package/src/cli/ai-setup/recommend.test.ts +1 -1
  63. package/src/cli/ask-seed.test.ts +3 -3
  64. package/src/cli/build.ts +8 -9
  65. package/src/cli/db-auto-push.test.ts +6 -3
  66. package/src/cli/db-auto-push.ts +7 -5
  67. package/src/cli/db-seed.ts +7 -8
  68. package/src/cli/db.test.ts +70 -71
  69. package/src/cli/db.ts +86 -12
  70. package/src/cli/dev-controller.test.ts +35 -0
  71. package/src/cli/dev-controller.ts +298 -0
  72. package/src/cli/dev-controls.ts +11 -65
  73. package/src/cli/dev-db-push.test.ts +47 -15
  74. package/src/cli/dev-schema-sync.test.ts +11 -11
  75. package/src/cli/dev-schema-sync.ts +10 -10
  76. package/src/cli/dev-session-lock.test.ts +106 -0
  77. package/src/cli/dev-session-lock.ts +209 -0
  78. package/src/cli/dev.test.ts +246 -114
  79. package/src/cli/dev.ts +153 -205
  80. package/src/cli/doc-staleness.test.ts +3 -6
  81. package/src/cli/docker-clean.test.ts +33 -1
  82. package/src/cli/docker-clean.ts +28 -33
  83. package/src/cli/docker-cli.test.ts +12 -11
  84. package/src/cli/docker.ts +95 -20
  85. package/src/cli/doctor.test.ts +40 -0
  86. package/src/cli/doctor.ts +142 -9
  87. package/src/cli/drizzle-env.test.ts +11 -13
  88. package/src/cli/drizzle-env.ts +18 -11
  89. package/src/cli/ensure-drizzle-config.ts +11 -14
  90. package/src/cli/hero-meta.test.ts +15 -15
  91. package/src/cli/hero-meta.ts +10 -9
  92. package/src/cli/index.ts +36 -6
  93. package/src/cli/load-config.images.test.ts +44 -10
  94. package/src/cli/load-config.source.test.ts +50 -0
  95. package/src/cli/load-config.ts +35 -29
  96. package/src/cli/meilisearch-local.ts +1 -2
  97. package/src/cli/mode.ts +7 -58
  98. package/src/cli/registry.ts +175 -19
  99. package/src/cli/resolve-dev-sql-env.test.ts +8 -16
  100. package/src/cli/resolve-dev-sql-env.ts +13 -15
  101. package/src/cli/safe-defaults.test.ts +29 -11
  102. package/src/cli/schema.ts +65 -16
  103. package/src/cli/test.ts +58 -0
  104. package/src/cli/tui/App.tsx +252 -0
  105. package/src/cli/tui/DevLive.tsx +116 -0
  106. package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
  107. package/src/cli/tui/components/HeaderBar.tsx +67 -0
  108. package/src/cli/tui/components/LogStream.tsx +47 -0
  109. package/src/cli/tui/components/PanelCard.tsx +39 -0
  110. package/src/cli/tui/components/SelectRow.tsx +37 -0
  111. package/src/cli/tui/components/SlashPalette.tsx +172 -0
  112. package/src/cli/tui/components/Spinner.tsx +32 -0
  113. package/src/cli/tui/components/StatusBar.tsx +51 -0
  114. package/src/cli/tui/components/StatusDot.tsx +37 -0
  115. package/src/cli/tui/components/TabBar.tsx +49 -0
  116. package/src/cli/tui/components/Wordmark.tsx +43 -0
  117. package/src/cli/tui/format.ts +38 -0
  118. package/src/cli/tui/keys.test.ts +18 -0
  119. package/src/cli/tui/keys.ts +26 -0
  120. package/src/cli/tui/launch.test.ts +18 -0
  121. package/src/cli/tui/launch.ts +57 -0
  122. package/src/cli/tui/panels/Dashboard.tsx +201 -0
  123. package/src/cli/tui/panels/Database.tsx +198 -0
  124. package/src/cli/tui/panels/Dev.tsx +257 -0
  125. package/src/cli/tui/panels/Docker.tsx +357 -0
  126. package/src/cli/tui/panels/Navigator.test.ts +22 -0
  127. package/src/cli/tui/panels/Navigator.tsx +213 -0
  128. package/src/cli/tui/slash-catalog.test.ts +31 -0
  129. package/src/cli/tui/slash-catalog.ts +184 -0
  130. package/src/cli/tui/slash-run.ts +54 -0
  131. package/src/cli/tui/state/ports.ts +95 -0
  132. package/src/cli/tui/theme.ts +24 -0
  133. package/src/cli/vault-cmd.test.ts +402 -0
  134. package/src/cli/vault-cmd.ts +727 -69
  135. package/src/cli/vault-secure-input.test.ts +56 -0
  136. package/src/cli/vault-secure-input.ts +124 -0
  137. package/src/compiler/effects-infer.ts +7 -0
  138. package/src/compiler/extract.ts +12 -0
  139. package/src/compiler/fixtures/skyport/oke.config.ts +7 -5
  140. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
  141. package/src/compiler/fixtures/skyport.expected.json +1 -1
  142. package/src/compiler/generate-adopt.ts +27 -1
  143. package/src/compiler-entry.ts +7 -0
  144. package/src/config/define-config.test.ts +111 -47
  145. package/src/config/driver-defaults.test.ts +115 -0
  146. package/src/config/driver-defaults.ts +156 -0
  147. package/src/config/index.ts +246 -131
  148. package/src/config/resolve-driver.test.ts +14 -19
  149. package/src/console/server/app.ts +4 -2
  150. package/src/console/server/console.test.ts +58 -1
  151. package/src/console/server/flows.ts +22 -2
  152. package/src/console/server/index.ts +3 -0
  153. package/src/console/server/operator-db.test.ts +55 -13
  154. package/src/console/server/operator-db.ts +305 -263
  155. package/src/console/server/serve.ts +16 -7
  156. package/src/console/server/state.ts +31 -9
  157. package/src/console/server/vault.test.ts +120 -5
  158. package/src/console/server/vault.ts +208 -12
  159. package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
  160. package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
  161. package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
  162. package/src/console/ui/dist/index.html +2 -2
  163. package/src/console/ui/shell/client.ts +16 -0
  164. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
  165. package/src/console/ui/vault/VaultA11yView.tsx +33 -1
  166. package/src/console/ui/vault/backend.test.ts +75 -0
  167. package/src/console/ui/vault/backend.ts +117 -0
  168. package/src/console/ui/vault/fixture.ts +21 -2
  169. package/src/console/ui/vault/index.ts +11 -1
  170. package/src/console/ui/vault/types.ts +26 -0
  171. package/src/docker/compose.ts +164 -61
  172. package/src/docker/derive.ts +106 -12
  173. package/src/docker/docker.test.ts +156 -110
  174. package/src/docker/helpers.ts +98 -0
  175. package/src/docker/images-config.test.ts +163 -0
  176. package/src/docker/index.ts +30 -5
  177. package/src/docker/recipes/index.ts +0 -3
  178. package/src/docker/recipes/llama-cpp.ts +4 -4
  179. package/src/docker/recipes/pgdog.ts +9 -2
  180. package/src/docker/resources.test.ts +71 -0
  181. package/src/docker/resources.ts +176 -0
  182. package/src/docker/stack-id.test.ts +11 -4
  183. package/src/docker/stack-id.ts +42 -32
  184. package/src/docker/stack.integration.test.ts +4 -15
  185. package/src/docker/types.ts +35 -3
  186. package/src/drivers/ai-ollama.integration.test.ts +2 -2
  187. package/src/drivers/conformance.test.ts +11 -12
  188. package/src/drivers/drizzle-dialect.test.ts +0 -4
  189. package/src/drivers/drizzle-dialect.ts +7 -13
  190. package/src/drivers/index.ts +24 -7
  191. package/src/drivers/journal-postgres.test.ts +3 -1
  192. package/src/drivers/journal-postgres.ts +4 -2
  193. package/src/drivers/meilisearch.ts +1 -1
  194. package/src/drivers/pglite.ts +28 -5
  195. package/src/drivers/types.ts +9 -11
  196. package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
  197. package/src/drivers/vault-aws-secrets-manager.ts +333 -0
  198. package/src/drivers/vault-builtin.test.ts +110 -0
  199. package/src/drivers/vault-builtin.ts +184 -0
  200. package/src/drivers/vault-driver-removal.test.ts +13 -0
  201. package/src/drivers/vault-managed.test.ts +95 -0
  202. package/src/drivers/vault-managed.ts +101 -25
  203. package/src/drivers/vault-types.ts +25 -5
  204. package/src/elements/ai/runtime.ts +1 -1
  205. package/src/elements/clock/chaos.test.ts +4 -1
  206. package/src/elements/clock/durable.ts +57 -4
  207. package/src/elements/clock.test.ts +13 -14
  208. package/src/elements/gate/constants.ts +18 -0
  209. package/src/elements/gate.test.ts +1 -1
  210. package/src/elements/gate.ts +2 -2
  211. package/src/elements/store/domain-ddl.test.ts +5 -12
  212. package/src/elements/store/emit-drizzle.ts +44 -19
  213. package/src/elements/store/index-boot.test.ts +15 -116
  214. package/src/elements/store/load-plugin-tables.ts +1 -1
  215. package/src/elements/store/resource-list-docs.fixture.ts +12 -6
  216. package/src/elements/store/resource-list-docs.test.ts +64 -44
  217. package/src/elements/store/resource.test.ts +17 -10
  218. package/src/elements/store/runtime.ts +9 -12
  219. package/src/elements/store/schema-decl.test.ts +16 -32
  220. package/src/elements/store/seed.test.ts +1 -2
  221. package/src/elements/store/seed.ts +7 -8
  222. package/src/elements/store/sql-condition.test.ts +2 -2
  223. package/src/elements/store/sql-session.test.ts +8 -10
  224. package/src/elements/store/sql-session.ts +10 -2
  225. package/src/elements/store.test.ts +13 -13
  226. package/src/elements/vault/audit.ts +233 -0
  227. package/src/elements/vault/boot-chain.test.ts +78 -0
  228. package/src/elements/vault/boot-chain.ts +43 -39
  229. package/src/elements/vault/builtin-adapter.test.ts +479 -0
  230. package/src/elements/vault/builtin-adapter.ts +1184 -0
  231. package/src/elements/vault/crypto.test.ts +237 -0
  232. package/src/elements/vault/crypto.ts +431 -0
  233. package/src/elements/vault/declare.ts +164 -3
  234. package/src/elements/vault/errors.ts +56 -0
  235. package/src/elements/vault/kms-unseal.test.ts +76 -0
  236. package/src/elements/vault/kms-unseal.ts +181 -0
  237. package/src/elements/vault/path.ts +90 -0
  238. package/src/elements/vault/resilience.test.ts +102 -0
  239. package/src/elements/vault/resilience.ts +107 -0
  240. package/src/elements/vault/runtime.ts +36 -4
  241. package/src/elements/vault/security-checklist.test.ts +130 -0
  242. package/src/elements/vault/storage.ts +448 -0
  243. package/src/elements/vault/types.ts +288 -0
  244. package/src/elements/vault/unseal.ts +150 -0
  245. package/src/elements/vault.test.ts +72 -4
  246. package/src/elements/vault.ts +91 -2
  247. package/src/full.ts +248 -0
  248. package/src/http.ts +41 -0
  249. package/src/i18n/interpolate-simple.ts +37 -0
  250. package/src/i18n/messages.ts +51 -4
  251. package/src/i18n-entry.ts +7 -0
  252. package/src/index.ts +35 -145
  253. package/src/journal-entry.ts +20 -0
  254. package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
  255. package/src/kernel/app.ts +40 -42
  256. package/src/kernel/auto-registry.test.ts +2 -2
  257. package/src/kernel/boot-bind/ai.test.ts +5 -5
  258. package/src/kernel/boot-bind/ai.ts +2 -1
  259. package/src/kernel/boot-bind/channel.test.ts +6 -6
  260. package/src/kernel/boot-bind/channel.ts +5 -4
  261. package/src/kernel/boot-bind/clock.ts +5 -5
  262. package/src/kernel/boot-bind/gate.ts +6 -7
  263. package/src/kernel/boot-bind/honor-config.test.ts +42 -42
  264. package/src/kernel/boot-bind/journal.ts +5 -5
  265. package/src/kernel/boot-bind/signal.ts +3 -1
  266. package/src/kernel/boot-bind/store.test.ts +55 -37
  267. package/src/kernel/boot-bind/store.ts +24 -34
  268. package/src/kernel/boot-bind/vault.ts +19 -4
  269. package/src/kernel/boot.test.ts +12 -4
  270. package/src/kernel/boot.ts +31 -19
  271. package/src/kernel/budget-entry.ts +1 -1
  272. package/src/kernel/compensate.test.ts +288 -1
  273. package/src/kernel/compensate.ts +126 -0
  274. package/src/kernel/concurrency.test.ts +10 -9
  275. package/src/kernel/effects-stamping.test.ts +27 -2
  276. package/src/kernel/element-registries.ts +5 -3
  277. package/src/kernel/flow.ts +4 -2
  278. package/src/kernel/fx.test.ts +119 -3
  279. package/src/kernel/fx.ts +215 -40
  280. package/src/kernel/index.ts +14 -0
  281. package/src/kernel/journal.ts +130 -7
  282. package/src/kernel/pipeline.test.ts +20 -6
  283. package/src/kernel/redacted.test.ts +35 -0
  284. package/src/kernel/redacted.ts +24 -2
  285. package/src/kernel/router/create-default.ts +16 -0
  286. package/src/kernel/router/create-edge.ts +18 -0
  287. package/src/kernel/router/create.ts +23 -0
  288. package/src/kernel/router/index.ts +23 -0
  289. package/src/kernel/router/linear.ts +88 -0
  290. package/src/kernel/router/regexp.ts +188 -0
  291. package/src/kernel/router/smart.ts +120 -0
  292. package/src/kernel/router/trie.ts +108 -0
  293. package/src/kernel/router/types.ts +56 -0
  294. package/src/kernel/router.ts +18 -532
  295. package/src/kernel-entry.ts +43 -0
  296. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  297. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  298. package/src/plugins/config-source.test.ts +7 -7
  299. package/src/release/build-lib.ts +58 -0
  300. package/src/release/exports.test.ts +4 -2
  301. package/src/release/exports.ts +30 -4
  302. package/src/release/measure.ts +101 -22
  303. package/src/runs/duckdb.ts +7 -2
  304. package/src/shared/optional-peer.ts +41 -0
  305. package/src/term.test.ts +3 -44
  306. package/src/test/create-test-app.ts +12 -0
  307. package/src/test/provisions.integration.test.ts +1 -1
  308. package/src/test/reset-element-registries.ts +2 -0
  309. package/src/upgrade/codemods.test.ts +7 -20
  310. package/src/upgrade/codemods.ts +93 -60
  311. package/site/content/docs/console/access.mdx +0 -29
  312. package/site/content/docs/console/ai.mdx +0 -35
  313. package/site/content/docs/console/architecture.mdx +0 -35
  314. package/site/content/docs/console/channels.mdx +0 -37
  315. package/site/content/docs/console/clock.mdx +0 -51
  316. package/site/content/docs/console/flows.mdx +0 -31
  317. package/site/content/docs/console/gates.mdx +0 -73
  318. package/site/content/docs/console/index.mdx +0 -54
  319. package/site/content/docs/console/manifest-diff.mdx +0 -34
  320. package/site/content/docs/console/meta.json +0 -24
  321. package/site/content/docs/console/overview.mdx +0 -40
  322. package/site/content/docs/console/plugins.mdx +0 -41
  323. package/site/content/docs/console/privacy.mdx +0 -32
  324. package/site/content/docs/console/runs.mdx +0 -50
  325. package/site/content/docs/console/signals.mdx +0 -40
  326. package/site/content/docs/console/store.mdx +0 -32
  327. package/site/content/docs/console/tenancy.mdx +0 -32
  328. package/site/content/docs/console/traces.mdx +0 -38
  329. package/site/content/docs/console/vault.mdx +0 -41
  330. package/site/content/docs/recipes/openbao.mdx +0 -141
  331. package/src/cli/ask-dev-mode.ts +0 -40
  332. package/src/cli/dev-mode.test.ts +0 -45
  333. package/src/cli/dev-mode.ts +0 -78
  334. package/src/cli/openbao-bootstrap.test.ts +0 -150
  335. package/src/cli/openbao-bootstrap.ts +0 -321
  336. package/src/cli/openbao-restart.integration.test.ts +0 -145
  337. package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
  338. package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
  339. package/src/docker/recipes/openbao.ts +0 -47
  340. package/src/drivers/libsql.ts +0 -179
  341. package/src/drivers/sqlite.ts +0 -44
  342. package/src/drivers/vault-openbao.test.ts +0 -97
  343. package/src/drivers/vault-openbao.ts +0 -143
@@ -1,41 +1,36 @@
1
1
  /**
2
- * Driver map resolution — including `docker` → prod fallback.
2
+ * Driver map resolution — including `dev` → prod fallback.
3
3
  */
4
4
 
5
5
  import { describe, expect, test } from "bun:test";
6
6
  import { resolveDomainDdlMode, resolveDriverId } from "./index.ts";
7
7
 
8
8
  describe("resolveDomainDdlMode", () => {
9
- test("test keeps ensure; docker/prod always off", () => {
9
+ test("test keeps ensure; prod always off", () => {
10
10
  expect(resolveDomainDdlMode("test", true)).toBe("ensure");
11
- expect(resolveDomainDdlMode("docker", true)).toBe("off");
12
11
  expect(resolveDomainDdlMode("prod", true)).toBe("off");
13
12
  });
14
13
 
15
- test("local follows autoPush", () => {
16
- expect(resolveDomainDdlMode("local", true)).toBe("off");
17
- expect(resolveDomainDdlMode("local", false)).toBe("ensure");
14
+ test("dev follows autoPush", () => {
15
+ expect(resolveDomainDdlMode("dev", true)).toBe("off");
16
+ expect(resolveDomainDdlMode("dev", false)).toBe("ensure");
18
17
  });
19
18
  });
20
19
 
21
20
  describe("resolveDriverId", () => {
22
21
  test("reads the named env key", () => {
23
- expect(resolveDriverId({ local: "sqlite", prod: "postgres" }, "local")).toBe("sqlite");
24
- expect(resolveDriverId({ local: "sqlite", prod: "postgres" }, "prod")).toBe("postgres");
22
+ expect(resolveDriverId({ dev: "postgres", prod: "postgres" }, "dev")).toBe("postgres");
23
+ expect(resolveDriverId({ dev: "postgres", prod: "postgres" }, "prod")).toBe("postgres");
25
24
  });
26
25
 
27
- test("docker prefers docker, then prod, then local", () => {
28
- expect(
29
- resolveDriverId({ local: "sqlite", docker: "postgres", prod: "postgres" }, "docker"),
30
- ).toBe("postgres");
31
- expect(resolveDriverId({ local: "sqlite", prod: "postgres" }, "docker")).toBe("postgres");
32
- expect(resolveDriverId({ local: "sqlite" }, "docker")).toBe("sqlite");
26
+ test("without defaults, cascade is env → dev → prod test", () => {
27
+ expect(resolveDriverId({ prod: "postgres" }, "dev")).toBe("postgres");
28
+ expect(resolveDriverId({ test: "pglite" }, "dev")).toBe("pglite");
33
29
  });
34
30
 
35
- test("legacy keys resolve after normalize", () => {
36
- expect(resolveDriverId({ dev: "sqlite", stack: "postgres" } as never, "local")).toBe("sqlite");
37
- expect(resolveDriverId({ dev: "sqlite", stack: "postgres" } as never, "docker")).toBe(
38
- "postgres",
39
- );
31
+ test("bare string expands to all envs", () => {
32
+ expect(resolveDriverId("redis", "dev")).toBe("redis");
33
+ expect(resolveDriverId("redis", "test")).toBe("redis");
34
+ expect(resolveDriverId("redis", "prod")).toBe("redis");
40
35
  });
41
36
  });
@@ -21,7 +21,7 @@ import { createManifestChannelRuntime } from "./channels.ts";
21
21
  import { createManifestClockRuntime } from "./clock.ts";
22
22
  import { createManifestStoreRuntime } from "./store.ts";
23
23
  import { VaultBootError } from "../../elements/vault.ts";
24
- import { createManifestVaultRuntime } from "./vault.ts";
24
+ import { createManifestVaultRuntime, resolveVaultDriverId } from "./vault.ts";
25
25
  import { printClaimCodeOnce } from "./claim.ts";
26
26
 
27
27
  /** Options for {@link createConsoleApp}. */
@@ -248,12 +248,14 @@ export async function bindManifestVaultRuntime(state: ConsoleState): Promise<voi
248
248
  if (!state.manifest?.vault || Object.keys(state.manifest.vault).length === 0) {
249
249
  return;
250
250
  }
251
+ const env = state.production ? "prod" : "dev";
251
252
  try {
252
253
  state.vaultRuntime = await createManifestVaultRuntime(state.manifest, {
253
254
  cwd: state.cwd,
254
- env: state.production ? "prod" : "local",
255
+ env,
255
256
  allowDevFallbacks: !state.production,
256
257
  now: state.now,
258
+ driverId: resolveVaultDriverId(state.okeConfig, env),
257
259
  });
258
260
  } catch (err) {
259
261
  // Gaps are a doctor concern — Console still lists contracts from Manifest.
@@ -14,6 +14,7 @@ import { join } from "node:path";
14
14
  import { issueSession } from "../../auth/index.ts";
15
15
  import { createClient } from "../../client/index.ts";
16
16
  import { CONSOLE_CSP, PLUGIN_IFRAME_SANDBOX } from "./security-headers.ts";
17
+ import { createConsoleApp } from "./app.ts";
17
18
  import { serveConsole, type ConsoleServerHandle } from "./serve.ts";
18
19
  import { startConsoleApp } from "./serve.ts";
19
20
 
@@ -321,7 +322,7 @@ describe("console serve security", () => {
321
322
  cwd,
322
323
  secret: "serve-secret",
323
324
  silentClaim: true,
324
- env: "dev",
325
+ env: "test",
325
326
  });
326
327
  });
327
328
 
@@ -379,3 +380,59 @@ describe("console serve security", () => {
379
380
  expect(PLUGIN_IFRAME_SANDBOX).toContain("allow-scripts");
380
381
  });
381
382
  });
383
+
384
+ describe("console boot under oke dev compose env", () => {
385
+ /**
386
+ * Isolate from compose URLs — this suite proves capability minting, not
387
+ * driver wiring. `serveConsole` passes the same `docker: false` flag.
388
+ */
389
+ const isolatedDevConfig = {
390
+ drivers: {
391
+ store: {
392
+ sql: { dev: "memory" },
393
+ kv: { dev: "memory" },
394
+ files: { dev: "memory" },
395
+ index: { dev: "memory" },
396
+ },
397
+ signal: { dev: "memory" },
398
+ clock: { dev: "frozen" },
399
+ journal: { dev: "memory" },
400
+ vault: { dev: "memory" },
401
+ channel: { email: { dev: "console" } },
402
+ ai: { dev: "mock" },
403
+ },
404
+ } as const;
405
+
406
+ test("docker:true + env:dev hard-fails OKE1008 on undeclared console flows", async () => {
407
+ const cwd = await mkdtemp(join(tmpdir(), "oke-console-docker-strict-"));
408
+ const handle = createConsoleApp({
409
+ cwd,
410
+ secret: "compose-dev-secret",
411
+ silentClaim: true,
412
+ });
413
+ await expect(
414
+ handle.app.boot({ env: "dev", docker: true, config: isolatedDevConfig }),
415
+ ).rejects.toThrow(/OKE1008/);
416
+ });
417
+
418
+ test("docker:false + env:dev boots even when OKE_DOCKER=1 (serveConsole contract)", async () => {
419
+ const prev = process.env.OKE_DOCKER;
420
+ process.env.OKE_DOCKER = "1";
421
+ const cwd = await mkdtemp(join(tmpdir(), "oke-console-docker-open-"));
422
+ const handle = createConsoleApp({
423
+ cwd,
424
+ secret: "compose-dev-secret",
425
+ silentClaim: true,
426
+ });
427
+ try {
428
+ // Same flags `serveConsole` now passes — must not inherit OKE_DOCKER=1.
429
+ await handle.app.boot({ env: "dev", docker: false, config: isolatedDevConfig });
430
+ const res = await handle.app.fetch(new Request("http://console.test/console/setup/status"));
431
+ expect(res.status).toBe(200);
432
+ } finally {
433
+ await handle.app.stop();
434
+ if (prev === undefined) delete process.env.OKE_DOCKER;
435
+ else process.env.OKE_DOCKER = prev;
436
+ }
437
+ });
438
+ });
@@ -596,9 +596,29 @@ const VaultRowOut = z.object({
596
596
  sharedFingerprintEnvs: z.array(z.string()),
597
597
  });
598
598
 
599
+ const VaultBuiltinStatusOut = z.object({
600
+ initialized: z.boolean(),
601
+ sealed: z.boolean(),
602
+ masterKeyPresent: z.boolean(),
603
+ kekVersion: z.number(),
604
+ secretCount: z.number(),
605
+ sealCount: z.number(),
606
+ lastSealedAt: z.number().nullable(),
607
+ lastUnsealedAt: z.number().nullable(),
608
+ rewrapTargetKekVersion: z.number().nullable(),
609
+ });
610
+
611
+ const VaultBackendOut = z.object({
612
+ driverId: z.enum(["env", "vault", "managed", "memory"]),
613
+ builtin: z.boolean(),
614
+ status: VaultBuiltinStatusOut.nullable(),
615
+ unavailable: z.string().nullable(),
616
+ });
617
+
599
618
  const VaultListOut = z.object({
600
619
  secrets: z.array(VaultRowOut),
601
620
  env: z.string(),
621
+ backend: VaultBackendOut.nullable(),
602
622
  });
603
623
 
604
624
  const VaultWriteIn = z.object({
@@ -1725,7 +1745,7 @@ function createSetupClaim(state: ConsoleState) {
1725
1745
  }
1726
1746
  throw err;
1727
1747
  }
1728
- state.persistOperator(op.id);
1748
+ await state.persistOperator(op.id);
1729
1749
  const issued = await issueOperatorSession(state, op.id);
1730
1750
  fx.log.info("console.setup.claim", { operatorId: op.id });
1731
1751
  return sessionPayload(op.id, op.email, op.name, issued);
@@ -2272,7 +2292,7 @@ async function issueOperatorSession(
2272
2292
  scopes: ["console:*"],
2273
2293
  },
2274
2294
  );
2275
- state.persistSessions();
2295
+ await state.persistSessions();
2276
2296
  return issued;
2277
2297
  }
2278
2298
 
@@ -72,9 +72,12 @@ export {
72
72
  type ClaimVerifyResult,
73
73
  } from "./claim.ts";
74
74
  export {
75
+ CONSOLE_PG_SCHEMA,
76
+ consoleTable,
75
77
  openConsolePersistence,
76
78
  resolveConsoleSecret,
77
79
  type ConsolePersistence,
80
+ type OpenConsolePersistenceOptions,
78
81
  } from "./operator-db.ts";
79
82
  export { createConsoleBindings } from "./flows.ts";
80
83
  export { PUBLIC_CONSOLE_FLOWS } from "./public-flows.ts";
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Durable Console operators + sessions under `.oke/console.sqlite`.
2
+ * Durable Console operators + sessions in Postgres schema `oke_console`
3
+ * (PGlite under `.oke/console-pg` when no DATABASE_URL).
3
4
  */
4
5
 
5
6
  import { afterEach, describe, expect, test } from "bun:test";
@@ -8,8 +9,15 @@ import { tmpdir } from "node:os";
8
9
  import { join } from "node:path";
9
10
  import { createOperator } from "../../auth/operator.ts";
10
11
  import { issueSession, verifyAccess } from "../../auth/sessions.ts";
12
+ import { AUTH_TABLES } from "../../auth/tables.ts";
13
+ import { connectPglite } from "../../drivers/pglite.ts";
11
14
  import { bootConsoleApp, createConsoleApp } from "./app.ts";
12
- import { openConsolePersistence, resolveConsoleSecret } from "./operator-db.ts";
15
+ import {
16
+ CONSOLE_PG_SCHEMA,
17
+ consoleTable,
18
+ openConsolePersistence,
19
+ resolveConsoleSecret,
20
+ } from "./operator-db.ts";
13
21
 
14
22
  describe("console operator persistence", () => {
15
23
  const dirs: string[] = [];
@@ -38,8 +46,8 @@ describe("console operator persistence", () => {
38
46
  name: "Ops",
39
47
  password: "password1234",
40
48
  });
41
- first.persistOperator(op.id);
42
- first.close();
49
+ await first.persistOperator(op.id);
50
+ await first.close();
43
51
 
44
52
  const second = await openConsolePersistence(cwd);
45
53
  expect(second.operators.operators.size).toBe(1);
@@ -65,7 +73,7 @@ describe("console operator persistence", () => {
65
73
  expect(printed.join("\n")).not.toContain("Claim code");
66
74
  } finally {
67
75
  console.log = origLog;
68
- second.close();
76
+ await second.close();
69
77
  }
70
78
  });
71
79
 
@@ -79,20 +87,20 @@ describe("console operator persistence", () => {
79
87
  name: "Ops",
80
88
  password: "password1234",
81
89
  });
82
- first.persistOperator(op.id);
90
+ await first.persistOperator(op.id);
83
91
  const issued = await issueSession(
84
92
  first.sessions,
85
93
  { secret: first.secret },
86
94
  { id: op.id, plane: "operator", scopes: ["console:*"] },
87
95
  );
88
- first.persistSessions();
89
- first.close();
96
+ await first.persistSessions();
97
+ await first.close();
90
98
 
91
99
  const second = await openConsolePersistence(cwd);
92
100
  expect(second.sessions.sessions.size).toBe(1);
93
101
  const claims = await verifyAccess(second.sessions, second.secret, issued.accessToken);
94
102
  expect(claims.sub).toBe(op.id);
95
- second.close();
103
+ await second.close();
96
104
  });
97
105
 
98
106
  test("claim then reopen keeps session.me authorized", async () => {
@@ -131,7 +139,7 @@ describe("console operator persistence", () => {
131
139
  accessToken = body.data.accessToken;
132
140
  } finally {
133
141
  await first.app.stop();
134
- firstPersist.close();
142
+ await firstPersist.close();
135
143
  }
136
144
 
137
145
  const secondPersist = await openConsolePersistence(cwd);
@@ -158,7 +166,7 @@ describe("console operator persistence", () => {
158
166
  expect(meBody.data.email).toBe("ops@example.com");
159
167
  } finally {
160
168
  await second.app.stop();
161
- secondPersist.close();
169
+ await secondPersist.close();
162
170
  }
163
171
  });
164
172
 
@@ -171,7 +179,7 @@ describe("console operator persistence", () => {
171
179
  name: "Ops",
172
180
  password: "password1234",
173
181
  });
174
- persistence.persistOperator(op.id);
182
+ await persistence.persistOperator(op.id);
175
183
 
176
184
  const handle = createConsoleApp({
177
185
  cwd,
@@ -196,7 +204,41 @@ describe("console operator persistence", () => {
196
204
  expect(body.data.setupClosed).toBe(true);
197
205
  } finally {
198
206
  await handle.app.stop();
199
- persistence.close();
207
+ await persistence.close();
200
208
  }
201
209
  });
210
+
211
+ test("tables live in oke_console schema, not public", async () => {
212
+ const cwd = await mkdtemp(join(tmpdir(), "oke-console-schema-"));
213
+ dirs.push(cwd);
214
+ const shared = await connectPglite({
215
+ url: `memory://console-schema-${crypto.randomUUID()}`,
216
+ });
217
+ const opened = await openConsolePersistence(cwd, { connection: shared });
218
+ try {
219
+ const op = await createOperator(opened.operators, {
220
+ email: "schema@example.com",
221
+ name: "Schema",
222
+ password: "password1234",
223
+ });
224
+ await opened.persistOperator(op.id);
225
+
226
+ const inConsole = await shared.query(
227
+ `SELECT email FROM ${consoleTable(AUTH_TABLES.operators)} WHERE id = ?`,
228
+ [op.id],
229
+ );
230
+ expect(inConsole[0]?.["email"]).toBe("schema@example.com");
231
+
232
+ const schemas = await shared.query(
233
+ `SELECT table_schema
234
+ FROM information_schema.tables
235
+ WHERE table_name = ?`,
236
+ [AUTH_TABLES.operators],
237
+ );
238
+ expect(schemas.map((r) => r["table_schema"])).toEqual([CONSOLE_PG_SCHEMA]);
239
+ } finally {
240
+ // connection was injected — close the shared handle ourselves
241
+ await shared.close();
242
+ }
243
+ }, 15_000);
202
244
  });