@1claw/openapi-spec 0.61.19 → 0.61.21

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 (3) hide show
  1. package/openapi.json +1156 -192
  2. package/openapi.yaml +514 -2
  3. package/package.json +1 -1
package/openapi.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
 
3
3
  info:
4
4
  title: 1Claw API
5
- version: "0.61.19"
5
+ version: "0.61.21"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -5623,6 +5623,14 @@ paths:
5623
5623
  chain:
5624
5624
  type: string
5625
5625
  enum: [solana]
5626
+ replace_existing:
5627
+ type: boolean
5628
+ default: false
5629
+ description: |
5630
+ Re-key ceremony: replace the active server-custody wallet on
5631
+ this chain. On `complete` its balance is swept to the new
5632
+ address by the old key's last signature and the old wallet is
5633
+ deactivated (audit `treasury_wallet.rekeyed`).
5626
5634
  responses:
5627
5635
  "201":
5628
5636
  description: Session opened; the vault's round-1 package
@@ -5942,6 +5950,481 @@ paths:
5942
5950
  "404":
5943
5951
  $ref: "#/components/responses/NotFound"
5944
5952
 
5953
+ /v1/runtimes/{runtime_id}/tss/holder:
5954
+ parameters:
5955
+ - name: runtime_id
5956
+ in: path
5957
+ required: true
5958
+ schema: { type: string, format: uuid }
5959
+ post:
5960
+ tags: [Key Custody]
5961
+ summary: Register the runtime's sidecar as a share holder
5962
+ description: |
5963
+ Called by the runtime's agent (the Shroud sidecar, at boot) with the P-256
5964
+ public key it generated. The owner can then provision a threshold-key
5965
+ share to this runtime, letting the agent co-sign below-cap sends
5966
+ unattended. Re-registering replaces the key; deleting the runtime revokes
5967
+ every share held by it.
5968
+ operationId: registerTssHolder
5969
+ security:
5970
+ - BearerAuth: []
5971
+ requestBody:
5972
+ required: true
5973
+ content:
5974
+ application/json:
5975
+ schema:
5976
+ type: object
5977
+ required: [public_key]
5978
+ properties:
5979
+ public_key: { type: string, description: Base64 SEC1 uncompressed P-256 point (65 bytes). }
5980
+ responses:
5981
+ "201":
5982
+ description: Registered
5983
+ content:
5984
+ application/json:
5985
+ schema:
5986
+ $ref: "#/components/schemas/TssHolder"
5987
+ "400":
5988
+ $ref: "#/components/responses/BadRequest"
5989
+ "401":
5990
+ $ref: "#/components/responses/Unauthorized"
5991
+ "403":
5992
+ $ref: "#/components/responses/Forbidden"
5993
+ "404":
5994
+ $ref: "#/components/responses/NotFound"
5995
+ get:
5996
+ tags: [Key Custody]
5997
+ summary: The runtime's registered share holder
5998
+ operationId: getTssHolder
5999
+ security:
6000
+ - BearerAuth: []
6001
+ responses:
6002
+ "200":
6003
+ description: Holder
6004
+ content:
6005
+ application/json:
6006
+ schema:
6007
+ $ref: "#/components/schemas/TssHolder"
6008
+ "401":
6009
+ $ref: "#/components/responses/Unauthorized"
6010
+ "404":
6011
+ $ref: "#/components/responses/NotFound"
6012
+
6013
+ /v1/keys/{key_id}/client-share/holder:
6014
+ parameters:
6015
+ - name: key_id
6016
+ in: path
6017
+ required: true
6018
+ schema: { type: string, format: uuid }
6019
+ put:
6020
+ tags: [Key Custody]
6021
+ summary: Provision a threshold-key share to a runtime holder
6022
+ description: |
6023
+ The owner's browser unlocks its share with the passkey PRF and re-wraps
6024
+ it to the holder's P-256 key (ECIES: ephemeral point ‖ iv ‖ AES-GCM). The
6025
+ vault stores the ciphertext unopened. The wallet must be delegated to the
6026
+ holder's agent. Audited as `client_share.provisioned_to_runtime`.
6027
+ operationId: provisionTssHolderShare
6028
+ security:
6029
+ - BearerAuth: []
6030
+ requestBody:
6031
+ required: true
6032
+ content:
6033
+ application/json:
6034
+ schema:
6035
+ type: object
6036
+ required: [holder_id, wrapped_share, salt]
6037
+ properties:
6038
+ holder_id: { type: string, format: uuid }
6039
+ wrapped_share: { type: string }
6040
+ salt: { type: string }
6041
+ responses:
6042
+ "201":
6043
+ description: Stored
6044
+ "400":
6045
+ $ref: "#/components/responses/BadRequest"
6046
+ "401":
6047
+ $ref: "#/components/responses/Unauthorized"
6048
+ "403":
6049
+ $ref: "#/components/responses/Forbidden"
6050
+ "404":
6051
+ $ref: "#/components/responses/NotFound"
6052
+ get:
6053
+ tags: [Key Custody]
6054
+ summary: The sidecar fetches the wrap made for it
6055
+ description: Agent-only; returns the wrap whose holder was registered by the calling agent.
6056
+ operationId: getTssHolderShare
6057
+ security:
6058
+ - BearerAuth: []
6059
+ responses:
6060
+ "200":
6061
+ description: Wrapped share (opaque)
6062
+ content:
6063
+ application/json:
6064
+ schema:
6065
+ type: object
6066
+ properties:
6067
+ key_id: { type: string, format: uuid }
6068
+ holder_id: { type: string, format: uuid }
6069
+ wrap_kind: { type: string, enum: [sidecar] }
6070
+ wrapped_share: { type: string }
6071
+ salt: { type: string }
6072
+ "401":
6073
+ $ref: "#/components/responses/Unauthorized"
6074
+ "403":
6075
+ $ref: "#/components/responses/Forbidden"
6076
+ "404":
6077
+ $ref: "#/components/responses/NotFound"
6078
+
6079
+ /v1/agents/{agent_id}/tss/prepare:
6080
+ parameters:
6081
+ - name: agent_id
6082
+ in: path
6083
+ required: true
6084
+ schema: { type: string, format: uuid }
6085
+ post:
6086
+ tags: [Key Custody]
6087
+ summary: Agent declares a send from a delegated client_tss wallet
6088
+ description: |
6089
+ Runs the agent's guardrails (chains, allowlists, caps, daily limits,
6090
+ approval policy) and the sanctions screen on the declared call, builds
6091
+ the unsigned message and records it as a prepared intent. Only a
6092
+ prepared message can enter `/tss/sign/begin`. Requires a treasury
6093
+ delegation and a share provisioned to the agent's runtime.
6094
+ operationId: agentTssPrepare
6095
+ security:
6096
+ - BearerAuth: []
6097
+ requestBody:
6098
+ required: true
6099
+ content:
6100
+ application/json:
6101
+ schema:
6102
+ type: object
6103
+ required: [key_id, to, value]
6104
+ properties:
6105
+ key_id: { type: string, format: uuid }
6106
+ to: { type: string }
6107
+ value: { type: string, description: Major units. }
6108
+ memo: { type: string }
6109
+ responses:
6110
+ "200":
6111
+ description: Unsigned message
6112
+ "400":
6113
+ $ref: "#/components/responses/BadRequest"
6114
+ "401":
6115
+ $ref: "#/components/responses/Unauthorized"
6116
+ "403":
6117
+ $ref: "#/components/responses/Forbidden"
6118
+ "404":
6119
+ $ref: "#/components/responses/NotFound"
6120
+
6121
+ /v1/agents/{agent_id}/tss/sign/begin:
6122
+ parameters:
6123
+ - name: agent_id
6124
+ in: path
6125
+ required: true
6126
+ schema: { type: string, format: uuid }
6127
+ post:
6128
+ tags: [Key Custody]
6129
+ summary: Agent threshold signing, round 1
6130
+ description: The message must be a live prepared intent for this agent and key; its transfers are screened again.
6131
+ operationId: agentTssSignBegin
6132
+ security:
6133
+ - BearerAuth: []
6134
+ requestBody:
6135
+ required: true
6136
+ content:
6137
+ application/json:
6138
+ schema:
6139
+ type: object
6140
+ required: [key_id, message]
6141
+ properties:
6142
+ key_id: { type: string, format: uuid }
6143
+ message: { type: string }
6144
+ responses:
6145
+ "201":
6146
+ description: Session opened
6147
+ "401":
6148
+ $ref: "#/components/responses/Unauthorized"
6149
+ "403":
6150
+ $ref: "#/components/responses/Forbidden"
6151
+ "404":
6152
+ $ref: "#/components/responses/NotFound"
6153
+
6154
+ /v1/agents/{agent_id}/tss/sign/complete:
6155
+ parameters:
6156
+ - name: agent_id
6157
+ in: path
6158
+ required: true
6159
+ schema: { type: string, format: uuid }
6160
+ post:
6161
+ tags: [Key Custody]
6162
+ summary: Agent threshold signing, round 2
6163
+ operationId: agentTssSignComplete
6164
+ security:
6165
+ - BearerAuth: []
6166
+ requestBody:
6167
+ required: true
6168
+ content:
6169
+ application/json:
6170
+ schema:
6171
+ type: object
6172
+ required: [session_id, client_commitments, client_signature_share]
6173
+ properties:
6174
+ session_id: { type: string, format: uuid }
6175
+ client_commitments: { type: string }
6176
+ client_signature_share: { type: string }
6177
+ responses:
6178
+ "200":
6179
+ description: Signature
6180
+ "400":
6181
+ $ref: "#/components/responses/BadRequest"
6182
+ "401":
6183
+ $ref: "#/components/responses/Unauthorized"
6184
+ "404":
6185
+ $ref: "#/components/responses/NotFound"
6186
+ "409":
6187
+ $ref: "#/components/responses/Conflict"
6188
+
6189
+ /v1/agents/{agent_id}/tss/broadcast:
6190
+ parameters:
6191
+ - name: agent_id
6192
+ in: path
6193
+ required: true
6194
+ schema: { type: string, format: uuid }
6195
+ post:
6196
+ tags: [Key Custody]
6197
+ summary: Broadcast an agent's threshold-signed send
6198
+ description: |
6199
+ Verifies the signature under the wallet key, checks the message is the
6200
+ prepared one, re-runs the agent's guardrails, records the transaction
6201
+ (daily limits count it) and submits. Audited as `treasury_wallet.send`
6202
+ with `via: runtime_share_holder`.
6203
+ operationId: agentTssBroadcast
6204
+ security:
6205
+ - BearerAuth: []
6206
+ requestBody:
6207
+ required: true
6208
+ content:
6209
+ application/json:
6210
+ schema:
6211
+ type: object
6212
+ required: [key_id, message, signature]
6213
+ properties:
6214
+ key_id: { type: string, format: uuid }
6215
+ message: { type: string }
6216
+ signature: { type: string }
6217
+ responses:
6218
+ "200":
6219
+ description: Broadcast
6220
+ content:
6221
+ application/json:
6222
+ schema:
6223
+ $ref: "#/components/schemas/TreasuryWalletSendResponse"
6224
+ "400":
6225
+ $ref: "#/components/responses/BadRequest"
6226
+ "401":
6227
+ $ref: "#/components/responses/Unauthorized"
6228
+ "403":
6229
+ $ref: "#/components/responses/Forbidden"
6230
+
6231
+ /v1/treasury/passkey-safes:
6232
+ post:
6233
+ tags: [Key Custody]
6234
+ summary: Create a Safe owned by your passkey
6235
+ description: |
6236
+ An EVM Safe (v1.4.1) whose only owner is Safe's WebAuthn shared signer,
6237
+ configured with this passkey's P-256 public key. No private key exists
6238
+ anywhere: signing a transaction is a WebAuthn assertion whose challenge
6239
+ is the SafeTx hash. The address is counterfactual (CREATE2) until the
6240
+ first `execute` deploys it. Chains: base, optimism, arbitrum, polygon
6241
+ (RIP-7212 precompile + fallback verifier), ethereum, sepolia, base-sepolia.
6242
+ operationId: createPasskeySafe
6243
+ security:
6244
+ - BearerAuth: []
6245
+ requestBody:
6246
+ required: true
6247
+ content:
6248
+ application/json:
6249
+ schema:
6250
+ type: object
6251
+ required: [chain, passkey_id]
6252
+ properties:
6253
+ chain: { type: string }
6254
+ passkey_id: { type: string, format: uuid }
6255
+ responses:
6256
+ "201":
6257
+ description: Safe registered (counterfactual)
6258
+ content:
6259
+ application/json:
6260
+ schema:
6261
+ $ref: "#/components/schemas/PasskeySafe"
6262
+ "400":
6263
+ $ref: "#/components/responses/BadRequest"
6264
+ "401":
6265
+ $ref: "#/components/responses/Unauthorized"
6266
+ "404":
6267
+ $ref: "#/components/responses/NotFound"
6268
+ "409":
6269
+ $ref: "#/components/responses/Conflict"
6270
+ get:
6271
+ tags: [Key Custody]
6272
+ summary: List your passkey-owned Safes
6273
+ operationId: listPasskeySafes
6274
+ security:
6275
+ - BearerAuth: []
6276
+ responses:
6277
+ "200":
6278
+ description: Safes
6279
+ content:
6280
+ application/json:
6281
+ schema:
6282
+ type: object
6283
+ properties:
6284
+ safes:
6285
+ type: array
6286
+ items:
6287
+ $ref: "#/components/schemas/PasskeySafe"
6288
+ "401":
6289
+ $ref: "#/components/responses/Unauthorized"
6290
+
6291
+ /v1/treasury/passkey-safes/{id}:
6292
+ parameters:
6293
+ - name: id
6294
+ in: path
6295
+ required: true
6296
+ schema: { type: string, format: uuid }
6297
+ delete:
6298
+ tags: [Key Custody]
6299
+ summary: Forget a passkey Safe
6300
+ description: Deactivates the record only; the Safe and its funds stay on-chain under the passkey.
6301
+ operationId: deactivatePasskeySafe
6302
+ security:
6303
+ - BearerAuth: []
6304
+ responses:
6305
+ "204":
6306
+ description: Deactivated
6307
+ "401":
6308
+ $ref: "#/components/responses/Unauthorized"
6309
+ "404":
6310
+ $ref: "#/components/responses/NotFound"
6311
+
6312
+ /v1/treasury/passkey-safes/{id}/prepare:
6313
+ parameters:
6314
+ - name: id
6315
+ in: path
6316
+ required: true
6317
+ schema: { type: string, format: uuid }
6318
+ post:
6319
+ tags: [Key Custody]
6320
+ summary: Compute the SafeTx hash for a call from a passkey Safe
6321
+ description: |
6322
+ Runs the sanctions screen and spend policies on the call, reads the
6323
+ Safe's on-chain nonce (0 if not yet deployed), and returns the SafeTx
6324
+ hash — the raw 32 bytes are the WebAuthn challenge to sign with
6325
+ `userVerification: "required"`.
6326
+ operationId: preparePasskeySafeTx
6327
+ security:
6328
+ - BearerAuth: []
6329
+ requestBody:
6330
+ required: true
6331
+ content:
6332
+ application/json:
6333
+ schema:
6334
+ type: object
6335
+ required: [to, value_wei]
6336
+ properties:
6337
+ to: { type: string }
6338
+ value_wei: { type: string }
6339
+ data: { type: string, description: Hex calldata, optional. }
6340
+ responses:
6341
+ "200":
6342
+ description: What to sign
6343
+ content:
6344
+ application/json:
6345
+ schema:
6346
+ type: object
6347
+ properties:
6348
+ safe_id: { type: string, format: uuid }
6349
+ safe_address: { type: string }
6350
+ chain: { type: string }
6351
+ chain_id: { type: integer }
6352
+ to: { type: string }
6353
+ value_wei: { type: string }
6354
+ data: { type: string }
6355
+ nonce: { type: integer }
6356
+ deploy_required: { type: boolean }
6357
+ safe_tx_hash: { type: string }
6358
+ credential_id: { type: string }
6359
+ rp_id: { type: string }
6360
+ "400":
6361
+ $ref: "#/components/responses/BadRequest"
6362
+ "401":
6363
+ $ref: "#/components/responses/Unauthorized"
6364
+ "403":
6365
+ $ref: "#/components/responses/Forbidden"
6366
+ "404":
6367
+ $ref: "#/components/responses/NotFound"
6368
+
6369
+ /v1/treasury/passkey-safes/{id}/execute:
6370
+ parameters:
6371
+ - name: id
6372
+ in: path
6373
+ required: true
6374
+ schema: { type: string, format: uuid }
6375
+ post:
6376
+ tags: [Key Custody]
6377
+ summary: Relay a passkey-signed Safe transaction
6378
+ description: |
6379
+ Recomputes the SafeTx hash, verifies the WebAuthn assertion locally
6380
+ (this passkey, this hash, a dashboard origin, UV flag set), wraps it in
6381
+ Safe's contract-signature format and relays `execTransaction` — deploying
6382
+ the Safe first if needed — from your Ethereum treasury wallet, which pays
6383
+ gas and is not an owner. Audited as `passkey_safe.executed`.
6384
+ operationId: executePasskeySafeTx
6385
+ security:
6386
+ - BearerAuth: []
6387
+ requestBody:
6388
+ required: true
6389
+ content:
6390
+ application/json:
6391
+ schema:
6392
+ type: object
6393
+ required: [to, value_wei, nonce, authenticator_data, client_data_json, signature]
6394
+ properties:
6395
+ to: { type: string }
6396
+ value_wei: { type: string }
6397
+ data: { type: string }
6398
+ nonce: { type: integer }
6399
+ authenticator_data: { type: string, description: Base64url. }
6400
+ client_data_json: { type: string, description: Base64url. }
6401
+ signature: { type: string, description: Base64url DER ECDSA signature. }
6402
+ responses:
6403
+ "200":
6404
+ description: Relayed
6405
+ content:
6406
+ application/json:
6407
+ schema:
6408
+ type: object
6409
+ properties:
6410
+ safe_id: { type: string, format: uuid }
6411
+ safe_address: { type: string }
6412
+ chain: { type: string }
6413
+ safe_tx_hash: { type: string }
6414
+ deploy_tx_hash: { type: string, nullable: true }
6415
+ tx_hash: { type: string }
6416
+ status: { type: string }
6417
+ "400":
6418
+ $ref: "#/components/responses/BadRequest"
6419
+ "401":
6420
+ $ref: "#/components/responses/Unauthorized"
6421
+ "403":
6422
+ $ref: "#/components/responses/Forbidden"
6423
+ "404":
6424
+ $ref: "#/components/responses/NotFound"
6425
+ "409":
6426
+ $ref: "#/components/responses/Conflict"
6427
+
5945
6428
  /v1/treasury/wallets/generate:
5946
6429
  post:
5947
6430
  tags: [Treasury Wallets]
@@ -25439,6 +25922,7 @@ components:
25439
25922
  wrap_kind:
25440
25923
  type: string
25441
25924
  enum: [passkey_prf, recovery_code]
25925
+ description: Sidecar wraps are stored through `PUT /v1/keys/{key_id}/client-share/holder`.
25442
25926
  credential_id:
25443
25927
  type: string
25444
25928
  format: uuid
@@ -25465,11 +25949,15 @@ components:
25465
25949
  enum: [agent_signing_key, treasury_wallet]
25466
25950
  wrap_kind:
25467
25951
  type: string
25468
- enum: [passkey_prf, recovery_code]
25952
+ enum: [passkey_prf, recovery_code, sidecar]
25469
25953
  credential_id:
25470
25954
  type: string
25471
25955
  format: uuid
25472
25956
  nullable: true
25957
+ holder_id:
25958
+ type: string
25959
+ format: uuid
25960
+ nullable: true
25473
25961
  wrapped_share:
25474
25962
  type: string
25475
25963
  description: Base64, exactly as stored.
@@ -25483,6 +25971,30 @@ components:
25483
25971
  type: string
25484
25972
  format: date-time
25485
25973
 
25974
+ TssHolder:
25975
+ type: object
25976
+ properties:
25977
+ holder_id: { type: string, format: uuid }
25978
+ runtime_id: { type: string, format: uuid }
25979
+ agent_id: { type: string, format: uuid }
25980
+ public_key: { type: string }
25981
+ registered_at: { type: string, format: date-time }
25982
+ last_seen_at: { type: string, format: date-time }
25983
+
25984
+ PasskeySafe:
25985
+ type: object
25986
+ properties:
25987
+ id: { type: string, format: uuid }
25988
+ chain: { type: string }
25989
+ chain_id: { type: integer }
25990
+ safe_address: { type: string }
25991
+ passkey_id: { type: string, format: uuid }
25992
+ custody: { type: string, enum: [passkey_owner] }
25993
+ deploy_status: { type: string, enum: [pending, deployed] }
25994
+ deploy_tx_hash: { type: string, nullable: true }
25995
+ owner_signer: { type: string, description: The SafeWebAuthnSharedSigner address listed as the Safe's owner. }
25996
+ created_at: { type: string, format: date-time }
25997
+
25486
25998
  ClientShareListResponse:
25487
25999
  type: object
25488
26000
  properties:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.61.19",
3
+ "version": "0.61.21",
4
4
  "description": "OpenAPI 3.1.0 specification for the 1Claw Vault API \u2014 generate clients in any language",
5
5
  "license": "MIT",
6
6
  "repository": {