@1claw/sdk 0.2.1 → 0.4.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 (150) hide show
  1. package/README.md +99 -2
  2. package/dist/__tests__/client.test.d.ts +2 -0
  3. package/dist/__tests__/client.test.d.ts.map +1 -0
  4. package/dist/__tests__/client.test.js +86 -0
  5. package/dist/__tests__/client.test.js.map +1 -0
  6. package/dist/__tests__/errors.test.d.ts +2 -0
  7. package/dist/__tests__/errors.test.d.ts.map +1 -0
  8. package/dist/__tests__/errors.test.js +125 -0
  9. package/dist/__tests__/errors.test.js.map +1 -0
  10. package/dist/__tests__/http.test.d.ts +2 -0
  11. package/dist/__tests__/http.test.d.ts.map +1 -0
  12. package/dist/__tests__/http.test.js +200 -0
  13. package/dist/__tests__/http.test.js.map +1 -0
  14. package/dist/__tests__/resources.test.d.ts +2 -0
  15. package/dist/__tests__/resources.test.d.ts.map +1 -0
  16. package/dist/__tests__/resources.test.js +538 -0
  17. package/dist/__tests__/resources.test.js.map +1 -0
  18. package/dist/cmek.d.ts +42 -0
  19. package/dist/cmek.d.ts.map +1 -0
  20. package/dist/cmek.js +101 -0
  21. package/dist/cmek.js.map +1 -0
  22. package/dist/{client.d.ts → core/client.d.ts} +15 -21
  23. package/dist/core/client.d.ts.map +1 -0
  24. package/dist/{client.js → core/client.js} +24 -42
  25. package/dist/core/client.js.map +1 -0
  26. package/dist/{errors.d.ts → core/errors.d.ts} +8 -1
  27. package/dist/core/errors.d.ts.map +1 -0
  28. package/dist/{errors.js → core/errors.js} +22 -2
  29. package/dist/core/errors.js.map +1 -0
  30. package/dist/{http.d.ts → core/http.d.ts} +7 -1
  31. package/dist/core/http.d.ts.map +1 -0
  32. package/dist/{http.js → core/http.js} +53 -0
  33. package/dist/core/http.js.map +1 -0
  34. package/dist/generated/api-types.d.ts +4213 -0
  35. package/dist/generated/api-types.d.ts.map +1 -0
  36. package/dist/generated/api-types.js +6 -0
  37. package/dist/generated/api-types.js.map +1 -0
  38. package/dist/index.d.ts +19 -16
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +19 -15
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp/handler.d.ts +1 -1
  43. package/dist/mcp/handler.d.ts.map +1 -1
  44. package/dist/plugins/audit-sink.d.ts +48 -0
  45. package/dist/plugins/audit-sink.d.ts.map +1 -0
  46. package/dist/plugins/audit-sink.js +2 -0
  47. package/dist/plugins/audit-sink.js.map +1 -0
  48. package/dist/plugins/crypto-provider.d.ts +38 -0
  49. package/dist/plugins/crypto-provider.d.ts.map +1 -0
  50. package/dist/plugins/crypto-provider.js +2 -0
  51. package/dist/plugins/crypto-provider.js.map +1 -0
  52. package/dist/plugins/index.d.ts +16 -0
  53. package/dist/plugins/index.d.ts.map +1 -0
  54. package/dist/plugins/index.js +2 -0
  55. package/dist/plugins/index.js.map +1 -0
  56. package/dist/plugins/policy-engine.d.ts +58 -0
  57. package/dist/plugins/policy-engine.d.ts.map +1 -0
  58. package/dist/plugins/policy-engine.js +2 -0
  59. package/dist/plugins/policy-engine.js.map +1 -0
  60. package/dist/{access.d.ts → resources/access.d.ts} +2 -2
  61. package/dist/resources/access.d.ts.map +1 -0
  62. package/dist/resources/access.js.map +1 -0
  63. package/dist/{agents.d.ts → resources/agents.d.ts} +4 -2
  64. package/dist/resources/agents.d.ts.map +1 -0
  65. package/dist/{agents.js → resources/agents.js} +4 -0
  66. package/dist/resources/agents.js.map +1 -0
  67. package/dist/{api-keys.d.ts → resources/api-keys.d.ts} +2 -2
  68. package/dist/resources/api-keys.d.ts.map +1 -0
  69. package/dist/resources/api-keys.js.map +1 -0
  70. package/dist/{approvals.d.ts → resources/approvals.d.ts} +2 -2
  71. package/dist/resources/approvals.d.ts.map +1 -0
  72. package/dist/resources/approvals.js.map +1 -0
  73. package/dist/{audit.d.ts → resources/audit.d.ts} +2 -2
  74. package/dist/resources/audit.d.ts.map +1 -0
  75. package/dist/resources/audit.js.map +1 -0
  76. package/dist/{auth.d.ts → resources/auth.d.ts} +8 -2
  77. package/dist/resources/auth.d.ts.map +1 -0
  78. package/dist/{auth.js → resources/auth.js} +16 -0
  79. package/dist/resources/auth.js.map +1 -0
  80. package/dist/{billing.d.ts → resources/billing.d.ts} +2 -2
  81. package/dist/resources/billing.d.ts.map +1 -0
  82. package/dist/resources/billing.js.map +1 -0
  83. package/dist/{chains.d.ts → resources/chains.d.ts} +2 -2
  84. package/dist/resources/chains.d.ts.map +1 -0
  85. package/dist/resources/chains.js.map +1 -0
  86. package/dist/{org.d.ts → resources/org.d.ts} +2 -2
  87. package/dist/resources/org.d.ts.map +1 -0
  88. package/dist/resources/org.js.map +1 -0
  89. package/dist/{secrets.d.ts → resources/secrets.d.ts} +2 -2
  90. package/dist/resources/secrets.d.ts.map +1 -0
  91. package/dist/resources/secrets.js.map +1 -0
  92. package/dist/{sharing.d.ts → resources/sharing.d.ts} +2 -2
  93. package/dist/resources/sharing.d.ts.map +1 -0
  94. package/dist/resources/sharing.js.map +1 -0
  95. package/dist/resources/vault.d.ts +29 -0
  96. package/dist/resources/vault.d.ts.map +1 -0
  97. package/dist/resources/vault.js +55 -0
  98. package/dist/resources/vault.js.map +1 -0
  99. package/dist/{x402.d.ts → resources/x402.d.ts} +2 -2
  100. package/dist/resources/x402.d.ts.map +1 -0
  101. package/dist/{x402.js → resources/x402.js} +1 -1
  102. package/dist/resources/x402.js.map +1 -0
  103. package/dist/types.d.ts +83 -123
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/types.js +0 -3
  106. package/dist/types.js.map +1 -1
  107. package/package.json +14 -4
  108. package/dist/access.d.ts.map +0 -1
  109. package/dist/access.js.map +0 -1
  110. package/dist/agents.d.ts.map +0 -1
  111. package/dist/agents.js.map +0 -1
  112. package/dist/api-keys.d.ts.map +0 -1
  113. package/dist/api-keys.js.map +0 -1
  114. package/dist/approvals.d.ts.map +0 -1
  115. package/dist/approvals.js.map +0 -1
  116. package/dist/audit.d.ts.map +0 -1
  117. package/dist/audit.js.map +0 -1
  118. package/dist/auth.d.ts.map +0 -1
  119. package/dist/auth.js.map +0 -1
  120. package/dist/billing.d.ts.map +0 -1
  121. package/dist/billing.js.map +0 -1
  122. package/dist/chains.d.ts.map +0 -1
  123. package/dist/chains.js.map +0 -1
  124. package/dist/client.d.ts.map +0 -1
  125. package/dist/client.js.map +0 -1
  126. package/dist/errors.d.ts.map +0 -1
  127. package/dist/errors.js.map +0 -1
  128. package/dist/http.d.ts.map +0 -1
  129. package/dist/http.js.map +0 -1
  130. package/dist/org.d.ts.map +0 -1
  131. package/dist/org.js.map +0 -1
  132. package/dist/secrets.d.ts.map +0 -1
  133. package/dist/secrets.js.map +0 -1
  134. package/dist/sharing.d.ts.map +0 -1
  135. package/dist/sharing.js.map +0 -1
  136. package/dist/vault.d.ts +0 -18
  137. package/dist/vault.d.ts.map +0 -1
  138. package/dist/vault.js +0 -30
  139. package/dist/vault.js.map +0 -1
  140. package/dist/x402.d.ts.map +0 -1
  141. package/dist/x402.js.map +0 -1
  142. /package/dist/{access.js → resources/access.js} +0 -0
  143. /package/dist/{api-keys.js → resources/api-keys.js} +0 -0
  144. /package/dist/{approvals.js → resources/approvals.js} +0 -0
  145. /package/dist/{audit.js → resources/audit.js} +0 -0
  146. /package/dist/{billing.js → resources/billing.js} +0 -0
  147. /package/dist/{chains.js → resources/chains.js} +0 -0
  148. /package/dist/{org.js → resources/org.js} +0 -0
  149. /package/dist/{secrets.js → resources/secrets.js} +0 -0
  150. /package/dist/{sharing.js → resources/sharing.js} +0 -0
@@ -0,0 +1,538 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { HttpClient } from "../core/http";
3
+ import { VaultResource } from "../resources/vault";
4
+ import { SecretsResource } from "../resources/secrets";
5
+ import { AccessResource } from "../resources/access";
6
+ import { AgentsResource } from "../resources/agents";
7
+ import { ChainsResource } from "../resources/chains";
8
+ import { SharingResource } from "../resources/sharing";
9
+ import { ApprovalsResource } from "../resources/approvals";
10
+ import { BillingResource } from "../resources/billing";
11
+ import { AuditResource } from "../resources/audit";
12
+ import { OrgResource } from "../resources/org";
13
+ import { AuthResource } from "../resources/auth";
14
+ import { ApiKeysResource } from "../resources/api-keys";
15
+ const BASE = "https://api.test";
16
+ const originalFetch = globalThis.fetch;
17
+ function mockFetch(status, body) {
18
+ return vi.fn().mockResolvedValue({
19
+ ok: status >= 200 && status < 300,
20
+ status,
21
+ headers: new Headers(),
22
+ json: () => Promise.resolve(body),
23
+ });
24
+ }
25
+ function makeHttp(token = "test-jwt") {
26
+ return new HttpClient({ baseUrl: BASE, token });
27
+ }
28
+ function lastCall() {
29
+ const f = globalThis.fetch;
30
+ return { url: f.mock.calls[0][0], init: f.mock.calls[0][1] };
31
+ }
32
+ afterEach(() => {
33
+ globalThis.fetch = originalFetch;
34
+ });
35
+ // ---------------------------------------------------------------------------
36
+ // VaultResource
37
+ // ---------------------------------------------------------------------------
38
+ describe("VaultResource", () => {
39
+ it("create sends POST /v1/vaults with name and description", async () => {
40
+ globalThis.fetch = mockFetch(201, { id: "v-1", name: "prod" });
41
+ const res = await new VaultResource(makeHttp()).create({ name: "prod", description: "test" });
42
+ const { url, init } = lastCall();
43
+ expect(url).toBe(`${BASE}/v1/vaults`);
44
+ expect(init.method).toBe("POST");
45
+ expect(JSON.parse(init.body)).toEqual({ name: "prod", description: "test" });
46
+ expect(res.data?.id).toBe("v-1");
47
+ });
48
+ it("create defaults description to empty string", async () => {
49
+ globalThis.fetch = mockFetch(201, { id: "v-1" });
50
+ await new VaultResource(makeHttp()).create({ name: "prod" });
51
+ expect(JSON.parse(lastCall().init.body).description).toBe("");
52
+ });
53
+ it("get sends GET /v1/vaults/{id}", async () => {
54
+ globalThis.fetch = mockFetch(200, { id: "v-1" });
55
+ await new VaultResource(makeHttp()).get("v-1");
56
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults/v-1`);
57
+ expect(lastCall().init.method).toBe("GET");
58
+ });
59
+ it("list sends GET /v1/vaults", async () => {
60
+ globalThis.fetch = mockFetch(200, { vaults: [] });
61
+ const res = await new VaultResource(makeHttp()).list();
62
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults`);
63
+ expect(res.data?.vaults).toEqual([]);
64
+ });
65
+ it("delete sends DELETE /v1/vaults/{id}", async () => {
66
+ globalThis.fetch = mockFetch(204, null);
67
+ const res = await new VaultResource(makeHttp()).delete("v-1");
68
+ expect(lastCall().init.method).toBe("DELETE");
69
+ expect(res.meta?.status).toBe(204);
70
+ });
71
+ });
72
+ // ---------------------------------------------------------------------------
73
+ // SecretsResource
74
+ // ---------------------------------------------------------------------------
75
+ describe("SecretsResource", () => {
76
+ it("set sends PUT with value and type", async () => {
77
+ globalThis.fetch = mockFetch(201, { id: "s-1", path: "db/pass", version: 1 });
78
+ await new SecretsResource(makeHttp()).set("v-1", "db/pass", "secret123", { type: "password" });
79
+ const { url, init } = lastCall();
80
+ expect(url).toBe(`${BASE}/v1/vaults/v-1/secrets/db/pass`);
81
+ expect(init.method).toBe("PUT");
82
+ const body = JSON.parse(init.body);
83
+ expect(body.value).toBe("secret123");
84
+ expect(body.type).toBe("password");
85
+ });
86
+ it("set defaults type to 'generic'", async () => {
87
+ globalThis.fetch = mockFetch(201, {});
88
+ await new SecretsResource(makeHttp()).set("v-1", "key", "val");
89
+ expect(JSON.parse(lastCall().init.body).type).toBe("generic");
90
+ });
91
+ it("set passes optional fields", async () => {
92
+ globalThis.fetch = mockFetch(201, {});
93
+ await new SecretsResource(makeHttp()).set("v-1", "key", "val", {
94
+ max_access_count: 5,
95
+ expires_at: "2025-12-31T00:00:00Z",
96
+ metadata: { env: "prod" },
97
+ });
98
+ const body = JSON.parse(lastCall().init.body);
99
+ expect(body.max_access_count).toBe(5);
100
+ expect(body.expires_at).toBe("2025-12-31T00:00:00Z");
101
+ expect(body.metadata).toEqual({ env: "prod" });
102
+ });
103
+ it("get sends GET with correct path", async () => {
104
+ globalThis.fetch = mockFetch(200, { value: "s3cr3t" });
105
+ const res = await new SecretsResource(makeHttp()).get("v-1", "db/pass");
106
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults/v-1/secrets/db/pass`);
107
+ expect(res.data?.value).toBe("s3cr3t");
108
+ });
109
+ it("delete sends DELETE", async () => {
110
+ globalThis.fetch = mockFetch(204, null);
111
+ await new SecretsResource(makeHttp()).delete("v-1", "db/pass");
112
+ expect(lastCall().init.method).toBe("DELETE");
113
+ });
114
+ it("list sends GET with optional prefix query", async () => {
115
+ globalThis.fetch = mockFetch(200, { secrets: [] });
116
+ await new SecretsResource(makeHttp()).list("v-1", "db");
117
+ const url = new URL(lastCall().url);
118
+ expect(url.pathname).toBe("/v1/vaults/v-1/secrets");
119
+ expect(url.searchParams.get("prefix")).toBe("db");
120
+ });
121
+ it("list omits prefix when not provided", async () => {
122
+ globalThis.fetch = mockFetch(200, { secrets: [] });
123
+ await new SecretsResource(makeHttp()).list("v-1");
124
+ const url = new URL(lastCall().url);
125
+ expect(url.searchParams.has("prefix")).toBe(false);
126
+ });
127
+ it("rotate delegates to set", async () => {
128
+ globalThis.fetch = mockFetch(201, { version: 2 });
129
+ await new SecretsResource(makeHttp()).rotate("v-1", "key", "new-val");
130
+ expect(lastCall().init.method).toBe("PUT");
131
+ expect(JSON.parse(lastCall().init.body).value).toBe("new-val");
132
+ });
133
+ });
134
+ // ---------------------------------------------------------------------------
135
+ // AccessResource
136
+ // ---------------------------------------------------------------------------
137
+ describe("AccessResource", () => {
138
+ it("grantHuman sends POST with principal_type user", async () => {
139
+ globalThis.fetch = mockFetch(201, { id: "p-1" });
140
+ await new AccessResource(makeHttp()).grantHuman("v-1", "u-1", ["read"]);
141
+ const body = JSON.parse(lastCall().init.body);
142
+ expect(body.principal_type).toBe("user");
143
+ expect(body.principal_id).toBe("u-1");
144
+ expect(body.permissions).toEqual(["read"]);
145
+ expect(body.secret_path_pattern).toBe("**");
146
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults/v-1/policies`);
147
+ });
148
+ it("grantAgent sends POST with principal_type agent", async () => {
149
+ globalThis.fetch = mockFetch(201, { id: "p-1" });
150
+ await new AccessResource(makeHttp()).grantAgent("v-1", "a-1", ["read", "write"], {
151
+ secretPathPattern: "keys/*",
152
+ expires_at: "2025-12-31T00:00:00Z",
153
+ });
154
+ const body = JSON.parse(lastCall().init.body);
155
+ expect(body.principal_type).toBe("agent");
156
+ expect(body.secret_path_pattern).toBe("keys/*");
157
+ expect(body.expires_at).toBe("2025-12-31T00:00:00Z");
158
+ });
159
+ it("update sends PUT", async () => {
160
+ globalThis.fetch = mockFetch(200, {});
161
+ await new AccessResource(makeHttp()).update("v-1", "p-1", { permissions: ["read"] });
162
+ expect(lastCall().init.method).toBe("PUT");
163
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults/v-1/policies/p-1`);
164
+ });
165
+ it("revoke sends DELETE", async () => {
166
+ globalThis.fetch = mockFetch(204, null);
167
+ await new AccessResource(makeHttp()).revoke("v-1", "p-1");
168
+ expect(lastCall().init.method).toBe("DELETE");
169
+ });
170
+ it("listGrants sends GET", async () => {
171
+ globalThis.fetch = mockFetch(200, { policies: [] });
172
+ await new AccessResource(makeHttp()).listGrants("v-1");
173
+ expect(lastCall().url).toBe(`${BASE}/v1/vaults/v-1/policies`);
174
+ });
175
+ });
176
+ // ---------------------------------------------------------------------------
177
+ // AgentsResource
178
+ // ---------------------------------------------------------------------------
179
+ describe("AgentsResource", () => {
180
+ it("create sends POST /v1/agents", async () => {
181
+ globalThis.fetch = mockFetch(201, { agent: { id: "a-1" }, api_key: "ocv_xxx" });
182
+ const res = await new AgentsResource(makeHttp()).create({
183
+ name: "bot",
184
+ crypto_proxy_enabled: true,
185
+ tx_max_value_eth: "0.5",
186
+ });
187
+ const body = JSON.parse(lastCall().init.body);
188
+ expect(body.name).toBe("bot");
189
+ expect(body.crypto_proxy_enabled).toBe(true);
190
+ expect(body.tx_max_value_eth).toBe("0.5");
191
+ expect(res.data?.api_key).toBe("ocv_xxx");
192
+ });
193
+ it("get sends GET /v1/agents/{id}", async () => {
194
+ globalThis.fetch = mockFetch(200, { id: "a-1" });
195
+ await new AgentsResource(makeHttp()).get("a-1");
196
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1`);
197
+ });
198
+ it("list sends GET /v1/agents", async () => {
199
+ globalThis.fetch = mockFetch(200, { agents: [] });
200
+ await new AgentsResource(makeHttp()).list();
201
+ expect(lastCall().url).toBe(`${BASE}/v1/agents`);
202
+ });
203
+ it("update sends PATCH", async () => {
204
+ globalThis.fetch = mockFetch(200, {});
205
+ await new AgentsResource(makeHttp()).update("a-1", { is_active: false });
206
+ expect(lastCall().init.method).toBe("PATCH");
207
+ expect(JSON.parse(lastCall().init.body).is_active).toBe(false);
208
+ });
209
+ it("delete sends DELETE", async () => {
210
+ globalThis.fetch = mockFetch(204, null);
211
+ await new AgentsResource(makeHttp()).delete("a-1");
212
+ expect(lastCall().init.method).toBe("DELETE");
213
+ });
214
+ it("rotateKey sends POST to /rotate-key", async () => {
215
+ globalThis.fetch = mockFetch(200, { api_key: "ocv_new" });
216
+ const res = await new AgentsResource(makeHttp()).rotateKey("a-1");
217
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/rotate-key`);
218
+ expect(res.data?.api_key).toBe("ocv_new");
219
+ });
220
+ it("submitTransaction sends POST to /transactions", async () => {
221
+ globalThis.fetch = mockFetch(201, { id: "tx-1", status: "signed" });
222
+ await new AgentsResource(makeHttp()).submitTransaction("a-1", {
223
+ to: "0xdead",
224
+ value: "0.01",
225
+ chain: "sepolia",
226
+ simulate_first: true,
227
+ });
228
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/transactions`);
229
+ const body = JSON.parse(lastCall().init.body);
230
+ expect(body.to).toBe("0xdead");
231
+ expect(body.simulate_first).toBe(true);
232
+ });
233
+ it("getTransaction sends GET to /transactions/{txId}", async () => {
234
+ globalThis.fetch = mockFetch(200, { id: "tx-1" });
235
+ await new AgentsResource(makeHttp()).getTransaction("a-1", "tx-1");
236
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/transactions/tx-1`);
237
+ });
238
+ it("listTransactions sends GET to /transactions", async () => {
239
+ globalThis.fetch = mockFetch(200, { transactions: [] });
240
+ await new AgentsResource(makeHttp()).listTransactions("a-1");
241
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/transactions`);
242
+ });
243
+ it("simulateTransaction sends POST to /transactions/simulate", async () => {
244
+ globalThis.fetch = mockFetch(200, { simulation_id: "sim-1", status: "success" });
245
+ await new AgentsResource(makeHttp()).simulateTransaction("a-1", {
246
+ to: "0xdead",
247
+ value: "0.01",
248
+ chain: "sepolia",
249
+ });
250
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/transactions/simulate`);
251
+ });
252
+ it("simulateBundle sends POST to /transactions/simulate-bundle", async () => {
253
+ globalThis.fetch = mockFetch(200, { simulations: [] });
254
+ await new AgentsResource(makeHttp()).simulateBundle("a-1", {
255
+ transactions: [{ to: "0xdead", value: "0.01", chain: "sepolia" }],
256
+ });
257
+ expect(lastCall().url).toBe(`${BASE}/v1/agents/a-1/transactions/simulate-bundle`);
258
+ });
259
+ });
260
+ // ---------------------------------------------------------------------------
261
+ // ChainsResource
262
+ // ---------------------------------------------------------------------------
263
+ describe("ChainsResource", () => {
264
+ it("list sends GET /v1/chains", async () => {
265
+ globalThis.fetch = mockFetch(200, { chains: [] });
266
+ await new ChainsResource(makeHttp()).list();
267
+ expect(lastCall().url).toBe(`${BASE}/v1/chains`);
268
+ });
269
+ it("get sends GET /v1/chains/{identifier}", async () => {
270
+ globalThis.fetch = mockFetch(200, { name: "ethereum", chain_id: 1 });
271
+ await new ChainsResource(makeHttp()).get("ethereum");
272
+ expect(lastCall().url).toBe(`${BASE}/v1/chains/ethereum`);
273
+ });
274
+ it("adminList sends GET /v1/admin/chains", async () => {
275
+ globalThis.fetch = mockFetch(200, { chains: [] });
276
+ await new ChainsResource(makeHttp()).adminList();
277
+ expect(lastCall().url).toBe(`${BASE}/v1/admin/chains`);
278
+ });
279
+ it("create sends POST /v1/admin/chains", async () => {
280
+ globalThis.fetch = mockFetch(201, {});
281
+ await new ChainsResource(makeHttp()).create({
282
+ name: "optimism",
283
+ display_name: "Optimism",
284
+ chain_id: 10,
285
+ });
286
+ expect(lastCall().init.method).toBe("POST");
287
+ expect(lastCall().url).toBe(`${BASE}/v1/admin/chains`);
288
+ });
289
+ it("update sends PUT /v1/admin/chains/{id}", async () => {
290
+ globalThis.fetch = mockFetch(200, {});
291
+ await new ChainsResource(makeHttp()).update("c-1", { rpc_url: "https://rpc.test" });
292
+ expect(lastCall().init.method).toBe("PUT");
293
+ });
294
+ it("delete sends DELETE /v1/admin/chains/{id}", async () => {
295
+ globalThis.fetch = mockFetch(204, null);
296
+ await new ChainsResource(makeHttp()).delete("c-1");
297
+ expect(lastCall().init.method).toBe("DELETE");
298
+ });
299
+ });
300
+ // ---------------------------------------------------------------------------
301
+ // SharingResource
302
+ // ---------------------------------------------------------------------------
303
+ describe("SharingResource", () => {
304
+ it("create sends POST /v1/secrets/{id}/share", async () => {
305
+ globalThis.fetch = mockFetch(201, { id: "sh-1", share_url: "https://..." });
306
+ await new SharingResource(makeHttp()).create("s-1", {
307
+ recipient_type: "user",
308
+ recipient_id: "u-1",
309
+ expires_at: "2025-12-31T00:00:00Z",
310
+ });
311
+ expect(lastCall().url).toBe(`${BASE}/v1/secrets/s-1/share`);
312
+ expect(lastCall().init.method).toBe("POST");
313
+ });
314
+ it("access sends GET /v1/share/{shareId}", async () => {
315
+ globalThis.fetch = mockFetch(200, { value: "shared-secret" });
316
+ await new SharingResource(makeHttp()).access("sh-1");
317
+ expect(lastCall().url).toBe(`${BASE}/v1/share/sh-1`);
318
+ });
319
+ it("listOutbound sends GET /v1/shares/outbound", async () => {
320
+ globalThis.fetch = mockFetch(200, { shares: [] });
321
+ await new SharingResource(makeHttp()).listOutbound();
322
+ expect(lastCall().url).toBe(`${BASE}/v1/shares/outbound`);
323
+ });
324
+ it("listInbound sends GET /v1/shares/inbound", async () => {
325
+ globalThis.fetch = mockFetch(200, { shares: [] });
326
+ await new SharingResource(makeHttp()).listInbound();
327
+ expect(lastCall().url).toBe(`${BASE}/v1/shares/inbound`);
328
+ });
329
+ it("accept sends POST /v1/shares/{id}/accept", async () => {
330
+ globalThis.fetch = mockFetch(204, null);
331
+ await new SharingResource(makeHttp()).accept("sh-1");
332
+ expect(lastCall().url).toBe(`${BASE}/v1/shares/sh-1/accept`);
333
+ });
334
+ it("decline sends POST /v1/shares/{id}/decline", async () => {
335
+ globalThis.fetch = mockFetch(204, null);
336
+ await new SharingResource(makeHttp()).decline("sh-1");
337
+ expect(lastCall().url).toBe(`${BASE}/v1/shares/sh-1/decline`);
338
+ });
339
+ it("revoke sends DELETE /v1/share/{id}", async () => {
340
+ globalThis.fetch = mockFetch(204, null);
341
+ await new SharingResource(makeHttp()).revoke("sh-1");
342
+ expect(lastCall().url).toBe(`${BASE}/v1/share/sh-1`);
343
+ expect(lastCall().init.method).toBe("DELETE");
344
+ });
345
+ });
346
+ // ---------------------------------------------------------------------------
347
+ // ApprovalsResource
348
+ // ---------------------------------------------------------------------------
349
+ describe("ApprovalsResource", () => {
350
+ it("request sends POST /v1/approvals", async () => {
351
+ globalThis.fetch = mockFetch(201, { id: "apr-1", status: "pending" });
352
+ await new ApprovalsResource(makeHttp()).request({
353
+ vault_id: "v-1",
354
+ secret_path: "keys/master",
355
+ });
356
+ expect(lastCall().init.method).toBe("POST");
357
+ });
358
+ it("list sends GET /v1/approvals with optional status", async () => {
359
+ globalThis.fetch = mockFetch(200, { approvals: [] });
360
+ await new ApprovalsResource(makeHttp()).list("pending");
361
+ const url = new URL(lastCall().url);
362
+ expect(url.searchParams.get("status")).toBe("pending");
363
+ });
364
+ it("approve sends POST /v1/approvals/{id}/approve", async () => {
365
+ globalThis.fetch = mockFetch(200, { status: "approved" });
366
+ await new ApprovalsResource(makeHttp()).approve("apr-1");
367
+ expect(lastCall().url).toBe(`${BASE}/v1/approvals/apr-1/approve`);
368
+ });
369
+ it("deny sends POST /v1/approvals/{id}/deny", async () => {
370
+ globalThis.fetch = mockFetch(200, { status: "denied" });
371
+ await new ApprovalsResource(makeHttp()).deny("apr-1", "not authorized");
372
+ expect(JSON.parse(lastCall().init.body)).toEqual({ reason: "not authorized" });
373
+ });
374
+ it("check sends GET /v1/approvals/{id}", async () => {
375
+ globalThis.fetch = mockFetch(200, { id: "apr-1", status: "pending" });
376
+ await new ApprovalsResource(makeHttp()).check("apr-1");
377
+ expect(lastCall().url).toBe(`${BASE}/v1/approvals/apr-1`);
378
+ });
379
+ it("subscribe polls and calls back, returns unsubscribe function", async () => {
380
+ vi.useFakeTimers();
381
+ const callback = vi.fn();
382
+ const approvals = [{ id: "a-1", status: "pending" }];
383
+ globalThis.fetch = mockFetch(200, { approvals });
384
+ const unsub = new ApprovalsResource(makeHttp()).subscribe(callback, { intervalMs: 100 });
385
+ await vi.advanceTimersByTimeAsync(50);
386
+ expect(callback).toHaveBeenCalledWith(approvals);
387
+ unsub();
388
+ vi.useRealTimers();
389
+ });
390
+ });
391
+ // ---------------------------------------------------------------------------
392
+ // BillingResource
393
+ // ---------------------------------------------------------------------------
394
+ describe("BillingResource", () => {
395
+ it("usage sends GET /v1/billing/usage", async () => {
396
+ globalThis.fetch = mockFetch(200, { billing_tier: "free" });
397
+ await new BillingResource(makeHttp()).usage();
398
+ expect(lastCall().url).toBe(`${BASE}/v1/billing/usage`);
399
+ });
400
+ it("history sends GET /v1/billing/history with optional limit", async () => {
401
+ globalThis.fetch = mockFetch(200, { events: [] });
402
+ await new BillingResource(makeHttp()).history(25);
403
+ const url = new URL(lastCall().url);
404
+ expect(url.searchParams.get("limit")).toBe("25");
405
+ });
406
+ it("history omits limit when not provided", async () => {
407
+ globalThis.fetch = mockFetch(200, { events: [] });
408
+ await new BillingResource(makeHttp()).history();
409
+ const url = new URL(lastCall().url);
410
+ expect(url.searchParams.has("limit")).toBe(false);
411
+ });
412
+ });
413
+ // ---------------------------------------------------------------------------
414
+ // AuditResource
415
+ // ---------------------------------------------------------------------------
416
+ describe("AuditResource", () => {
417
+ it("query sends GET /v1/audit/events with filters as query params", async () => {
418
+ globalThis.fetch = mockFetch(200, { events: [], count: 0 });
419
+ await new AuditResource(makeHttp()).query({
420
+ resource_id: "v-1",
421
+ action: "secret.read",
422
+ limit: 10,
423
+ offset: 5,
424
+ });
425
+ const url = new URL(lastCall().url);
426
+ expect(url.pathname).toBe("/v1/audit/events");
427
+ expect(url.searchParams.get("resource_id")).toBe("v-1");
428
+ expect(url.searchParams.get("action")).toBe("secret.read");
429
+ expect(url.searchParams.get("limit")).toBe("10");
430
+ expect(url.searchParams.get("offset")).toBe("5");
431
+ });
432
+ it("query with no filters sends bare request", async () => {
433
+ globalThis.fetch = mockFetch(200, { events: [], count: 0 });
434
+ await new AuditResource(makeHttp()).query();
435
+ const url = new URL(lastCall().url);
436
+ expect(url.search).toBe("");
437
+ });
438
+ });
439
+ // ---------------------------------------------------------------------------
440
+ // OrgResource
441
+ // ---------------------------------------------------------------------------
442
+ describe("OrgResource", () => {
443
+ it("listMembers sends GET /v1/org/members", async () => {
444
+ globalThis.fetch = mockFetch(200, { members: [] });
445
+ await new OrgResource(makeHttp()).listMembers();
446
+ expect(lastCall().url).toBe(`${BASE}/v1/org/members`);
447
+ });
448
+ it("updateMemberRole sends PATCH /v1/org/members/{userId}", async () => {
449
+ globalThis.fetch = mockFetch(200, {});
450
+ await new OrgResource(makeHttp()).updateMemberRole("u-1", "admin");
451
+ expect(lastCall().init.method).toBe("PATCH");
452
+ expect(lastCall().url).toBe(`${BASE}/v1/org/members/u-1`);
453
+ expect(JSON.parse(lastCall().init.body)).toEqual({ role: "admin" });
454
+ });
455
+ it("removeMember sends DELETE /v1/org/members/{userId}", async () => {
456
+ globalThis.fetch = mockFetch(204, null);
457
+ await new OrgResource(makeHttp()).removeMember("u-1");
458
+ expect(lastCall().init.method).toBe("DELETE");
459
+ });
460
+ });
461
+ // ---------------------------------------------------------------------------
462
+ // AuthResource
463
+ // ---------------------------------------------------------------------------
464
+ describe("AuthResource", () => {
465
+ it("login sends POST /v1/auth/token and stores JWT", async () => {
466
+ globalThis.fetch = mockFetch(200, { access_token: "jwt-123", token_type: "bearer", expires_in: 3600 });
467
+ const http = makeHttp("");
468
+ const res = await new AuthResource(http).login({ email: "a@b.co", password: "p" });
469
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/token`);
470
+ expect(http.getToken()).toBe("jwt-123");
471
+ expect(res.data?.access_token).toBe("jwt-123");
472
+ });
473
+ it("signup sends POST /v1/auth/signup and stores JWT", async () => {
474
+ globalThis.fetch = mockFetch(200, { access_token: "jwt-new" });
475
+ const http = makeHttp("");
476
+ await new AuthResource(http).signup({ email: "a@b.co", password: "p", display_name: "A" });
477
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/signup`);
478
+ expect(http.getToken()).toBe("jwt-new");
479
+ });
480
+ it("agentToken sends POST /v1/auth/agent-token", async () => {
481
+ globalThis.fetch = mockFetch(200, { access_token: "agent-jwt" });
482
+ const http = makeHttp("");
483
+ await new AuthResource(http).agentToken({ agent_id: "a-1", api_key: "ocv_x" });
484
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/agent-token`);
485
+ expect(http.getToken()).toBe("agent-jwt");
486
+ });
487
+ it("apiKeyToken sends POST /v1/auth/api-key-token", async () => {
488
+ globalThis.fetch = mockFetch(200, { access_token: "key-jwt" });
489
+ const http = makeHttp("");
490
+ await new AuthResource(http).apiKeyToken({ api_key: "ocv_x" });
491
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/api-key-token`);
492
+ expect(http.getToken()).toBe("key-jwt");
493
+ });
494
+ it("google sends POST /v1/auth/google", async () => {
495
+ globalThis.fetch = mockFetch(200, { access_token: "g-jwt" });
496
+ const http = makeHttp("");
497
+ await new AuthResource(http).google({ id_token: "google-id" });
498
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/google`);
499
+ });
500
+ it("changePassword sends POST /v1/auth/change-password", async () => {
501
+ globalThis.fetch = mockFetch(204, null);
502
+ await new AuthResource(makeHttp()).changePassword({
503
+ current_password: "old",
504
+ new_password: "new",
505
+ });
506
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/change-password`);
507
+ });
508
+ it("logout sends DELETE /v1/auth/token and clears JWT", async () => {
509
+ globalThis.fetch = mockFetch(204, null);
510
+ const http = makeHttp("active-jwt");
511
+ await new AuthResource(http).logout();
512
+ expect(lastCall().init.method).toBe("DELETE");
513
+ expect(http.getToken()).toBe("");
514
+ });
515
+ });
516
+ // ---------------------------------------------------------------------------
517
+ // ApiKeysResource
518
+ // ---------------------------------------------------------------------------
519
+ describe("ApiKeysResource", () => {
520
+ it("create sends POST /v1/auth/api-keys", async () => {
521
+ globalThis.fetch = mockFetch(201, { key: { id: "k-1" }, api_key: "1ck_xxx" });
522
+ const res = await new ApiKeysResource(makeHttp()).create({ name: "ci-key" });
523
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/api-keys`);
524
+ expect(res.data?.api_key).toBe("1ck_xxx");
525
+ });
526
+ it("list sends GET /v1/auth/api-keys", async () => {
527
+ globalThis.fetch = mockFetch(200, { keys: [] });
528
+ await new ApiKeysResource(makeHttp()).list();
529
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/api-keys`);
530
+ });
531
+ it("revoke sends DELETE /v1/auth/api-keys/{keyId}", async () => {
532
+ globalThis.fetch = mockFetch(204, null);
533
+ await new ApiKeysResource(makeHttp()).revoke("k-1");
534
+ expect(lastCall().init.method).toBe("DELETE");
535
+ expect(lastCall().url).toBe(`${BASE}/v1/auth/api-keys/k-1`);
536
+ });
537
+ });
538
+ //# sourceMappingURL=resources.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.test.js","sourceRoot":"","sources":["../../src/__tests__/resources.test.ts"],"names":[],"mappings":"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"}
package/dist/cmek.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Client-side CMEK (Customer-Managed Encryption Key) utilities.
3
+ *
4
+ * Wire format:
5
+ * [1 byte version = 0x01][12 bytes IV][N bytes ciphertext + 16 bytes GCM tag]
6
+ *
7
+ * The key never leaves the client. Only its SHA-256 fingerprint is sent to the
8
+ * server so the vault can track which key was used without knowing the key.
9
+ *
10
+ * Works in browsers (WebCrypto) and Node.js 18+ (globalThis.crypto).
11
+ */
12
+ /**
13
+ * Generate a random 256-bit AES-GCM key.
14
+ * Returns the raw key bytes as a Uint8Array (32 bytes).
15
+ */
16
+ export declare function generateCmekKey(): Promise<Uint8Array>;
17
+ /**
18
+ * Compute the SHA-256 fingerprint of a CMEK key.
19
+ * Returns a 64-character lowercase hex string.
20
+ */
21
+ export declare function cmekFingerprint(key: Uint8Array): Promise<string>;
22
+ /**
23
+ * Encrypt plaintext with a CMEK key using AES-256-GCM.
24
+ * Returns the versioned wire-format blob as a Uint8Array.
25
+ */
26
+ export declare function cmekEncrypt(plaintext: Uint8Array, keyBytes: Uint8Array): Promise<Uint8Array>;
27
+ /**
28
+ * Decrypt a CMEK wire-format blob with the key.
29
+ * Returns the original plaintext as a Uint8Array.
30
+ */
31
+ export declare function cmekDecrypt(blob: Uint8Array, keyBytes: Uint8Array): Promise<Uint8Array>;
32
+ /**
33
+ * Encode a Uint8Array to a base64 string.
34
+ * Works in browsers and Node.js 18+.
35
+ */
36
+ export declare function toBase64(data: Uint8Array): string;
37
+ /**
38
+ * Decode a base64 string to a Uint8Array.
39
+ * Works in browsers and Node.js 18+.
40
+ */
41
+ export declare function fromBase64(b64: string): Uint8Array;
42
+ //# sourceMappingURL=cmek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmek.d.ts","sourceRoot":"","sources":["../src/cmek.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAI3D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAKtE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,UAAU,EACrB,QAAQ,EAAE,UAAU,GACrB,OAAO,CAAC,UAAU,CAAC,CAuBrB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC7B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,UAAU,GACrB,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CASjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAUlD"}