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.
- package/package.json +76 -10
- package/site/content/docs/ai/mcp.mdx +0 -1
- package/site/content/docs/deployment/docker-swarm.mdx +48 -111
- package/site/content/docs/deployment/docker.mdx +43 -36
- package/site/content/docs/deployment/index.mdx +9 -9
- package/site/content/docs/deployment/kubernetes.mdx +4 -4
- package/site/content/docs/elements/ai.mdx +7 -13
- package/site/content/docs/elements/channel.mdx +9 -13
- package/site/content/docs/elements/clock.mdx +8 -14
- package/site/content/docs/elements/flow.mdx +46 -54
- package/site/content/docs/elements/gate.mdx +6 -11
- package/site/content/docs/elements/signal.mdx +2 -8
- package/site/content/docs/elements/store.mdx +79 -93
- package/site/content/docs/elements/vault.mdx +89 -76
- package/site/content/docs/get-started/basic-usage.mdx +8 -14
- package/site/content/docs/get-started/installation.mdx +36 -36
- package/site/content/docs/get-started/introduction.mdx +11 -0
- package/site/content/docs/get-started/why.mdx +3 -4
- package/site/content/docs/index.mdx +0 -1
- package/site/content/docs/meta.json +0 -1
- package/site/content/docs/plugins/anonymous.mdx +1 -1
- package/site/content/docs/plugins/magic-link.mdx +11 -11
- package/site/content/docs/plugins/otp.mdx +2 -2
- package/site/content/docs/plugins/passkey.mdx +1 -1
- package/site/content/docs/plugins/two-factor.mdx +1 -1
- package/site/content/docs/plugins/username.mdx +1 -1
- package/site/content/docs/recipes/caddy.mdx +1 -1
- package/site/content/docs/recipes/cockroachdb.mdx +2 -2
- package/site/content/docs/recipes/dragonfly.mdx +1 -1
- package/site/content/docs/recipes/index.mdx +1 -2
- package/site/content/docs/recipes/llama-cpp.mdx +21 -23
- package/site/content/docs/recipes/mailpit.mdx +11 -11
- package/site/content/docs/recipes/meilisearch.mdx +10 -10
- package/site/content/docs/recipes/meta.json +0 -1
- package/site/content/docs/recipes/ollama.mdx +1 -1
- package/site/content/docs/recipes/pgdog.mdx +12 -9
- package/site/content/docs/recipes/postgres.mdx +3 -3
- package/site/content/docs/recipes/redis.mdx +2 -2
- package/site/content/docs/recipes/rustfs.mdx +10 -7
- package/site/content/docs/recipes/sglang.mdx +1 -1
- package/site/content/docs/recipes/supabase-docker.mdx +1 -1
- package/site/content/docs/recipes/timescale.mdx +2 -2
- package/site/content/docs/recipes/valkey.mdx +1 -1
- package/site/content/docs/recipes/vllm.mdx +1 -1
- package/site/content/docs/recipes/yugabytedb.mdx +2 -2
- package/site/content/docs/reference/cli.md +61 -38
- package/site/content/docs/reference/configuration.mdx +145 -70
- package/site/content/docs/reference/environment-variables.mdx +36 -28
- package/site/content/docs/reference/errors.mdx +28 -29
- package/site/content/docs/reference/fx.mdx +14 -7
- package/site/content/docs/reference/i18n.mdx +17 -6
- package/site/content/docs/reference/index.mdx +5 -0
- package/site/content/docs/reference/meta.json +1 -0
- package/site/content/docs/reference/migrating-environments.mdx +158 -0
- package/site/content/docs/reference/plugins.mdx +2 -2
- package/src/auth/gate-auth.test.ts +12 -10
- package/src/cli/ai-setup/ai-setup.test.ts +30 -16
- package/src/cli/ai-setup/apply.ts +111 -15
- package/src/cli/ai-setup/catalog.ts +3 -3
- package/src/cli/ai-setup/index.ts +1 -1
- package/src/cli/ai-setup/prompts.ts +1 -1
- package/src/cli/ai-setup/recommend.test.ts +1 -1
- package/src/cli/ask-seed.test.ts +3 -3
- package/src/cli/build.ts +8 -9
- package/src/cli/db-auto-push.test.ts +6 -3
- package/src/cli/db-auto-push.ts +7 -5
- package/src/cli/db-seed.ts +7 -8
- package/src/cli/db.test.ts +70 -71
- package/src/cli/db.ts +86 -12
- package/src/cli/dev-controller.test.ts +35 -0
- package/src/cli/dev-controller.ts +298 -0
- package/src/cli/dev-controls.ts +11 -65
- package/src/cli/dev-db-push.test.ts +47 -15
- package/src/cli/dev-schema-sync.test.ts +11 -11
- package/src/cli/dev-schema-sync.ts +10 -10
- package/src/cli/dev-session-lock.test.ts +106 -0
- package/src/cli/dev-session-lock.ts +209 -0
- package/src/cli/dev.test.ts +246 -114
- package/src/cli/dev.ts +153 -205
- package/src/cli/doc-staleness.test.ts +3 -6
- package/src/cli/docker-clean.test.ts +33 -1
- package/src/cli/docker-clean.ts +28 -33
- package/src/cli/docker-cli.test.ts +12 -11
- package/src/cli/docker.ts +95 -20
- package/src/cli/doctor.test.ts +40 -0
- package/src/cli/doctor.ts +142 -9
- package/src/cli/drizzle-env.test.ts +11 -13
- package/src/cli/drizzle-env.ts +18 -11
- package/src/cli/ensure-drizzle-config.ts +11 -14
- package/src/cli/hero-meta.test.ts +15 -15
- package/src/cli/hero-meta.ts +10 -9
- package/src/cli/index.ts +36 -6
- package/src/cli/load-config.images.test.ts +44 -10
- package/src/cli/load-config.source.test.ts +50 -0
- package/src/cli/load-config.ts +35 -29
- package/src/cli/meilisearch-local.ts +1 -2
- package/src/cli/mode.ts +7 -58
- package/src/cli/registry.ts +175 -19
- package/src/cli/resolve-dev-sql-env.test.ts +8 -16
- package/src/cli/resolve-dev-sql-env.ts +13 -15
- package/src/cli/safe-defaults.test.ts +29 -11
- package/src/cli/schema.ts +65 -16
- package/src/cli/test.ts +58 -0
- package/src/cli/tui/App.tsx +252 -0
- package/src/cli/tui/DevLive.tsx +116 -0
- package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
- package/src/cli/tui/components/HeaderBar.tsx +67 -0
- package/src/cli/tui/components/LogStream.tsx +47 -0
- package/src/cli/tui/components/PanelCard.tsx +39 -0
- package/src/cli/tui/components/SelectRow.tsx +37 -0
- package/src/cli/tui/components/SlashPalette.tsx +172 -0
- package/src/cli/tui/components/Spinner.tsx +32 -0
- package/src/cli/tui/components/StatusBar.tsx +51 -0
- package/src/cli/tui/components/StatusDot.tsx +37 -0
- package/src/cli/tui/components/TabBar.tsx +49 -0
- package/src/cli/tui/components/Wordmark.tsx +43 -0
- package/src/cli/tui/format.ts +38 -0
- package/src/cli/tui/keys.test.ts +18 -0
- package/src/cli/tui/keys.ts +26 -0
- package/src/cli/tui/launch.test.ts +18 -0
- package/src/cli/tui/launch.ts +57 -0
- package/src/cli/tui/panels/Dashboard.tsx +201 -0
- package/src/cli/tui/panels/Database.tsx +198 -0
- package/src/cli/tui/panels/Dev.tsx +257 -0
- package/src/cli/tui/panels/Docker.tsx +357 -0
- package/src/cli/tui/panels/Navigator.test.ts +22 -0
- package/src/cli/tui/panels/Navigator.tsx +213 -0
- package/src/cli/tui/slash-catalog.test.ts +31 -0
- package/src/cli/tui/slash-catalog.ts +184 -0
- package/src/cli/tui/slash-run.ts +54 -0
- package/src/cli/tui/state/ports.ts +95 -0
- package/src/cli/tui/theme.ts +24 -0
- package/src/cli/vault-cmd.test.ts +402 -0
- package/src/cli/vault-cmd.ts +727 -69
- package/src/cli/vault-secure-input.test.ts +56 -0
- package/src/cli/vault-secure-input.ts +124 -0
- package/src/compiler/effects-infer.ts +7 -0
- package/src/compiler/extract.ts +12 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +7 -5
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
- package/src/compiler/fixtures/skyport.expected.json +1 -1
- package/src/compiler/generate-adopt.ts +27 -1
- package/src/compiler-entry.ts +7 -0
- package/src/config/define-config.test.ts +111 -47
- package/src/config/driver-defaults.test.ts +115 -0
- package/src/config/driver-defaults.ts +156 -0
- package/src/config/index.ts +246 -131
- package/src/config/resolve-driver.test.ts +14 -19
- package/src/console/server/app.ts +4 -2
- package/src/console/server/console.test.ts +58 -1
- package/src/console/server/flows.ts +22 -2
- package/src/console/server/index.ts +3 -0
- package/src/console/server/operator-db.test.ts +55 -13
- package/src/console/server/operator-db.ts +305 -263
- package/src/console/server/serve.ts +16 -7
- package/src/console/server/state.ts +31 -9
- package/src/console/server/vault.test.ts +120 -5
- package/src/console/server/vault.ts +208 -12
- package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
- package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
- package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
- package/src/console/ui/dist/index.html +2 -2
- package/src/console/ui/shell/client.ts +16 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
- package/src/console/ui/vault/VaultA11yView.tsx +33 -1
- package/src/console/ui/vault/backend.test.ts +75 -0
- package/src/console/ui/vault/backend.ts +117 -0
- package/src/console/ui/vault/fixture.ts +21 -2
- package/src/console/ui/vault/index.ts +11 -1
- package/src/console/ui/vault/types.ts +26 -0
- package/src/docker/compose.ts +164 -61
- package/src/docker/derive.ts +106 -12
- package/src/docker/docker.test.ts +156 -110
- package/src/docker/helpers.ts +98 -0
- package/src/docker/images-config.test.ts +163 -0
- package/src/docker/index.ts +30 -5
- package/src/docker/recipes/index.ts +0 -3
- package/src/docker/recipes/llama-cpp.ts +4 -4
- package/src/docker/recipes/pgdog.ts +9 -2
- package/src/docker/resources.test.ts +71 -0
- package/src/docker/resources.ts +176 -0
- package/src/docker/stack-id.test.ts +11 -4
- package/src/docker/stack-id.ts +42 -32
- package/src/docker/stack.integration.test.ts +4 -15
- package/src/docker/types.ts +35 -3
- package/src/drivers/ai-ollama.integration.test.ts +2 -2
- package/src/drivers/conformance.test.ts +11 -12
- package/src/drivers/drizzle-dialect.test.ts +0 -4
- package/src/drivers/drizzle-dialect.ts +7 -13
- package/src/drivers/index.ts +24 -7
- package/src/drivers/journal-postgres.test.ts +3 -1
- package/src/drivers/journal-postgres.ts +4 -2
- package/src/drivers/meilisearch.ts +1 -1
- package/src/drivers/pglite.ts +28 -5
- package/src/drivers/types.ts +9 -11
- package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
- package/src/drivers/vault-aws-secrets-manager.ts +333 -0
- package/src/drivers/vault-builtin.test.ts +110 -0
- package/src/drivers/vault-builtin.ts +184 -0
- package/src/drivers/vault-driver-removal.test.ts +13 -0
- package/src/drivers/vault-managed.test.ts +95 -0
- package/src/drivers/vault-managed.ts +101 -25
- package/src/drivers/vault-types.ts +25 -5
- package/src/elements/ai/runtime.ts +1 -1
- package/src/elements/clock/chaos.test.ts +4 -1
- package/src/elements/clock/durable.ts +57 -4
- package/src/elements/clock.test.ts +13 -14
- package/src/elements/gate/constants.ts +18 -0
- package/src/elements/gate.test.ts +1 -1
- package/src/elements/gate.ts +2 -2
- package/src/elements/store/domain-ddl.test.ts +5 -12
- package/src/elements/store/emit-drizzle.ts +44 -19
- package/src/elements/store/index-boot.test.ts +15 -116
- package/src/elements/store/load-plugin-tables.ts +1 -1
- package/src/elements/store/resource-list-docs.fixture.ts +12 -6
- package/src/elements/store/resource-list-docs.test.ts +64 -44
- package/src/elements/store/resource.test.ts +17 -10
- package/src/elements/store/runtime.ts +9 -12
- package/src/elements/store/schema-decl.test.ts +16 -32
- package/src/elements/store/seed.test.ts +1 -2
- package/src/elements/store/seed.ts +7 -8
- package/src/elements/store/sql-condition.test.ts +2 -2
- package/src/elements/store/sql-session.test.ts +8 -10
- package/src/elements/store/sql-session.ts +10 -2
- package/src/elements/store.test.ts +13 -13
- package/src/elements/vault/audit.ts +233 -0
- package/src/elements/vault/boot-chain.test.ts +78 -0
- package/src/elements/vault/boot-chain.ts +43 -39
- package/src/elements/vault/builtin-adapter.test.ts +479 -0
- package/src/elements/vault/builtin-adapter.ts +1184 -0
- package/src/elements/vault/crypto.test.ts +237 -0
- package/src/elements/vault/crypto.ts +431 -0
- package/src/elements/vault/declare.ts +164 -3
- package/src/elements/vault/errors.ts +56 -0
- package/src/elements/vault/kms-unseal.test.ts +76 -0
- package/src/elements/vault/kms-unseal.ts +181 -0
- package/src/elements/vault/path.ts +90 -0
- package/src/elements/vault/resilience.test.ts +102 -0
- package/src/elements/vault/resilience.ts +107 -0
- package/src/elements/vault/runtime.ts +36 -4
- package/src/elements/vault/security-checklist.test.ts +130 -0
- package/src/elements/vault/storage.ts +448 -0
- package/src/elements/vault/types.ts +288 -0
- package/src/elements/vault/unseal.ts +150 -0
- package/src/elements/vault.test.ts +72 -4
- package/src/elements/vault.ts +91 -2
- package/src/full.ts +248 -0
- package/src/http.ts +41 -0
- package/src/i18n/interpolate-simple.ts +37 -0
- package/src/i18n/messages.ts +51 -4
- package/src/i18n-entry.ts +7 -0
- package/src/index.ts +35 -145
- package/src/journal-entry.ts +20 -0
- package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
- package/src/kernel/app.ts +40 -42
- package/src/kernel/auto-registry.test.ts +2 -2
- package/src/kernel/boot-bind/ai.test.ts +5 -5
- package/src/kernel/boot-bind/ai.ts +2 -1
- package/src/kernel/boot-bind/channel.test.ts +6 -6
- package/src/kernel/boot-bind/channel.ts +5 -4
- package/src/kernel/boot-bind/clock.ts +5 -5
- package/src/kernel/boot-bind/gate.ts +6 -7
- package/src/kernel/boot-bind/honor-config.test.ts +42 -42
- package/src/kernel/boot-bind/journal.ts +5 -5
- package/src/kernel/boot-bind/signal.ts +3 -1
- package/src/kernel/boot-bind/store.test.ts +55 -37
- package/src/kernel/boot-bind/store.ts +24 -34
- package/src/kernel/boot-bind/vault.ts +19 -4
- package/src/kernel/boot.test.ts +12 -4
- package/src/kernel/boot.ts +31 -19
- package/src/kernel/budget-entry.ts +1 -1
- package/src/kernel/compensate.test.ts +288 -1
- package/src/kernel/compensate.ts +126 -0
- package/src/kernel/concurrency.test.ts +10 -9
- package/src/kernel/effects-stamping.test.ts +27 -2
- package/src/kernel/element-registries.ts +5 -3
- package/src/kernel/flow.ts +4 -2
- package/src/kernel/fx.test.ts +119 -3
- package/src/kernel/fx.ts +215 -40
- package/src/kernel/index.ts +14 -0
- package/src/kernel/journal.ts +130 -7
- package/src/kernel/pipeline.test.ts +20 -6
- package/src/kernel/redacted.test.ts +35 -0
- package/src/kernel/redacted.ts +24 -2
- package/src/kernel/router/create-default.ts +16 -0
- package/src/kernel/router/create-edge.ts +18 -0
- package/src/kernel/router/create.ts +23 -0
- package/src/kernel/router/index.ts +23 -0
- package/src/kernel/router/linear.ts +88 -0
- package/src/kernel/router/regexp.ts +188 -0
- package/src/kernel/router/smart.ts +120 -0
- package/src/kernel/router/trie.ts +108 -0
- package/src/kernel/router/types.ts +56 -0
- package/src/kernel/router.ts +18 -532
- package/src/kernel-entry.ts +43 -0
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/plugins/config-source.test.ts +7 -7
- package/src/release/build-lib.ts +58 -0
- package/src/release/exports.test.ts +4 -2
- package/src/release/exports.ts +30 -4
- package/src/release/measure.ts +101 -22
- package/src/runs/duckdb.ts +7 -2
- package/src/shared/optional-peer.ts +41 -0
- package/src/term.test.ts +3 -44
- package/src/test/create-test-app.ts +12 -0
- package/src/test/provisions.integration.test.ts +1 -1
- package/src/test/reset-element-registries.ts +2 -0
- package/src/upgrade/codemods.test.ts +7 -20
- package/src/upgrade/codemods.ts +93 -60
- package/site/content/docs/console/access.mdx +0 -29
- package/site/content/docs/console/ai.mdx +0 -35
- package/site/content/docs/console/architecture.mdx +0 -35
- package/site/content/docs/console/channels.mdx +0 -37
- package/site/content/docs/console/clock.mdx +0 -51
- package/site/content/docs/console/flows.mdx +0 -31
- package/site/content/docs/console/gates.mdx +0 -73
- package/site/content/docs/console/index.mdx +0 -54
- package/site/content/docs/console/manifest-diff.mdx +0 -34
- package/site/content/docs/console/meta.json +0 -24
- package/site/content/docs/console/overview.mdx +0 -40
- package/site/content/docs/console/plugins.mdx +0 -41
- package/site/content/docs/console/privacy.mdx +0 -32
- package/site/content/docs/console/runs.mdx +0 -50
- package/site/content/docs/console/signals.mdx +0 -40
- package/site/content/docs/console/store.mdx +0 -32
- package/site/content/docs/console/tenancy.mdx +0 -32
- package/site/content/docs/console/traces.mdx +0 -38
- package/site/content/docs/console/vault.mdx +0 -41
- package/site/content/docs/recipes/openbao.mdx +0 -141
- package/src/cli/ask-dev-mode.ts +0 -40
- package/src/cli/dev-mode.test.ts +0 -45
- package/src/cli/dev-mode.ts +0 -78
- package/src/cli/openbao-bootstrap.test.ts +0 -150
- package/src/cli/openbao-bootstrap.ts +0 -321
- package/src/cli/openbao-restart.integration.test.ts +0 -145
- package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
- package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
- package/src/docker/recipes/openbao.ts +0 -47
- package/src/drivers/libsql.ts +0 -179
- package/src/drivers/sqlite.ts +0 -44
- package/src/drivers/vault-openbao.test.ts +0 -97
- package/src/drivers/vault-openbao.ts +0 -143
|
@@ -186,7 +186,7 @@ await fx.store(db).delete(notes).where(lt(notes.createdAt, cutoff));
|
|
|
186
186
|
|
|
187
187
|
### Schema — declare once, generate per dialect
|
|
188
188
|
|
|
189
|
-
The recommended path: declare tables ORM-agnostically, then let `oke db` emit real Drizzle
|
|
189
|
+
The recommended path: declare tables ORM-agnostically, then let `oke db` emit real Drizzle (`pgTable` for Postgres / PGLite) into `src/db/schema.drizzle.ts`.
|
|
190
190
|
|
|
191
191
|
| Field API | Meaning |
|
|
192
192
|
| -------------------------------------------- | ----------------------------------------------- |
|
|
@@ -232,28 +232,28 @@ export const relations = store.schema.relations({ links, daily }, (r) => ({
|
|
|
232
232
|
| `oke db generate` | Write versioned SQL under `drizzle/` for review |
|
|
233
233
|
| `oke db migrate` | Apply those files — human or CI, **never** at boot |
|
|
234
234
|
|
|
235
|
-
`oke dev`
|
|
235
|
+
`oke dev` auto-pushes when you save a schema _input_ (`schema.decl.ts`,
|
|
236
236
|
hand-written `schema.ts`, `app.ts` for plugin tables, or `drizzle.config.ts`) —
|
|
237
|
-
not when emit rewrites `schema.
|
|
237
|
+
not when emit rewrites `schema.drizzle.ts`.
|
|
238
238
|
|
|
239
|
-
Opt out with `--no-db-push` or `db: { autoPush: false }`.
|
|
240
|
-
auto-
|
|
239
|
+
Opt out with `--no-db-push` or `db: { autoPush: false }`. `prod` **never**
|
|
240
|
+
auto-applies DDL; a missing table fails as **OKE1101** (`oke db migrate`).
|
|
241
241
|
|
|
242
242
|
#### Multiple environments
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
`dev` can `oke db push` freely — safe to wipe and regenerate.
|
|
245
245
|
|
|
246
246
|
Staging/prod accumulate versioned SQL under `drizzle/` (`oke db generate`).
|
|
247
247
|
`oke db migrate` applies only unrecorded files in order — behind DBs catch up.
|
|
248
248
|
|
|
249
249
|
| Environment | Sync |
|
|
250
250
|
| -------------- | -------------------------------------------------------------- |
|
|
251
|
-
|
|
|
251
|
+
| `dev` | `oke db push` (or auto-push from `oke dev`) |
|
|
252
252
|
| Staging / prod | `oke db generate` → review files → `oke db migrate` on that DB |
|
|
253
253
|
|
|
254
254
|
<Callout title="Connection pooling is infrastructure, not app code" type="info">
|
|
255
255
|
Bun.SQL defaults to **10** connections per process — fine per instance. Scale out and `N × pool`
|
|
256
|
-
can exceed Postgres `max_connections`.
|
|
256
|
+
can exceed Postgres `max_connections`. `dev`/`prod` put **PgDog** in front; `DATABASE_URL` → port
|
|
257
257
|
`6432`. No app code changes.
|
|
258
258
|
</Callout>
|
|
259
259
|
|
|
@@ -272,15 +272,13 @@ Seed proves existence (bootstrap rows); it does not correct schema-adjacent data
|
|
|
272
272
|
|
|
273
273
|
<StoreSeeding />
|
|
274
274
|
|
|
275
|
-
| env
|
|
276
|
-
|
|
|
277
|
-
| `
|
|
278
|
-
| `
|
|
279
|
-
| `
|
|
280
|
-
| `prod` | yes | no | yes |
|
|
275
|
+
| env | `essential` | `dev` | `prod` |
|
|
276
|
+
| ------ | ----------- | ----- | ------ |
|
|
277
|
+
| `dev` | yes | yes | no |
|
|
278
|
+
| `test` | yes | no | no |
|
|
279
|
+
| `prod` | yes | no | yes |
|
|
281
280
|
|
|
282
|
-
`
|
|
283
|
-
Outside `test`, exactly one of `dev` / `prod` runs with `essential`.
|
|
281
|
+
Outside `test`, exactly one of seed-category `dev` / `prod` runs with `essential`.
|
|
284
282
|
|
|
285
283
|
**Simple form** — everything inline:
|
|
286
284
|
|
|
@@ -367,14 +365,14 @@ await fx.store(db).upsert(
|
|
|
367
365
|
is for seed-owned rows you intentionally overwrite. Schema-wide data fixes still belong in
|
|
368
366
|
migrations, not seed.
|
|
369
367
|
|
|
370
|
-
| Env
|
|
371
|
-
|
|
|
372
|
-
| `
|
|
373
|
-
| `
|
|
368
|
+
| Env | Confirm |
|
|
369
|
+
| -------------- | ----------------------------------------------------- |
|
|
370
|
+
| `test` | none |
|
|
371
|
+
| `dev` / `prod` | print DB target; type the env name (`--force` for CI) |
|
|
374
372
|
|
|
375
373
|
```bash
|
|
376
|
-
oke db seed # resolve env like other oke db commands
|
|
377
|
-
oke db seed --env
|
|
374
|
+
oke db seed # resolve env like other oke db commands
|
|
375
|
+
oke db seed --env dev # explicit override
|
|
378
376
|
oke db seed --env prod --force
|
|
379
377
|
```
|
|
380
378
|
|
|
@@ -394,27 +392,25 @@ oke db seed --env prod --force
|
|
|
394
392
|
|
|
395
393
|
Same flow code, different backends — configured once in `oke.config.ts`:
|
|
396
394
|
|
|
397
|
-
| Facet |
|
|
398
|
-
| ----- |
|
|
399
|
-
| `sql` | `
|
|
395
|
+
| Facet | `dev` / `prod` | `test` | Runs as |
|
|
396
|
+
| ----- | -------------- | -------- | --------------------------------------------- |
|
|
397
|
+
| `sql` | `postgres` | `pglite` | Compose / deploy Postgres → in-process PGLite |
|
|
400
398
|
|
|
401
|
-
Defaults: `
|
|
399
|
+
Defaults: `postgres` for `dev`/`prod`, `pglite` for `test`. SQLite-family drivers (`sqlite`, `libsql`) are removed. Container images come from the `images` map — change the vendor by changing the pin, never the driver id.
|
|
402
400
|
|
|
403
401
|
#### Opt-in SQL drivers
|
|
404
402
|
|
|
405
|
-
|
|
403
|
+
| Driver | Install | Wire dialect | Choose for |
|
|
404
|
+
| -------- | -------------------------------------------------------- | ------------ | --------------------------------------------------------- |
|
|
405
|
+
| `pglite` | `@electric-sql/pglite` + `@electric-sql/pglite-pgvector` | postgresql | **required** for `store.sql.test`; also usable in-process |
|
|
406
406
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
<Callout title="PGlite is not a latency play">
|
|
413
|
-
PGlite pays a one-time ~1 s WASM init, and warm CRUD is roughly 15× slower than `bun:sqlite`.
|
|
414
|
-
Choose it for dialect/pgvector parity with prod — never as a faster local default.
|
|
407
|
+
<Callout title="PGlite is the test SQL driver">
|
|
408
|
+
`defineConfig` requires `drivers.store.sql.test` to be `pglite` when set. Use `oke test` (sets
|
|
409
|
+
`OKE_PGLITE_URL=memory://`). Choose PGLite for Postgres correctness in tests — not as a Compose
|
|
410
|
+
substitute for `oke dev`.
|
|
415
411
|
</Callout>
|
|
416
412
|
|
|
417
|
-
SQL-backed index
|
|
413
|
+
SQL-backed index driver `pgvector` shares this facet's connection — see [Advanced — composing facets together](#advanced--composing-facets-together).
|
|
418
414
|
|
|
419
415
|
## KV
|
|
420
416
|
|
|
@@ -470,8 +466,8 @@ Optional third argument on `set` is a duration string: `(\d+)(ms|s|m|h|d)` — e
|
|
|
470
466
|
|
|
471
467
|
<StoreKvTtl />
|
|
472
468
|
|
|
473
|
-
**Consequence:** a TTL you rely on in prod does nothing under the
|
|
474
|
-
against `redis`
|
|
469
|
+
**Consequence:** a TTL you rely on in prod does nothing under the `test` `memory` driver. Exercise
|
|
470
|
+
expiry against `redis` under `oke dev` when lifetime matters.
|
|
475
471
|
|
|
476
472
|
### Examples — what follows from each choice
|
|
477
473
|
|
|
@@ -490,34 +486,33 @@ await fx.store(sessions).set(`sess:${token}`, { userId }, "7d");
|
|
|
490
486
|
const keys = await fx.store(sessions).list("sess:");
|
|
491
487
|
```
|
|
492
488
|
|
|
493
|
-
**Consequence:** `list`
|
|
494
|
-
|
|
495
|
-
readable.
|
|
489
|
+
**Consequence:** `list` enumerates a namespace. Prefer stable key prefixes (`user:`, `sess:`) so
|
|
490
|
+
your Flows and operator tools stay readable.
|
|
496
491
|
|
|
497
492
|
### Per-environment KV drivers
|
|
498
493
|
|
|
499
494
|
```typescript title="oke.config.ts"
|
|
500
495
|
drivers: {
|
|
501
496
|
store: {
|
|
502
|
-
kv: {
|
|
497
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
503
498
|
},
|
|
504
499
|
},
|
|
505
500
|
images: {
|
|
506
|
-
|
|
501
|
+
store: { kv: "redis:8-alpine" },
|
|
507
502
|
// or: "valkey/valkey:8-alpine"
|
|
508
503
|
// or: "docker.dragonflydb.io/dragonflydb/dragonfly"
|
|
509
504
|
},
|
|
510
505
|
```
|
|
511
506
|
|
|
512
|
-
| Facet |
|
|
513
|
-
| ----- |
|
|
514
|
-
| `kv` | `
|
|
507
|
+
| Facet | `dev` / `prod` | `test` | Runs as |
|
|
508
|
+
| ----- | -------------- | -------- | ---------------------- |
|
|
509
|
+
| `kv` | `redis` | `memory` | container → in-process |
|
|
515
510
|
|
|
516
511
|
| Variable | When |
|
|
517
512
|
| ------------------ | -------------------------------- |
|
|
518
513
|
| `REDIS_URL` | Required for the `redis` driver |
|
|
519
514
|
| `OKE_STORE_KV_URL` | Override if `REDIS_URL` is unset |
|
|
520
|
-
| `OKE_KV_DRIVER` | Force a driver id
|
|
515
|
+
| `OKE_KV_DRIVER` | Force a driver id |
|
|
521
516
|
|
|
522
517
|
Missing Redis URL fails boot loudly: `oke boot: redis driver needs REDIS_URL`.
|
|
523
518
|
|
|
@@ -614,32 +609,32 @@ Keys are opaque strings the driver stores as-is. Prefer path-like prefixes (`pho
|
|
|
614
609
|
```typescript title="oke.config.ts"
|
|
615
610
|
drivers: {
|
|
616
611
|
store: {
|
|
617
|
-
files: {
|
|
612
|
+
files: { dev: "s3", test: "memory", prod: "s3" },
|
|
618
613
|
},
|
|
619
614
|
},
|
|
620
615
|
images: {
|
|
621
|
-
|
|
616
|
+
store: { files: "rustfs/rustfs:1.0.0-beta.11" },
|
|
622
617
|
},
|
|
623
618
|
```
|
|
624
619
|
|
|
625
|
-
| Facet |
|
|
626
|
-
| ------- |
|
|
627
|
-
| `files` | `
|
|
620
|
+
| Facet | `dev` / `prod` | `test` | Runs as |
|
|
621
|
+
| ------- | -------------- | -------- | ------------------------ |
|
|
622
|
+
| `files` | `s3` | `memory` | RustFS / S3 → in-process |
|
|
628
623
|
|
|
629
624
|
| Variable | When |
|
|
630
625
|
| ----------------------------- | -------------------------------------- |
|
|
631
626
|
| `S3_BUCKET` | Required bucket for the `s3` driver |
|
|
632
627
|
| `OKE_STORE_FILES_DB` | Override bucket name |
|
|
633
628
|
| `S3_ENDPOINT` · keys · region | S3-compatible endpoint and credentials |
|
|
634
|
-
| `OKE_FILES_DRIVER` | Force a driver id
|
|
629
|
+
| `OKE_FILES_DRIVER` | Force a driver id |
|
|
635
630
|
|
|
636
631
|
`memory` is the test default. Local `fs` writes under a temp root when no binding `root` is set.
|
|
637
632
|
|
|
638
|
-
**Known limit:** `fs` is single-host. Under horizontal scale each replica sees its own filesystem (silently inconsistent object views). Boot prints a one-shot warning when `drivers.store.files` is `fs`. Use `s3` for
|
|
633
|
+
**Known limit:** `fs` is single-host. Under horizontal scale each replica sees its own filesystem (silently inconsistent object views). Boot prints a one-shot warning when `drivers.store.files` is `fs`. Use `s3` for `dev`/`prod` (create-oke templates already do).
|
|
639
634
|
|
|
640
|
-
<Callout title="
|
|
641
|
-
|
|
642
|
-
|
|
635
|
+
<Callout title="Operator tools can browse, not edit bytes">
|
|
636
|
+
Operator tools can list keys and delete them. Direct edit is **KV + SQL only** — blob bodies are
|
|
637
|
+
not patched.
|
|
643
638
|
</Callout>
|
|
644
639
|
|
|
645
640
|
### Images — `image` / `putImage`
|
|
@@ -748,11 +743,10 @@ runtime.
|
|
|
748
743
|
|
|
749
744
|
### Vector ANN
|
|
750
745
|
|
|
751
|
-
| `store.index` id | Shares connection from | Real ANN via
|
|
752
|
-
| ---------------- | -------------------------- |
|
|
753
|
-
| `memory` | — (in-process, default) | Full scan cosine
|
|
754
|
-
| `pgvector` | `postgres` or `pglite` sql | HNSW + `cosineDistance`
|
|
755
|
-
| `libsql` | `libsql` sql | `libsql_vector_idx` + `vector_top_k` |
|
|
746
|
+
| `store.index` id | Shares connection from | Real ANN via |
|
|
747
|
+
| ---------------- | -------------------------- | ----------------------- |
|
|
748
|
+
| `memory` | — (in-process, default) | Full scan cosine |
|
|
749
|
+
| `pgvector` | `postgres` or `pglite` sql | HNSW + `cosineDistance` |
|
|
756
750
|
|
|
757
751
|
**Consequence:** a configured SQL-backed index that cannot reach its engine — missing peer, missing
|
|
758
752
|
`vector` extension, wrong sql driver — fails loudly at first use. It never silently falls back to
|
|
@@ -789,29 +783,27 @@ do: async ({ id, doc, q }, fx) => {
|
|
|
789
783
|
```typescript title="oke.config.ts"
|
|
790
784
|
drivers: {
|
|
791
785
|
store: {
|
|
792
|
-
index: {
|
|
786
|
+
index: { dev: "meilisearch", test: "memory", prod: "meilisearch" },
|
|
793
787
|
},
|
|
794
788
|
},
|
|
795
789
|
images: {
|
|
796
|
-
|
|
790
|
+
store: { index: "getmeili/meilisearch:v1.37" },
|
|
797
791
|
},
|
|
798
792
|
```
|
|
799
793
|
|
|
800
|
-
-
|
|
801
|
-
- **Docker / prod** uses the image recipe; the app gets `OKE_STORE_INDEX_URL` + `OKE_STORE_INDEX_KEY` from Compose — a standalone HTTP service, never the shared `sqlUrl`.
|
|
794
|
+
- **`oke dev` / prod** use the image recipe; the app gets `OKE_STORE_INDEX_URL` + `OKE_STORE_INDEX_KEY` from Compose — a standalone HTTP service, never the shared `sqlUrl`.
|
|
802
795
|
- **Fail-loud:** a configured meilisearch that is unreachable or unhealthy throws `MeilisearchUnavailableError` — never a silent memory fallback.
|
|
803
796
|
- **Not for vectors:** `ai.embed` / `fx.search` stay vector-only; pointing an embed `into` a meilisearch index fails loud (embeddings don't apply).
|
|
804
|
-
- **Alpine caveat:** the raw glibc binary fails on Alpine/musl _hosts_; the official image is musl-clean. Install the binary for your platform (e.g. Homebrew / install script), or use `--docker`.
|
|
805
797
|
|
|
806
798
|
### Per-environment Index drivers
|
|
807
799
|
|
|
808
|
-
Unlike KV/Files, an unset `drivers.store.index` map stays **`memory` in every environment** — there is no
|
|
800
|
+
Unlike KV/Files, an unset `drivers.store.index` map stays **`memory` in every environment** — there is no automatic fallback to `pgvector`. Opt in explicitly:
|
|
809
801
|
|
|
810
802
|
```typescript title="oke.config.ts"
|
|
811
803
|
drivers: {
|
|
812
804
|
store: {
|
|
813
|
-
sql: {
|
|
814
|
-
index: {
|
|
805
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
806
|
+
index: { dev: "pgvector", test: "memory", prod: "pgvector" },
|
|
815
807
|
},
|
|
816
808
|
},
|
|
817
809
|
```
|
|
@@ -832,25 +824,25 @@ target meilisearch.
|
|
|
832
824
|
|
|
833
825
|
Facets are independent declarations. A Flow may touch several in one `do` — for example store a files key on a SQL row, or `upsert` into an index after a SQL write. There is no special sync API: `store.resource` `search:` is SQL substring match, not meilisearch.
|
|
834
826
|
|
|
835
|
-
One real coupling:
|
|
827
|
+
One real coupling: `pgvector` shares the sql facet's already-open connection, so configure the pair together:
|
|
836
828
|
|
|
837
829
|
```typescript title="oke.config.ts"
|
|
838
830
|
drivers: {
|
|
839
831
|
store: {
|
|
840
|
-
sql: {
|
|
841
|
-
index: {
|
|
832
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
833
|
+
index: { dev: "pgvector", test: "memory", prod: "pgvector" },
|
|
842
834
|
},
|
|
843
835
|
},
|
|
844
836
|
```
|
|
845
837
|
|
|
846
|
-
|
|
838
|
+
The full per-environment map looks like this:
|
|
847
839
|
|
|
848
840
|
```typescript title="oke.config.ts"
|
|
849
841
|
drivers: {
|
|
850
842
|
store: {
|
|
851
|
-
sql: {
|
|
852
|
-
kv: {
|
|
853
|
-
files: {
|
|
843
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
844
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
845
|
+
files: { dev: "s3", test: "memory", prod: "s3" },
|
|
854
846
|
},
|
|
855
847
|
},
|
|
856
848
|
```
|
|
@@ -861,16 +853,16 @@ Container images come from the `images` map — change the vendor by changing th
|
|
|
861
853
|
|
|
862
854
|
Columns tagged `.pii()` or `.sensitive()` are masked at the store boundary — flows, logs, and the Console see a mask, not the value. Revealing cleartext PII requires an explicit `pii:reveal` gate on the flow, so access is a permission, not a convention.
|
|
863
855
|
|
|
864
|
-
Optional `description` on a store (and `.describe("…")` on fields) becomes
|
|
865
|
-
|
|
866
|
-
|
|
856
|
+
Optional `description` on a store (and `.describe("…")` on fields) becomes its human title in
|
|
857
|
+
operator tools. Single-table `reads` / `writes` in the Manifest power cache invalidation and that
|
|
858
|
+
same PII masking — see the Callout under [Querying by hand](#querying-by-hand).
|
|
867
859
|
|
|
868
860
|
## Troubleshooting
|
|
869
861
|
|
|
870
862
|
<Accordions>
|
|
871
|
-
<Accordion title="OKE1101 — missing table in
|
|
863
|
+
<Accordion title="OKE1101 — missing table in prod">
|
|
872
864
|
|
|
873
|
-
Schema DDL never runs automatically
|
|
865
|
+
Schema DDL never runs automatically in `prod`. Under `oke dev`, `db.autoPush` (default `true`) runs `oke db push`. For production use `oke db generate` + `oke db migrate`.
|
|
874
866
|
|
|
875
867
|
</Accordion>
|
|
876
868
|
<Accordion title="I need a join — with: is not supported">
|
|
@@ -888,14 +880,14 @@ You are on offset paging. Switch `list` to keyset by setting `cursor` columns wi
|
|
|
888
880
|
`count: "exact"` runs `COUNT(*)` per page. Set `count: "none"` in the `list` options to skip it, or use keyset mode where totals are rarely needed.
|
|
889
881
|
|
|
890
882
|
</Accordion>
|
|
891
|
-
<Accordion title="KV TTL never expires
|
|
883
|
+
<Accordion title="KV TTL never expires in tests">
|
|
892
884
|
|
|
893
|
-
The
|
|
885
|
+
The `test` default is `memory`, which ignores TTL on `set`. Under `oke dev`, KV is `redis` by default — use that when you need real expiry.
|
|
894
886
|
|
|
895
887
|
</Accordion>
|
|
896
888
|
<Accordion title="oke boot: redis / meilisearch / S3 URL missing">
|
|
897
889
|
|
|
898
|
-
Driver-backed facets fail boot when their URL is absent — Redis needs `REDIS_URL`, meilisearch needs `OKE_STORE_INDEX_URL`, S3 needs `S3_BUCKET`.
|
|
890
|
+
Driver-backed facets fail boot when their URL is absent — Redis needs `REDIS_URL`, meilisearch needs `OKE_STORE_INDEX_URL`, S3 needs `S3_BUCKET`. `oke dev` writes these into the Compose env.
|
|
899
891
|
|
|
900
892
|
</Accordion>
|
|
901
893
|
<Accordion title="vector dims X !== index dims Y">
|
|
@@ -903,9 +895,9 @@ Driver-backed facets fail boot when their URL is absent — Redis needs `REDIS_U
|
|
|
903
895
|
The vector length must match `store.index(…, { dims })` (runtime default `3` if unset). Align `dims` with your embedder, or fix the vector you pass to `upsert` / `search`.
|
|
904
896
|
|
|
905
897
|
</Accordion>
|
|
906
|
-
<Accordion title="Index stays on memory
|
|
898
|
+
<Accordion title="Index stays on memory under oke dev">
|
|
907
899
|
|
|
908
|
-
Unlike KV/Files, unset `drivers.store.index` does **not** promote to `pgvector` in
|
|
900
|
+
Unlike KV/Files, unset `drivers.store.index` does **not** promote to `pgvector` in `dev` — it stays `memory`. Set the map explicitly (and pair SQL for `pgvector`).
|
|
909
901
|
|
|
910
902
|
</Accordion>
|
|
911
903
|
</Accordions>
|
|
@@ -915,7 +907,6 @@ Unlike KV/Files, unset `drivers.store.index` does **not** promote to `pgvector`
|
|
|
915
907
|
- [Flow](/docs/elements/flow) — the `fx.store` session inside `do`
|
|
916
908
|
- [AI](/docs/elements/ai) — `ai.embed` into a vector `store.index`, searched via `fx.search`
|
|
917
909
|
- [Gate](/docs/elements/gate) — `pii:reveal` and other permissions on flows
|
|
918
|
-
- [Console · Store](/docs/console/store) — browse data, cache keys, PII masking
|
|
919
910
|
- [CLI Reference](/docs/reference/cli) — `oke db push` · `generate` · `migrate`
|
|
920
911
|
- [Configuration](/docs/reference/configuration) — `drivers.store` maps and `images` pins
|
|
921
912
|
- [Environment variables](/docs/reference/environment-variables) — Redis · S3 · meilisearch URLs
|
|
@@ -929,9 +920,4 @@ Unlike KV/Files, unset `drivers.store.index` does **not** promote to `pgvector`
|
|
|
929
920
|
description="Eight elements overview."
|
|
930
921
|
href="/docs/get-started/introduction"
|
|
931
922
|
/>
|
|
932
|
-
<Card
|
|
933
|
-
title="Console"
|
|
934
|
-
description="Panels derived from the Manifest."
|
|
935
|
-
href="/docs/console/overview"
|
|
936
|
-
/>
|
|
937
923
|
</Cards>
|