okengine 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/package.json +76 -10
  2. package/site/content/docs/ai/mcp.mdx +0 -1
  3. package/site/content/docs/deployment/docker-swarm.mdx +48 -111
  4. package/site/content/docs/deployment/docker.mdx +43 -36
  5. package/site/content/docs/deployment/index.mdx +9 -9
  6. package/site/content/docs/deployment/kubernetes.mdx +4 -4
  7. package/site/content/docs/elements/ai.mdx +7 -13
  8. package/site/content/docs/elements/channel.mdx +9 -13
  9. package/site/content/docs/elements/clock.mdx +8 -14
  10. package/site/content/docs/elements/flow.mdx +46 -54
  11. package/site/content/docs/elements/gate.mdx +6 -11
  12. package/site/content/docs/elements/signal.mdx +2 -8
  13. package/site/content/docs/elements/store.mdx +79 -93
  14. package/site/content/docs/elements/vault.mdx +89 -76
  15. package/site/content/docs/get-started/basic-usage.mdx +8 -14
  16. package/site/content/docs/get-started/installation.mdx +36 -36
  17. package/site/content/docs/get-started/introduction.mdx +11 -0
  18. package/site/content/docs/get-started/why.mdx +3 -4
  19. package/site/content/docs/index.mdx +0 -1
  20. package/site/content/docs/meta.json +0 -1
  21. package/site/content/docs/plugins/anonymous.mdx +1 -1
  22. package/site/content/docs/plugins/magic-link.mdx +11 -11
  23. package/site/content/docs/plugins/otp.mdx +2 -2
  24. package/site/content/docs/plugins/passkey.mdx +1 -1
  25. package/site/content/docs/plugins/two-factor.mdx +1 -1
  26. package/site/content/docs/plugins/username.mdx +1 -1
  27. package/site/content/docs/recipes/caddy.mdx +1 -1
  28. package/site/content/docs/recipes/cockroachdb.mdx +2 -2
  29. package/site/content/docs/recipes/dragonfly.mdx +1 -1
  30. package/site/content/docs/recipes/index.mdx +1 -2
  31. package/site/content/docs/recipes/llama-cpp.mdx +21 -23
  32. package/site/content/docs/recipes/mailpit.mdx +11 -11
  33. package/site/content/docs/recipes/meilisearch.mdx +10 -10
  34. package/site/content/docs/recipes/meta.json +0 -1
  35. package/site/content/docs/recipes/ollama.mdx +1 -1
  36. package/site/content/docs/recipes/pgdog.mdx +12 -9
  37. package/site/content/docs/recipes/postgres.mdx +3 -3
  38. package/site/content/docs/recipes/redis.mdx +2 -2
  39. package/site/content/docs/recipes/rustfs.mdx +10 -7
  40. package/site/content/docs/recipes/sglang.mdx +1 -1
  41. package/site/content/docs/recipes/supabase-docker.mdx +1 -1
  42. package/site/content/docs/recipes/timescale.mdx +2 -2
  43. package/site/content/docs/recipes/valkey.mdx +1 -1
  44. package/site/content/docs/recipes/vllm.mdx +1 -1
  45. package/site/content/docs/recipes/yugabytedb.mdx +2 -2
  46. package/site/content/docs/reference/cli.md +61 -38
  47. package/site/content/docs/reference/configuration.mdx +145 -70
  48. package/site/content/docs/reference/environment-variables.mdx +36 -28
  49. package/site/content/docs/reference/errors.mdx +28 -29
  50. package/site/content/docs/reference/fx.mdx +14 -7
  51. package/site/content/docs/reference/i18n.mdx +17 -6
  52. package/site/content/docs/reference/index.mdx +5 -0
  53. package/site/content/docs/reference/meta.json +1 -0
  54. package/site/content/docs/reference/migrating-environments.mdx +158 -0
  55. package/site/content/docs/reference/plugins.mdx +2 -2
  56. package/src/auth/gate-auth.test.ts +12 -10
  57. package/src/cli/ai-setup/ai-setup.test.ts +30 -16
  58. package/src/cli/ai-setup/apply.ts +111 -15
  59. package/src/cli/ai-setup/catalog.ts +3 -3
  60. package/src/cli/ai-setup/index.ts +1 -1
  61. package/src/cli/ai-setup/prompts.ts +1 -1
  62. package/src/cli/ai-setup/recommend.test.ts +1 -1
  63. package/src/cli/ask-seed.test.ts +3 -3
  64. package/src/cli/build.ts +8 -9
  65. package/src/cli/db-auto-push.test.ts +6 -3
  66. package/src/cli/db-auto-push.ts +7 -5
  67. package/src/cli/db-seed.ts +7 -8
  68. package/src/cli/db.test.ts +70 -71
  69. package/src/cli/db.ts +86 -12
  70. package/src/cli/dev-controller.test.ts +35 -0
  71. package/src/cli/dev-controller.ts +298 -0
  72. package/src/cli/dev-controls.ts +11 -65
  73. package/src/cli/dev-db-push.test.ts +47 -15
  74. package/src/cli/dev-schema-sync.test.ts +11 -11
  75. package/src/cli/dev-schema-sync.ts +10 -10
  76. package/src/cli/dev-session-lock.test.ts +106 -0
  77. package/src/cli/dev-session-lock.ts +209 -0
  78. package/src/cli/dev.test.ts +246 -114
  79. package/src/cli/dev.ts +153 -205
  80. package/src/cli/doc-staleness.test.ts +3 -6
  81. package/src/cli/docker-clean.test.ts +33 -1
  82. package/src/cli/docker-clean.ts +28 -33
  83. package/src/cli/docker-cli.test.ts +12 -11
  84. package/src/cli/docker.ts +95 -20
  85. package/src/cli/doctor.test.ts +40 -0
  86. package/src/cli/doctor.ts +142 -9
  87. package/src/cli/drizzle-env.test.ts +11 -13
  88. package/src/cli/drizzle-env.ts +18 -11
  89. package/src/cli/ensure-drizzle-config.ts +11 -14
  90. package/src/cli/hero-meta.test.ts +15 -15
  91. package/src/cli/hero-meta.ts +10 -9
  92. package/src/cli/index.ts +36 -6
  93. package/src/cli/load-config.images.test.ts +44 -10
  94. package/src/cli/load-config.source.test.ts +50 -0
  95. package/src/cli/load-config.ts +35 -29
  96. package/src/cli/meilisearch-local.ts +1 -2
  97. package/src/cli/mode.ts +7 -58
  98. package/src/cli/registry.ts +175 -19
  99. package/src/cli/resolve-dev-sql-env.test.ts +8 -16
  100. package/src/cli/resolve-dev-sql-env.ts +13 -15
  101. package/src/cli/safe-defaults.test.ts +29 -11
  102. package/src/cli/schema.ts +65 -16
  103. package/src/cli/test.ts +58 -0
  104. package/src/cli/tui/App.tsx +252 -0
  105. package/src/cli/tui/DevLive.tsx +116 -0
  106. package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
  107. package/src/cli/tui/components/HeaderBar.tsx +67 -0
  108. package/src/cli/tui/components/LogStream.tsx +47 -0
  109. package/src/cli/tui/components/PanelCard.tsx +39 -0
  110. package/src/cli/tui/components/SelectRow.tsx +37 -0
  111. package/src/cli/tui/components/SlashPalette.tsx +172 -0
  112. package/src/cli/tui/components/Spinner.tsx +32 -0
  113. package/src/cli/tui/components/StatusBar.tsx +51 -0
  114. package/src/cli/tui/components/StatusDot.tsx +37 -0
  115. package/src/cli/tui/components/TabBar.tsx +49 -0
  116. package/src/cli/tui/components/Wordmark.tsx +43 -0
  117. package/src/cli/tui/format.ts +38 -0
  118. package/src/cli/tui/keys.test.ts +18 -0
  119. package/src/cli/tui/keys.ts +26 -0
  120. package/src/cli/tui/launch.test.ts +18 -0
  121. package/src/cli/tui/launch.ts +57 -0
  122. package/src/cli/tui/panels/Dashboard.tsx +201 -0
  123. package/src/cli/tui/panels/Database.tsx +198 -0
  124. package/src/cli/tui/panels/Dev.tsx +257 -0
  125. package/src/cli/tui/panels/Docker.tsx +357 -0
  126. package/src/cli/tui/panels/Navigator.test.ts +22 -0
  127. package/src/cli/tui/panels/Navigator.tsx +213 -0
  128. package/src/cli/tui/slash-catalog.test.ts +31 -0
  129. package/src/cli/tui/slash-catalog.ts +184 -0
  130. package/src/cli/tui/slash-run.ts +54 -0
  131. package/src/cli/tui/state/ports.ts +95 -0
  132. package/src/cli/tui/theme.ts +24 -0
  133. package/src/cli/vault-cmd.test.ts +402 -0
  134. package/src/cli/vault-cmd.ts +727 -69
  135. package/src/cli/vault-secure-input.test.ts +56 -0
  136. package/src/cli/vault-secure-input.ts +124 -0
  137. package/src/compiler/effects-infer.ts +7 -0
  138. package/src/compiler/extract.ts +12 -0
  139. package/src/compiler/fixtures/skyport/oke.config.ts +7 -5
  140. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
  141. package/src/compiler/fixtures/skyport.expected.json +1 -1
  142. package/src/compiler/generate-adopt.ts +27 -1
  143. package/src/compiler-entry.ts +7 -0
  144. package/src/config/define-config.test.ts +111 -47
  145. package/src/config/driver-defaults.test.ts +115 -0
  146. package/src/config/driver-defaults.ts +156 -0
  147. package/src/config/index.ts +246 -131
  148. package/src/config/resolve-driver.test.ts +14 -19
  149. package/src/console/server/app.ts +4 -2
  150. package/src/console/server/console.test.ts +58 -1
  151. package/src/console/server/flows.ts +22 -2
  152. package/src/console/server/index.ts +3 -0
  153. package/src/console/server/operator-db.test.ts +55 -13
  154. package/src/console/server/operator-db.ts +305 -263
  155. package/src/console/server/serve.ts +16 -7
  156. package/src/console/server/state.ts +31 -9
  157. package/src/console/server/vault.test.ts +120 -5
  158. package/src/console/server/vault.ts +208 -12
  159. package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
  160. package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
  161. package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
  162. package/src/console/ui/dist/index.html +2 -2
  163. package/src/console/ui/shell/client.ts +16 -0
  164. package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
  165. package/src/console/ui/vault/VaultA11yView.tsx +33 -1
  166. package/src/console/ui/vault/backend.test.ts +75 -0
  167. package/src/console/ui/vault/backend.ts +117 -0
  168. package/src/console/ui/vault/fixture.ts +21 -2
  169. package/src/console/ui/vault/index.ts +11 -1
  170. package/src/console/ui/vault/types.ts +26 -0
  171. package/src/docker/compose.ts +164 -61
  172. package/src/docker/derive.ts +106 -12
  173. package/src/docker/docker.test.ts +156 -110
  174. package/src/docker/helpers.ts +98 -0
  175. package/src/docker/images-config.test.ts +163 -0
  176. package/src/docker/index.ts +30 -5
  177. package/src/docker/recipes/index.ts +0 -3
  178. package/src/docker/recipes/llama-cpp.ts +4 -4
  179. package/src/docker/recipes/pgdog.ts +9 -2
  180. package/src/docker/resources.test.ts +71 -0
  181. package/src/docker/resources.ts +176 -0
  182. package/src/docker/stack-id.test.ts +11 -4
  183. package/src/docker/stack-id.ts +42 -32
  184. package/src/docker/stack.integration.test.ts +4 -15
  185. package/src/docker/types.ts +35 -3
  186. package/src/drivers/ai-ollama.integration.test.ts +2 -2
  187. package/src/drivers/conformance.test.ts +11 -12
  188. package/src/drivers/drizzle-dialect.test.ts +0 -4
  189. package/src/drivers/drizzle-dialect.ts +7 -13
  190. package/src/drivers/index.ts +24 -7
  191. package/src/drivers/journal-postgres.test.ts +3 -1
  192. package/src/drivers/journal-postgres.ts +4 -2
  193. package/src/drivers/meilisearch.ts +1 -1
  194. package/src/drivers/pglite.ts +28 -5
  195. package/src/drivers/types.ts +9 -11
  196. package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
  197. package/src/drivers/vault-aws-secrets-manager.ts +333 -0
  198. package/src/drivers/vault-builtin.test.ts +110 -0
  199. package/src/drivers/vault-builtin.ts +184 -0
  200. package/src/drivers/vault-driver-removal.test.ts +13 -0
  201. package/src/drivers/vault-managed.test.ts +95 -0
  202. package/src/drivers/vault-managed.ts +101 -25
  203. package/src/drivers/vault-types.ts +25 -5
  204. package/src/elements/ai/runtime.ts +1 -1
  205. package/src/elements/clock/chaos.test.ts +4 -1
  206. package/src/elements/clock/durable.ts +57 -4
  207. package/src/elements/clock.test.ts +13 -14
  208. package/src/elements/gate/constants.ts +18 -0
  209. package/src/elements/gate.test.ts +1 -1
  210. package/src/elements/gate.ts +2 -2
  211. package/src/elements/store/domain-ddl.test.ts +5 -12
  212. package/src/elements/store/emit-drizzle.ts +44 -19
  213. package/src/elements/store/index-boot.test.ts +15 -116
  214. package/src/elements/store/load-plugin-tables.ts +1 -1
  215. package/src/elements/store/resource-list-docs.fixture.ts +12 -6
  216. package/src/elements/store/resource-list-docs.test.ts +64 -44
  217. package/src/elements/store/resource.test.ts +17 -10
  218. package/src/elements/store/runtime.ts +9 -12
  219. package/src/elements/store/schema-decl.test.ts +16 -32
  220. package/src/elements/store/seed.test.ts +1 -2
  221. package/src/elements/store/seed.ts +7 -8
  222. package/src/elements/store/sql-condition.test.ts +2 -2
  223. package/src/elements/store/sql-session.test.ts +8 -10
  224. package/src/elements/store/sql-session.ts +10 -2
  225. package/src/elements/store.test.ts +13 -13
  226. package/src/elements/vault/audit.ts +233 -0
  227. package/src/elements/vault/boot-chain.test.ts +78 -0
  228. package/src/elements/vault/boot-chain.ts +43 -39
  229. package/src/elements/vault/builtin-adapter.test.ts +479 -0
  230. package/src/elements/vault/builtin-adapter.ts +1184 -0
  231. package/src/elements/vault/crypto.test.ts +237 -0
  232. package/src/elements/vault/crypto.ts +431 -0
  233. package/src/elements/vault/declare.ts +164 -3
  234. package/src/elements/vault/errors.ts +56 -0
  235. package/src/elements/vault/kms-unseal.test.ts +76 -0
  236. package/src/elements/vault/kms-unseal.ts +181 -0
  237. package/src/elements/vault/path.ts +90 -0
  238. package/src/elements/vault/resilience.test.ts +102 -0
  239. package/src/elements/vault/resilience.ts +107 -0
  240. package/src/elements/vault/runtime.ts +36 -4
  241. package/src/elements/vault/security-checklist.test.ts +130 -0
  242. package/src/elements/vault/storage.ts +448 -0
  243. package/src/elements/vault/types.ts +288 -0
  244. package/src/elements/vault/unseal.ts +150 -0
  245. package/src/elements/vault.test.ts +72 -4
  246. package/src/elements/vault.ts +91 -2
  247. package/src/full.ts +248 -0
  248. package/src/http.ts +41 -0
  249. package/src/i18n/interpolate-simple.ts +37 -0
  250. package/src/i18n/messages.ts +51 -4
  251. package/src/i18n-entry.ts +7 -0
  252. package/src/index.ts +35 -145
  253. package/src/journal-entry.ts +20 -0
  254. package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
  255. package/src/kernel/app.ts +40 -42
  256. package/src/kernel/auto-registry.test.ts +2 -2
  257. package/src/kernel/boot-bind/ai.test.ts +5 -5
  258. package/src/kernel/boot-bind/ai.ts +2 -1
  259. package/src/kernel/boot-bind/channel.test.ts +6 -6
  260. package/src/kernel/boot-bind/channel.ts +5 -4
  261. package/src/kernel/boot-bind/clock.ts +5 -5
  262. package/src/kernel/boot-bind/gate.ts +6 -7
  263. package/src/kernel/boot-bind/honor-config.test.ts +42 -42
  264. package/src/kernel/boot-bind/journal.ts +5 -5
  265. package/src/kernel/boot-bind/signal.ts +3 -1
  266. package/src/kernel/boot-bind/store.test.ts +55 -37
  267. package/src/kernel/boot-bind/store.ts +24 -34
  268. package/src/kernel/boot-bind/vault.ts +19 -4
  269. package/src/kernel/boot.test.ts +12 -4
  270. package/src/kernel/boot.ts +31 -19
  271. package/src/kernel/budget-entry.ts +1 -1
  272. package/src/kernel/compensate.test.ts +288 -1
  273. package/src/kernel/compensate.ts +126 -0
  274. package/src/kernel/concurrency.test.ts +10 -9
  275. package/src/kernel/effects-stamping.test.ts +27 -2
  276. package/src/kernel/element-registries.ts +5 -3
  277. package/src/kernel/flow.ts +4 -2
  278. package/src/kernel/fx.test.ts +119 -3
  279. package/src/kernel/fx.ts +215 -40
  280. package/src/kernel/index.ts +14 -0
  281. package/src/kernel/journal.ts +130 -7
  282. package/src/kernel/pipeline.test.ts +20 -6
  283. package/src/kernel/redacted.test.ts +35 -0
  284. package/src/kernel/redacted.ts +24 -2
  285. package/src/kernel/router/create-default.ts +16 -0
  286. package/src/kernel/router/create-edge.ts +18 -0
  287. package/src/kernel/router/create.ts +23 -0
  288. package/src/kernel/router/index.ts +23 -0
  289. package/src/kernel/router/linear.ts +88 -0
  290. package/src/kernel/router/regexp.ts +188 -0
  291. package/src/kernel/router/smart.ts +120 -0
  292. package/src/kernel/router/trie.ts +108 -0
  293. package/src/kernel/router/types.ts +56 -0
  294. package/src/kernel/router.ts +18 -532
  295. package/src/kernel-entry.ts +43 -0
  296. package/src/manifest/fixtures/skyport.excerpt.json +1 -1
  297. package/src/manifest/fixtures/skyport.manifest.json +1 -1
  298. package/src/plugins/config-source.test.ts +7 -7
  299. package/src/release/build-lib.ts +58 -0
  300. package/src/release/exports.test.ts +4 -2
  301. package/src/release/exports.ts +30 -4
  302. package/src/release/measure.ts +101 -22
  303. package/src/runs/duckdb.ts +7 -2
  304. package/src/shared/optional-peer.ts +41 -0
  305. package/src/term.test.ts +3 -44
  306. package/src/test/create-test-app.ts +12 -0
  307. package/src/test/provisions.integration.test.ts +1 -1
  308. package/src/test/reset-element-registries.ts +2 -0
  309. package/src/upgrade/codemods.test.ts +7 -20
  310. package/src/upgrade/codemods.ts +93 -60
  311. package/site/content/docs/console/access.mdx +0 -29
  312. package/site/content/docs/console/ai.mdx +0 -35
  313. package/site/content/docs/console/architecture.mdx +0 -35
  314. package/site/content/docs/console/channels.mdx +0 -37
  315. package/site/content/docs/console/clock.mdx +0 -51
  316. package/site/content/docs/console/flows.mdx +0 -31
  317. package/site/content/docs/console/gates.mdx +0 -73
  318. package/site/content/docs/console/index.mdx +0 -54
  319. package/site/content/docs/console/manifest-diff.mdx +0 -34
  320. package/site/content/docs/console/meta.json +0 -24
  321. package/site/content/docs/console/overview.mdx +0 -40
  322. package/site/content/docs/console/plugins.mdx +0 -41
  323. package/site/content/docs/console/privacy.mdx +0 -32
  324. package/site/content/docs/console/runs.mdx +0 -50
  325. package/site/content/docs/console/signals.mdx +0 -40
  326. package/site/content/docs/console/store.mdx +0 -32
  327. package/site/content/docs/console/tenancy.mdx +0 -32
  328. package/site/content/docs/console/traces.mdx +0 -38
  329. package/site/content/docs/console/vault.mdx +0 -41
  330. package/site/content/docs/recipes/openbao.mdx +0 -141
  331. package/src/cli/ask-dev-mode.ts +0 -40
  332. package/src/cli/dev-mode.test.ts +0 -45
  333. package/src/cli/dev-mode.ts +0 -78
  334. package/src/cli/openbao-bootstrap.test.ts +0 -150
  335. package/src/cli/openbao-bootstrap.ts +0 -321
  336. package/src/cli/openbao-restart.integration.test.ts +0 -145
  337. package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
  338. package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
  339. package/src/docker/recipes/openbao.ts +0 -47
  340. package/src/drivers/libsql.ts +0 -179
  341. package/src/drivers/sqlite.ts +0 -44
  342. package/src/drivers/vault-openbao.test.ts +0 -97
  343. package/src/drivers/vault-openbao.ts +0 -143
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Vault value/adapter/config shapes shared by every backend.
3
+ *
4
+ * These types describe the *encrypted-at-rest* Vault (secrets stored by
5
+ * path, wrapped by a KEK derived from a master key) — distinct from the
6
+ * boot-time contract declarations in `declare.ts`.
7
+ */
8
+
9
+ import type { VaultErrorCode } from "./errors.ts";
10
+
11
+ /** Content-encryption algorithm identifier persisted alongside every row. */
12
+ export type VaultAlgorithm = "aes-256-gcm";
13
+
14
+ /** Who performed a Vault operation (audit + policy). */
15
+ export type VaultActorType = "flow" | "operator" | "system" | "cli" | "unknown";
16
+
17
+ /** Caller identity attached to a mutation for audit purposes. */
18
+ export interface VaultActor {
19
+ /** Actor class. */
20
+ readonly type: VaultActorType;
21
+ /** Stable id within the actor class (flow name, operator id, …). */
22
+ readonly id?: string;
23
+ /** Correlation id for the enclosing request/run. */
24
+ readonly requestId?: string;
25
+ }
26
+
27
+ /** A decrypted secret as returned to a caller. */
28
+ export interface VaultSecret {
29
+ /** Canonical path (`prod/api/stripe`). */
30
+ readonly path: string;
31
+ /** Cleartext value — never log, never serialize. */
32
+ readonly value: string;
33
+ /** Monotonic version, starting at 1. */
34
+ readonly version: number;
35
+ /** Non-sensitive metadata stored beside the ciphertext. */
36
+ readonly metadata?: Readonly<Record<string, unknown>>;
37
+ /** Algorithm used for this version. */
38
+ readonly algorithm: VaultAlgorithm;
39
+ /** KEK generation that wrapped this version's DEK. */
40
+ readonly kekVersion: number;
41
+ /** First-write timestamp for the path. */
42
+ readonly createdAt: Date;
43
+ /** Last-write timestamp for this version. */
44
+ readonly updatedAt: Date;
45
+ /** Absolute expiry; reads past it fail with `EXPIRED`. */
46
+ readonly expiresAt?: Date;
47
+ }
48
+
49
+ /** Options for {@link VaultAdapter.set} / {@link VaultAdapter.rotate}. */
50
+ export interface VaultSetOptions {
51
+ /** Non-sensitive metadata stored beside the ciphertext. */
52
+ readonly metadata?: Readonly<Record<string, unknown>>;
53
+ /** Absolute expiry. Takes precedence over {@link ttlMs}. */
54
+ readonly expiresAt?: Date;
55
+ /** Relative expiry from now, in milliseconds. */
56
+ readonly ttlMs?: number;
57
+ /** Caller identity recorded in the audit chain. */
58
+ readonly actor?: VaultActor;
59
+ }
60
+
61
+ /** Options for read-side operations. */
62
+ export interface VaultGetOptions {
63
+ /** Read a specific version instead of the latest. */
64
+ readonly version?: number;
65
+ /** Return expired secrets instead of failing with `EXPIRED`. */
66
+ readonly allowExpired?: boolean;
67
+ /** Caller identity recorded in the audit chain. */
68
+ readonly actor?: VaultActor;
69
+ }
70
+
71
+ /** One entry in a {@link VaultAdapter.list} result (never a value). */
72
+ export interface VaultListEntry {
73
+ /** Canonical path. */
74
+ readonly path: string;
75
+ /** Latest version for the path. */
76
+ readonly version: number;
77
+ /** Last-write timestamp. */
78
+ readonly updatedAt: Date;
79
+ /** Absolute expiry, when set. */
80
+ readonly expiresAt?: Date;
81
+ }
82
+
83
+ /** Options for {@link VaultAdapter.list}. */
84
+ export interface VaultListOptions {
85
+ /** Canonical path prefix filter (`prod/api`). */
86
+ readonly prefix?: string;
87
+ /** Maximum entries to return. */
88
+ readonly limit?: number;
89
+ /** Include soft-deleted paths. */
90
+ readonly includeDeleted?: boolean;
91
+ /** Caller identity recorded in the audit chain. */
92
+ readonly actor?: VaultActor;
93
+ }
94
+
95
+ /** Operational state of a Vault backend. */
96
+ export interface VaultStatus {
97
+ /** Whether the master key is currently unavailable in memory. */
98
+ readonly sealed: boolean;
99
+ /** Whether {@link VaultAdapter.initialize} has run. */
100
+ readonly initialized: boolean;
101
+ /** Whether a master-key record exists in the backend. */
102
+ readonly masterKeyPresent: boolean;
103
+ /** Current KEK generation new writes use. */
104
+ readonly kekVersion: number;
105
+ /** Number of live (non-deleted) paths. */
106
+ readonly secretCount: number;
107
+ /** Last transition into sealed state. */
108
+ readonly lastSealedAt?: Date;
109
+ /** Last transition out of sealed state. */
110
+ readonly lastUnsealedAt?: Date;
111
+ /** How many times the Vault has been sealed since initialization. */
112
+ readonly sealCount: number;
113
+ /** Resume cursor for an in-flight KEK rewrap. */
114
+ readonly rewrapCheckpoint?: string;
115
+ /** KEK generation an in-flight rewrap is migrating toward. */
116
+ readonly rewrapTargetKekVersion?: number;
117
+ }
118
+
119
+ /** Result of a one-time {@link VaultAdapter.initialize}. */
120
+ export interface VaultInitResult {
121
+ /**
122
+ * Base64 master key — returned exactly once, never persisted in cleartext.
123
+ * The operator is responsible for storing it out of band.
124
+ */
125
+ readonly masterKey: string;
126
+ /** Verification hash persisted so later unseals can reject a wrong key. */
127
+ readonly verifyHash: string;
128
+ /** KEK generation the Vault starts at. */
129
+ readonly kekVersion: number;
130
+ }
131
+
132
+ /**
133
+ * Backend-agnostic Vault surface.
134
+ *
135
+ * `seal` / `unseal` / `initialize` are optional: pass-through backends
136
+ * (managed KMS, remote providers) own their own key lifecycle.
137
+ */
138
+ export interface VaultAdapter {
139
+ /** Backend id (`sql`, `memory`, `vault`, …). */
140
+ readonly id: string;
141
+ /**
142
+ * Read the latest (or pinned) version of a path.
143
+ *
144
+ * @param path - Canonical path
145
+ * @param options - Version pin / expiry policy / actor
146
+ */
147
+ get(path: string, options?: VaultGetOptions): Promise<VaultSecret | undefined>;
148
+ /**
149
+ * Write a new version of a path (creates it when absent).
150
+ *
151
+ * @param path - Canonical path
152
+ * @param value - Cleartext value
153
+ * @param options - Metadata / expiry / actor
154
+ */
155
+ set(path: string, value: string, options?: VaultSetOptions): Promise<VaultSecret>;
156
+ /**
157
+ * Crypto-shred a path. Returns whether anything was removed.
158
+ *
159
+ * @param path - Canonical path
160
+ * @param options - Actor
161
+ */
162
+ delete(path: string, options?: { readonly actor?: VaultActor }): Promise<boolean>;
163
+ /**
164
+ * Write a new version with a fresh DEK, retiring the previous one.
165
+ *
166
+ * @param path - Canonical path
167
+ * @param value - New cleartext value
168
+ * @param options - Metadata / expiry / actor
169
+ */
170
+ rotate(path: string, value: string, options?: VaultSetOptions): Promise<VaultSecret>;
171
+ /**
172
+ * Enumerate paths (never values).
173
+ *
174
+ * @param options - Prefix / limit / actor
175
+ */
176
+ list(options?: VaultListOptions): Promise<readonly VaultListEntry[]>;
177
+ /** Operational state for Console and health checks. */
178
+ status(): Promise<VaultStatus>;
179
+ /** Drop the in-memory master key; subsequent reads fail with `SEALED`. */
180
+ seal?(): Promise<void>;
181
+ /**
182
+ * Restore the in-memory master key.
183
+ *
184
+ * @param masterKey - Base64 or raw 32-byte master key
185
+ */
186
+ unseal?(masterKey: string | Uint8Array): Promise<void>;
187
+ /** Generate the master key and persist backend state exactly once. */
188
+ initialize?(): Promise<VaultInitResult>;
189
+ }
190
+
191
+ /** Where the master key comes from at boot. */
192
+ export type MasterKeySource =
193
+ | {
194
+ /** Read a base64 master key from an environment variable. */
195
+ readonly kind: "env";
196
+ /** Variable name (e.g. `OKE_VAULT_MASTER_KEY`). */
197
+ readonly name: string;
198
+ }
199
+ | {
200
+ /** Read a raw 32-byte or base64 master key from disk. */
201
+ readonly kind: "file";
202
+ /** Absolute or project-relative file path. */
203
+ readonly path: string;
204
+ }
205
+ | {
206
+ /** Unwrap the master key through an external KMS. */
207
+ readonly kind: "kms";
208
+ /** Provider-specific key identifier. */
209
+ readonly keyId: string;
210
+ /** Provider id (`aws`, `gcp`, …). */
211
+ readonly provider?: string;
212
+ }
213
+ | {
214
+ /** Hold the master key in process memory only (tests / dev). */
215
+ readonly kind: "memory";
216
+ };
217
+
218
+ /** Encryption block of {@link VaultElementConfig}. */
219
+ export interface VaultEncryptionConfig {
220
+ /** Content-encryption algorithm. Defaults to `aes-256-gcm`. */
221
+ readonly algorithm?: VaultAlgorithm;
222
+ /** Master-key provider. Defaults to `{ kind: "env", name: "OKE_VAULT_MASTER_KEY" }`. */
223
+ readonly masterKey?: MasterKeySource;
224
+ /** KEK generation new writes use. Defaults to `1`. */
225
+ readonly kekVersion?: number;
226
+ /**
227
+ * Rows re-wrapped per transaction during a KEK rotation. Bounded so a
228
+ * rewrap never holds a long transaction open. Defaults to `100`.
229
+ */
230
+ readonly kekRewrapBatchSize?: number;
231
+ }
232
+
233
+ /** Where audit rows are written. */
234
+ export type VaultAuditSinkKind = "db" | "stdout" | "webhook";
235
+
236
+ /** Audit block of {@link VaultElementConfig}. */
237
+ export interface VaultAuditConfig {
238
+ /** Whether auditing is on. Defaults to `true`. */
239
+ readonly enabled?: boolean;
240
+ /** Sink kind. Defaults to `db`. */
241
+ readonly sink?: VaultAuditSinkKind;
242
+ /** Destination for the `webhook` sink. */
243
+ readonly webhookUrl?: string;
244
+ /** Days of audit history to keep; older rows are purgeable. */
245
+ readonly retainDays?: number;
246
+ /** Whether each row links to its predecessor by hash. Defaults to `true`. */
247
+ readonly hashChain?: boolean;
248
+ }
249
+
250
+ /** Seal block of {@link VaultElementConfig}. */
251
+ export interface VaultSealConfig {
252
+ /** Auto-seal after this many idle milliseconds. `0` disables. */
253
+ readonly autoSealAfterMs?: number;
254
+ /** Start sealed and require an explicit unseal. Defaults to `false`. */
255
+ readonly sealOnBoot?: boolean;
256
+ /** Reject reads while sealed rather than lazily unsealing. Defaults to `true`. */
257
+ readonly requireUnsealForRead?: boolean;
258
+ }
259
+
260
+ /** Managed (hosted) backend block of {@link VaultElementConfig}. */
261
+ export interface VaultManagedConfig {
262
+ /** Whether the managed backend is used instead of local SQL. */
263
+ readonly enabled?: boolean;
264
+ /** Managed service endpoint. */
265
+ readonly endpoint?: string;
266
+ /** Tenant / namespace within the managed service. */
267
+ readonly namespace?: string;
268
+ }
269
+
270
+ /** Manifest-facing `vault` element configuration. */
271
+ export interface VaultElementConfig {
272
+ /** Algorithm + master-key + KEK settings. */
273
+ readonly encryption?: VaultEncryptionConfig;
274
+ /** Audit sink + retention settings. */
275
+ readonly audit?: VaultAuditConfig;
276
+ /** Seal lifecycle settings. */
277
+ readonly seal?: VaultSealConfig;
278
+ /** Managed backend settings. */
279
+ readonly managed?: VaultManagedConfig;
280
+ }
281
+
282
+ /** Failure detail surfaced to Console without leaking material. */
283
+ export interface VaultFailure {
284
+ /** Machine-readable reason. */
285
+ readonly code: VaultErrorCode;
286
+ /** Safe, secret-free description. */
287
+ readonly message: string;
288
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Unsealers — the only objects allowed to hold master-key material.
3
+ *
4
+ * A master key lives in a closure, never on an exported object and never
5
+ * on `globalThis`. {@link Unsealer.seal} overwrites the buffer and flips
6
+ * the instance permanently sealed; every later derivation fails with
7
+ * `SEALED`. Restoring service after a seal requires a fresh unsealer built
8
+ * from the key source again.
9
+ */
10
+
11
+ import {
12
+ deriveBackupKek,
13
+ deriveKek,
14
+ deriveVerifyHash,
15
+ MASTER_KEY_BYTES,
16
+ masterKeyFromBase64,
17
+ zeroBytes,
18
+ } from "./crypto.ts";
19
+ import { VaultError } from "./errors.ts";
20
+
21
+ /** Holder of master-key material with a one-way seal. */
22
+ export interface Unsealer {
23
+ /** Whether the master key has been zeroed. */
24
+ readonly sealed: boolean;
25
+ /** Derive the key-encryption key that wraps per-secret DEKs. */
26
+ unwrapKek(): Promise<CryptoKey>;
27
+ /** Derive the backup key-encryption key used for export bundles. */
28
+ unwrapBackupKek(): Promise<CryptoKey>;
29
+ /** Derive the persisted verification hash for this master key. */
30
+ verifyHash(): Promise<string>;
31
+ /** Zero the master key. Idempotent and irreversible for this instance. */
32
+ seal(): void;
33
+ }
34
+
35
+ /**
36
+ * Build an unsealer over a copy of `key`.
37
+ *
38
+ * The caller's buffer is copied, so the caller remains responsible for
39
+ * zeroing its own copy.
40
+ *
41
+ * @param key - Raw 32-byte master key
42
+ * @throws VaultError `INVALID_KEY` when the key is not 32 bytes
43
+ */
44
+ function createUnsealer(key: Uint8Array): Unsealer {
45
+ if (key.byteLength !== MASTER_KEY_BYTES) {
46
+ throw new VaultError("INVALID_KEY", `vault: master key must be ${MASTER_KEY_BYTES} bytes`);
47
+ }
48
+ let sealed = false;
49
+ const material = new Uint8Array(MASTER_KEY_BYTES);
50
+ material.set(key);
51
+
52
+ /** Master key or `SEALED`. */
53
+ function requireKey(): Uint8Array {
54
+ if (sealed) {
55
+ throw new VaultError("SEALED", "vault: sealed — master key is not available");
56
+ }
57
+ return material;
58
+ }
59
+
60
+ return {
61
+ get sealed() {
62
+ return sealed;
63
+ },
64
+ async unwrapKek() {
65
+ return deriveKek(requireKey());
66
+ },
67
+ async unwrapBackupKek() {
68
+ return deriveBackupKek(requireKey());
69
+ },
70
+ async verifyHash() {
71
+ return deriveVerifyHash(requireKey());
72
+ },
73
+ seal() {
74
+ sealed = true;
75
+ zeroBytes(material);
76
+ },
77
+ };
78
+ }
79
+
80
+ /**
81
+ * Unsealer from a raw key already in memory (tests, `memory` key source).
82
+ *
83
+ * @param key - Raw 32-byte master key
84
+ */
85
+ export function createMemoryUnsealer(key: Uint8Array): Unsealer {
86
+ return createUnsealer(key);
87
+ }
88
+
89
+ /**
90
+ * Unsealer from an environment-supplied key.
91
+ *
92
+ * @param key - Raw 32-byte master key decoded from the environment
93
+ */
94
+ export function createEnvUnsealer(key: Uint8Array): Unsealer {
95
+ return createUnsealer(key);
96
+ }
97
+
98
+ /**
99
+ * Unsealer from a base64 master key (environment variables, CLI flags).
100
+ *
101
+ * @param encoded - Base64 master key
102
+ */
103
+ export function createUnsealerFromBase64(encoded: string): Unsealer {
104
+ const key = masterKeyFromBase64(encoded);
105
+ try {
106
+ return createUnsealer(key);
107
+ } finally {
108
+ zeroBytes(key);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Unsealer from a key file.
114
+ *
115
+ * The file holds either exactly 32 raw bytes or base64 text (with optional
116
+ * surrounding whitespace).
117
+ *
118
+ * @param path - Key file path
119
+ * @throws VaultError `NOT_INITIALIZED` when the file is missing or unreadable
120
+ * @throws VaultError `INVALID_KEY` when the contents are not a 32-byte key
121
+ */
122
+ export async function createFileUnsealer(path: string): Promise<Unsealer> {
123
+ let raw: Uint8Array;
124
+ try {
125
+ raw = new Uint8Array(await Bun.file(path).arrayBuffer());
126
+ } catch {
127
+ // Never surface the filesystem error: its message may echo the path chain.
128
+ throw new VaultError("NOT_INITIALIZED", "vault: master key file is missing or unreadable");
129
+ }
130
+
131
+ if (raw.byteLength === MASTER_KEY_BYTES) {
132
+ try {
133
+ return createUnsealer(raw);
134
+ } finally {
135
+ zeroBytes(raw);
136
+ }
137
+ }
138
+
139
+ const text = new TextDecoder().decode(raw).trim();
140
+ zeroBytes(raw);
141
+ if (text.length === 0) {
142
+ throw new VaultError("INVALID_KEY", "vault: master key file is empty");
143
+ }
144
+ const decoded = masterKeyFromBase64(text);
145
+ try {
146
+ return createUnsealer(decoded);
147
+ } finally {
148
+ zeroBytes(decoded);
149
+ }
150
+ }
@@ -6,13 +6,15 @@
6
6
  * - resolution chain (first hit wins)
7
7
  */
8
8
 
9
- import { describe, expect, test } from "bun:test";
9
+ import { afterEach, describe, expect, test } from "bun:test";
10
10
  import { envVaultDriver, memoryVaultDriver } from "../drivers/index.ts";
11
11
  import { createFx } from "../kernel/fx.ts";
12
12
  import { REDACTED_PLACEHOLDER, Redacted } from "../kernel/redacted.ts";
13
13
  import {
14
14
  createVaultRuntime,
15
15
  fingerprintSecretSync,
16
+ listRequiredEnvNames,
17
+ resetRequiredEnvNames,
16
18
  SECRET_MASK,
17
19
  vault,
18
20
  VaultBootError,
@@ -189,6 +191,72 @@ describe("resolution chain", () => {
189
191
  });
190
192
  });
191
193
 
194
+ describe("vault.env", () => {
195
+ const NAME = "OKE_TEST_VAULT_ENV";
196
+
197
+ afterEach(() => {
198
+ delete process.env[NAME];
199
+ resetRequiredEnvNames();
200
+ });
201
+
202
+ test("reads, coerces, and treats an empty value as unset", () => {
203
+ expect(vault.env(NAME)).toBeUndefined();
204
+ process.env[NAME] = "";
205
+ expect(vault.env(NAME)).toBeUndefined();
206
+
207
+ process.env[NAME] = "42";
208
+ expect(vault.env(NAME)).toBe("42");
209
+ expect(vault.env.int(NAME)).toBe(42);
210
+
211
+ process.env[NAME] = "YES";
212
+ expect(vault.env.bool(NAME)).toBe(true);
213
+ process.env[NAME] = "off";
214
+ expect(vault.env.bool(NAME)).toBe(false);
215
+
216
+ process.env[NAME] = '{"a":1}';
217
+ expect(vault.env.json<{ a: number }>(NAME)).toEqual({ a: 1 });
218
+
219
+ delete process.env[NAME];
220
+ expect(vault.env.int(NAME, 7)).toBe(7);
221
+ expect(vault.env.bool(NAME, true)).toBe(true);
222
+ expect(vault.env.json(NAME)).toBeUndefined();
223
+ });
224
+
225
+ test("malformed values and missing defaults throw TypeError", () => {
226
+ process.env[NAME] = "not-a-number";
227
+ expect(() => vault.env.int(NAME)).toThrow(TypeError);
228
+ process.env[NAME] = "maybe";
229
+ expect(() => vault.env.bool(NAME)).toThrow(TypeError);
230
+ process.env[NAME] = "{";
231
+ expect(() => vault.env.json(NAME)).toThrow(TypeError);
232
+ delete process.env[NAME];
233
+ expect(() => vault.env.int(NAME)).toThrow(TypeError);
234
+ });
235
+
236
+ test("required registers the name and throws when unset", () => {
237
+ expect(() => vault.env.required(NAME)).toThrow(TypeError);
238
+ expect(listRequiredEnvNames()).toContain(NAME);
239
+
240
+ process.env[NAME] = "present";
241
+ expect(vault.env.required(NAME)).toBe("present");
242
+ expect(listRequiredEnvNames().filter((n) => n === NAME)).toHaveLength(1);
243
+ });
244
+
245
+ test("a missing required env var joins the secret gaps in one boot failure", async () => {
246
+ const runtime = createVaultRuntime({
247
+ secrets: [vault("STRIPE_KEY")],
248
+ requiredEnv: [NAME],
249
+ chain: [{ driver: memoryVaultDriver, options: { secrets: {} } }],
250
+ });
251
+ const error = await runtime.boot().then(
252
+ () => undefined,
253
+ (e: unknown) => e as VaultBootError,
254
+ );
255
+ expect(error).toBeInstanceOf(VaultBootError);
256
+ expect(error?.gaps.map((g) => g.name).sort()).toEqual([NAME, "STRIPE_KEY"]);
257
+ });
258
+ });
259
+
192
260
  describe("redaction + fingerprints", () => {
193
261
  test("secret value never appears in fx.log even when passed explicitly", async () => {
194
262
  const secret = "sk_live_super_secret_value_do_not_leak";
@@ -201,7 +269,7 @@ describe("redaction + fingerprints", () => {
201
269
  const lines: Array<{ message: string; data?: Record<string, unknown> }> = [];
202
270
  const { fx } = createFxContextWithVault(runtime, lines);
203
271
 
204
- const wrapped = fx.vault("STRIPE_KEY");
272
+ const wrapped = await fx.vault.get("STRIPE_KEY");
205
273
  expect(wrapped.reveal()).toBe(secret);
206
274
 
207
275
  fx.log.info(`charging with ${wrapped}`, { key: wrapped, nested: { k: wrapped } });
@@ -216,7 +284,7 @@ describe("redaction + fingerprints", () => {
216
284
  expect(lines[1]!.message).toContain(SECRET_MASK);
217
285
  });
218
286
 
219
- test("Redacted from fx.vault is masked in fx.log without a vault runtime", () => {
287
+ test("Redacted from fx.vault is masked in fx.log without a vault runtime", async () => {
220
288
  const secret = "sk_no_vault_runtime";
221
289
  const lines: Array<{ message: string; data?: Record<string, unknown> }> = [];
222
290
  const fx = createFx({
@@ -225,7 +293,7 @@ describe("redaction + fingerprints", () => {
225
293
  onLog: (_level, message, data) => lines.push({ message, data }),
226
294
  });
227
295
 
228
- const wrapped = fx.vault("STRIPE_KEY");
296
+ const wrapped = await fx.vault.get("STRIPE_KEY");
229
297
  expect(wrapped).toBeInstanceOf(Redacted);
230
298
  expect(String(wrapped)).toBe(REDACTED_PLACEHOLDER);
231
299
  expect(`${wrapped}`).toBe(REDACTED_PLACEHOLDER);
@@ -2,7 +2,7 @@
2
2
  * Vault element — protected knowledge.
3
3
  *
4
4
  * Physics: secrets · config · environment.
5
- * Drivers: `env` · `openbao` · `managed`.
5
+ * Drivers: `env` · `vault` · `managed` · `memory`.
6
6
  *
7
7
  * A declaration is a contract, never a value. Boot validates every contract
8
8
  * and lists all gaps at once. Logs/traces receive fingerprints and redaction
@@ -12,17 +12,22 @@
12
12
 
13
13
  export {
14
14
  vault,
15
+ vaultEnvApi,
15
16
  fromDocker,
16
17
  FROM_DOCKER_PREFIX,
17
18
  isFromDocker,
18
19
  fromDockerRole,
20
+ listRequiredEnvNames,
21
+ readEnv,
22
+ resetRequiredEnvNames,
19
23
  } from "./vault/declare.ts";
20
- export type { VaultSecretDecl, VaultSecretOptions } from "./vault/declare.ts";
24
+ export type { VaultEnvApi, VaultSecretDecl, VaultSecretOptions } from "./vault/declare.ts";
21
25
 
22
26
  export {
23
27
  createVaultRuntime,
24
28
  VaultBootError,
25
29
  SECRET_MASK,
30
+ requiredEnvGaps,
26
31
  resolveLayerSource,
27
32
  } from "./vault/runtime.ts";
28
33
  export type {
@@ -36,6 +41,90 @@ export type {
36
41
 
37
42
  export { COMPOSE_ENV_REL, resolveComposeEnvPath } from "./vault/chain.ts";
38
43
 
44
+ export { VaultError, isVaultError } from "./vault/errors.ts";
45
+ export type { VaultErrorCode } from "./vault/errors.ts";
46
+
47
+ export { canonicalizePath, MAX_VAULT_PATH_LENGTH } from "./vault/path.ts";
48
+ export type {
49
+ MasterKeySource,
50
+ VaultActor,
51
+ VaultActorType,
52
+ VaultAdapter,
53
+ VaultAlgorithm,
54
+ VaultAuditConfig,
55
+ VaultAuditSinkKind,
56
+ VaultElementConfig,
57
+ VaultEncryptionConfig,
58
+ VaultGetOptions,
59
+ VaultInitResult,
60
+ VaultListEntry,
61
+ VaultListOptions,
62
+ VaultManagedConfig,
63
+ VaultSealConfig,
64
+ VaultSecret,
65
+ VaultSetOptions,
66
+ VaultStatus,
67
+ } from "./vault/types.ts";
68
+
69
+ export {
70
+ BACKUP_MAGIC,
71
+ createBuiltinVaultAdapter,
72
+ DEFAULT_KEK_REWRAP_BATCH_SIZE,
73
+ sqlConnectionAsExec,
74
+ } from "./vault/builtin-adapter.ts";
75
+ export type {
76
+ BuiltinVaultAdapter,
77
+ CreateBuiltinVaultOptions,
78
+ VaultRotateMasterResult,
79
+ } from "./vault/builtin-adapter.ts";
80
+
81
+ export {
82
+ createAuditSink,
83
+ createNullAuditSink,
84
+ computeAuditRowHash,
85
+ AUDIT_GENESIS_HASH,
86
+ } from "./vault/audit.ts";
87
+ export type { AuditAction, AuditEntry, AuditSink, AuditWriter } from "./vault/audit.ts";
88
+
89
+ export {
90
+ createSqlAuditWriter,
91
+ ensureVaultTables,
92
+ purgeAuditBefore,
93
+ purgeExpiredSecrets,
94
+ readAuditPage,
95
+ verifyAuditChain,
96
+ VAULT_DDL_STATEMENTS,
97
+ } from "./vault/storage.ts";
98
+ export type {
99
+ AuditChainResult,
100
+ AuditPageOptions,
101
+ PurgeExpiredResult,
102
+ SqlExec,
103
+ VaultAuditRecord,
104
+ } from "./vault/storage.ts";
105
+
106
+ export {
107
+ createResilientSqlExec,
108
+ DEFAULT_RETRY,
109
+ isRetryableError,
110
+ withResilience,
111
+ } from "./vault/resilience.ts";
112
+ export type { RetryConfig } from "./vault/resilience.ts";
113
+
114
+ export {
115
+ createEnvUnsealer,
116
+ createFileUnsealer,
117
+ createMemoryUnsealer,
118
+ createUnsealerFromBase64,
119
+ } from "./vault/unseal.ts";
120
+ export type { Unsealer } from "./vault/unseal.ts";
121
+
122
+ export { createAwsKmsUnsealer, wrapMasterWithAwsKms } from "./vault/kms-unseal.ts";
123
+ export type {
124
+ CreateAwsKmsUnsealerOptions,
125
+ WrapMasterWithAwsKmsOptions,
126
+ } from "./vault/kms-unseal.ts";
127
+
39
128
  export { fingerprintSecret, fingerprintSecretSync } from "./vault/fingerprint.ts";
40
129
 
41
130
  export { createSecretRedactor } from "./vault/redact.ts";