okengine 0.2.8 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/AGENTS.md +17 -15
  2. package/README.md +57 -29
  3. package/package.json +11 -16
  4. package/site/content/docs/ai/llms-txt.mdx +54 -0
  5. package/site/content/docs/ai/mcp.mdx +123 -0
  6. package/site/content/docs/ai/meta.json +5 -0
  7. package/site/content/docs/ai/skills.mdx +53 -0
  8. package/site/content/docs/console/access.mdx +29 -0
  9. package/site/content/docs/console/ai.mdx +35 -0
  10. package/site/content/docs/console/architecture.mdx +35 -0
  11. package/site/content/docs/console/channels.mdx +37 -0
  12. package/site/content/docs/console/clock.mdx +31 -0
  13. package/site/content/docs/console/flows.mdx +31 -0
  14. package/site/content/docs/console/gates.mdx +35 -0
  15. package/site/content/docs/console/manifest-diff.mdx +34 -0
  16. package/site/content/docs/console/meta.json +23 -0
  17. package/site/content/docs/console/overview.mdx +40 -0
  18. package/site/content/docs/console/plugins.mdx +41 -0
  19. package/site/content/docs/console/privacy.mdx +32 -0
  20. package/site/content/docs/console/runs.mdx +40 -0
  21. package/site/content/docs/console/signals.mdx +31 -0
  22. package/site/content/docs/console/store.mdx +32 -0
  23. package/site/content/docs/console/tenancy.mdx +32 -0
  24. package/site/content/docs/console/traces.mdx +34 -0
  25. package/site/content/docs/console/vault.mdx +37 -0
  26. package/site/content/docs/elements/ai.mdx +180 -0
  27. package/site/content/docs/elements/channel.mdx +167 -0
  28. package/site/content/docs/elements/clock.mdx +182 -0
  29. package/site/content/docs/elements/flow.mdx +288 -0
  30. package/site/content/docs/elements/gate.mdx +171 -0
  31. package/site/content/docs/elements/meta.json +5 -0
  32. package/site/content/docs/elements/signal.mdx +171 -0
  33. package/site/content/docs/elements/store.mdx +320 -0
  34. package/site/content/docs/elements/vault.mdx +263 -0
  35. package/site/content/docs/get-started/basic-usage.mdx +124 -0
  36. package/site/content/docs/get-started/comparison.mdx +65 -0
  37. package/site/content/docs/get-started/installation.mdx +113 -0
  38. package/site/content/docs/get-started/introduction.mdx +123 -0
  39. package/site/content/docs/get-started/meta.json +5 -0
  40. package/site/content/docs/index.mdx +63 -0
  41. package/site/content/docs/meta.json +5 -0
  42. package/site/content/docs/plugins/compression.mdx +60 -0
  43. package/site/content/docs/plugins/cors.mdx +92 -0
  44. package/site/content/docs/plugins/csrf.mdx +96 -0
  45. package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
  46. package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
  47. package/site/content/docs/plugins/meta.json +15 -0
  48. package/site/content/docs/plugins/security-headers.mdx +136 -0
  49. package/site/content/docs/reference/cli.md +101 -0
  50. package/site/content/docs/reference/configuration.mdx +159 -0
  51. package/site/content/docs/reference/environment-variables.mdx +87 -0
  52. package/site/content/docs/reference/errors.mdx +80 -0
  53. package/site/content/docs/reference/fx.mdx +117 -0
  54. package/site/content/docs/reference/meta.json +5 -0
  55. package/site/content/docs/reference/plugins.mdx +249 -0
  56. package/site/content/docs/reference/security.md +63 -0
  57. package/src/auth/auth.test.ts +3 -0
  58. package/src/cli/ask-dev-mode.ts +1 -1
  59. package/src/cli/db.ts +87 -17
  60. package/src/cli/dev-db-push.test.ts +32 -2
  61. package/src/cli/dev-schema-sync.test.ts +66 -0
  62. package/src/cli/dev-schema-sync.ts +139 -0
  63. package/src/cli/dev.test.ts +123 -1
  64. package/src/cli/dev.ts +150 -8
  65. package/src/cli/doc-staleness.test.ts +4 -4
  66. package/src/cli/docker-cli.test.ts +20 -0
  67. package/src/cli/docker.ts +10 -0
  68. package/src/cli/drizzle-env.test.ts +67 -0
  69. package/src/cli/drizzle-env.ts +78 -0
  70. package/src/cli/ensure-drizzle-config.ts +50 -0
  71. package/src/cli/hero-meta.test.ts +1 -1
  72. package/src/cli/load-config.ts +6 -0
  73. package/src/cli/mode.ts +24 -4
  74. package/src/cli/openbao-bootstrap.test.ts +147 -0
  75. package/src/cli/openbao-bootstrap.ts +280 -0
  76. package/src/cli/openbao-restart.integration.test.ts +136 -0
  77. package/src/cli/ports.test.ts +7 -5
  78. package/src/cli/ports.ts +6 -2
  79. package/src/cli/resolve-dev-sql-env.test.ts +48 -0
  80. package/src/cli/resolve-dev-sql-env.ts +42 -0
  81. package/src/cli/stack.ts +7 -4
  82. package/src/cli/vault-cmd.ts +63 -0
  83. package/src/client/types.ts +7 -1
  84. package/src/compiler/extract.test.ts +40 -0
  85. package/src/compiler/extract.ts +123 -1
  86. package/src/compiler/fixtures/skyport/oke.config.ts +2 -2
  87. package/src/compiler/fixtures/skyport.expected.json +1 -1
  88. package/src/compiler/response.ts +12 -0
  89. package/src/config/define-config.test.ts +4 -6
  90. package/src/config/index.ts +2 -15
  91. package/src/console/server/app.ts +2 -0
  92. package/src/console/server/vault.ts +21 -6
  93. package/src/docker/compose.ts +112 -16
  94. package/src/docker/derive.ts +7 -1
  95. package/src/docker/docker.test.ts +103 -0
  96. package/src/docker/index.ts +11 -1
  97. package/src/docker/recipes/index.ts +3 -2
  98. package/src/docker/recipes/openbao.ts +47 -0
  99. package/src/docker/recipes/redis.ts +5 -1
  100. package/src/docker/recipes/rustfs.ts +2 -3
  101. package/src/docker/stack-id.test.ts +43 -8
  102. package/src/docker/stack-id.ts +99 -20
  103. package/src/docker/stack.ts +36 -4
  104. package/src/docker/types.ts +3 -0
  105. package/src/docs-origin.ts +4 -4
  106. package/src/drivers/drizzle-dialect.test.ts +20 -0
  107. package/src/drivers/drizzle-dialect.ts +37 -0
  108. package/src/drivers/index.ts +1 -2
  109. package/src/drivers/memory.ts +278 -39
  110. package/src/drivers/s3.ts +10 -1
  111. package/src/drivers/vault-driver-removal.test.ts +55 -0
  112. package/src/drivers/vault-openbao.test.ts +97 -0
  113. package/src/drivers/vault-openbao.ts +102 -35
  114. package/src/drivers/vault-types.ts +3 -10
  115. package/src/elements/store/declare.ts +4 -1
  116. package/src/elements/store/resource-list-docs.fixture.ts +56 -0
  117. package/src/elements/store/resource-list-docs.test.ts +79 -0
  118. package/src/elements/store/resource.test.ts +253 -0
  119. package/src/elements/store/resource.ts +786 -0
  120. package/src/elements/store/sql-condition.test.ts +132 -0
  121. package/src/elements/store/sql-condition.ts +284 -46
  122. package/src/elements/store/sql-session.test.ts +86 -1
  123. package/src/elements/store/sql-session.ts +187 -27
  124. package/src/elements/store/table.ts +34 -4
  125. package/src/elements/store.ts +16 -0
  126. package/src/elements/vault/runtime.ts +1 -1
  127. package/src/elements/vault.test.ts +1 -28
  128. package/src/elements/vault.ts +1 -1
  129. package/src/kernel/app.ts +59 -25
  130. package/src/kernel/boot-bind/channel.test.ts +60 -0
  131. package/src/kernel/boot-bind/channel.ts +64 -2
  132. package/src/kernel/boot-bind/store.test.ts +10 -1
  133. package/src/kernel/boot-bind/store.ts +49 -2
  134. package/src/kernel/boot.test.ts +0 -1
  135. package/src/kernel/boot.ts +1 -1
  136. package/src/kernel/edge.test.ts +68 -0
  137. package/src/kernel/errors.registry.test.ts +1 -1
  138. package/src/kernel/flow.ts +8 -0
  139. package/src/kernel/fx.test.ts +23 -3
  140. package/src/kernel/fx.ts +115 -18
  141. package/src/kernel/hooks.test.ts +33 -0
  142. package/src/kernel/hooks.ts +22 -0
  143. package/src/kernel/index.ts +7 -0
  144. package/src/kernel/on.ts +44 -3
  145. package/src/kernel/plugin.ts +33 -3
  146. package/src/kernel/registry-isolation.test.ts +74 -0
  147. package/src/kernel/registry.ts +22 -1
  148. package/src/kernel/triggers.ts +59 -0
  149. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  150. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  151. package/src/manifest/index.ts +1 -1
  152. package/src/manifest/types.ts +1 -1
  153. package/src/manifest/validate.ts +2 -2
  154. package/src/plugins/compression.test.ts +127 -0
  155. package/src/plugins/compression.ts +94 -0
  156. package/src/plugins/config-source.test.ts +204 -0
  157. package/src/plugins/config-source.ts +209 -0
  158. package/src/plugins/cors.test.ts +138 -0
  159. package/src/plugins/cors.ts +129 -0
  160. package/src/plugins/csrf.test.ts +102 -0
  161. package/src/plugins/csrf.ts +86 -0
  162. package/src/plugins/headers.ts +54 -0
  163. package/src/plugins/index.ts +26 -0
  164. package/src/plugins/ip-allowlist.test.ts +105 -0
  165. package/src/plugins/ip-allowlist.ts +76 -0
  166. package/src/plugins/maintenance-mode.test.ts +91 -0
  167. package/src/plugins/maintenance-mode.ts +85 -0
  168. package/src/plugins/security-headers.test.ts +243 -0
  169. package/src/plugins/security-headers.ts +255 -0
  170. package/src/release/measure.ts +1 -2
  171. package/src/test/create-test-app.ts +14 -2
  172. package/docs/spec/console.md +0 -762
  173. package/docs/spec/example.md +0 -1374
  174. package/docs/spec/four-applications.md +0 -1376
  175. package/docs/spec/unified-theory.md +0 -498
  176. package/src/cli/doc-drift.test.ts +0 -147
  177. package/src/cli/doc-drift.ts +0 -401
  178. package/src/cli/doctor-diff-examples.ts +0 -90
  179. package/src/drivers/vault-sops.ts +0 -246
  180. /package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +0 -0
@@ -54,9 +54,33 @@ export function hostPortForInstance(
54
54
  if (role === "store.sql") return 15_000 + n;
55
55
  if (role === "store.kv") return 16_000 + n;
56
56
  if (role === "signal") return 17_000 + n;
57
+ if (role === "store.files") return 18_000 + n;
58
+ if (role === "channel.email") return 20_000 + n;
59
+ if (role === "vault") return 22_000 + n;
57
60
  return defaultHostPort(role, containerPort) + n;
58
61
  }
59
62
 
63
+ /**
64
+ * Host port for a recipe's additional published port.
65
+ *
66
+ * Built-in roles use disjoint ranges so an offset cannot move Mailpit's UI
67
+ * onto RustFS's API port (for example, `8025 + 975 = 9000`).
68
+ *
69
+ * @param role - Role key
70
+ * @param hostPort - Recipe's default additional host port
71
+ * @param instanceId - 6-hex stack id
72
+ */
73
+ export function extraHostPortForInstance(
74
+ role: string,
75
+ hostPort: number,
76
+ instanceId: string,
77
+ ): number {
78
+ const n = instancePortOffset(instanceId);
79
+ if (role === "store.files") return 19_000 + n;
80
+ if (role === "channel.email") return 21_000 + n;
81
+ return hostPort + n;
82
+ }
83
+
60
84
  /**
61
85
  * Parse role credentials from an existing `.env.docker` body (reuse on restart).
62
86
  *
@@ -67,29 +91,16 @@ export function parseStackCredentials(
67
91
  text: string,
68
92
  roles: readonly string[],
69
93
  ): Record<string, ServiceCredentials> {
70
- const map = new Map<string, string>();
71
- for (const line of text.split("\n")) {
72
- const trimmed = line.trim();
73
- if (!trimmed || trimmed.startsWith("#")) continue;
74
- const eq = trimmed.indexOf("=");
75
- if (eq <= 0) continue;
76
- const key = trimmed.slice(0, eq);
77
- let value = trimmed.slice(eq + 1);
78
- if (
79
- (value.startsWith('"') && value.endsWith('"')) ||
80
- (value.startsWith("'") && value.endsWith("'"))
81
- ) {
82
- value = value.slice(1, -1);
83
- }
84
- map.set(key, value);
85
- }
86
-
94
+ const map = parseDotenv(text);
87
95
  const out: Record<string, ServiceCredentials> = {};
88
96
  for (const role of roles) {
89
97
  const prefix = envPrefix(role);
90
- const user = map.get(`${prefix}_USER`);
91
- const password = map.get(`${prefix}_PASSWORD`);
92
- const database = map.get(`${prefix}_DB`);
98
+ const user =
99
+ map.get(`${prefix}_USER`) ?? (role === "store.files" ? map.get("S3_ACCESS_KEY_ID") : "oke");
100
+ const password =
101
+ map.get(`${prefix}_PASSWORD`) ??
102
+ (role === "store.files" ? map.get("S3_SECRET_ACCESS_KEY") : undefined);
103
+ const database = map.get(`${prefix}_DB`) ?? "oke";
93
104
  if (user && password && database) {
94
105
  out[role] = { user, password, database };
95
106
  }
@@ -97,6 +108,36 @@ export function parseStackCredentials(
97
108
  return out;
98
109
  }
99
110
 
111
+ /** Optional `.env.docker` keys preserved when generated files refresh. */
112
+ export const STACK_CONTROL_KEYS = [
113
+ "PGDATA",
114
+ "POSTGRES_INITDB_ARGS",
115
+ "OKE_STORE_KV_MAXMEMORY",
116
+ "OKE_STORE_KV_MAXMEMORY_POLICY",
117
+ "S3_REGION",
118
+ "S3_SESSION_TOKEN",
119
+ "SMTP_USER",
120
+ "SMTP_PASSWORD",
121
+ "MP_MAX_MESSAGES",
122
+ "MP_SMTP_AUTH_ACCEPT_ANY",
123
+ "MP_SMTP_AUTH_ALLOW_INSECURE",
124
+ ] as const;
125
+
126
+ /**
127
+ * Read supported user controls from an existing `.env.docker`.
128
+ *
129
+ * @param text - Dotenv contents
130
+ */
131
+ export function parseStackControls(text: string): Record<string, string> {
132
+ const parsed = parseDotenv(text);
133
+ return Object.fromEntries(
134
+ STACK_CONTROL_KEYS.flatMap((key) => {
135
+ const value = parsed.get(key);
136
+ return value === undefined ? [] : [[key, value]];
137
+ }),
138
+ );
139
+ }
140
+
100
141
  /**
101
142
  * Load credentials from `docker/.env.docker` when present.
102
143
  *
@@ -118,3 +159,41 @@ export async function loadExistingStackCredentials(
118
159
  }
119
160
  return undefined;
120
161
  }
162
+
163
+ /**
164
+ * Load optional controls from `docker/.env.docker` when present.
165
+ *
166
+ * @param cwd - Project root
167
+ */
168
+ export async function loadExistingStackControls(
169
+ cwd: string,
170
+ ): Promise<Readonly<Record<string, string>> | undefined> {
171
+ const candidates = [resolve(cwd, DEFAULT_DOCKER_DIR, ".env.docker"), resolve(cwd, ".env.docker")];
172
+ for (const path of candidates) {
173
+ const file = Bun.file(path);
174
+ if (!(await file.exists())) continue;
175
+ const controls = parseStackControls(await file.text());
176
+ if (Object.keys(controls).length > 0) return controls;
177
+ }
178
+ return undefined;
179
+ }
180
+
181
+ function parseDotenv(text: string): Map<string, string> {
182
+ const map = new Map<string, string>();
183
+ for (const line of text.split("\n")) {
184
+ const trimmed = line.trim();
185
+ if (!trimmed || trimmed.startsWith("#")) continue;
186
+ const eq = trimmed.indexOf("=");
187
+ if (eq <= 0) continue;
188
+ const key = trimmed.slice(0, eq);
189
+ let value = trimmed.slice(eq + 1);
190
+ if (
191
+ (value.startsWith('"') && value.endsWith('"')) ||
192
+ (value.startsWith("'") && value.endsWith("'"))
193
+ ) {
194
+ value = value.slice(1, -1);
195
+ }
196
+ map.set(key, value);
197
+ }
198
+ return map;
199
+ }
@@ -4,8 +4,15 @@
4
4
 
5
5
  import { buildSpecs } from "./compose.ts";
6
6
  import { recipeFor } from "./recipes/index.ts";
7
+ import { extraHostPortForInstance } from "./stack-id.ts";
7
8
  import type { DeriveOptions, ServiceSpec } from "./types.ts";
8
9
 
10
+ /** Extra published host↔container mapping for stack preview. */
11
+ export interface StackExtraPort {
12
+ readonly hostPort: number;
13
+ readonly containerPort: number;
14
+ }
15
+
9
16
  /** One resolved stack row for preview. */
10
17
  export interface StackRow {
11
18
  readonly role: string;
@@ -14,12 +21,14 @@ export interface StackRow {
14
21
  readonly service: string;
15
22
  readonly containerPort: number;
16
23
  readonly hostPort: number;
24
+ /** Additional published ports (Mailpit UI, RustFS console, …). */
25
+ readonly extraPorts: readonly StackExtraPort[];
17
26
  }
18
27
 
19
28
  /**
20
29
  * Resolve stack preview rows from image pins.
21
30
  *
22
- * @param options - Images (+ optional recipes)
31
+ * @param options - Images (+ optional recipes / instanceId)
23
32
  */
24
33
  export function resolveStack(options: DeriveOptions): readonly StackRow[] {
25
34
  const specs = buildSpecs(options);
@@ -38,13 +47,35 @@ export function formatStackPreview(rows: readonly StackRow[]): string {
38
47
  "-------------- --------- --------------------------------- --------------",
39
48
  ];
40
49
  for (const r of rows) {
41
- lines.push(
42
- `${pad(r.role, 14)} ${pad(r.recipe, 9)} ${pad(r.image, 33)} ${r.hostPort}:${r.containerPort}`,
43
- );
50
+ const ports = [
51
+ `${r.hostPort}:${r.containerPort}`,
52
+ ...r.extraPorts.map((p) => `${p.hostPort}:${p.containerPort}`),
53
+ ].join(", ");
54
+ lines.push(`${pad(r.role, 14)} ${pad(r.recipe, 9)} ${pad(r.image, 33)} ${ports}`);
44
55
  }
45
56
  return `${lines.join("\n")}\n`;
46
57
  }
47
58
 
59
+ /**
60
+ * Resolve additional published ports for a service (instance-aware).
61
+ *
62
+ * @param spec - Normalised service
63
+ * @param options - Derive options
64
+ */
65
+ export function resolveExtraPorts(
66
+ spec: ServiceSpec,
67
+ options: DeriveOptions,
68
+ ): readonly StackExtraPort[] {
69
+ const recipe = recipeFor(spec.image, options.recipes ?? []);
70
+ const applied = recipe.apply(spec);
71
+ return (applied.extraPorts ?? []).map((p) => ({
72
+ containerPort: p.container,
73
+ hostPort: options.instanceId
74
+ ? extraHostPortForInstance(spec.role, p.host, options.instanceId)
75
+ : p.host,
76
+ }));
77
+ }
78
+
48
79
  function toRow(spec: ServiceSpec, options: DeriveOptions): StackRow {
49
80
  const recipe = recipeFor(spec.image, options.recipes ?? []);
50
81
  return {
@@ -54,6 +85,7 @@ function toRow(spec: ServiceSpec, options: DeriveOptions): StackRow {
54
85
  service: spec.serviceName,
55
86
  containerPort: spec.port,
56
87
  hostPort: spec.hostPort,
88
+ extraPorts: resolveExtraPorts(spec, options),
57
89
  };
58
90
  }
59
91
 
@@ -60,6 +60,7 @@ export interface RecipeExtraPort {
60
60
  export interface RecipeApplyResult {
61
61
  readonly environment?: Readonly<Record<string, string>>;
62
62
  readonly command?: string | readonly string[];
63
+ readonly entrypoint?: string | readonly string[];
63
64
  readonly healthcheck?: ComposeHealthcheck;
64
65
  readonly volumes?: readonly string[];
65
66
  readonly user?: string;
@@ -128,6 +129,8 @@ export interface DeriveOptions {
128
129
  readonly host?: string;
129
130
  /** Extra image recipes (plugins). */
130
131
  readonly recipes?: readonly ImageRecipe[];
132
+ /** Preserved optional controls from an existing `.env.docker`. */
133
+ readonly controls?: Readonly<Record<string, string>>;
131
134
  /**
132
135
  * Local stack instance id (6-hex). When set, host ports are offset so two
133
136
  * `oke dev -s` projects do not share one Postgres on `:5432`.
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Canonical public docs origin for error links, README, and the site.
3
3
  *
4
- * Flip this one constant when the custom domain is attached:
5
- * `https://oke.omqkhafi.dev`
4
+ * Keep in lockstep with `packages/create-oke/src/docs-origin.ts` and
5
+ * `site/app/layout.tsx` (`metadataBase`).
6
6
  */
7
7
 
8
- /** Live docs site (Vercel). Planned cutover: `https://oke.omqkhafi.dev`. */
9
- export const DOCS_ORIGIN = "https://okengine.vercel.app" as const;
8
+ /** Live docs site. */
9
+ export const DOCS_ORIGIN = "https://oke.omqkhafi.dev" as const;
10
10
 
11
11
  /**
12
12
  * Absolute docs URL for a path under the handbook / site.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Exhaustive SQL driver → drizzle-kit dialect map.
3
+ */
4
+
5
+ import { describe, expect, test } from "bun:test";
6
+ import { drizzleDialectFromSqlDriver, SQL_DRIVER_TO_DRIZZLE_DIALECT } from "./drizzle-dialect.ts";
7
+
8
+ describe("SQL_DRIVER_TO_DRIZZLE_DIALECT", () => {
9
+ test("maps owned SQL drivers", () => {
10
+ expect(SQL_DRIVER_TO_DRIZZLE_DIALECT).toEqual({
11
+ sqlite: "sqlite",
12
+ postgres: "postgresql",
13
+ });
14
+ });
15
+
16
+ test("drizzleDialectFromSqlDriver resolves", () => {
17
+ expect(drizzleDialectFromSqlDriver("sqlite")).toBe("sqlite");
18
+ expect(drizzleDialectFromSqlDriver("postgres")).toBe("postgresql");
19
+ });
20
+ });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Map OKE `store.sql` driver ids to drizzle-kit dialects.
3
+ *
4
+ * drizzle-kit `1.0.0-rc.4` dialects (from its schema validator):
5
+ * `postgresql` · `mysql` · `sqlite` · `turso` · `singlestore` · `mssql` ·
6
+ * `cockroach` · `duckdb`. OKE owns kit-facing SQL drivers `sqlite` /
7
+ * `postgres` only — map those, never infer from connection URLs.
8
+ */
9
+
10
+ import type { StoreDriverId } from "./types.ts";
11
+
12
+ /** drizzle-kit `Dialect` values OKE currently emits for owned SQL drivers. */
13
+ export type OkeDrizzleKitDialect = "sqlite" | "postgresql";
14
+
15
+ /**
16
+ * Exhaustive map: adding a new SQL id to `StoreDriverId` without updating
17
+ * this `Record` is a compile error (via `Extract`), not a silent wrong
18
+ * dialect months later.
19
+ */
20
+ export const SQL_DRIVER_TO_DRIZZLE_DIALECT: Record<
21
+ Extract<StoreDriverId, "sqlite" | "postgres">,
22
+ OkeDrizzleKitDialect
23
+ > = {
24
+ sqlite: "sqlite",
25
+ postgres: "postgresql",
26
+ };
27
+
28
+ /**
29
+ * Resolve the drizzle-kit dialect for an OKE SQL driver id.
30
+ *
31
+ * @param driverId - Protocol driver id (`sqlite` | `postgres`)
32
+ */
33
+ export function drizzleDialectFromSqlDriver(
34
+ driverId: Extract<StoreDriverId, "sqlite" | "postgres">,
35
+ ): OkeDrizzleKitDialect {
36
+ return SQL_DRIVER_TO_DRIZZLE_DIALECT[driverId];
37
+ }
@@ -102,8 +102,7 @@ export type { VaultDriverId, VaultOpenOptions, VaultBag, VaultDriver } from "./v
102
102
 
103
103
  export { memoryVaultDriver } from "./vault-memory.ts";
104
104
  export { envVaultDriver } from "./vault-env.ts";
105
- export { sopsVaultDriver, buildSopsFixture, sopsEncryptValue } from "./vault-sops.ts";
106
- export { openbaoVaultDriver } from "./vault-openbao.ts";
105
+ export { openbaoVaultDriver, OpenBaoUnavailableError } from "./vault-openbao.ts";
107
106
  export { infisicalVaultDriver } from "./vault-infisical.ts";
108
107
  export { managedVaultDriver } from "./vault-managed.ts";
109
108