@homeflare/distilled-openbao 0.2.0 → 0.2.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 (49) hide show
  1. package/README.md +28 -3
  2. package/dist/credentials.d.ts +3 -2
  3. package/dist/credentials.d.ts.map +1 -1
  4. package/dist/credentials.js +5 -3
  5. package/dist/credentials.js.map +1 -1
  6. package/dist/errors.d.ts +2 -2
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/protocol-mount-tables.d.ts +10 -0
  9. package/dist/protocol-mount-tables.d.ts.map +1 -0
  10. package/dist/protocol-mount-tables.js +39 -0
  11. package/dist/protocol-mount-tables.js.map +1 -0
  12. package/dist/protocol-mount-tables.test.d.ts +2 -0
  13. package/dist/protocol-mount-tables.test.d.ts.map +1 -0
  14. package/dist/protocol-mount-tables.test.js +164 -0
  15. package/dist/protocol-mount-tables.test.js.map +1 -0
  16. package/dist/protocol-requests.test.d.ts +2 -0
  17. package/dist/protocol-requests.test.d.ts.map +1 -0
  18. package/dist/protocol-requests.test.js +32 -0
  19. package/dist/protocol-requests.test.js.map +1 -0
  20. package/dist/protocol.d.ts.map +1 -1
  21. package/dist/protocol.js +11 -5
  22. package/dist/protocol.js.map +1 -1
  23. package/dist/retry.d.ts +4 -5
  24. package/dist/retry.d.ts.map +1 -1
  25. package/dist/retry.js +4 -5
  26. package/dist/retry.js.map +1 -1
  27. package/dist/services/auth.d.ts +46 -1
  28. package/dist/services/auth.d.ts.map +1 -1
  29. package/dist/services/auth.js +39 -1
  30. package/dist/services/auth.js.map +1 -1
  31. package/dist/services/mounts.d.ts +46 -1
  32. package/dist/services/mounts.d.ts.map +1 -1
  33. package/dist/services/mounts.js +39 -1
  34. package/dist/services/mounts.js.map +1 -1
  35. package/dist/traits.d.ts +3 -8
  36. package/dist/traits.d.ts.map +1 -1
  37. package/dist/traits.js +5 -1
  38. package/dist/traits.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/credentials.ts +9 -5
  41. package/src/errors.ts +4 -2
  42. package/src/protocol-mount-tables.test.ts +190 -0
  43. package/src/protocol-mount-tables.ts +60 -0
  44. package/src/protocol-requests.test.ts +66 -0
  45. package/src/protocol.ts +11 -5
  46. package/src/retry.ts +4 -5
  47. package/src/services/auth.ts +96 -2
  48. package/src/services/mounts.ts +96 -2
  49. package/src/traits.ts +9 -1
package/README.md CHANGED
@@ -33,6 +33,22 @@ actually measured against the ephemeral dev server (see
33
33
  `patches/policies/_errors.json` in the distilled clone); more are added as
34
34
  each kit family migrates onto this SDK.
35
35
 
36
+ The copied source is distilled commit
37
+ `52a18936d4e46786c005424549b6085c144ce047` (2026-09-24). Its auth-method and
38
+ secrets-engine inventories return typed maps keyed by exact mount path. The
39
+ OpenBao 2.6.2 OpenAPI document omits both response schemas; source-side Smithy
40
+ patches derive them from the pinned server's `vault/logical_system.go`
41
+ `mountInfo`, `handleAuthTable` and `handleMountTable`, cross-checked against the
42
+ official Go API client. See `packages/openbao/patches/mount-tables.md` in that
43
+ source commit for provenance and reproduction.
44
+
45
+ Only those two inventory operations require and validate a `data` map.
46
+ Unknown metadata and nested mount paths survive; malformed bodies fail with
47
+ `OpenBaoParseError` without response values. An explicit empty map is valid.
48
+ HTTP failures remain typed errors, including a 404 of the table endpoint;
49
+ individual mount absence is a missing key in a successful inventory. This
50
+ does not add auth/login envelope support or custom plugin endpoints.
51
+
36
52
  ```ts
37
53
  import * as OpenBao from '@distilled.cloud/openbao'; // aliased onto this package — see docs/distilled-interim.md
38
54
  import * as Effect from 'effect/Effect';
@@ -59,15 +75,24 @@ swap with no import changes anywhere in the kit.
59
75
 
60
76
  ## Updating it
61
77
 
62
- From the distilled clone's `homeflare/openbao` worktree:
78
+ ⚠️ **The commit above lives only in the house's local `alchemy-run/distilled`
79
+ clone.** Per the never-push policy at the top of this file (decision 42),
80
+ that clone's `homeflare/openbao` worktree is never pushed anywhere — no
81
+ fork, no branch, no PR on `alchemy-run/distilled` itself — so the commit
82
+ hash is a provenance record for this copy, not a fetchable ref. Regenerating
83
+ needs a machine with that clone (or a fresh one built from
84
+ `.agents/skills/distilled-sdk/SKILL.md` against the same OpenBao pin), not
85
+ a checkout of the hash from origin.
86
+
87
+ From that worktree, at the recorded source commit:
63
88
 
64
89
  ```sh
65
90
  DISTILLED_SPECS_LOCAL=1 pnpm generate openbao # or pnpm specs:sync first for a real refresh
66
91
  pnpm typecheck:ci && pnpm specs:check && pnpm format:check
67
92
  ```
68
93
 
69
- Then copy `src/` back here (`cp -R`, `diff -rq` to prove it), bump this
70
- package's `version`, and add a changeset.
94
+ Then copy `src/` back here (`cp -R`, `diff -rq` to prove it), update the source
95
+ commit above, and add a changeset. Changesets owns the package version bump.
71
96
 
72
97
  ## License
73
98
 
@@ -12,7 +12,8 @@ export declare const API_PATH = "/v1";
12
12
  /** Normalize an address (or an already-complete `/v1` root) into the API base URL. */
13
13
  export declare const normalizeBaseUrl: (addr: string) => string;
14
14
  export interface Config {
15
- readonly token: Redacted.Redacted<string>;
15
+ /** Absent for a local agent listener that supplies its own identity. */
16
+ readonly token?: Redacted.Redacted<string>;
16
17
  /** Fully-qualified API root, e.g. `http://127.0.0.1:8200/v1`. */
17
18
  readonly apiBaseUrl: string;
18
19
  /** `X-Vault-Namespace`, when the estate uses one. Absent = root namespace. */
@@ -24,7 +25,7 @@ export declare class Credentials extends Credentials_base {
24
25
  export declare const CredentialsFromEnv: Layer.Layer<Credentials, never, never>;
25
26
  /** Convenience layer from a plain token, address and optional namespace. */
26
27
  export declare const credentials: (config: {
27
- readonly token: string | Redacted.Redacted<string>;
28
+ readonly token?: string | Redacted.Redacted<string>;
28
29
  readonly addr: string;
29
30
  readonly namespace?: string;
30
31
  }) => Layer.Layer<Credentials>;
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAc9B,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAG/C,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;;AAED,qBAAa,WAAY,SAAQ,gBAGR;CAAG;AAQ5B,eAAO,MAAM,kBAAkB,wCAgB9B,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,WAAY;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,KAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAWxB,CAAC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAc9B,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAG/C,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;;AAED,qBAAa,WAAY,SAAQ,gBAGR;CAAG;AAQ5B,eAAO,MAAM,kBAAkB,wCAmB9B,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,WAAY;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,KAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAWxB,CAAC"}
@@ -44,14 +44,16 @@ export const normalizeBaseUrl = (addr) => {
44
44
  export class Credentials extends Context.Service()("OpenBaoCredentials") {
45
45
  }
46
46
  const envConfig = EffectConfig.all({
47
- token: EffectConfig.String("BAO_TOKEN"),
47
+ token: EffectConfig.String("BAO_TOKEN").pipe(EffectConfig.option),
48
48
  addr: EffectConfig.String("BAO_ADDR"),
49
49
  namespace: EffectConfig.String("BAO_NAMESPACE").pipe(EffectConfig.option),
50
50
  });
51
51
  export const CredentialsFromEnv = Layer.succeed(Credentials, envConfig.pipe(Effect.mapError(() => new ConfigError({
52
- message: "BAO_ADDR and BAO_TOKEN environment variables are required",
52
+ message: "BAO_ADDR environment variable is required",
53
53
  })), Effect.map(({ token, addr, namespace }) => ({
54
- token: Redacted.make(token),
54
+ token: token.valueOrUndefined === undefined
55
+ ? undefined
56
+ : Redacted.make(token.valueOrUndefined),
55
57
  apiBaseUrl: normalizeBaseUrl(addr),
56
58
  namespace: namespace.valueOrUndefined,
57
59
  })), Effect.orDie));
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE;IACvD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;AACxE,CAAC,CAAC;AAUF,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAG7C,CAAC,oBAAoB,CAAC;CAAG;AAE5B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC;IACjC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;IACvC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;IACrC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAC7C,WAAW,EACX,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CACH,IAAI,WAAW,CAAC;IACd,OAAO,EAAE,2DAA2D;CACrE,CAAC,CACL,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,SAAS,CAAC,gBAAgB;CACtC,CAAC,CAAC,EACH,MAAM,CAAC,KAAK,CACb,CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAI3B,EAA4B,EAAE,CAC7B,KAAK,CAAC,OAAO,CACX,WAAW,EACX,MAAM,CAAC,OAAO,CAAC;IACb,KAAK,EACH,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,MAAM,CAAC,KAAK;IAClB,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC,SAAS;CAC5B,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE;IACvD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;AACxE,CAAC,CAAC;AAWF,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAG7C,CAAC,oBAAoB,CAAC;CAAG;AAE5B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC;IACjC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACjE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;IACrC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAC7C,WAAW,EACX,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CACH,IAAI,WAAW,CAAC;IACd,OAAO,EAAE,2CAA2C;CACrD,CAAC,CACL,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,KAAK,EACH,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAClC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC3C,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,SAAS,CAAC,gBAAgB;CACtC,CAAC,CAAC,EACH,MAAM,CAAC,KAAK,CACb,CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAI3B,EAA4B,EAAE,CAC7B,KAAK,CAAC,OAAO,CACX,WAAW,EACX,MAAM,CAAC,OAAO,CAAC;IACb,KAAK,EACH,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,MAAM,CAAC,KAAK;IAClB,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC,SAAS;CAC5B,CAAC,CACH,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  * status (and message, when OpenBao supplies one) under `patches/`.
17
17
  */
18
18
  export { BadGateway, BadRequest, Conflict, ConfigError, Forbidden, GatewayTimeout, InternalServerError, Locked, NotFound, ServiceUnavailable, TooManyRequests, Unauthorized, UnprocessableEntity, HTTP_STATUS_MAP, DEFAULT_ERRORS, API_ERRORS, } from "@distilled.cloud/core/errors";
19
- import type { DefaultErrors as CoreDefaultErrors } from "@distilled.cloud/core/errors";
19
+ import type { API_ERRORS } from "@distilled.cloud/core/errors";
20
20
  import * as Schema from "effect/Schema";
21
21
  declare const UnknownOpenBaoError_base: Schema.Class<UnknownOpenBaoError, Schema.TaggedStruct<"UnknownOpenBaoError", {
22
22
  readonly code: Schema.optional<Schema.String>;
@@ -53,5 +53,5 @@ export type ClientErrors = UnknownOpenBaoError | OpenBaoParseError;
53
53
  * Default OpenBao operation errors: the shared HTTP status errors from core
54
54
  * plus the client-level fallback/decode errors.
55
55
  */
56
- export type DefaultErrors = CoreDefaultErrors | ClientErrors;
56
+ export type DefaultErrors = InstanceType<(typeof API_ERRORS)[number]> | ClientErrors;
57
57
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;;;;;;;AAGxC;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,wBAOT;CAAG;;;;;;;;;AAEnC,kCAAkC;AAClC,qBAAa,iBAAkB,SAAQ,sBAMR;CAAG;AAElC;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,YAAY,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;;;;;;;AAGxC;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,wBAOT;CAAG;;;;;;;;;AAEnC,kCAAkC;AAClC,qBAAa,iBAAkB,SAAQ,sBAMR;CAAG;AAElC;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,YAAY,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GACzC,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The auth/mount inventories require a data map (OpenBao v2.6.2
3
+ * vault/logical_system.go:930-959,2108-2134; api/v2 sys_{auth,mounts}.go).
4
+ * A missing envelope must never masquerade as an empty table and authorize
5
+ * a consumer's create. Other logical, health and login shapes are separate.
6
+ */
7
+ import * as API from "@distilled.cloud/core/api";
8
+ import * as Layer from "effect/Layer";
9
+ export declare const withMountTables: (base: Layer.Layer<API.Protocol>) => Layer.Layer<API.Protocol>;
10
+ //# sourceMappingURL=protocol-mount-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-mount-tables.d.ts","sourceRoot":"","sources":["../src/protocol-mount-tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,GAAG,MAAM,2BAA2B,CAAC;AAGjD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAatC,eAAO,MAAM,eAAe,SACpB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAmCE,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The auth/mount inventories require a data map (OpenBao v2.6.2
3
+ * vault/logical_system.go:930-959,2108-2134; api/v2 sys_{auth,mounts}.go).
4
+ * A missing envelope must never masquerade as an empty table and authorize
5
+ * a consumer's create. Other logical, health and login shapes are separate.
6
+ */
7
+ import * as API from "@distilled.cloud/core/api";
8
+ import { getAnn } from "@distilled.cloud/core/protocol-http";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
11
+ import * as Schema from "effect/Schema";
12
+ import { OpenBaoParseError } from "./errors.js";
13
+ import { mountTableSymbol } from "./traits.js";
14
+ const invalidTable = () => new OpenBaoParseError({
15
+ body: undefined,
16
+ cause: "Response does not match the declared OpenBao mount table schema",
17
+ });
18
+ const record = (body) => typeof body === "object" && body !== null && !Array.isArray(body);
19
+ export const withMountTables = (base) => Layer.effect(API.Protocol, Effect.gen(function* () {
20
+ const protocol = yield* API.Protocol;
21
+ return API.Protocol.of({
22
+ encode: protocol.encode,
23
+ decode: (args) => {
24
+ if (!getAnn(args.outputAst, mountTableSymbol) ||
25
+ args.response.status >= 400 ||
26
+ args.config.output === undefined)
27
+ return protocol.decode(args);
28
+ // These schemas use wire names and contain no sensitive transforms.
29
+ // Validate the original envelope before core's empty-body fallback;
30
+ // retain unknown metadata after validation for forward compatibility.
31
+ // Neither body values nor schema diagnostics may enter parse errors.
32
+ const output = args.config.output;
33
+ return args.response.json.pipe(Effect.mapError(invalidTable), Effect.flatMap((envelope) => record(envelope) && record(envelope.data)
34
+ ? Schema.decodeUnknownEffect(Schema.toType(output))(envelope.data).pipe(Effect.as(envelope.data), Effect.mapError(invalidTable))
35
+ : Effect.fail(invalidTable())));
36
+ },
37
+ });
38
+ })).pipe(Layer.provide(base));
39
+ //# sourceMappingURL=protocol-mount-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-mount-tables.js","sourceRoot":"","sources":["../src/protocol-mount-tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,IAAI,iBAAiB,CAAC;IACpB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,iEAAiE;CACzE,CAAC,CAAC;AACL,MAAM,MAAM,GAAG,CAAC,IAAa,EAAmC,EAAE,CAChE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAA+B,EACJ,EAAE,CAC7B,KAAK,CAAC,MAAM,CACV,GAAG,CAAC,QAAQ,EACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrC,OAAO,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACf,IACE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG;gBAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;gBAEhC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,oEAAoE;YACpE,oEAAoE;YACpE,sEAAsE;YACtE,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAC5B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAC/C,QAAQ,CAAC,IAAI,CACd,CAAC,IAAI,CACJ,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxB,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC9B;gBACH,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAChC,CACwB,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol-mount-tables.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-mount-tables.test.d.ts","sourceRoot":"","sources":["../src/protocol-mount-tables.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as HttpClient from "effect/unstable/http/HttpClient";
5
+ import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
6
+ import { credentials } from "./credentials.js";
7
+ import { OpenBaoParseError } from "./errors.js";
8
+ import * as Retry from "./retry.js";
9
+ import { authListEnabledMethods } from "./services/auth.js";
10
+ import { mountsListSecretsEngines } from "./services/mounts.js";
11
+ // Synthetic fixture from v2.6.2 vault/logical_system.go:871-928, not a live
12
+ // vault inventory. Nil options is legal; optional arrays may be absent.
13
+ const entry = {
14
+ type: "approle",
15
+ description: "fixture",
16
+ accessor: "auth_fixture",
17
+ uuid: "fixture-uuid",
18
+ plugin_version: "",
19
+ running_plugin_version: "v2.6.2+builtin",
20
+ running_sha256: "",
21
+ local: false,
22
+ seal_wrap: false,
23
+ external_entropy_access: false,
24
+ options: null,
25
+ config: { default_lease_ttl: 0, max_lease_ttl: 0, force_no_cache: false },
26
+ };
27
+ for (const [path, operation] of [
28
+ ["/sys/auth", authListEnabledMethods],
29
+ ["/sys/mounts", mountsListSecretsEngines],
30
+ ]) {
31
+ describe(path, () => {
32
+ const call = (body, status = 200, raw = false) => {
33
+ let calls = 0;
34
+ const client = HttpClient.make((request) => {
35
+ calls++;
36
+ expect(request.method).toBe("GET");
37
+ expect(new URL(request.url).pathname).toBe(`/v1${path}`);
38
+ expect(request.headers["x-vault-request"]).toBe("true");
39
+ expect(request.headers["x-vault-token"]).toBeUndefined();
40
+ expect(request.headers["x-vault-namespace"]).toBe("fixture");
41
+ return Effect.succeed(HttpClientResponse.fromWeb(request, new Response(status === 204 ? null : raw ? String(body) : JSON.stringify(body), { status })));
42
+ });
43
+ const effect = operation({}).pipe(Retry.none, Effect.provide(Layer.mergeAll(Layer.succeed(HttpClient.HttpClient, client), credentials({ addr: "http://fake.invalid", namespace: "fixture" }))));
44
+ return { effect, calls: () => calls };
45
+ };
46
+ test("dynamic nested mount paths and unknown metadata survive", async () => {
47
+ const configured = {
48
+ ...entry,
49
+ type: "kv",
50
+ options: { version: "2", custom_option: "yes" },
51
+ deprecation_status: "supported",
52
+ future_metadata: { key: "retained" },
53
+ config: {
54
+ ...entry.config,
55
+ token_type: "default-service",
56
+ listing_visibility: "unauth",
57
+ audit_non_hmac_request_keys: ["mount-secret-marker"],
58
+ audit_non_hmac_response_keys: [],
59
+ passthrough_request_headers: ["X-Forwarded-For"],
60
+ allowed_response_headers: ["X-Fixture"],
61
+ future_config: { keep: true },
62
+ user_lockout_config: {
63
+ user_lockout_counter_reset_duration: 900,
64
+ user_lockout_threshold: 5,
65
+ user_lockout_duration: 900,
66
+ user_lockout_disable: false,
67
+ },
68
+ },
69
+ };
70
+ const data = { "approle/": entry, "team/nested/": configured };
71
+ const { effect, calls } = call({
72
+ request_id: "synthetic",
73
+ data,
74
+ warnings: null,
75
+ });
76
+ const result = await Effect.runPromise(effect);
77
+ // Indexed values are typed MountInfo | undefined, not {} or unknown.
78
+ const type = result["team/nested/"]?.type;
79
+ expect(type).toBe("kv");
80
+ expect(result).toEqual(data);
81
+ expect(calls()).toBe(1);
82
+ });
83
+ test("an explicit empty data map is a valid inventory", async () => {
84
+ expect(await Effect.runPromise(call({ data: {} }).effect)).toEqual({});
85
+ });
86
+ for (const [name, body] of [
87
+ ["no envelope", {}],
88
+ ["null body", null],
89
+ ["no data", { request_id: "fixture" }],
90
+ ["null data", { data: null }],
91
+ ["array data", { data: [] }],
92
+ ["scalar data", { data: "mount-secret-marker" }],
93
+ ["null entry", { data: { "x/": null } }],
94
+ ["empty entry", { data: { "x/": {} } }],
95
+ [
96
+ "invalid field",
97
+ {
98
+ data: {
99
+ "x/": { ...entry, type: "mount-secret-marker", local: "false" },
100
+ },
101
+ },
102
+ ],
103
+ [
104
+ "invalid config",
105
+ {
106
+ data: {
107
+ "x/": {
108
+ ...entry,
109
+ config: { ...entry.config, max_lease_ttl: "60" },
110
+ },
111
+ },
112
+ },
113
+ ],
114
+ [
115
+ "invalid options",
116
+ { data: { "x/": { ...entry, options: { version: 2 } } } },
117
+ ],
118
+ [
119
+ "invalid lockout",
120
+ {
121
+ data: {
122
+ "x/": {
123
+ ...entry,
124
+ config: { ...entry.config, user_lockout_config: {} },
125
+ },
126
+ },
127
+ },
128
+ ],
129
+ ]) {
130
+ test(`rejects ${name} without exposing response values`, async () => {
131
+ const { effect, calls } = call(body);
132
+ const error = await Effect.runPromise(effect.pipe(Effect.flip));
133
+ expect(error).toBeInstanceOf(OpenBaoParseError);
134
+ expect(error).toMatchObject({ body: undefined });
135
+ expect(JSON.stringify(error)).not.toContain("mount-secret-marker");
136
+ expect(calls()).toBe(1);
137
+ });
138
+ }
139
+ for (const [status, text] of [
140
+ [200, ""],
141
+ [200, "mount-secret-marker: invalid JSON"],
142
+ [204, ""],
143
+ ]) {
144
+ test(`rejects ${status} empty or invalid JSON safely`, async () => {
145
+ const error = await Effect.runPromise(call(text, status, true).effect.pipe(Effect.flip));
146
+ expect(error).toBeInstanceOf(OpenBaoParseError);
147
+ expect(JSON.stringify(error)).not.toContain("mount-secret-marker");
148
+ });
149
+ }
150
+ for (const [status, tag] of [
151
+ [401, "Unauthorized"],
152
+ [403, "Forbidden"],
153
+ [404, "NotFound"],
154
+ [500, "InternalServerError"],
155
+ ]) {
156
+ test(`${status} remains a typed HTTP failure, never an empty map`, async () => {
157
+ const { effect, calls } = call({ errors: ["fixture refusal"] }, status);
158
+ expect(await Effect.runPromise(effect.pipe(Effect.flip))).toMatchObject({ _tag: tag });
159
+ expect(calls()).toBe(1);
160
+ });
161
+ }
162
+ });
163
+ }
164
+ //# sourceMappingURL=protocol-mount-tables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-mount-tables.test.js","sourceRoot":"","sources":["../src/protocol-mount-tables.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol-requests.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-requests.test.d.ts","sourceRoot":"","sources":["../src/protocol-requests.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { expect, test } from "bun:test";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as HttpClient from "effect/unstable/http/HttpClient";
5
+ import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
6
+ import { credentials } from "./credentials.js";
7
+ import * as Retry from "./retry.js";
8
+ import { policiesDeleteAclPolicy } from "./services/policies.js";
9
+ for (const token of [undefined, "", "test-token"]) {
10
+ test(`agent request header is present; ${token ? "nonempty" : "absent or empty"} token has correct header semantics`, async () => {
11
+ const client = HttpClient.make((request) => {
12
+ expect(request.headers["x-vault-request"]).toBe("true");
13
+ if (token)
14
+ expect(request.headers["x-vault-token"]).toBe(token);
15
+ else
16
+ expect(request.headers["x-vault-token"]).toBeUndefined();
17
+ expect(request.headers["x-vault-namespace"]).toBeUndefined();
18
+ return Effect.succeed(HttpClientResponse.fromWeb(request, new Response(null, { status: 204 })));
19
+ });
20
+ await Effect.runPromise(policiesDeleteAclPolicy({ name: "test" }).pipe(Retry.none, Effect.provide(Layer.mergeAll(Layer.succeed(HttpClient.HttpClient, client), credentials({ addr: "http://fake.invalid", token })))));
21
+ });
22
+ }
23
+ test("every status mapped by the protocol is represented in the operation error union", async () => {
24
+ // These catchTag calls must compile: core DEFAULT_ERRORS excludes both tags,
25
+ // but OpenBaoProtocol's default HTTP_STATUS_MAP emits them for every operation.
26
+ for (const status of [403, 404]) {
27
+ const client = HttpClient.make((request) => Effect.succeed(HttpClientResponse.fromWeb(request, Response.json({ errors: [] }, { status }))));
28
+ const tag = await Effect.runPromise(policiesDeleteAclPolicy({ name: "test" }).pipe(Retry.none, Effect.as("success"), Effect.catchTag("Forbidden", () => Effect.succeed("Forbidden")), Effect.catchTag("NotFound", () => Effect.succeed("NotFound")), Effect.provide(Layer.mergeAll(Layer.succeed(HttpClient.HttpClient, client), credentials({ addr: "http://fake.invalid", token: "test-token" })))));
29
+ expect(tag).toBe(status === 403 ? "Forbidden" : "NotFound");
30
+ }
31
+ });
32
+ //# sourceMappingURL=protocol-requests.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-requests.test.js","sourceRoot":"","sources":["../src/protocol-requests.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,KAAK,eAAe,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAKhE,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,eAAe,CAAC,eAAe,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC;AAyBnE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CA4BlD,CAAC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,KAAK,UAAU,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,KAAK,eAAe,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,KAAK,GAAG,MAAM,2BAA2B,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAKhE,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtE;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,WAAW,GACX,eAAe,CAAC,eAAe,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC;AAyBnE,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CA+B5B,CAAC"}
package/dist/protocol.js CHANGED
@@ -31,9 +31,11 @@
31
31
  * match on status, or on message when OpenBao actually supplies one — see
32
32
  * `patches/`.
33
33
  *
34
- * Authentication is a single header, `X-Vault-Token`, plus an optional
35
- * `X-Vault-Namespace` when the credential carries one — the estate always
36
- * does (`BAO_NAMESPACE=homeflare`). A namespace does not change a mounted
34
+ * Authentication is `X-Vault-Token` when a credential carries a nonempty
35
+ * token; omit it for a local agent that supplies its own identity. An
36
+ * optional `X-Vault-Namespace` selects a namespace; absent means root.
37
+ * `X-Vault-Request: true` admits agent listeners with require_request_header
38
+ * (OpenBao v2.6.2 command/agent.go:544-548). A namespace does not change a mounted
37
39
  * backend's own path shape (see `stacks/distilled-submodules/spec-repos/
38
40
  * openbao/fetch-specs.ts`'s module docs for how that was confirmed), so it
39
41
  * is purely a request header here, never a path segment.
@@ -43,6 +45,7 @@ import * as Redacted from "effect/Redacted";
43
45
  import { makeRestProtocol, } from "@distilled.cloud/core/protocol-rest";
44
46
  import { Credentials } from "./credentials.js";
45
47
  import { UnknownOpenBaoError } from "./errors.js";
48
+ import { withMountTables } from "./protocol-mount-tables.js";
46
49
  /**
47
50
  * OpenBao error bodies are `{"errors": [...]}`. Several strings are joined
48
51
  * (`"; "`) rather than only the first kept, so a matcher's `includes` still
@@ -77,7 +80,10 @@ export const OpenBaoProtocol = makeRestProtocol({
77
80
  }),
78
81
  baseUrl: (creds) => creds.apiBaseUrl,
79
82
  headers: (creds) => ({
80
- "X-Vault-Token": Redacted.value(creds.token),
83
+ ...(creds.token && Redacted.value(creds.token) !== ""
84
+ ? { "X-Vault-Token": Redacted.value(creds.token) }
85
+ : {}),
86
+ "X-Vault-Request": "true",
81
87
  ...(creds.namespace ? { "X-Vault-Namespace": creds.namespace } : {}),
82
88
  Accept: "application/json",
83
89
  }),
@@ -92,5 +98,5 @@ export const OpenBaoProtocol = makeRestProtocol({
92
98
  message,
93
99
  body,
94
100
  }),
95
- });
101
+ }).pipe(withMountTables);
96
102
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAK5C,OAAO,EACL,gBAAgB,GAEjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAgBtE;;;;;;;GAOG;AACH,MAAM,aAAa,GAAG,CAAC,IAAa,EAAiC,EAAE;IACrE,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC5E,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC5E,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAW,EAAE;IACnD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAI,IAAgC,CAAC,IAAI,CAAC;IACpD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,gBAAgB,CAAS;IACvB,uEAAuE;IACvE,wEAAwE;IACxE,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnB,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IACF,aAAa;IACb,iBAAiB;IACjB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,mBAAmB,CAAC;QACtB,IAAI,EACF,OAAO,IAAI,KAAK,QAAQ;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,CAAC,CAAC,SAAS;QACjB,OAAO;QACP,IAAI;KACL,CAAC;CACL,CAAC,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/dist/retry.d.ts CHANGED
@@ -10,11 +10,10 @@
10
10
  * `packages/alchemy/src/openbao/bao-http.ts` caps in-flight OpenBao
11
11
  * exchanges at 8 process-wide (`BaoGate`, a `Semaphore`) after a real
12
12
  * outage: unbounded Alchemy fan-out took the dev listener's socket down
13
- * (measured 2026-09-14). That cap is `HttpClient` middleware, not a retry
14
- * policy, and stays exactly where it is — the kit's Effect runtime provides
15
- * the gated `HttpClient.HttpClient` layer underneath whichever protocol
16
- * (hand-rolled or this SDK) issues the request, so it keeps applying
17
- * unchanged to every call this package makes.
13
+ * (measured 2026-09-14). That cap lives inside the kit's call runner, not
14
+ * inside HttpClient. SDK consumers must explicitly share the same gate;
15
+ * merely supplying the HTTP client does not apply it. The kit runner also
16
+ * selects Retry.none so a failed response cannot repeat a sent write.
18
17
  *
19
18
  * @example
20
19
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;AAEpC,uEAAuE;AACvE,qBAAa,KAAM,SAAQ,UAAgD;CAAG;AAE9E,yEAAyE;AACzE,eAAO,MAAM,MAAM,EAAE;IACnB,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;CAEU,CAAC;AAEzD,sCAAsC;AACtC,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAEzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,OAA6B,CAAC;AAExD,eAAO,MAAM,QAAQ,0JAAmB,CAAC;AACzC,eAAO,MAAM,MAAM,uMAAiB,CAAC;AAErC,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,EAAE,OAAmC,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAqC,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,EAAE,OAAkC,CAAC;AAElE,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAoC,CAAC"}
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;AAEpC,uEAAuE;AACvE,qBAAa,KAAM,SAAQ,UAAgD;CAAG;AAE9E,yEAAyE;AACzE,eAAO,MAAM,MAAM,EAAE;IACnB,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,CACE,OAAO,EAAE,OAAO,GACf,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;CAEU,CAAC;AAEzD,sCAAsC;AACtC,eAAO,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAEzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,OAA6B,CAAC;AAExD,eAAO,MAAM,QAAQ,0JAAmB,CAAC;AACzC,eAAO,MAAM,MAAM,uMAAiB,CAAC;AAErC,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,EAAE,OAAmC,CAAC;AAEpE,0EAA0E;AAC1E,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAqC,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,EAAE,OAAkC,CAAC;AAElE,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAoC,CAAC"}
package/dist/retry.js CHANGED
@@ -10,11 +10,10 @@
10
10
  * `packages/alchemy/src/openbao/bao-http.ts` caps in-flight OpenBao
11
11
  * exchanges at 8 process-wide (`BaoGate`, a `Semaphore`) after a real
12
12
  * outage: unbounded Alchemy fan-out took the dev listener's socket down
13
- * (measured 2026-09-14). That cap is `HttpClient` middleware, not a retry
14
- * policy, and stays exactly where it is — the kit's Effect runtime provides
15
- * the gated `HttpClient.HttpClient` layer underneath whichever protocol
16
- * (hand-rolled or this SDK) issues the request, so it keeps applying
17
- * unchanged to every call this package makes.
13
+ * (measured 2026-09-14). That cap lives inside the kit's call runner, not
14
+ * inside HttpClient. SDK consumers must explicitly share the same gate;
15
+ * merely supplying the HTTP client does not apply it. The kit runner also
16
+ * selects Retry.none so a failed response cannot repeat a sent write.
18
17
  *
19
18
  * @example
20
19
  * ```ts
package/dist/retry.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAMvD,uEAAuE;AACvE,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAiB,CAAC,cAAc,CAAC;CAAG;AAE9E,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAWf,CAAC,gBAAmC,EAAE,EAAE,CAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEzD,sCAAsC;AACtC,MAAM,CAAC,MAAM,IAAI,GAE6B,MAAM,CAAC,OAAO,CAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAC7C,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAY,OAAO,CAAC,WAAW,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAY,OAAO,CAAC,iBAAiB,CAAC;AAEpE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAEuB,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEhF,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAY,OAAO,CAAC,gBAAgB,CAAC;AAElE,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAEwB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AAMvD,uEAAuE;AACvE,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAiB,CAAC,cAAc,CAAC;CAAG;AAE9E,yEAAyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAWf,CAAC,gBAAmC,EAAE,EAAE,CAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEzD,sCAAsC;AACtC,MAAM,CAAC,MAAM,IAAI,GAE6B,MAAM,CAAC,OAAO,CAC1D,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAC7C,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAY,OAAO,CAAC,WAAW,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAY,OAAO,CAAC,iBAAiB,CAAC;AAEpE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAEuB,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEhF,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAY,OAAO,CAAC,gBAAgB,CAAC;AAElE,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAEwB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC"}
@@ -39,8 +39,53 @@ export declare const AuthEnableMethodResponse: S.Schema<AuthEnableMethodResponse
39
39
  export interface AuthListEnabledMethodsRequest {
40
40
  }
41
41
  export declare const AuthListEnabledMethodsRequest: S.Schema<AuthListEnabledMethodsRequest>;
42
- export interface AuthListEnabledMethodsResponse {
42
+ export type MountOptions = {
43
+ [key: string]: string | undefined;
44
+ };
45
+ export declare const MountOptions: S.Schema<MountOptions>;
46
+ export type MountStrings = Array<string>;
47
+ export declare const MountStrings: S.Schema<MountStrings>;
48
+ export interface MountUserLockoutConfig {
49
+ user_lockout_counter_reset_duration: number;
50
+ user_lockout_threshold: number;
51
+ user_lockout_duration: number;
52
+ user_lockout_disable: boolean;
43
53
  }
54
+ export declare const MountUserLockoutConfig: S.Schema<MountUserLockoutConfig>;
55
+ export interface MountConfig {
56
+ default_lease_ttl: number;
57
+ max_lease_ttl: number;
58
+ force_no_cache: boolean;
59
+ audit_non_hmac_request_keys?: MountStrings;
60
+ audit_non_hmac_response_keys?: MountStrings;
61
+ passthrough_request_headers?: MountStrings;
62
+ allowed_response_headers?: MountStrings;
63
+ listing_visibility?: string;
64
+ token_type?: string;
65
+ user_lockout_config?: MountUserLockoutConfig;
66
+ }
67
+ export declare const MountConfig: S.Schema<MountConfig>;
68
+ export interface MountInfo {
69
+ type: string;
70
+ description: string;
71
+ accessor: string;
72
+ uuid: string;
73
+ plugin_version: string;
74
+ running_plugin_version: string;
75
+ running_sha256: string;
76
+ local: boolean;
77
+ seal_wrap: boolean;
78
+ external_entropy_access: boolean;
79
+ options: MountOptions | null;
80
+ config: MountConfig;
81
+ deprecation_status?: string;
82
+ }
83
+ export declare const MountInfo: S.Schema<MountInfo>;
84
+ export type MountTable = {
85
+ [key: string]: MountInfo | undefined;
86
+ };
87
+ export declare const MountTable: S.Schema<MountTable>;
88
+ export type AuthListEnabledMethodsResponse = MountTable;
44
89
  export declare const AuthListEnabledMethodsResponse: S.Schema<AuthListEnabledMethodsResponse>;
45
90
  export interface AuthReadConfigurationRequest {
46
91
  /** The path to mount to. Cannot be delimited. Example: "user" */