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
|
@@ -1,41 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Driver map resolution — including `
|
|
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;
|
|
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("
|
|
16
|
-
expect(resolveDomainDdlMode("
|
|
17
|
-
expect(resolveDomainDdlMode("
|
|
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({
|
|
24
|
-
expect(resolveDriverId({
|
|
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("
|
|
28
|
-
expect(
|
|
29
|
-
|
|
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("
|
|
36
|
-
expect(resolveDriverId(
|
|
37
|
-
expect(resolveDriverId(
|
|
38
|
-
|
|
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
|
|
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: "
|
|
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
|
|
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 {
|
|
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
|
});
|