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.
- package/package.json +76 -10
- 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 -7
- package/site/content/docs/elements/channel.mdx +9 -7
- package/site/content/docs/elements/clock.mdx +8 -8
- package/site/content/docs/elements/flow.mdx +46 -47
- package/site/content/docs/elements/gate.mdx +6 -5
- package/site/content/docs/elements/signal.mdx +2 -2
- package/site/content/docs/elements/store.mdx +71 -78
- package/site/content/docs/elements/vault.mdx +89 -70
- package/site/content/docs/get-started/basic-usage.mdx +8 -8
- 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 +2 -2
- 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 +11 -4
- 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 +27 -15
- 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 +1 -1
- 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 +166 -121
- package/src/cli/dev.ts +138 -192
- 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 +55 -15
- 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 +16 -12
- package/src/cli/load-config.source.test.ts +50 -0
- package/src/cli/load-config.ts +34 -28
- 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 +28 -10
- 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/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
- package/src/compiler/fixtures/skyport.expected.json +1 -1
- package/src/compiler-entry.ts +7 -0
- package/src/config/define-config.test.ts +111 -47
- package/src/config/driver-defaults.test.ts +16 -23
- package/src/config/driver-defaults.ts +33 -63
- package/src/config/index.ts +169 -144
- 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 +3 -8
- 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/config.ts +13 -3
- package/src/elements/gate/constants.ts +18 -0
- package/src/elements/gate/declare.ts +1 -1
- package/src/elements/gate/strategies.ts +2 -12
- 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-auth.ts +98 -0
- package/src/kernel/app.ts +77 -110
- 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 +3 -10
- package/src/kernel/boot-bind/clock.ts +2 -2
- package/src/kernel/boot-bind/gate.ts +5 -9
- package/src/kernel/boot-bind/honor-config.test.ts +42 -42
- package/src/kernel/boot-bind/journal.ts +2 -2
- package/src/kernel/boot-bind/store.test.ts +43 -44
- package/src/kernel/boot-bind/store.ts +16 -41
- package/src/kernel/boot-bind/vault.ts +16 -1
- package/src/kernel/boot.test.ts +13 -19
- 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 +61 -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/lazy-src.ts +79 -0
- 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/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
|
@@ -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
|
-
*
|
|
32
|
-
* `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`
|
|
194
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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 {
|
|
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,
|
package/src/kernel/boot.test.ts
CHANGED
|
@@ -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
|
|
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
|
|
120
|
-
//
|
|
121
|
-
|
|
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
|
|
263
|
+
// Non-test env → startScheduler defaults ON. No createTestApp / advance.
|
|
277
264
|
const app = oke({
|
|
278
265
|
name: "cron-autostart",
|
|
279
|
-
env: "
|
|
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
|
|
package/src/kernel/boot.ts
CHANGED
|
@@ -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 ||
|
|
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
|
-
//
|
|
287
|
-
//
|
|
288
|
-
const env: ConfigEnv =
|
|
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: `
|
|
560
|
-
*
|
|
561
|
-
*
|
|
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 = "
|
|
571
|
-
options: {
|
|
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
|
-
|
|
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 —
|
|
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. `
|
|
649
|
-
* `
|
|
650
|
-
* never a silently-incomplete route table in a
|
|
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 = "
|
|
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
|
-
|
|
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 —
|
|
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
|
/**
|