@1claw/sdk 0.61.13 → 0.61.14

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
@@ -419,7 +419,7 @@ Key properties:
419
419
 
420
420
  ### TEE Enforcement (Pro+)
421
421
 
422
- Lock down agents so signing and execution requests **must** route through the hardware enclave (Shroud TEE). Direct Vault API calls are rejected with 403.
422
+ Lock down agents so signing and execution **must** happen in the hardware enclave (Shroud TEE). The vault enforces it by forwarding to Shroud, not by rejecting you.
423
423
 
424
424
  ```typescript
425
425
  await client.agents.update(agentId, {
@@ -429,13 +429,12 @@ await client.agents.update(agentId, {
429
429
  ```
430
430
 
431
431
  When `intents_require_tee` is true:
432
- - Transaction submit/sign requests to `api.1claw.co` are rejected (403)
433
- - Agents must route through `shroud.1claw.co` where signing happens inside TEE memory
432
+ - Transaction submit/sign requests are signed inside Shroud's TEE whichever host you call — the vault forwards a request that arrives at `api.1claw.co` to Shroud on the agent's behalf (vault ≥ 0.61.19), so the SDK needs no special `baseUrl`
433
+ - Direct calls to `shroud.1claw.co` still work and are required for DPoP-bound tokens
434
434
 
435
435
  When `execution_require_tee` is true:
436
- - Execute requests to `api.1claw.co` are rejected (403)
436
+ - Execute requests run on Shroud's TEE execution surface — forced by the vault, no client routing needed
437
437
  - All direct secret reads by the agent are blocked — forces use of Execution Intent bindings
438
- - Agents must route through `shroud.1claw.co`
439
438
 
440
439
  Both require `intents_api_enabled` / `execution_intents_enabled` to be on first.
441
440
 
@@ -3241,6 +3241,92 @@ export interface paths {
3241
3241
  patch?: never;
3242
3242
  trace?: never;
3243
3243
  };
3244
+ "/v1/keys/{key_id}/client-share": {
3245
+ parameters: {
3246
+ query?: never;
3247
+ header?: never;
3248
+ path: {
3249
+ /** @description A treasury wallet id or an agent signing key id owned by the caller's org */
3250
+ key_id: string;
3251
+ };
3252
+ cookie?: never;
3253
+ };
3254
+ /**
3255
+ * List the caller's wrapped shares for a key
3256
+ * @description Returns every wrap on file for this key, unopened, to the user who
3257
+ * stored them. `custody` tells you whether the key is `server` (1claw
3258
+ * holds the whole private key) or `client_tss` (threshold; neither party
3259
+ * can sign alone). Funding a `client_tss` wallet needs at least two wraps.
3260
+ */
3261
+ get: operations["listClientKeyShares"];
3262
+ /**
3263
+ * Store the customer's wrapped share of a threshold key
3264
+ * @description Stores ciphertext the vault cannot open: the customer's share of a
3265
+ * 2-party threshold signing key, wrapped in the browser under the
3266
+ * passkey's WebAuthn PRF output (`passkey_prf`, one wrap per credential)
3267
+ * or under a recovery code (`recovery_code`, one per key). The vault
3268
+ * keeps the blob and its salt and returns them only to the owning user.
3269
+ * Human users only; the passkey must have reported PRF support at
3270
+ * registration. Idempotent per (key, credential).
3271
+ */
3272
+ put: operations["putClientKeyShare"];
3273
+ post?: never;
3274
+ delete?: never;
3275
+ options?: never;
3276
+ head?: never;
3277
+ patch?: never;
3278
+ trace?: never;
3279
+ };
3280
+ "/v1/keys/{key_id}/client-share/rewrap": {
3281
+ parameters: {
3282
+ query?: never;
3283
+ header?: never;
3284
+ path: {
3285
+ key_id: string;
3286
+ };
3287
+ cookie?: never;
3288
+ };
3289
+ get?: never;
3290
+ put?: never;
3291
+ /**
3292
+ * Add a wrap for another credential or the recovery code
3293
+ * @description Same write as `PUT …/client-share`, for a key that already has at
3294
+ * least one wrap: the browser, holding the share in memory during a
3295
+ * passkey session, re-wraps it under a newly added passkey's PRF
3296
+ * output or under the recovery code. 409 if no wrap exists yet.
3297
+ */
3298
+ post: operations["rewrapClientKeyShare"];
3299
+ delete?: never;
3300
+ options?: never;
3301
+ head?: never;
3302
+ patch?: never;
3303
+ trace?: never;
3304
+ };
3305
+ "/v1/keys/{key_id}/client-share/{share_id}": {
3306
+ parameters: {
3307
+ query?: never;
3308
+ header?: never;
3309
+ path: {
3310
+ key_id: string;
3311
+ share_id: string;
3312
+ };
3313
+ cookie?: never;
3314
+ };
3315
+ get?: never;
3316
+ put?: never;
3317
+ post?: never;
3318
+ /**
3319
+ * Remove one wrap
3320
+ * @description Deletes a single wrap. Wraps tied to a passkey are also removed when
3321
+ * that passkey is deleted. Removing the last wrap of a `client_tss` key
3322
+ * makes the key unrecoverable — the vault holds only its own share.
3323
+ */
3324
+ delete: operations["deleteClientKeyShare"];
3325
+ options?: never;
3326
+ head?: never;
3327
+ patch?: never;
3328
+ trace?: never;
3329
+ };
3244
3330
  "/v1/treasury/wallets/generate": {
3245
3331
  parameters: {
3246
3332
  query?: never;
@@ -13087,6 +13173,12 @@ export interface components {
13087
13173
  created_at?: string;
13088
13174
  /** Format: date-time */
13089
13175
  rotated_at?: string | null;
13176
+ /**
13177
+ * @description `server` — 1claw holds the whole private key and can sign alone.
13178
+ * `client_tss` — 2-party threshold key; the customer's passkey share is required.
13179
+ * @enum {string}
13180
+ */
13181
+ custody?: "server" | "client_tss";
13090
13182
  };
13091
13183
  SigningKeyListResponse: {
13092
13184
  keys?: components["schemas"]["SigningKeyResponse"][];
@@ -14025,6 +14117,12 @@ export interface components {
14025
14117
  is_active?: boolean;
14026
14118
  /** Format: date-time */
14027
14119
  created_at?: string;
14120
+ /**
14121
+ * @description `server` — 1claw holds the whole private key and can sign alone.
14122
+ * `client_tss` — 2-party threshold key; the customer's passkey share is required.
14123
+ * @enum {string}
14124
+ */
14125
+ custody?: "server" | "client_tss";
14028
14126
  };
14029
14127
  TreasuryWalletListResponse: {
14030
14128
  wallets?: components["schemas"]["TreasuryWalletResponse"][];
@@ -15357,6 +15455,58 @@ export interface components {
15357
15455
  client_data_json: string;
15358
15456
  transports?: string[];
15359
15457
  name?: string;
15458
+ /**
15459
+ * @description `prf.enabled` from `credential.getClientExtensionResults()` —
15460
+ * whether this authenticator can derive the secret that wraps a
15461
+ * wallet share. Omit if the client did not request the extension.
15462
+ */
15463
+ prf_supported?: boolean | null;
15464
+ };
15465
+ PutClientShareRequest: {
15466
+ /** @enum {string} */
15467
+ wrap_kind: "passkey_prf" | "recovery_code";
15468
+ /**
15469
+ * Format: uuid
15470
+ * @description Required for `passkey_prf`; the passkey id from `GET /v1/auth/passkeys`.
15471
+ */
15472
+ credential_id?: string | null;
15473
+ /** @description Base64 ciphertext (≤ 4 KiB). Opaque to the vault. */
15474
+ wrapped_share: string;
15475
+ /** @description Base64 PRF salt, 16–64 random bytes, one per key. */
15476
+ salt: string;
15477
+ };
15478
+ ClientShareResponse: {
15479
+ /** Format: uuid */
15480
+ id?: string;
15481
+ /** Format: uuid */
15482
+ key_id?: string;
15483
+ /** @enum {string} */
15484
+ key_kind?: "agent_signing_key" | "treasury_wallet";
15485
+ /** @enum {string} */
15486
+ wrap_kind?: "passkey_prf" | "recovery_code";
15487
+ /** Format: uuid */
15488
+ credential_id?: string | null;
15489
+ /** @description Base64, exactly as stored. */
15490
+ wrapped_share?: string;
15491
+ /** @description Base64. */
15492
+ salt?: string;
15493
+ /** Format: date-time */
15494
+ created_at?: string;
15495
+ /** Format: date-time */
15496
+ updated_at?: string;
15497
+ };
15498
+ ClientShareListResponse: {
15499
+ /** Format: uuid */
15500
+ key_id?: string;
15501
+ /** @enum {string} */
15502
+ key_kind?: "agent_signing_key" | "treasury_wallet";
15503
+ /**
15504
+ * @description `server` — 1claw holds the whole private key and can sign alone.
15505
+ * `client_tss` — 2-party threshold key; the customer's share is required.
15506
+ * @enum {string}
15507
+ */
15508
+ custody?: "server" | "client_tss";
15509
+ shares?: components["schemas"]["ClientShareResponse"][];
15360
15510
  };
15361
15511
  PasskeyRegisterCompleteResponse: {
15362
15512
  /** Format: uuid */
@@ -18108,6 +18258,12 @@ export interface operations {
18108
18258
  name?: string;
18109
18259
  last_used_at?: string;
18110
18260
  created_at?: string;
18261
+ /**
18262
+ * @description `true` — can hold a wallet share (WebAuthn PRF).
18263
+ * `false` — cannot. `null` — registered before this
18264
+ * was captured.
18265
+ */
18266
+ prf_supported?: boolean | null;
18111
18267
  }[];
18112
18268
  };
18113
18269
  };
@@ -23023,6 +23179,118 @@ export interface operations {
23023
23179
  404: components["responses"]["NotFound"];
23024
23180
  };
23025
23181
  };
23182
+ listClientKeyShares: {
23183
+ parameters: {
23184
+ query?: never;
23185
+ header?: never;
23186
+ path: {
23187
+ /** @description A treasury wallet id or an agent signing key id owned by the caller's org */
23188
+ key_id: string;
23189
+ };
23190
+ cookie?: never;
23191
+ };
23192
+ requestBody?: never;
23193
+ responses: {
23194
+ /** @description Wraps on file */
23195
+ 200: {
23196
+ headers: {
23197
+ [name: string]: unknown;
23198
+ };
23199
+ content: {
23200
+ "application/json": components["schemas"]["ClientShareListResponse"];
23201
+ };
23202
+ };
23203
+ 401: components["responses"]["Unauthorized"];
23204
+ 403: components["responses"]["Forbidden"];
23205
+ 404: components["responses"]["NotFound"];
23206
+ };
23207
+ };
23208
+ putClientKeyShare: {
23209
+ parameters: {
23210
+ query?: never;
23211
+ header?: never;
23212
+ path: {
23213
+ /** @description A treasury wallet id or an agent signing key id owned by the caller's org */
23214
+ key_id: string;
23215
+ };
23216
+ cookie?: never;
23217
+ };
23218
+ requestBody: {
23219
+ content: {
23220
+ "application/json": components["schemas"]["PutClientShareRequest"];
23221
+ };
23222
+ };
23223
+ responses: {
23224
+ /** @description Share stored */
23225
+ 201: {
23226
+ headers: {
23227
+ [name: string]: unknown;
23228
+ };
23229
+ content: {
23230
+ "application/json": components["schemas"]["ClientShareResponse"];
23231
+ };
23232
+ };
23233
+ 400: components["responses"]["BadRequest"];
23234
+ 401: components["responses"]["Unauthorized"];
23235
+ 403: components["responses"]["Forbidden"];
23236
+ 404: components["responses"]["NotFound"];
23237
+ };
23238
+ };
23239
+ rewrapClientKeyShare: {
23240
+ parameters: {
23241
+ query?: never;
23242
+ header?: never;
23243
+ path: {
23244
+ key_id: string;
23245
+ };
23246
+ cookie?: never;
23247
+ };
23248
+ requestBody: {
23249
+ content: {
23250
+ "application/json": components["schemas"]["PutClientShareRequest"];
23251
+ };
23252
+ };
23253
+ responses: {
23254
+ /** @description Wrap added */
23255
+ 201: {
23256
+ headers: {
23257
+ [name: string]: unknown;
23258
+ };
23259
+ content: {
23260
+ "application/json": components["schemas"]["ClientShareResponse"];
23261
+ };
23262
+ };
23263
+ 400: components["responses"]["BadRequest"];
23264
+ 401: components["responses"]["Unauthorized"];
23265
+ 403: components["responses"]["Forbidden"];
23266
+ 404: components["responses"]["NotFound"];
23267
+ 409: components["responses"]["Conflict"];
23268
+ };
23269
+ };
23270
+ deleteClientKeyShare: {
23271
+ parameters: {
23272
+ query?: never;
23273
+ header?: never;
23274
+ path: {
23275
+ key_id: string;
23276
+ share_id: string;
23277
+ };
23278
+ cookie?: never;
23279
+ };
23280
+ requestBody?: never;
23281
+ responses: {
23282
+ /** @description Wrap removed */
23283
+ 204: {
23284
+ headers: {
23285
+ [name: string]: unknown;
23286
+ };
23287
+ content?: never;
23288
+ };
23289
+ 401: components["responses"]["Unauthorized"];
23290
+ 403: components["responses"]["Forbidden"];
23291
+ 404: components["responses"]["NotFound"];
23292
+ };
23293
+ };
23026
23294
  generateTreasuryWallets: {
23027
23295
  parameters: {
23028
23296
  query?: never;