@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.
- package/README.md +28 -3
- package/dist/credentials.d.ts +3 -2
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +5 -3
- package/dist/credentials.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/protocol-mount-tables.d.ts +10 -0
- package/dist/protocol-mount-tables.d.ts.map +1 -0
- package/dist/protocol-mount-tables.js +39 -0
- package/dist/protocol-mount-tables.js.map +1 -0
- package/dist/protocol-mount-tables.test.d.ts +2 -0
- package/dist/protocol-mount-tables.test.d.ts.map +1 -0
- package/dist/protocol-mount-tables.test.js +164 -0
- package/dist/protocol-mount-tables.test.js.map +1 -0
- package/dist/protocol-requests.test.d.ts +2 -0
- package/dist/protocol-requests.test.d.ts.map +1 -0
- package/dist/protocol-requests.test.js +32 -0
- package/dist/protocol-requests.test.js.map +1 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +11 -5
- package/dist/protocol.js.map +1 -1
- package/dist/retry.d.ts +4 -5
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +4 -5
- package/dist/retry.js.map +1 -1
- package/dist/services/auth.d.ts +46 -1
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +39 -1
- package/dist/services/auth.js.map +1 -1
- package/dist/services/mounts.d.ts +46 -1
- package/dist/services/mounts.d.ts.map +1 -1
- package/dist/services/mounts.js +39 -1
- package/dist/services/mounts.js.map +1 -1
- package/dist/traits.d.ts +3 -8
- package/dist/traits.d.ts.map +1 -1
- package/dist/traits.js +5 -1
- package/dist/traits.js.map +1 -1
- package/package.json +1 -1
- package/src/credentials.ts +9 -5
- package/src/errors.ts +4 -2
- package/src/protocol-mount-tables.test.ts +190 -0
- package/src/protocol-mount-tables.ts +60 -0
- package/src/protocol-requests.test.ts +66 -0
- package/src/protocol.ts +11 -5
- package/src/retry.ts +4 -5
- package/src/services/auth.ts +96 -2
- package/src/services/mounts.ts +96 -2
- 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
|
-
|
|
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),
|
|
70
|
-
|
|
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
|
|
package/dist/credentials.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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;
|
|
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"}
|
package/dist/credentials.js
CHANGED
|
@@ -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
|
|
52
|
+
message: "BAO_ADDR environment variable is required",
|
|
53
53
|
})), Effect.map(({ token, addr, namespace }) => ({
|
|
54
|
-
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));
|
package/dist/credentials.js.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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 =
|
|
56
|
+
export type DefaultErrors = InstanceType<(typeof API_ERRORS)[number]> | ClientErrors;
|
|
57
57
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"
|
|
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
|
|
35
|
-
*
|
|
36
|
-
*
|
|
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
|
-
|
|
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
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
14
|
-
*
|
|
15
|
-
* the
|
|
16
|
-
*
|
|
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.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
14
|
-
*
|
|
15
|
-
* the
|
|
16
|
-
*
|
|
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
|
|
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"}
|
package/dist/services/auth.d.ts
CHANGED
|
@@ -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
|
|
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" */
|