@ratelkey/burrow-sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,20 +2,10 @@
2
2
 
3
3
  Read secrets from a self-hosted [RatelKey](https://ratelkey.com) Burrow with a machine identity.
4
4
 
5
- This is the Node.js SDK. It lives under `tools/SDKs/<language>/`, one directory per language; each SDK is a
6
- standalone, independently-published artifact that speaks the same signed machine data-plane protocol. Its API
7
- mirrors the Kotlin/JVM SDK one-for-one, so a Burrow reads the same way in either language.
8
-
9
- ## What it does
10
-
11
- A machine authenticates to a Burrow with a per-request **Ed25519 signature** — no session, no long-lived
12
- bearer token. The private key is generated on the machine during bootstrap and never leaves it. This SDK
13
- signs each read the same way the `ratel` CLI does, so a machine bootstrapped once works with both.
14
-
15
5
  - Single and structured secrets, and individual fields of a structured secret.
16
- - The machine's own access map (which projects/environments it can read).
17
- - Trust-on-first-use certificate pinning for the default self-signed Burrow (shared pin store with the CLI),
18
- or standard CA trust for a Burrow on a real domain.
6
+ - The machine's own access map (`listProjects`, `listSecrets`).
7
+ - Certificate pinning, or standard CA trust (`TlsMode`).
8
+ - An OIDC token instead of a key (`Burrow.oidc`).
19
9
 
20
10
  ## Requirements
21
11
 
@@ -24,9 +14,8 @@ signs each read the same way the `ratel` CLI does, so a machine bootstrapped onc
24
14
 
25
15
  ## Bootstrap a machine
26
16
 
27
- From the Burrow dashboard, open **Machines → Add machine** and run the one-line install on the target host.
28
- It generates the keypair locally, registers the public key, and writes the identity to
29
- `~/.burrow/burrows/<slug>/identity.json`. Grant the machine access to the projects/environments it needs.
17
+ From the Burrow dashboard, **Machines → Add machine**, and run the install it gives you on the target host.
18
+ The identity lands at `~/.burrow/burrows/<slug>/identity.json`.
30
19
 
31
20
  ## Quick start
32
21
 
@@ -49,8 +38,6 @@ const [user, pass] = db.getFields("username", "password"); // in order — de
49
38
  for (const p of await burrow.listProjects()) console.log(`${p.project}: ${p.categories}`);
50
39
  ```
51
40
 
52
- Resolving the identity and loading its key are synchronous; only the reads themselves are async.
53
-
54
41
  Point it at a specific identity by selector or path:
55
42
 
56
43
  ```ts
@@ -70,21 +57,20 @@ const burrow = Burrow.connect({
70
57
  });
71
58
  ```
72
59
 
73
- ## Certificate trust
60
+ ## OIDC
61
+
62
+ ```ts
63
+ const burrow = Burrow.oidc({
64
+ burrowUrl: "https://burrow.example.com",
65
+ fingerprint: process.env.BURROW_FINGERPRINT, // omit for a publicly-trusted certificate
66
+ });
74
67
 
75
- Burrows serve HTTPS self-signed by default, so the SDK pins the Burrow's **public key** rather than
76
- disabling verification. The key, not the certificate: a Burrow that adds a custom domain or renews its
77
- certificate is still the same Burrow, and pinning the certificate would refuse it.
68
+ const apiKey = (await burrow.getSecret("payments/prod/API_KEY")).value;
69
+ ```
78
70
 
79
- - `TlsMode.Pinned` (default) trust-on-first-use; pins on first contact, refuses a changed key. Kept beside
80
- that Burrow's identity at `~/.burrow/burrows/<slug>/known_cert`, shared with the CLI.
81
- - `TlsMode.PinnedTo("aa:bb:…")` — pin to a known fingerprint (the SHA-256 the Burrow shows in its network
82
- settings). No first-use trust.
83
- - `TlsMode.SystemTrust` — standard CA + hostname verification, for a Burrow on a custom domain or Let's
84
- Encrypt.
71
+ `audience` defaults to `burrowUrl`. GitHub Actions currently requires `permissions: id-token: write`.
85
72
 
86
- The handshake completes and the pin is checked before the HTTP request is written, so a mismatched
87
- certificate never sees the signed request.
73
+ ## Certificate trust
88
74
 
89
75
  ```ts
90
76
  import { Burrow, TlsMode } from "@ratelkey/burrow-sdk";
@@ -92,6 +78,10 @@ import { Burrow, TlsMode } from "@ratelkey/burrow-sdk";
92
78
  const burrow = Burrow(null, { tls: TlsMode.SystemTrust });
93
79
  ```
94
80
 
81
+ - `TlsMode.Pinned` (default) — trust-on-first-use, stored at `~/.burrow/burrows/<slug>/known_cert`.
82
+ - `TlsMode.PinnedTo("aa:bb:…")` — a fixed fingerprint (from the Burrow's network settings).
83
+ - `TlsMode.SystemTrust` — CA + hostname verification, for a Burrow on a custom domain or Let's Encrypt.
84
+
95
85
  ## Errors
96
86
 
97
87
  Every failure is a `BurrowException`: `BurrowAuthException` (401), `BurrowForbiddenException` (403, no grant),
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OidcAuthorizer = exports.SignedAuthorizer = void 0;
4
+ const Oidc_js_1 = require("./Oidc.js");
5
+ const Signer_js_1 = require("./Signer.js");
6
+ /** Signs each request with the machine's Ed25519 key. */
7
+ class SignedAuthorizer {
8
+ machineId;
9
+ key;
10
+ clientTag;
11
+ now;
12
+ constructor(machineId, key, clientTag, now = Date.now) {
13
+ this.machineId = machineId;
14
+ this.key = key;
15
+ this.clientTag = clientTag;
16
+ this.now = now;
17
+ }
18
+ authorize(action, resource) {
19
+ return Promise.resolve(Signer_js_1.MachineSigner.sign(this.machineId, this.key, action, resource, this.clientTag, this.now()));
20
+ }
21
+ }
22
+ exports.SignedAuthorizer = SignedAuthorizer;
23
+ /** Mints a provider OIDC token per request and sends it as a bearer. No key; the Burrow identifies the machine
24
+ * from the token's claims. */
25
+ class OidcAuthorizer {
26
+ audience;
27
+ clientTag;
28
+ machineId = "";
29
+ constructor(audience, clientTag) {
30
+ this.audience = audience;
31
+ this.clientTag = clientTag;
32
+ }
33
+ async authorize() {
34
+ const token = await (0, Oidc_js_1.mintOidcToken)(this.audience);
35
+ return { Authorization: `Bearer ${token}`, "Ratel-Client": this.clientTag };
36
+ }
37
+ }
38
+ exports.OidcAuthorizer = OidcAuthorizer;
39
+ //# sourceMappingURL=Auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/Auth.ts"],"names":[],"mappings":";;;AACA,uCAA0C;AAC1C,2CAA4C;AAc5C,yDAAyD;AACzD,MAAa,gBAAgB;IAEhB;IACQ;IACA;IACA;IAJnB,YACW,SAAiB,EACT,GAAc,EACd,SAAiB,EACjB,MAAoB,IAAI,CAAC,GAAG;QAHpC,cAAS,GAAT,SAAS,CAAQ;QACT,QAAG,GAAH,GAAG,CAAW;QACd,cAAS,GAAT,SAAS,CAAQ;QACjB,QAAG,GAAH,GAAG,CAAyB;IAC5C,CAAC;IAEJ,SAAS,CAAC,MAAc,EAAE,QAAkB;QAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,yBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrH,CAAC;CACF;AAXD,4CAWC;AAED;+BAC+B;AAC/B,MAAa,cAAc;IAGI;IAAmC;IAFvD,SAAS,GAAG,EAAE,CAAC;IAExB,YAA6B,QAAgB,EAAmB,SAAiB;QAApD,aAAQ,GAAR,QAAQ,CAAQ;QAAmB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAErF,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;CACF;AATD,wCASC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Burrow = exports.DEFAULT_CLIENT_TAG = exports.SDK_VERSION = void 0;
4
+ const Auth_js_1 = require("./Auth.js");
4
5
  const BurrowClient_js_1 = require("./BurrowClient.js");
5
6
  const Identity_js_1 = require("./Identity.js");
6
7
  const Tls_js_1 = require("./Tls.js");
@@ -16,7 +17,8 @@ exports.DEFAULT_CLIENT_TAG = `ratel-sdk-node/${exports.SDK_VERSION}`;
16
17
  */
17
18
  function open(target, options = {}) {
18
19
  const id = Identity_js_1.Identities.select(target);
19
- return new BurrowClient_js_1.DefaultBurrowClient(id.burrowUrl, id.machineId, id.loadPrivateKey(), options.clientTag ?? exports.DEFAULT_CLIENT_TAG, options.tls ?? Tls_js_1.TlsMode.Pinned, id.directory);
20
+ const clientTag = options.clientTag ?? exports.DEFAULT_CLIENT_TAG;
21
+ return new BurrowClient_js_1.DefaultBurrowClient(id.burrowUrl, new Auth_js_1.SignedAuthorizer(id.machineId, id.loadPrivateKey(), clientTag), options.tls ?? Tls_js_1.TlsMode.Pinned, id.directory);
20
22
  }
21
23
  /**
22
24
  * Connect with an explicit identity — for an app that manages its own key material rather than reading the
@@ -24,7 +26,21 @@ function open(target, options = {}) {
24
26
  */
25
27
  function connect(options) {
26
28
  const key = (0, Identity_js_1.parseEd25519PrivateKey)(options.privateKeyPem, "provided PEM");
27
- return new BurrowClient_js_1.DefaultBurrowClient(options.burrowUrl, options.machineId, key, options.clientTag ?? exports.DEFAULT_CLIENT_TAG, options.tls ?? Tls_js_1.TlsMode.Pinned, options.pinStoreDir ?? null);
29
+ const clientTag = options.clientTag ?? exports.DEFAULT_CLIENT_TAG;
30
+ return new BurrowClient_js_1.DefaultBurrowClient(options.burrowUrl, new Auth_js_1.SignedAuthorizer(options.machineId, key, clientTag), options.tls ?? Tls_js_1.TlsMode.Pinned, options.pinStoreDir ?? null);
28
31
  }
29
- exports.Burrow = Object.assign(open, { DEFAULT_CLIENT_TAG: exports.DEFAULT_CLIENT_TAG, connect });
32
+ /**
33
+ * Connect with OIDC — for a CI workflow (GitHub Actions today) that reads secrets with no key. Each call
34
+ * mints a fresh provider token for {@link OidcConnectOptions.audience} and sends it as a bearer; the Burrow
35
+ * verifies it against the machine's trust policy. There is no key and nothing written to disk.
36
+ *
37
+ * TLS defaults to {@link OidcConnectOptions.fingerprint} when given (pin the burrow's public key, from its
38
+ * Network settings) and otherwise to system trust — trust-on-first-use is useless on an ephemeral runner.
39
+ */
40
+ function oidc(options) {
41
+ const clientTag = options.clientTag ?? exports.DEFAULT_CLIENT_TAG;
42
+ const tls = options.tls ?? (options.fingerprint ? Tls_js_1.TlsMode.PinnedTo(options.fingerprint) : Tls_js_1.TlsMode.SystemTrust);
43
+ return new BurrowClient_js_1.DefaultBurrowClient(options.burrowUrl, new Auth_js_1.OidcAuthorizer(options.audience ?? options.burrowUrl, clientTag), tls, null);
44
+ }
45
+ exports.Burrow = Object.assign(open, { DEFAULT_CLIENT_TAG: exports.DEFAULT_CLIENT_TAG, connect, oidc });
30
46
  //# sourceMappingURL=Burrow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Burrow.js","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":";;;AAAA,uDAA2E;AAC3E,+CAAmE;AACnE,qCAAmC;AAEnC,2FAA2F;AAC9E,QAAA,WAAW,GAAG,OAAO,CAAC;AAEnC,4GAA4G;AAC/F,QAAA,kBAAkB,GAAG,kBAAkB,mBAAW,EAAE,CAAC;AA2BlE;;;;;GAKG;AACH,SAAS,IAAI,CAAC,MAAsB,EAAE,UAAyB,EAAE;IAC/D,MAAM,EAAE,GAAG,wBAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,IAAI,qCAAmB,CAC5B,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,cAAc,EAAE,EACnB,OAAO,CAAC,SAAS,IAAI,0BAAkB,EACvC,OAAO,CAAC,GAAG,IAAI,gBAAO,CAAC,MAAM,EAC7B,EAAE,CAAC,SAAS,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,OAAuB;IACtC,MAAM,GAAG,GAAG,IAAA,oCAAsB,EAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,IAAI,qCAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,GAAG,EACH,OAAO,CAAC,SAAS,IAAI,0BAAkB,EACvC,OAAO,CAAC,GAAG,IAAI,gBAAO,CAAC,MAAM,EAC7B,OAAO,CAAC,WAAW,IAAI,IAAI,CAC5B,CAAC;AACJ,CAAC;AAiCY,QAAA,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAlB,0BAAkB,EAAE,OAAO,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"Burrow.js","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":";;;AAAA,uCAA6D;AAC7D,uDAA2E;AAC3E,+CAAmE;AACnE,qCAAmC;AAEnC,2FAA2F;AAC9E,QAAA,WAAW,GAAG,OAAO,CAAC;AAEnC,4GAA4G;AAC/F,QAAA,kBAAkB,GAAG,kBAAkB,mBAAW,EAAE,CAAC;AAuClE;;;;;GAKG;AACH,SAAS,IAAI,CAAC,MAAsB,EAAE,UAAyB,EAAE;IAC/D,MAAM,EAAE,GAAG,wBAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAAkB,CAAC;IAC1D,OAAO,IAAI,qCAAmB,CAC5B,EAAE,CAAC,SAAS,EACZ,IAAI,0BAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC,EAClE,OAAO,CAAC,GAAG,IAAI,gBAAO,CAAC,MAAM,EAC7B,EAAE,CAAC,SAAS,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,OAAuB;IACtC,MAAM,GAAG,GAAG,IAAA,oCAAsB,EAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAAkB,CAAC;IAC1D,OAAO,IAAI,qCAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,IAAI,0BAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC,EACvD,OAAO,CAAC,GAAG,IAAI,gBAAO,CAAC,MAAM,EAC7B,OAAO,CAAC,WAAW,IAAI,IAAI,CAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,IAAI,CAAC,OAA2B;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAAkB,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAO,CAAC,WAAW,CAAC,CAAC;IAC/G,OAAO,IAAI,qCAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,IAAI,wBAAc,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EACpE,GAAG,EACH,IAAI,CACL,CAAC;AACJ,CAAC;AAoCY,QAAA,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAlB,0BAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC"}
@@ -3,24 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultBurrowClient = void 0;
4
4
  const Errors_js_1 = require("./Errors.js");
5
5
  const Model_js_1 = require("./Model.js");
6
- const Signer_js_1 = require("./Signer.js");
7
6
  const Transport_js_1 = require("./Transport.js");
8
- /** The default {@link BurrowClient}: signs each request and talks to the Burrow over the pinned transport. */
7
+ /** The default {@link BurrowClient}: authenticates each request via its {@link Authorizer} and talks to the
8
+ * Burrow over the pinned transport. */
9
9
  class DefaultBurrowClient {
10
10
  burrowUrl;
11
- machineId;
12
- key;
13
- clientTag;
14
- now;
11
+ authorizer;
15
12
  transport;
16
- constructor(burrowUrl, machineId, key, clientTag, tls,
13
+ machineId;
14
+ constructor(burrowUrl, authorizer, tls,
17
15
  /** Where this Burrow's pinned key is kept — its identity directory. Null for a caller that has none. */
18
- pinStoreDir, now = Date.now) {
16
+ pinStoreDir) {
19
17
  this.burrowUrl = burrowUrl;
20
- this.machineId = machineId;
21
- this.key = key;
22
- this.clientTag = clientTag;
23
- this.now = now;
18
+ this.authorizer = authorizer;
19
+ this.machineId = authorizer.machineId;
24
20
  this.transport = new Transport_js_1.Transport(burrowUrl, tls, pinStoreDir);
25
21
  }
26
22
  async getSecret(coordinate) {
@@ -51,8 +47,8 @@ class DefaultBurrowClient {
51
47
  return new Model_js_1.ProjectAccess(typeof o["project"] === "string" ? o["project"] : "", Array.isArray(categories) ? categories.filter((c) => typeof c === "string") : []);
52
48
  });
53
49
  }
54
- signedGet(action, resource, path) {
55
- const headers = Signer_js_1.MachineSigner.sign(this.machineId, this.key, action, resource, this.clientTag, this.now());
50
+ async signedGet(action, resource, path) {
51
+ const headers = await this.authorizer.authorize(action, resource);
56
52
  return this.transport.get(path, headers);
57
53
  }
58
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BurrowClient.js","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BurrowClient.js","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oidcProviderDetected = oidcProviderDetected;
4
+ exports.mintOidcToken = mintOidcToken;
5
+ const Errors_js_1 = require("./Errors.js");
6
+ /**
7
+ * Mints a provider OIDC token for the machine data plane — the CI path, where the client holds no key and
8
+ * proves itself with a short-lived token its provider signs. GitHub Actions is the provider today.
9
+ *
10
+ * The token's audience must be the value the Burrow's trust policy requires; the Burrow verifies the token's
11
+ * signature against the provider's keys and matches its claims (repository, workflow, environment) to that
12
+ * policy. Nothing here is a secret at rest: the token lives for minutes and is minted per request.
13
+ */
14
+ /** Whether this process can mint an OIDC token right now (GitHub Actions with `id-token: write`). */
15
+ function oidcProviderDetected() {
16
+ return ((process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]?.length ?? 0) > 0 &&
17
+ (process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]?.length ?? 0) > 0);
18
+ }
19
+ /** Request a token for `audience` from the detected provider. Throws if no provider is available. */
20
+ async function mintOidcToken(audience) {
21
+ const requestUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"];
22
+ const requestToken = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"];
23
+ if (!requestUrl || !requestToken) {
24
+ throw new Errors_js_1.BurrowAuthException("no OIDC provider detected. In GitHub Actions the workflow needs 'permissions: id-token: write' " +
25
+ "(which sets ACTIONS_ID_TOKEN_REQUEST_URL and ACTIONS_ID_TOKEN_REQUEST_TOKEN)");
26
+ }
27
+ const url = new URL(requestUrl);
28
+ if (audience.length > 0)
29
+ url.searchParams.set("audience", audience);
30
+ let response;
31
+ try {
32
+ // GitHub's token service, publicly trusted — ordinary TLS verification applies.
33
+ response = await fetch(url, {
34
+ headers: { Authorization: `Bearer ${requestToken}`, Accept: "application/json" },
35
+ });
36
+ }
37
+ catch (e) {
38
+ throw new Errors_js_1.BurrowAuthException(`requesting an OIDC token from the provider: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
39
+ }
40
+ if (!response.ok) {
41
+ throw new Errors_js_1.BurrowAuthException(`the OIDC token request failed (HTTP ${response.status})`);
42
+ }
43
+ const body = (await response.json().catch(() => ({})));
44
+ if (typeof body.value !== "string" || body.value.length === 0) {
45
+ throw new Errors_js_1.BurrowAuthException("the OIDC provider returned no token");
46
+ }
47
+ return body.value;
48
+ }
49
+ //# sourceMappingURL=Oidc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Oidc.js","sourceRoot":"","sources":["../../src/Oidc.ts"],"names":[],"mappings":";;AAYA,oDAKC;AAGD,sCA6BC;AAjDD,2CAAkD;AAElD;;;;;;;GAOG;AAEH,qGAAqG;AACrG,SAAgB,oBAAoB;IAClC,OAAO,CACL,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAC9D,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,qGAAqG;AAC9F,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,+BAAmB,CAC3B,iGAAiG;YAC/F,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEpE,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,gFAAgF;QAChF,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACjF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,+BAAmB,CAAC,+CAA+C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3I,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,+BAAmB,CAAC,uCAAuC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAwB,CAAC;IAC9E,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,+BAAmB,CAAC,qCAAqC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { KeyObject } from "node:crypto";
2
+ /**
3
+ * Produces the auth headers for one machine-plane request. Two implementations: {@link SignedAuthorizer} (an
4
+ * Ed25519 key signs each request) and {@link OidcAuthorizer} (a provider-minted bearer token). The client
5
+ * doesn't care which — it awaits `authorize` and hands the headers to the transport.
6
+ */
7
+ export interface Authorizer {
8
+ /** The machine id, when known client-side. Empty for OIDC, where the Burrow resolves it from the token. */
9
+ readonly machineId: string;
10
+ /** Headers for the request. `resource` is the signed operation's coordinates (Ed25519 only). */
11
+ authorize(action: string, resource: string[]): Promise<Record<string, string>>;
12
+ }
13
+ /** Signs each request with the machine's Ed25519 key. */
14
+ export declare class SignedAuthorizer implements Authorizer {
15
+ readonly machineId: string;
16
+ private readonly key;
17
+ private readonly clientTag;
18
+ private readonly now;
19
+ constructor(machineId: string, key: KeyObject, clientTag: string, now?: () => number);
20
+ authorize(action: string, resource: string[]): Promise<Record<string, string>>;
21
+ }
22
+ /** Mints a provider OIDC token per request and sends it as a bearer. No key; the Burrow identifies the machine
23
+ * from the token's claims. */
24
+ export declare class OidcAuthorizer implements Authorizer {
25
+ private readonly audience;
26
+ private readonly clientTag;
27
+ readonly machineId = "";
28
+ constructor(audience: string, clientTag: string);
29
+ authorize(): Promise<Record<string, string>>;
30
+ }
31
+ //# sourceMappingURL=Auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../src/Auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,2GAA2G;IAC3G,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gGAAgG;IAChG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChF;AAED,yDAAyD;AACzD,qBAAa,gBAAiB,YAAW,UAAU;IAE/C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAHX,SAAS,EAAE,MAAM,EACT,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAiB;IAG/C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAG/E;AAED;+BAC+B;AAC/B,qBAAa,cAAe,YAAW,UAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFzE,QAAQ,CAAC,SAAS,MAAM;gBAEK,QAAQ,EAAE,MAAM,EAAmB,SAAS,EAAE,MAAM;IAE3E,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAInD"}
@@ -0,0 +1,34 @@
1
+ import { mintOidcToken } from "./Oidc.js";
2
+ import { MachineSigner } from "./Signer.js";
3
+ /** Signs each request with the machine's Ed25519 key. */
4
+ export class SignedAuthorizer {
5
+ machineId;
6
+ key;
7
+ clientTag;
8
+ now;
9
+ constructor(machineId, key, clientTag, now = Date.now) {
10
+ this.machineId = machineId;
11
+ this.key = key;
12
+ this.clientTag = clientTag;
13
+ this.now = now;
14
+ }
15
+ authorize(action, resource) {
16
+ return Promise.resolve(MachineSigner.sign(this.machineId, this.key, action, resource, this.clientTag, this.now()));
17
+ }
18
+ }
19
+ /** Mints a provider OIDC token per request and sends it as a bearer. No key; the Burrow identifies the machine
20
+ * from the token's claims. */
21
+ export class OidcAuthorizer {
22
+ audience;
23
+ clientTag;
24
+ machineId = "";
25
+ constructor(audience, clientTag) {
26
+ this.audience = audience;
27
+ this.clientTag = clientTag;
28
+ }
29
+ async authorize() {
30
+ const token = await mintOidcToken(this.audience);
31
+ return { Authorization: `Bearer ${token}`, "Ratel-Client": this.clientTag };
32
+ }
33
+ }
34
+ //# sourceMappingURL=Auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/Auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAc5C,yDAAyD;AACzD,MAAM,OAAO,gBAAgB;IAEhB;IACQ;IACA;IACA;IAJnB,YACW,SAAiB,EACT,GAAc,EACd,SAAiB,EACjB,MAAoB,IAAI,CAAC,GAAG;QAHpC,cAAS,GAAT,SAAS,CAAQ;QACT,QAAG,GAAH,GAAG,CAAW;QACd,cAAS,GAAT,SAAS,CAAQ;QACjB,QAAG,GAAH,GAAG,CAAyB;IAC5C,CAAC;IAEJ,SAAS,CAAC,MAAc,EAAE,QAAkB;QAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrH,CAAC;CACF;AAED;+BAC+B;AAC/B,MAAM,OAAO,cAAc;IAGI;IAAmC;IAFvD,SAAS,GAAG,EAAE,CAAC;IAExB,YAA6B,QAAgB,EAAmB,SAAiB;QAApD,aAAQ,GAAR,QAAQ,CAAQ;QAAmB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAErF,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;CACF"}
@@ -27,6 +27,17 @@ export interface ConnectOptions extends BurrowOptions {
27
27
  */
28
28
  pinStoreDir?: string;
29
29
  }
30
+ /** Options for {@link Burrow.oidc} — a CI workflow reading secrets with no key. */
31
+ export interface OidcConnectOptions extends BurrowOptions {
32
+ burrowUrl: string;
33
+ /** The token audience the Burrow requires. Defaults to `burrowUrl`. */
34
+ audience?: string;
35
+ /**
36
+ * The Burrow's public-key fingerprint to pin (from its Network settings). Omit when the Burrow serves a
37
+ * publicly-trusted certificate. Ignored when `tls` is set explicitly.
38
+ */
39
+ fingerprint?: string;
40
+ }
30
41
  /**
31
42
  * Entry point for reading secrets from a Burrow with a machine identity.
32
43
  *
@@ -54,6 +65,8 @@ export interface BurrowFactory {
54
65
  readonly DEFAULT_CLIENT_TAG: string;
55
66
  /** Connect with an explicit identity rather than one discovered under `~/.burrow`. */
56
67
  connect(options: ConnectOptions): BurrowClient;
68
+ /** Connect with OIDC — a CI workflow reading secrets with no key (GitHub Actions today). */
69
+ oidc(options: OidcConnectOptions): BurrowClient;
57
70
  }
58
71
  export declare const Burrow: BurrowFactory;
59
72
  //# sourceMappingURL=Burrow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Burrow.d.ts","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,2FAA2F;AAC3F,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,4GAA4G;AAC5G,eAAO,MAAM,kBAAkB,yBAAkC,CAAC;AAElE,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+FAA+F;AAC/F,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAEhE,4GAA4G;IAC5G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,sFAAsF;IACtF,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAAC;CAChD;AAED,eAAO,MAAM,MAAM,EAAE,aAAoE,CAAC"}
1
+ {"version":3,"file":"Burrow.d.ts","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,2FAA2F;AAC3F,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,4GAA4G;AAC5G,eAAO,MAAM,kBAAkB,yBAAkC,CAAC;AAElE,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+FAA+F;AAC/F,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mFAAmF;AACnF,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqDD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAEhE,4GAA4G;IAC5G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAEpC,sFAAsF;IACtF,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAAC;IAE/C,4FAA4F;IAC5F,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAAC;CACjD;AAED,eAAO,MAAM,MAAM,EAAE,aAA0E,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { OidcAuthorizer, SignedAuthorizer } from "./Auth.js";
1
2
  import { DefaultBurrowClient } from "./BurrowClient.js";
2
3
  import { Identities, parseEd25519PrivateKey } from "./Identity.js";
3
4
  import { TlsMode } from "./Tls.js";
@@ -13,7 +14,8 @@ export const DEFAULT_CLIENT_TAG = `ratel-sdk-node/${SDK_VERSION}`;
13
14
  */
14
15
  function open(target, options = {}) {
15
16
  const id = Identities.select(target);
16
- return new DefaultBurrowClient(id.burrowUrl, id.machineId, id.loadPrivateKey(), options.clientTag ?? DEFAULT_CLIENT_TAG, options.tls ?? TlsMode.Pinned, id.directory);
17
+ const clientTag = options.clientTag ?? DEFAULT_CLIENT_TAG;
18
+ return new DefaultBurrowClient(id.burrowUrl, new SignedAuthorizer(id.machineId, id.loadPrivateKey(), clientTag), options.tls ?? TlsMode.Pinned, id.directory);
17
19
  }
18
20
  /**
19
21
  * Connect with an explicit identity — for an app that manages its own key material rather than reading the
@@ -21,7 +23,21 @@ function open(target, options = {}) {
21
23
  */
22
24
  function connect(options) {
23
25
  const key = parseEd25519PrivateKey(options.privateKeyPem, "provided PEM");
24
- return new DefaultBurrowClient(options.burrowUrl, options.machineId, key, options.clientTag ?? DEFAULT_CLIENT_TAG, options.tls ?? TlsMode.Pinned, options.pinStoreDir ?? null);
26
+ const clientTag = options.clientTag ?? DEFAULT_CLIENT_TAG;
27
+ return new DefaultBurrowClient(options.burrowUrl, new SignedAuthorizer(options.machineId, key, clientTag), options.tls ?? TlsMode.Pinned, options.pinStoreDir ?? null);
25
28
  }
26
- export const Burrow = Object.assign(open, { DEFAULT_CLIENT_TAG, connect });
29
+ /**
30
+ * Connect with OIDC — for a CI workflow (GitHub Actions today) that reads secrets with no key. Each call
31
+ * mints a fresh provider token for {@link OidcConnectOptions.audience} and sends it as a bearer; the Burrow
32
+ * verifies it against the machine's trust policy. There is no key and nothing written to disk.
33
+ *
34
+ * TLS defaults to {@link OidcConnectOptions.fingerprint} when given (pin the burrow's public key, from its
35
+ * Network settings) and otherwise to system trust — trust-on-first-use is useless on an ephemeral runner.
36
+ */
37
+ function oidc(options) {
38
+ const clientTag = options.clientTag ?? DEFAULT_CLIENT_TAG;
39
+ const tls = options.tls ?? (options.fingerprint ? TlsMode.PinnedTo(options.fingerprint) : TlsMode.SystemTrust);
40
+ return new DefaultBurrowClient(options.burrowUrl, new OidcAuthorizer(options.audience ?? options.burrowUrl, clientTag), tls, null);
41
+ }
42
+ export const Burrow = Object.assign(open, { DEFAULT_CLIENT_TAG, connect, oidc });
27
43
  //# sourceMappingURL=Burrow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Burrow.js","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,4GAA4G;AAC5G,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,WAAW,EAAE,CAAC;AA2BlE;;;;;GAKG;AACH,SAAS,IAAI,CAAC,MAAsB,EAAE,UAAyB,EAAE;IAC/D,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,IAAI,mBAAmB,CAC5B,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,cAAc,EAAE,EACnB,OAAO,CAAC,SAAS,IAAI,kBAAkB,EACvC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAC7B,EAAE,CAAC,SAAS,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,OAAuB;IACtC,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,IAAI,mBAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,GAAG,EACH,OAAO,CAAC,SAAS,IAAI,kBAAkB,EACvC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAC7B,OAAO,CAAC,WAAW,IAAI,IAAI,CAC5B,CAAC;AACJ,CAAC;AAiCD,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"Burrow.js","sourceRoot":"","sources":["../../src/Burrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAqB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,4GAA4G;AAC5G,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,WAAW,EAAE,CAAC;AAuClE;;;;;GAKG;AACH,SAAS,IAAI,CAAC,MAAsB,EAAE,UAAyB,EAAE;IAC/D,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,OAAO,IAAI,mBAAmB,CAC5B,EAAE,CAAC,SAAS,EACZ,IAAI,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC,EAClE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAC7B,EAAE,CAAC,SAAS,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,OAAuB;IACtC,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,OAAO,IAAI,mBAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC,EACvD,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAC7B,OAAO,CAAC,WAAW,IAAI,IAAI,CAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,IAAI,CAAC,OAA2B;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/G,OAAO,IAAI,mBAAmB,CAC5B,OAAO,CAAC,SAAS,EACjB,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EACpE,GAAG,EACH,IAAI,CACL,CAAC;AACJ,CAAC;AAoCD,MAAM,CAAC,MAAM,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC"}
@@ -1,14 +1,15 @@
1
- import type { KeyObject } from "node:crypto";
1
+ import type { Authorizer } from "./Auth.js";
2
2
  import { ProjectAccess, Secret, SecretCoordinate } from "./Model.js";
3
3
  import type { TlsMode } from "./Tls.js";
4
4
  /**
5
- * Reads secrets from a Burrow as a machine identity. Every call is independently Ed25519-signedthere is
6
- * no session and no long-lived bearer token. Instances are reusable; construct one via `Burrow`.
5
+ * Reads secrets from a Burrow as a machine identity. Every call is independently authenticatedeither an
6
+ * Ed25519 signature or a freshly-minted OIDC token — with no session held. Instances are reusable; construct
7
+ * one via `Burrow`.
7
8
  */
8
9
  export interface BurrowClient {
9
10
  /** The Burrow this client reads from. */
10
11
  readonly burrowUrl: string;
11
- /** The machine identity this client acts as. */
12
+ /** The machine identity this client acts as. Empty when authenticating by OIDC (the Burrow resolves it). */
12
13
  readonly machineId: string;
13
14
  /**
14
15
  * Read a secret by its `project/env/NAME` coordinate, whole, in one signed call. Project the result
@@ -21,17 +22,16 @@ export interface BurrowClient {
21
22
  /** Every project this machine can read, and the environment categories it holds in each. */
22
23
  listProjects(): Promise<ProjectAccess[]>;
23
24
  }
24
- /** The default {@link BurrowClient}: signs each request and talks to the Burrow over the pinned transport. */
25
+ /** The default {@link BurrowClient}: authenticates each request via its {@link Authorizer} and talks to the
26
+ * Burrow over the pinned transport. */
25
27
  export declare class DefaultBurrowClient implements BurrowClient {
26
28
  readonly burrowUrl: string;
27
- readonly machineId: string;
28
- private readonly key;
29
- private readonly clientTag;
30
- private readonly now;
29
+ private readonly authorizer;
31
30
  private readonly transport;
32
- constructor(burrowUrl: string, machineId: string, key: KeyObject, clientTag: string, tls: TlsMode,
31
+ readonly machineId: string;
32
+ constructor(burrowUrl: string, authorizer: Authorizer, tls: TlsMode,
33
33
  /** Where this Burrow's pinned key is kept — its identity directory. Null for a caller that has none. */
34
- pinStoreDir: string | null, now?: () => number);
34
+ pinStoreDir: string | null);
35
35
  getSecret(coordinate: string): Promise<Secret>;
36
36
  listSecrets(): Promise<SecretCoordinate[]>;
37
37
  listProjects(): Promise<ProjectAccess[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"BurrowClient.d.ts","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAoB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C,2EAA2E;IAC3E,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAE3C,4FAA4F;IAC5F,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC1C;AAED,8GAA8G;AAC9G,qBAAa,mBAAoB,YAAW,YAAY;IAIpD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAI1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAG3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACT,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EAClC,GAAG,EAAE,OAAO;IACZ,wGAAwG;IACxG,WAAW,EAAE,MAAM,GAAG,IAAI,EACT,GAAG,GAAE,MAAM,MAAiB;IAKzC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa9C,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQ1C,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAe9C,OAAO,CAAC,SAAS;CAWlB"}
1
+ {"version":3,"file":"BurrowClient.d.ts","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAoB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,4GAA4G;IAC5G,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/C,2EAA2E;IAC3E,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAE3C,4FAA4F;IAC5F,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC1C;AAED;wCACwC;AACxC,qBAAa,mBAAoB,YAAW,YAAY;IAKpD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAGhB,SAAS,EAAE,MAAM,EACT,UAAU,EAAE,UAAU,EACvC,GAAG,EAAE,OAAO;IACZ,wGAAwG;IACxG,WAAW,EAAE,MAAM,GAAG,IAAI;IAMtB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa9C,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQ1C,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAehC,SAAS;CAIxB"}
@@ -1,23 +1,19 @@
1
1
  import { BurrowTransportException } from "./Errors.js";
2
2
  import { ProjectAccess, Secret, SecretCoordinate } from "./Model.js";
3
- import { MachineSigner } from "./Signer.js";
4
3
  import { Transport } from "./Transport.js";
5
- /** The default {@link BurrowClient}: signs each request and talks to the Burrow over the pinned transport. */
4
+ /** The default {@link BurrowClient}: authenticates each request via its {@link Authorizer} and talks to the
5
+ * Burrow over the pinned transport. */
6
6
  export class DefaultBurrowClient {
7
7
  burrowUrl;
8
- machineId;
9
- key;
10
- clientTag;
11
- now;
8
+ authorizer;
12
9
  transport;
13
- constructor(burrowUrl, machineId, key, clientTag, tls,
10
+ machineId;
11
+ constructor(burrowUrl, authorizer, tls,
14
12
  /** Where this Burrow's pinned key is kept — its identity directory. Null for a caller that has none. */
15
- pinStoreDir, now = Date.now) {
13
+ pinStoreDir) {
16
14
  this.burrowUrl = burrowUrl;
17
- this.machineId = machineId;
18
- this.key = key;
19
- this.clientTag = clientTag;
20
- this.now = now;
15
+ this.authorizer = authorizer;
16
+ this.machineId = authorizer.machineId;
21
17
  this.transport = new Transport(burrowUrl, tls, pinStoreDir);
22
18
  }
23
19
  async getSecret(coordinate) {
@@ -48,8 +44,8 @@ export class DefaultBurrowClient {
48
44
  return new ProjectAccess(typeof o["project"] === "string" ? o["project"] : "", Array.isArray(categories) ? categories.filter((c) => typeof c === "string") : []);
49
45
  });
50
46
  }
51
- signedGet(action, resource, path) {
52
- const headers = MachineSigner.sign(this.machineId, this.key, action, resource, this.clientTag, this.now());
47
+ async signedGet(action, resource, path) {
48
+ const headers = await this.authorizer.authorize(action, resource);
53
49
  return this.transport.get(path, headers);
54
50
  }
55
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BurrowClient.js","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BurrowClient.js","sourceRoot":"","sources":["../../src/BurrowClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Mints a provider OIDC token for the machine data plane — the CI path, where the client holds no key and
3
+ * proves itself with a short-lived token its provider signs. GitHub Actions is the provider today.
4
+ *
5
+ * The token's audience must be the value the Burrow's trust policy requires; the Burrow verifies the token's
6
+ * signature against the provider's keys and matches its claims (repository, workflow, environment) to that
7
+ * policy. Nothing here is a secret at rest: the token lives for minutes and is minted per request.
8
+ */
9
+ /** Whether this process can mint an OIDC token right now (GitHub Actions with `id-token: write`). */
10
+ export declare function oidcProviderDetected(): boolean;
11
+ /** Request a token for `audience` from the detected provider. Throws if no provider is available. */
12
+ export declare function mintOidcToken(audience: string): Promise<string>;
13
+ //# sourceMappingURL=Oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Oidc.d.ts","sourceRoot":"","sources":["../../src/Oidc.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,qGAAqG;AACrG,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrE"}
@@ -0,0 +1,45 @@
1
+ import { BurrowAuthException } from "./Errors.js";
2
+ /**
3
+ * Mints a provider OIDC token for the machine data plane — the CI path, where the client holds no key and
4
+ * proves itself with a short-lived token its provider signs. GitHub Actions is the provider today.
5
+ *
6
+ * The token's audience must be the value the Burrow's trust policy requires; the Burrow verifies the token's
7
+ * signature against the provider's keys and matches its claims (repository, workflow, environment) to that
8
+ * policy. Nothing here is a secret at rest: the token lives for minutes and is minted per request.
9
+ */
10
+ /** Whether this process can mint an OIDC token right now (GitHub Actions with `id-token: write`). */
11
+ export function oidcProviderDetected() {
12
+ return ((process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]?.length ?? 0) > 0 &&
13
+ (process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]?.length ?? 0) > 0);
14
+ }
15
+ /** Request a token for `audience` from the detected provider. Throws if no provider is available. */
16
+ export async function mintOidcToken(audience) {
17
+ const requestUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"];
18
+ const requestToken = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"];
19
+ if (!requestUrl || !requestToken) {
20
+ throw new BurrowAuthException("no OIDC provider detected. In GitHub Actions the workflow needs 'permissions: id-token: write' " +
21
+ "(which sets ACTIONS_ID_TOKEN_REQUEST_URL and ACTIONS_ID_TOKEN_REQUEST_TOKEN)");
22
+ }
23
+ const url = new URL(requestUrl);
24
+ if (audience.length > 0)
25
+ url.searchParams.set("audience", audience);
26
+ let response;
27
+ try {
28
+ // GitHub's token service, publicly trusted — ordinary TLS verification applies.
29
+ response = await fetch(url, {
30
+ headers: { Authorization: `Bearer ${requestToken}`, Accept: "application/json" },
31
+ });
32
+ }
33
+ catch (e) {
34
+ throw new BurrowAuthException(`requesting an OIDC token from the provider: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
35
+ }
36
+ if (!response.ok) {
37
+ throw new BurrowAuthException(`the OIDC token request failed (HTTP ${response.status})`);
38
+ }
39
+ const body = (await response.json().catch(() => ({})));
40
+ if (typeof body.value !== "string" || body.value.length === 0) {
41
+ throw new BurrowAuthException("the OIDC provider returned no token");
42
+ }
43
+ return body.value;
44
+ }
45
+ //# sourceMappingURL=Oidc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Oidc.js","sourceRoot":"","sources":["../../src/Oidc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;GAOG;AAEH,qGAAqG;AACrG,MAAM,UAAU,oBAAoB;IAClC,OAAO,CACL,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAC9D,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IACnE,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,mBAAmB,CAC3B,iGAAiG;YAC/F,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEpE,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,gFAAgF;QAChF,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACjF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,mBAAmB,CAAC,+CAA+C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3I,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAwB,CAAC;IAC9E,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,mBAAmB,CAAC,qCAAqC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { Burrow, DEFAULT_CLIENT_TAG, SDK_VERSION } from "./Burrow.js";
2
- export type { BurrowFactory, BurrowOptions, ConnectOptions } from "./Burrow.js";
2
+ export type { BurrowFactory, BurrowOptions, ConnectOptions, OidcConnectOptions } from "./Burrow.js";
3
3
  export type { BurrowClient } from "./BurrowClient.js";
4
4
  export { ProjectAccess, Secret, SecretCoordinate } from "./Model.js";
5
5
  export type { SecretField } from "./Model.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpG,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@ratelkey/burrow-sdk","version":"0.1.0","description":"Read secrets from a self-hosted RatelKey Burrow with a machine identity.","type":"module","engines":{"node":">=18.17"},"main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./package.json":"./package.json"},"files":["dist","README.md"],"scripts":{"build":"node scripts/build.mjs","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.0"},"keywords":["ratelkey","burrow","secrets","sdk"]}
1
+ {"name":"@ratelkey/burrow-sdk","version":"0.2.0","description":"Read secrets from a self-hosted RatelKey Burrow with a machine identity.","type":"module","engines":{"node":">=18.17"},"main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./package.json":"./package.json"},"files":["dist","README.md"],"scripts":{"build":"node scripts/build.mjs","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.0"},"keywords":["ratelkey","burrow","secrets","sdk"]}