@cef-ai/vault-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +122 -0
  2. package/dist/agreements/gar-client.d.ts +28 -0
  3. package/dist/agreements/gar-client.d.ts.map +1 -0
  4. package/dist/agreements/gar-client.js +21 -0
  5. package/dist/agreements/gar-client.js.map +1 -0
  6. package/dist/agreements/index.d.ts +7 -0
  7. package/dist/agreements/index.d.ts.map +1 -0
  8. package/dist/agreements/index.js +5 -0
  9. package/dist/agreements/index.js.map +1 -0
  10. package/dist/agreements/payload.d.ts +38 -0
  11. package/dist/agreements/payload.d.ts.map +1 -0
  12. package/dist/agreements/payload.js +20 -0
  13. package/dist/agreements/payload.js.map +1 -0
  14. package/dist/agreements/sign.d.ts +31 -0
  15. package/dist/agreements/sign.d.ts.map +1 -0
  16. package/dist/agreements/sign.js +38 -0
  17. package/dist/agreements/sign.js.map +1 -0
  18. package/dist/auth/no-auth.d.ts +9 -0
  19. package/dist/auth/no-auth.d.ts.map +1 -0
  20. package/dist/auth/no-auth.js +14 -0
  21. package/dist/auth/no-auth.js.map +1 -0
  22. package/dist/auth/provider.d.ts +31 -0
  23. package/dist/auth/provider.d.ts.map +1 -0
  24. package/dist/auth/provider.js +2 -0
  25. package/dist/auth/provider.js.map +1 -0
  26. package/dist/auth/wallet.d.ts +15 -0
  27. package/dist/auth/wallet.d.ts.map +1 -0
  28. package/dist/auth/wallet.js +33 -0
  29. package/dist/auth/wallet.js.map +1 -0
  30. package/dist/client.d.ts +48 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +64 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/core/canonical.d.ts +16 -0
  35. package/dist/core/canonical.d.ts.map +1 -0
  36. package/dist/core/canonical.js +39 -0
  37. package/dist/core/canonical.js.map +1 -0
  38. package/dist/core/endpoints.d.ts +27 -0
  39. package/dist/core/endpoints.d.ts.map +1 -0
  40. package/dist/core/endpoints.js +28 -0
  41. package/dist/core/endpoints.js.map +1 -0
  42. package/dist/core/errors.d.ts +13 -0
  43. package/dist/core/errors.d.ts.map +1 -0
  44. package/dist/core/errors.js +29 -0
  45. package/dist/core/errors.js.map +1 -0
  46. package/dist/core/http.d.ts +31 -0
  47. package/dist/core/http.d.ts.map +1 -0
  48. package/dist/core/http.js +82 -0
  49. package/dist/core/http.js.map +1 -0
  50. package/dist/core/types.d.ts +135 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +2 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/fluent/agent-connection.d.ts +28 -0
  55. package/dist/fluent/agent-connection.d.ts.map +1 -0
  56. package/dist/fluent/agent-connection.js +52 -0
  57. package/dist/fluent/agent-connection.js.map +1 -0
  58. package/dist/fluent/cubby.d.ts +12 -0
  59. package/dist/fluent/cubby.d.ts.map +1 -0
  60. package/dist/fluent/cubby.js +20 -0
  61. package/dist/fluent/cubby.js.map +1 -0
  62. package/dist/fluent/job.d.ts +20 -0
  63. package/dist/fluent/job.d.ts.map +1 -0
  64. package/dist/fluent/job.js +24 -0
  65. package/dist/fluent/job.js.map +1 -0
  66. package/dist/fluent/scope.d.ts +27 -0
  67. package/dist/fluent/scope.d.ts.map +1 -0
  68. package/dist/fluent/scope.js +40 -0
  69. package/dist/fluent/scope.js.map +1 -0
  70. package/dist/fluent/subscribe.d.ts +24 -0
  71. package/dist/fluent/subscribe.d.ts.map +1 -0
  72. package/dist/fluent/subscribe.js +46 -0
  73. package/dist/fluent/subscribe.js.map +1 -0
  74. package/dist/fluent/vault.d.ts +68 -0
  75. package/dist/fluent/vault.d.ts.map +1 -0
  76. package/dist/fluent/vault.js +98 -0
  77. package/dist/fluent/vault.js.map +1 -0
  78. package/dist/index.d.ts +22 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +17 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/internal/agents.d.ts +21 -0
  83. package/dist/internal/agents.d.ts.map +1 -0
  84. package/dist/internal/agents.js +30 -0
  85. package/dist/internal/agents.js.map +1 -0
  86. package/dist/internal/browse.d.ts +31 -0
  87. package/dist/internal/browse.d.ts.map +1 -0
  88. package/dist/internal/browse.js +32 -0
  89. package/dist/internal/browse.js.map +1 -0
  90. package/dist/internal/cubbies.d.ts +15 -0
  91. package/dist/internal/cubbies.d.ts.map +1 -0
  92. package/dist/internal/cubbies.js +20 -0
  93. package/dist/internal/cubbies.js.map +1 -0
  94. package/dist/internal/events.d.ts +8 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +17 -0
  97. package/dist/internal/events.js.map +1 -0
  98. package/dist/internal/health.d.ts +12 -0
  99. package/dist/internal/health.d.ts.map +1 -0
  100. package/dist/internal/health.js +16 -0
  101. package/dist/internal/health.js.map +1 -0
  102. package/dist/internal/marketplace.d.ts +25 -0
  103. package/dist/internal/marketplace.d.ts.map +1 -0
  104. package/dist/internal/marketplace.js +22 -0
  105. package/dist/internal/marketplace.js.map +1 -0
  106. package/dist/internal/scopes.d.ts +21 -0
  107. package/dist/internal/scopes.d.ts.map +1 -0
  108. package/dist/internal/scopes.js +19 -0
  109. package/dist/internal/scopes.js.map +1 -0
  110. package/dist/internal/vaults.d.ts +17 -0
  111. package/dist/internal/vaults.d.ts.map +1 -0
  112. package/dist/internal/vaults.js +19 -0
  113. package/dist/internal/vaults.js.map +1 -0
  114. package/dist/internal-exports.d.ts +11 -0
  115. package/dist/internal-exports.d.ts.map +1 -0
  116. package/dist/internal-exports.js +13 -0
  117. package/dist/internal-exports.js.map +1 -0
  118. package/dist/wallet/adapter.d.ts +15 -0
  119. package/dist/wallet/adapter.d.ts.map +1 -0
  120. package/dist/wallet/adapter.js +6 -0
  121. package/dist/wallet/adapter.js.map +1 -0
  122. package/dist/wallet/cere-internal/index.d.ts +4 -0
  123. package/dist/wallet/cere-internal/index.d.ts.map +1 -0
  124. package/dist/wallet/cere-internal/index.js +4 -0
  125. package/dist/wallet/cere-internal/index.js.map +1 -0
  126. package/dist/wallet/cere-internal/json-signer.d.ts +34 -0
  127. package/dist/wallet/cere-internal/json-signer.d.ts.map +1 -0
  128. package/dist/wallet/cere-internal/json-signer.js +78 -0
  129. package/dist/wallet/cere-internal/json-signer.js.map +1 -0
  130. package/dist/wallet/cere-internal/signer.d.ts +51 -0
  131. package/dist/wallet/cere-internal/signer.d.ts.map +1 -0
  132. package/dist/wallet/cere-internal/signer.js +33 -0
  133. package/dist/wallet/cere-internal/signer.js.map +1 -0
  134. package/dist/wallet/cere-internal/uri-signer.d.ts +28 -0
  135. package/dist/wallet/cere-internal/uri-signer.d.ts.map +1 -0
  136. package/dist/wallet/cere-internal/uri-signer.js +68 -0
  137. package/dist/wallet/cere-internal/uri-signer.js.map +1 -0
  138. package/dist/wallet/cere.d.ts +22 -0
  139. package/dist/wallet/cere.d.ts.map +1 -0
  140. package/dist/wallet/cere.js +55 -0
  141. package/dist/wallet/cere.js.map +1 -0
  142. package/dist/wallet/keypair.d.ts +12 -0
  143. package/dist/wallet/keypair.d.ts.map +1 -0
  144. package/dist/wallet/keypair.js +24 -0
  145. package/dist/wallet/keypair.js.map +1 -0
  146. package/package.json +40 -0
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # @cef-ai/vault-sdk
2
+
3
+ Client SDK for apps talking to a user's CEF Vault from outside the Agent
4
+ Runtime: chat UIs, Slack bots, data pipelines, integrations.
5
+
6
+ ## Install
7
+
8
+ ```sh
9
+ pnpm add @cef-ai/vault-sdk
10
+ ```
11
+
12
+ ## Quickstart
13
+
14
+ ```ts
15
+ import { VaultSDK, CereWallet } from "@cef-ai/vault-sdk";
16
+
17
+ const wallet = await CereWallet.fromMnemonic(process.env.WALLET_MNEMONIC!);
18
+ const sdk = new VaultSDK({
19
+ endpoint: "https://vault.cere.io",
20
+ garEndpoint: "https://gar.cere.io", // required for vault.agents.connect
21
+ wallet,
22
+ });
23
+ const vault = await sdk.vault.ensure({ delegationToken });
24
+
25
+ await vault.scope("default").publish({
26
+ type: "user_message",
27
+ context: "conv-42",
28
+ payload: { text: "Hi" },
29
+ });
30
+
31
+ const sub = vault.scope("default").subscribe(
32
+ { context: "conv-42", types: ["assistant_message"] },
33
+ (event) => console.log(event.payload),
34
+ );
35
+ ```
36
+
37
+ ## Connecting an agent
38
+
39
+ `vault.agents.connect({ manifest, scope, settings })` is the high-level entry
40
+ point. It builds the v2 agreement payload, signs it with your wallet, POSTs
41
+ the signed envelope to the Global Agent Registry (GAR), and then calls
42
+ vault-api `POST /agents` with the resulting signature — all internally.
43
+
44
+ ```ts
45
+ const manifest = await sdk.marketplace.getAgent("personal-assistant");
46
+
47
+ const handle = await vault.agents.connect({
48
+ manifest,
49
+ scope: "default",
50
+ settings: { language: "en" },
51
+ });
52
+
53
+ console.log(handle.agentId, handle.status);
54
+ ```
55
+
56
+ Requires `garEndpoint` and a `wallet` adapter on `VaultSDKConfig`. If you
57
+ already have a pre-signed `agreementSignature` (e.g. from a custodial flow),
58
+ drop down to the low-level `Agents.connect(vaultId, ConnectAgentRequest)`
59
+ exported from `@cef-ai/vault-sdk/internal`.
60
+
61
+ For delegation-token construction (`vault.ensure({ delegationToken })`),
62
+ see `examples/vault-chat/utils/vault-token.ts` — the SDK accepts the token
63
+ as opaque to avoid a runtime dep on `@cere-ddc-sdk/ddc-client`.
64
+
65
+ ## Surface
66
+
67
+ | Method | Maps to |
68
+ | --- | --- |
69
+ | `sdk.vault.ensure()` / `.current()` / `.rotateCredentials()` | `POST` / `GET` / `PUT /api/v1/vaults[/credentials]` |
70
+ | `vault.scopes.{list,get,create,update,delete}` | `/api/v1/vaults/:v/scopes` |
71
+ | `vault.agents.connect({ manifest, scope, settings })` (signs GAR internally) | `POST {garEndpoint}/api/v1/agreements` + `POST /api/v1/vaults/:v/agents` |
72
+ | `vault.agents.{list,get}` → `AgentConnectionHandle` | `/api/v1/vaults/:v/agents` |
73
+ | `handle.update(settings)` / `handle.disconnect()` | `PATCH` / `DELETE` |
74
+ | `handle.cubby(alias).query(...)` / `.exec(...)` | `/scopes/:s/cubbies/:alias/{query,exec}` |
75
+ | `handle.jobs.list()` | `/agents/:a/jobs` |
76
+ | `vault.scope(s).publish(input)` | `POST /scopes/:s/events` |
77
+ | `vault.scope(s).subscribe(filter, handler)` | poll-backed long-poll over `/streams/:c/events` |
78
+ | `vault.scope(s).streams.list()` / `.get(c)` / `.stream(c).events.list()` | `/scopes/:s/streams[/:c[/events]]` |
79
+ | `vault.jobs.list()` / `.get(id).activities.list()` | `/jobs[/...]` |
80
+ | `sdk.marketplace.getAgent(id, version?)` | public `GET /api/v1/marketplace/agents/...` |
81
+ | `sdk.health.live()` / `.ready()` | public `GET /health` / `/ready` |
82
+
83
+ ## Pluggable auth
84
+
85
+ `VaultSDK` accepts either a `wallet` (default → `WalletAuthProvider`) or a
86
+ fully custom `auth: AuthProvider`:
87
+
88
+ ```ts
89
+ new VaultSDK({ endpoint, auth: new BearerAuthProvider(token) });
90
+ ```
91
+
92
+ Ships with `WalletAuthProvider` and `NoAuth`. Implement `AuthProvider`
93
+ yourself to plug in delegation tokens, trusted-headers, or anything else.
94
+
95
+ ## Wallet adapters
96
+
97
+ The `Wallet` interface is `{ pubkey(), sign(bytes), sigType?() }`.
98
+
99
+ - `KeypairWallet.fromSeed(bytes)` — raw 32-byte ed25519 seed (server use).
100
+ - `CereWallet.fromMnemonic(mnemonic, type?)` — wraps `UriSigner`.
101
+ - `CereWallet.fromKeystore(json, passphrase, type?)` — Cere/Polkadot JSON keystore.
102
+
103
+ The `UriSigner` / `JsonSigner` classes powering `CereWallet` are vendored
104
+ from [`@cere-activity-sdk/signers`](https://github.com/cere-io/cere-activity-sdk/tree/main/packages/signers)
105
+ (Apache-2.0); see `src/wallet/cere-internal/README.md` for attribution and
106
+ divergences. We dropped the runtime dep because the upstream package is
107
+ neglected; the underlying `@polkadot/keyring`, `@polkadot/util` and
108
+ `@polkadot/util-crypto` are pulled in directly.
109
+
110
+ Browser-extension and CereWalletNative adapters live in their own packages.
111
+
112
+ ## Lower-level access
113
+
114
+ `@cef-ai/vault-sdk/internal` re-exports `Vaults`, `Scopes`, `Agents`,
115
+ `Events`, `Browse`, `Cubbies`, `Health`, `Marketplace`, plus
116
+ `VaultHttpClient` and `endpoints`. Use it only when the fluent surface
117
+ isn't enough.
118
+
119
+ ## Spec
120
+
121
+ See `../../specs/platform/03-components/vault-sdk.md` (internal
122
+ sibling repo) for the design contract.
@@ -0,0 +1,28 @@
1
+ import type { VaultHttpClient } from "../core/http.js";
2
+ /**
3
+ * Wire shape of a signed agreement envelope POSTed to GAR.
4
+ * - `payload` is the base64url-encoded UTF-8 JSON of the v2 payload.
5
+ * - `signature.value` is the 0x-prefixed hex of the 64-byte ed25519 signature
6
+ * over the **raw JSON bytes** (not the base64url-encoded string).
7
+ * - `signature.signer` is the 0x-prefixed hex of the user's pubkey.
8
+ */
9
+ export interface SignedAgreementEnvelope {
10
+ payload: string;
11
+ signature: {
12
+ algorithm: "ed25519";
13
+ signer: string;
14
+ value: string;
15
+ };
16
+ }
17
+ /**
18
+ * Thin POST-only client for the Global Agent Registry's `agreements` endpoint.
19
+ * GAR validates the signature inside the envelope body, so we use NoAuth per
20
+ * call (no wallet-auth headers). A separate `VaultHttpClient` instance pointed
21
+ * at `garEndpoint` is wired in `client.ts`.
22
+ */
23
+ export declare class GarClient {
24
+ private readonly http;
25
+ constructor(http: VaultHttpClient);
26
+ postAgreement(envelope: SignedAgreementEnvelope): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=gar-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gar-client.d.ts","sourceRoot":"","sources":["../../src/agreements/gar-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKvD;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,eAAe;IAE5C,aAAa,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;CAUtE"}
@@ -0,0 +1,21 @@
1
+ import { NoAuth } from "../auth/no-auth.js";
2
+ const GAR_NO_AUTH = new NoAuth();
3
+ /**
4
+ * Thin POST-only client for the Global Agent Registry's `agreements` endpoint.
5
+ * GAR validates the signature inside the envelope body, so we use NoAuth per
6
+ * call (no wallet-auth headers). A separate `VaultHttpClient` instance pointed
7
+ * at `garEndpoint` is wired in `client.ts`.
8
+ */
9
+ export class GarClient {
10
+ http;
11
+ constructor(http) {
12
+ this.http = http;
13
+ }
14
+ async postAgreement(envelope) {
15
+ await this.http.send("POST", "/api/v1/agreements", {
16
+ body: envelope,
17
+ auth: GAR_NO_AUTH,
18
+ });
19
+ }
20
+ }
21
+ //# sourceMappingURL=gar-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gar-client.js","sourceRoot":"","sources":["../../src/agreements/gar-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,GAAG,IAAI,MAAM,EAAE,CAAC;AAkBjC;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;IAAG,CAAC;IAEtD,KAAK,CAAC,aAAa,CAAC,QAAiC;QACnD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAClB,MAAM,EACN,oBAAoB,EACpB;YACE,IAAI,EAAE,QAA8C;YACpD,IAAI,EAAE,WAAW;SAClB,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export { buildVaultAgreementPayloadV2, } from "./payload.js";
2
+ export type { VaultAgreementPayloadV2, BuildVaultAgreementPayloadOptions, BuildVaultAgreementPayloadResult, } from "./payload.js";
3
+ export { GarClient } from "./gar-client.js";
4
+ export type { SignedAgreementEnvelope } from "./gar-client.js";
5
+ export { signAndSubmitAgreement } from "./sign.js";
6
+ export type { SignAndSubmitAgreementOptions, SignAndSubmitAgreementResult, } from "./sign.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agreements/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,uBAAuB,EACvB,iCAAiC,EACjC,gCAAgC,GACjC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EACV,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ // src/agreements/index.ts
2
+ export { buildVaultAgreementPayloadV2, } from "./payload.js";
3
+ export { GarClient } from "./gar-client.js";
4
+ export { signAndSubmitAgreement } from "./sign.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agreements/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EACL,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * V2 agreement payload as enforced by the Global Agent Registry. Field order
3
+ * must match `internal/agreement/agreement.go` in the GAR repo so that the
4
+ * JSON-encoded bytes signed here match what GAR re-marshals on its side. V8 /
5
+ * Node preserve TS object-literal property insertion order, which gives us
6
+ * the deterministic byte output GAR's signature verification needs.
7
+ */
8
+ export interface VaultAgreementPayloadV2 {
9
+ version: "v2";
10
+ agent_service_pub_key: string;
11
+ agent_id: string;
12
+ vault_id: string;
13
+ user_pub_key: string;
14
+ revoked: false;
15
+ expires_at: null;
16
+ metadata: {
17
+ scopes: string[];
18
+ };
19
+ created_at: string;
20
+ }
21
+ export interface BuildVaultAgreementPayloadOptions {
22
+ vaultId: string;
23
+ /** User's wallet pubkey — accepted with or without `0x`; stamped 0x-hex. */
24
+ userPubKey: string;
25
+ /** Agent service pubkey from the manifest — same handling as `userPubKey`. */
26
+ asPubKey: string;
27
+ agentId: string;
28
+ scope: string;
29
+ /** Injectable clock for deterministic tests. Defaults to `nowRFC3339`. */
30
+ createdAt?: () => string;
31
+ }
32
+ export interface BuildVaultAgreementPayloadResult {
33
+ payload: VaultAgreementPayloadV2;
34
+ /** UTF-8 bytes of `JSON.stringify(payload)` — what the wallet must sign. */
35
+ bytes: Uint8Array;
36
+ }
37
+ export declare function buildVaultAgreementPayloadV2(opts: BuildVaultAgreementPayloadOptions): BuildVaultAgreementPayloadResult;
38
+ //# sourceMappingURL=payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/agreements/payload.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,IAAI,CAAC;IACd,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,uBAAuB,CAAC;IACjC,4EAA4E;IAC5E,KAAK,EAAE,UAAU,CAAC;CACnB;AAID,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,iCAAiC,GACtC,gCAAgC,CAelC"}
@@ -0,0 +1,20 @@
1
+ // src/agreements/payload.ts
2
+ import { ensure0xHex, nowRFC3339 } from "../core/canonical.js";
3
+ const enc = new TextEncoder();
4
+ export function buildVaultAgreementPayloadV2(opts) {
5
+ const clock = opts.createdAt ?? nowRFC3339;
6
+ // Insertion order matters — see VaultAgreementPayloadV2 doc comment.
7
+ const payload = {
8
+ version: "v2",
9
+ agent_service_pub_key: ensure0xHex(opts.asPubKey),
10
+ agent_id: opts.agentId,
11
+ vault_id: opts.vaultId,
12
+ user_pub_key: ensure0xHex(opts.userPubKey),
13
+ revoked: false,
14
+ expires_at: null,
15
+ metadata: { scopes: [opts.scope] },
16
+ created_at: clock(),
17
+ };
18
+ return { payload, bytes: enc.encode(JSON.stringify(payload)) };
19
+ }
20
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/agreements/payload.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAuC/D,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9B,MAAM,UAAU,4BAA4B,CAC1C,IAAuC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;IAC3C,qEAAqE;IACrE,MAAM,OAAO,GAA4B;QACvC,OAAO,EAAE,IAAI;QACb,qBAAqB,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjD,QAAQ,EAAE,IAAI,CAAC,OAAO;QACtB,QAAQ,EAAE,IAAI,CAAC,OAAO;QACtB,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1C,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAClC,UAAU,EAAE,KAAK,EAAE;KACpB,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Wallet } from "../wallet/adapter.js";
2
+ import type { AgentManifest } from "../internal/marketplace.js";
3
+ import type { GarClient } from "./gar-client.js";
4
+ export interface SignAndSubmitAgreementOptions {
5
+ /** Wallet adapter — must implement `sign(bytes)`. */
6
+ wallet: Wallet;
7
+ /** Vault to bind the agreement to. */
8
+ vault: {
9
+ id: string;
10
+ userPubKey: string;
11
+ };
12
+ manifest: AgentManifest;
13
+ scope: string;
14
+ gar: GarClient;
15
+ /** Injectable clock for deterministic tests. */
16
+ clock?: () => string;
17
+ }
18
+ export interface SignAndSubmitAgreementResult {
19
+ /**
20
+ * Bare hex (no `0x` prefix) of the 64-byte ed25519 signature. PR #19 of the
21
+ * vault-api connect endpoint expects this stripped form.
22
+ */
23
+ agreementSignature: string;
24
+ }
25
+ /**
26
+ * High-level orchestrator: build a v2 agreement payload, sign the JSON bytes
27
+ * with the user's wallet, POST the signed envelope to GAR, and return the
28
+ * bare-hex signature for the vault-api `agents.connect` body.
29
+ */
30
+ export declare function signAndSubmitAgreement(opts: SignAndSubmitAgreementOptions): Promise<SignAndSubmitAgreementResult>;
31
+ //# sourceMappingURL=sign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/agreements/sign.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,6BAA6B;IAC5C,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,SAAS,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,4BAA4B,CAAC,CAkCvC"}
@@ -0,0 +1,38 @@
1
+ // src/agreements/sign.ts
2
+ import { bytesToHex, encodeBase64Url, ensure0xHex, strip0xHex, } from "../core/canonical.js";
3
+ import { VaultSignerRequiredError } from "../core/errors.js";
4
+ import { buildVaultAgreementPayloadV2 } from "./payload.js";
5
+ /**
6
+ * High-level orchestrator: build a v2 agreement payload, sign the JSON bytes
7
+ * with the user's wallet, POST the signed envelope to GAR, and return the
8
+ * bare-hex signature for the vault-api `agents.connect` body.
9
+ */
10
+ export async function signAndSubmitAgreement(opts) {
11
+ if (typeof opts.wallet?.sign !== "function") {
12
+ throw new VaultSignerRequiredError();
13
+ }
14
+ if (!opts.manifest.asPubKey) {
15
+ throw new Error("signAndSubmitAgreement: manifest is missing required `asPubKey` field");
16
+ }
17
+ const { bytes } = buildVaultAgreementPayloadV2({
18
+ vaultId: opts.vault.id,
19
+ userPubKey: opts.vault.userPubKey,
20
+ asPubKey: opts.manifest.asPubKey,
21
+ agentId: opts.manifest.agentId,
22
+ scope: opts.scope,
23
+ createdAt: opts.clock,
24
+ });
25
+ const sigBytes = await opts.wallet.sign(bytes);
26
+ const sigHexBare = bytesToHex(sigBytes);
27
+ const envelope = {
28
+ payload: encodeBase64Url(bytes),
29
+ signature: {
30
+ algorithm: "ed25519",
31
+ signer: ensure0xHex(opts.vault.userPubKey),
32
+ value: ensure0xHex(sigHexBare),
33
+ },
34
+ };
35
+ await opts.gar.postAgreement(envelope);
36
+ return { agreementSignature: strip0xHex(sigHexBare) };
37
+ }
38
+ //# sourceMappingURL=sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/agreements/sign.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAuB5D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAmC;IAEnC,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,wBAAwB,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,4BAA4B,CAAC;QAC7C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;QACtB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAChC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,KAAK;KACtB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAExC,MAAM,QAAQ,GAA4B;QACxC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC;QAC/B,SAAS,EAAE;YACT,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC1C,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC;SAC/B;KACF,CAAC;IAEF,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEvC,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AuthProvider, AuthRequest, AuthOutcome } from "./provider.js";
2
+ /**
3
+ * Public-route auth provider. Adds Content-Type for mutation bodies, no
4
+ * authentication headers. Used by Marketplace + Health/Ready.
5
+ */
6
+ export declare class NoAuth implements AuthProvider {
7
+ authenticate(req: AuthRequest): Promise<AuthOutcome>;
8
+ }
9
+ //# sourceMappingURL=no-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-auth.d.ts","sourceRoot":"","sources":["../../src/auth/no-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E;;;GAGG;AACH,qBAAa,MAAO,YAAW,YAAY;IACnC,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAO3D"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Public-route auth provider. Adds Content-Type for mutation bodies, no
3
+ * authentication headers. Used by Marketplace + Health/Ready.
4
+ */
5
+ export class NoAuth {
6
+ async authenticate(req) {
7
+ if (req.body !== undefined) {
8
+ const bytes = new TextEncoder().encode(JSON.stringify(req.body));
9
+ return { headers: { "Content-Type": "application/json" }, body: bytes };
10
+ }
11
+ return { headers: {} };
12
+ }
13
+ }
14
+ //# sourceMappingURL=no-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-auth.js","sourceRoot":"","sources":["../../src/auth/no-auth.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,MAAM;IACjB,KAAK,CAAC,YAAY,CAAC,GAAgB;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pluggable authentication for VaultHttpClient. Implementations transform a
3
+ * pending request into a header set + (for mutations that sign the body)
4
+ * the exact byte payload that was authenticated.
5
+ *
6
+ * Shipped: WalletAuthProvider (X-Public-Key/X-Signature flow), NoAuth.
7
+ * Future: BearerAuthProvider, TrustedHeadersAuthProvider, DelegationToken.
8
+ */
9
+ export interface AuthRequest {
10
+ method: string;
11
+ /** URL path (no host, no query). */
12
+ path: string;
13
+ /** Query string without leading `?`. */
14
+ query: string;
15
+ /** Mutation body before authentication. AuthProvider may stamp + serialise. */
16
+ body?: Record<string, unknown>;
17
+ }
18
+ export interface AuthOutcome {
19
+ /** Headers to spread onto the outgoing fetch. */
20
+ headers: Record<string, string>;
21
+ /**
22
+ * Bytes to send as the request body. When set, the transport sends these
23
+ * verbatim — typically because the auth provider added a timestamp and
24
+ * needs the signature to cover the exact serialised bytes.
25
+ */
26
+ body?: Uint8Array;
27
+ }
28
+ export interface AuthProvider {
29
+ authenticate(req: AuthRequest): Promise<AuthOutcome>;
30
+ }
31
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/auth/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/auth/provider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { AuthProvider, AuthRequest, AuthOutcome } from "./provider.js";
2
+ import type { Wallet } from "../wallet/adapter.js";
3
+ export interface WalletAuthOptions {
4
+ /** Override the wallet's sigType. */
5
+ sigType?: "ed25519" | "sr25519";
6
+ /** Clock for deterministic tests. */
7
+ clock?: () => string;
8
+ }
9
+ export declare class WalletAuthProvider implements AuthProvider {
10
+ private readonly wallet;
11
+ private readonly opts;
12
+ constructor(wallet: Wallet, opts?: WalletAuthOptions);
13
+ authenticate(req: AuthRequest): Promise<AuthOutcome>;
14
+ }
15
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/auth/wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAMnD,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IAEnD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,iBAAsB;IAGzC,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAuB3D"}
@@ -0,0 +1,33 @@
1
+ import { buildPreamble, encodeBase64Url, ensure0xHex, stampBody, strip0xHex, bytesToHex, } from "../core/canonical.js";
2
+ import { VaultSignerRequiredError } from "../core/errors.js";
3
+ export class WalletAuthProvider {
4
+ wallet;
5
+ opts;
6
+ constructor(wallet, opts = {}) {
7
+ this.wallet = wallet;
8
+ this.opts = opts;
9
+ }
10
+ async authenticate(req) {
11
+ if (typeof this.wallet?.sign !== "function")
12
+ throw new VaultSignerRequiredError();
13
+ const sigType = this.opts.sigType ?? this.wallet.sigType?.() ?? "ed25519";
14
+ const headers = {
15
+ "X-Public-Key": ensure0xHex(this.wallet.pubkey()),
16
+ "X-Signature-Type": sigType,
17
+ };
18
+ const upper = req.method.toUpperCase();
19
+ if (upper === "GET" || upper === "HEAD") {
20
+ const { bytes } = buildPreamble(upper, req.path, req.query, this.opts.clock);
21
+ const sig = await this.wallet.sign(bytes);
22
+ headers["X-Signed-Preamble"] = encodeBase64Url(bytes);
23
+ headers["X-Signature"] = strip0xHex(bytesToHex(sig));
24
+ return { headers };
25
+ }
26
+ const { bytes } = stampBody(req.body, this.opts.clock);
27
+ const sig = await this.wallet.sign(bytes);
28
+ headers["Content-Type"] = "application/json";
29
+ headers["X-Signature"] = strip0xHex(bytesToHex(sig));
30
+ return { headers, body: bytes };
31
+ }
32
+ }
33
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/auth/wallet.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAC/E,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAS7D,MAAM,OAAO,kBAAkB;IAEV;IACA;IAFnB,YACmB,MAAc,EACd,OAA0B,EAAE;QAD5B,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAwB;IAC5C,CAAC;IAEJ,KAAK,CAAC,YAAY,CAAC,GAAgB;QACjC,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU;YAAE,MAAM,IAAI,wBAAwB,EAAE,CAAC;QAElF,MAAM,OAAO,GACX,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;QAC5D,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,kBAAkB,EAAE,OAAO;SAC5B,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACxC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,mBAAmB,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,OAAO,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import { Marketplace } from "./internal/marketplace.js";
2
+ import { Health } from "./internal/health.js";
3
+ import { Vault } from "./fluent/vault.js";
4
+ import type { AuthProvider } from "./auth/provider.js";
5
+ import type { Wallet } from "./wallet/adapter.js";
6
+ export interface VaultSDKConfig {
7
+ endpoint: string;
8
+ /** Marketplace API base URL. Defaults to `endpoint`. */
9
+ marketplaceEndpoint?: string;
10
+ /**
11
+ * Global Agent Registry endpoint. When set, `vault.agents.connect` becomes
12
+ * the high-level helper that signs the GAR agreement on the user's behalf.
13
+ * When unset, callers must use the low-level `Agents.connect` directly with
14
+ * a pre-signed `agreementSignature`.
15
+ */
16
+ garEndpoint?: string;
17
+ /**
18
+ * Wallet adapter — used to construct a default `WalletAuthProvider` for
19
+ * authenticated calls. Mutually exclusive with `auth`.
20
+ */
21
+ wallet?: Wallet;
22
+ /** Fully custom auth provider. Overrides `wallet`. */
23
+ auth?: AuthProvider;
24
+ fetch?: typeof fetch;
25
+ timeoutMs?: number;
26
+ }
27
+ export interface EnsureVaultOptions {
28
+ name?: string;
29
+ /** DDC delegation token issued during onboarding. Opaque base58 string. */
30
+ delegationToken: string;
31
+ }
32
+ export declare class VaultSDK {
33
+ private readonly http;
34
+ private readonly marketplaceHttp;
35
+ private readonly vaults;
36
+ private readonly gar?;
37
+ private readonly wallet?;
38
+ readonly marketplace: Marketplace;
39
+ readonly health: Health;
40
+ constructor(config: VaultSDKConfig);
41
+ vault: {
42
+ ensure: (opts: EnsureVaultOptions) => Promise<Vault>;
43
+ current: () => Promise<Vault>;
44
+ /** Rotate the SigV4 delegation credential. */
45
+ rotateCredentials: (vaultId: string, delegationToken: string) => Promise<Vault>;
46
+ };
47
+ }
48
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,cAAc;IA8BlC,KAAK;uBACkB,kBAAkB,KAAG,OAAO,CAAC,KAAK,CAAC;uBAOrC,OAAO,CAAC,KAAK,CAAC;QAIjC,8CAA8C;qCAEnC,MAAM,mBACE,MAAM,KACtB,OAAO,CAAC,KAAK,CAAC;MAMjB;CACH"}
package/dist/client.js ADDED
@@ -0,0 +1,64 @@
1
+ // src/client.ts
2
+ import { VaultHttpClient } from "./core/http.js";
3
+ import { Vaults } from "./internal/vaults.js";
4
+ import { Marketplace } from "./internal/marketplace.js";
5
+ import { Health } from "./internal/health.js";
6
+ import { Vault } from "./fluent/vault.js";
7
+ import { WalletAuthProvider } from "./auth/wallet.js";
8
+ import { GarClient } from "./agreements/gar-client.js";
9
+ export class VaultSDK {
10
+ http;
11
+ marketplaceHttp;
12
+ vaults;
13
+ gar;
14
+ wallet;
15
+ marketplace;
16
+ health;
17
+ constructor(config) {
18
+ const auth = config.auth ?? (config.wallet ? new WalletAuthProvider(config.wallet) : undefined);
19
+ this.http = new VaultHttpClient({
20
+ url: config.endpoint,
21
+ auth,
22
+ fetch: config.fetch,
23
+ timeoutMs: config.timeoutMs,
24
+ });
25
+ this.marketplaceHttp = new VaultHttpClient({
26
+ url: config.marketplaceEndpoint ?? config.endpoint,
27
+ fetch: config.fetch,
28
+ timeoutMs: config.timeoutMs,
29
+ });
30
+ if (config.garEndpoint) {
31
+ // GAR validates the signature inside the body — no auth provider needed.
32
+ this.gar = new GarClient(new VaultHttpClient({
33
+ url: config.garEndpoint,
34
+ fetch: config.fetch,
35
+ timeoutMs: config.timeoutMs,
36
+ }));
37
+ }
38
+ this.wallet = config.wallet;
39
+ this.vaults = new Vaults(this.http);
40
+ this.marketplace = new Marketplace(this.marketplaceHttp);
41
+ this.health = new Health(this.http);
42
+ }
43
+ vault = {
44
+ ensure: async (opts) => {
45
+ const rec = await this.vaults.claim({
46
+ name: opts.name,
47
+ delegation_token: opts.delegationToken,
48
+ });
49
+ return new Vault(this.http, rec, { gar: this.gar, wallet: this.wallet });
50
+ },
51
+ current: async () => {
52
+ const rec = await this.vaults.current();
53
+ return new Vault(this.http, rec, { gar: this.gar, wallet: this.wallet });
54
+ },
55
+ /** Rotate the SigV4 delegation credential. */
56
+ rotateCredentials: async (vaultId, delegationToken) => {
57
+ const rec = await this.vaults.rotateCredentials(vaultId, {
58
+ delegation_token: delegationToken,
59
+ });
60
+ return new Vault(this.http, rec, { gar: this.gar, wallet: this.wallet });
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const nowRFC3339: () => string;
2
+ export declare function ensure0xHex(s: string): string;
3
+ export declare function strip0xHex(s: string): string;
4
+ export declare function bytesToHex(b: Uint8Array): string;
5
+ export declare function encodeBase64Url(bytes: Uint8Array): string;
6
+ export interface StampedBody {
7
+ body: Record<string, unknown>;
8
+ bytes: Uint8Array;
9
+ }
10
+ export declare function stampBody(body: Record<string, unknown> | undefined, clock?: () => string): StampedBody;
11
+ export interface Preamble {
12
+ preamble: string;
13
+ bytes: Uint8Array;
14
+ }
15
+ export declare function buildPreamble(method: string, path: string, query: string, clock?: () => string): Preamble;
16
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/core/canonical.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,QAAO,MAAkC,CAAC;AAEjE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AACD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AACD,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAGhD;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAKzD;AAGD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE;AACjF,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,KAAK,GAAE,MAAM,MAAmB,GAC/B,WAAW,CAIb;AAED,MAAM,WAAW,QAAQ;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE;AACjE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,MAAmB,GAC/B,QAAQ,CAQV"}