@1claw/openapi-spec 0.61.2 → 0.61.4

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 +384 -1
  2. package/openapi.yaml +238 -1
  3. package/package.json +1 -1
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "1Claw API",
5
- "version": "0.61.2",
5
+ "version": "0.61.4",
6
6
  "description": "Secure secret management for AI agents. Provides vaults, secrets,\npolicy-based access control, agent identity, Intents API,\nsharing, billing, and audit logging. Automations (workflow_spec,\nwebhook tokens, event triggers, Assist), cloud runtimes with\ninteractive shell sessions, agent memory, and discovery.\n\n## Domains\n\n`api.1claw.co` is canonical: it is the OIDC issuer, the `aud` the API\nmints, and the first entry in `servers` — a generated client takes its\nbase URL from there, and the previous ordering pointed every SDK at the\ndomain the issuer had already left. `api.1claw.xyz` still answers and is\nstill accepted on token validation, because tokens minted before the\nmove carry it; it is never minted now.\n\nOne deliberate exception: the Shroud attestation identity token is\nrequested from GCP with `audience: https://api.1claw.xyz`, so\n`/v1/shroud/attestation` reports that as its `expected_audience`. That\nis accurate rather than stale — the audience is a verification contract\nwith anyone already checking the token, and moving it is a breaking\nchange for them, not a rename.\n\nAll endpoints require JWT Bearer authentication unless marked with\n`security: []`.\n",
7
7
  "contact": {
8
8
  "email": "ops@1claw.co"
@@ -25057,6 +25057,389 @@
25057
25057
  }
25058
25058
  }
25059
25059
  },
25060
+ "/otel/v1/stream": {
25061
+ "get": {
25062
+ "tags": [
25063
+ "Observability"
25064
+ ],
25065
+ "summary": "SSE stream of this org's telemetry signals",
25066
+ "description": "Server-sent events carrying spans, metrics and events for the caller's organization. Human users only: an agent must not be able to subscribe to org-wide telemetry.\n\nEvery message carries an `id:` field. On reconnect, send the last one back as the `Last-Event-ID` header to resume. If that id has fallen out of the server's buffer, or came from another replica, the stream opens with an `event: gap` message and the client must refetch topology rather than assume continuity. A `gap` is also emitted, without closing the connection, when a subscriber falls behind.",
25067
+ "operationId": "stream_otel_signals",
25068
+ "parameters": [
25069
+ {
25070
+ "name": "fixture",
25071
+ "in": "query",
25072
+ "required": false,
25073
+ "description": "Set to `1` to request synthetic data. Available only on deployments with fixtures enabled, or to callers in the platform organization; refused with 403 otherwise.",
25074
+ "schema": {
25075
+ "type": "string",
25076
+ "enum": [
25077
+ "1",
25078
+ "true"
25079
+ ]
25080
+ }
25081
+ },
25082
+ {
25083
+ "name": "Last-Event-ID",
25084
+ "in": "header",
25085
+ "required": false,
25086
+ "description": "Resume after this event id.",
25087
+ "schema": {
25088
+ "type": "string"
25089
+ }
25090
+ }
25091
+ ],
25092
+ "responses": {
25093
+ "200": {
25094
+ "description": "An event stream",
25095
+ "content": {
25096
+ "text/event-stream": {
25097
+ "schema": {
25098
+ "type": "string"
25099
+ }
25100
+ }
25101
+ }
25102
+ },
25103
+ "401": {
25104
+ "description": "Unauthenticated"
25105
+ },
25106
+ "403": {
25107
+ "description": "Not a human user, or fixtures are not available here"
25108
+ },
25109
+ "429": {
25110
+ "description": "Too many concurrent streams for this user"
25111
+ }
25112
+ }
25113
+ }
25114
+ },
25115
+ "/otel/v1/threats": {
25116
+ "get": {
25117
+ "tags": [
25118
+ "Observability"
25119
+ ],
25120
+ "summary": "Durable threat register for the org, worst reach first",
25121
+ "description": "Threats are ranked by blast radius — the size of the affected agent's topology neighbourhood (vaults + connectors + chains) — not by recency or severity alone, so the row an operator should look at first is first. Ties fall back to recency.\n\n`shadow: true` marks a threat the trust engine produced while running in recommend-only mode. Those are shown with a badge and never acted on automatically.\n\nEvidence carries trace and span ids and a note. It never contains secret values or HTTP bodies.",
25122
+ "operationId": "list_otel_threats",
25123
+ "parameters": [
25124
+ {
25125
+ "name": "state",
25126
+ "in": "query",
25127
+ "required": false,
25128
+ "description": "`open` (default) returns anything not yet resolved; `all` includes resolved.",
25129
+ "schema": {
25130
+ "type": "string",
25131
+ "enum": [
25132
+ "open",
25133
+ "all"
25134
+ ]
25135
+ }
25136
+ }
25137
+ ],
25138
+ "responses": {
25139
+ "200": {
25140
+ "description": "Threats, highest blast radius first",
25141
+ "content": {
25142
+ "application/json": {
25143
+ "schema": {
25144
+ "type": "array",
25145
+ "items": {
25146
+ "type": "object",
25147
+ "required": [
25148
+ "id",
25149
+ "agent_id",
25150
+ "class",
25151
+ "severity",
25152
+ "detected_by",
25153
+ "status",
25154
+ "shadow",
25155
+ "blast_radius",
25156
+ "blast_radius_size"
25157
+ ],
25158
+ "properties": {
25159
+ "id": {
25160
+ "type": "string",
25161
+ "format": "uuid"
25162
+ },
25163
+ "agent_id": {
25164
+ "type": "string",
25165
+ "format": "uuid"
25166
+ },
25167
+ "class": {
25168
+ "type": "string",
25169
+ "enum": [
25170
+ "prompt_injection",
25171
+ "policy_breach",
25172
+ "spend_anomaly",
25173
+ "key_exfil",
25174
+ "off_hours",
25175
+ "consensus_bypass",
25176
+ "trust_breach"
25177
+ ]
25178
+ },
25179
+ "severity": {
25180
+ "type": "string",
25181
+ "enum": [
25182
+ "critical",
25183
+ "warn"
25184
+ ]
25185
+ },
25186
+ "detected_by": {
25187
+ "type": "string"
25188
+ },
25189
+ "status": {
25190
+ "type": "string",
25191
+ "enum": [
25192
+ "open",
25193
+ "acknowledged",
25194
+ "resolved"
25195
+ ]
25196
+ },
25197
+ "shadow": {
25198
+ "type": "boolean"
25199
+ },
25200
+ "evidence": {
25201
+ "type": "array",
25202
+ "items": {
25203
+ "type": "object"
25204
+ }
25205
+ },
25206
+ "blast_radius": {
25207
+ "type": "object",
25208
+ "properties": {
25209
+ "vaults": {
25210
+ "type": "integer"
25211
+ },
25212
+ "connectors": {
25213
+ "type": "integer"
25214
+ },
25215
+ "chains": {
25216
+ "type": "integer"
25217
+ }
25218
+ }
25219
+ },
25220
+ "blast_radius_size": {
25221
+ "type": "integer",
25222
+ "description": "Sum of the blast radius. The sort key."
25223
+ },
25224
+ "resolved_by": {
25225
+ "type": "string",
25226
+ "nullable": true
25227
+ },
25228
+ "created_at": {
25229
+ "type": "string",
25230
+ "format": "date-time"
25231
+ },
25232
+ "updated_at": {
25233
+ "type": "string",
25234
+ "format": "date-time"
25235
+ }
25236
+ }
25237
+ }
25238
+ }
25239
+ }
25240
+ }
25241
+ },
25242
+ "401": {
25243
+ "description": "Unauthenticated"
25244
+ },
25245
+ "403": {
25246
+ "description": "Not a human user"
25247
+ }
25248
+ }
25249
+ }
25250
+ },
25251
+ "/otel/v1/summary": {
25252
+ "get": {
25253
+ "tags": [
25254
+ "Observability"
25255
+ ],
25256
+ "summary": "Posture score and the counts behind it",
25257
+ "description": "`posture_score` is the mean agent trust score, less a penalty per open critical threat scaled by the fraction of the organization that threat can reach. Scaling by fraction rather than count is what makes the number comparable between a seven-agent org and a fifty-agent one.\n\nIt returns 100 when there are no agents, and also while the trust engine is still in shadow mode and no scores exist yet — absence of data is not evidence of compromise. It never goes below 0.\n\n`top_threats` uses the same ranking as `/otel/v1/threats`, so clicking through from the summary lands on the same first row.",
25258
+ "operationId": "get_otel_summary",
25259
+ "responses": {
25260
+ "200": {
25261
+ "description": "Posture summary",
25262
+ "content": {
25263
+ "application/json": {
25264
+ "schema": {
25265
+ "type": "object",
25266
+ "required": [
25267
+ "posture_score",
25268
+ "open_threats",
25269
+ "open_critical",
25270
+ "pending_approvals",
25271
+ "agent_count",
25272
+ "top_threats"
25273
+ ],
25274
+ "properties": {
25275
+ "posture_score": {
25276
+ "type": "integer",
25277
+ "minimum": 0,
25278
+ "maximum": 100
25279
+ },
25280
+ "open_threats": {
25281
+ "type": "integer"
25282
+ },
25283
+ "open_critical": {
25284
+ "type": "integer"
25285
+ },
25286
+ "pending_approvals": {
25287
+ "type": "integer"
25288
+ },
25289
+ "agent_count": {
25290
+ "type": "integer"
25291
+ },
25292
+ "top_threats": {
25293
+ "type": "array",
25294
+ "description": "At most five, same ranking as /otel/v1/threats.",
25295
+ "items": {
25296
+ "type": "object"
25297
+ }
25298
+ }
25299
+ }
25300
+ }
25301
+ }
25302
+ }
25303
+ },
25304
+ "401": {
25305
+ "description": "Unauthenticated"
25306
+ },
25307
+ "403": {
25308
+ "description": "Not a human user"
25309
+ }
25310
+ }
25311
+ }
25312
+ },
25313
+ "/otel/v1/topology": {
25314
+ "get": {
25315
+ "tags": [
25316
+ "Observability"
25317
+ ],
25318
+ "summary": "Agent, vault, policy, connector and chain graph for the org",
25319
+ "description": "A snapshot of the organization's resources and how they connect. Human users only.\n\nCapped at 500 nodes. When the cap applies, `truncated` is true and `total_nodes` reports the count before capping — a client must not present a truncated graph as complete. Agents are kept in preference to everything else, and edges that lose an endpoint to the cap are removed.\n\nAgent `status` is derived at request time, never stored, so it cannot go stale.",
25320
+ "operationId": "get_otel_topology",
25321
+ "parameters": [
25322
+ {
25323
+ "name": "fixture",
25324
+ "in": "query",
25325
+ "required": false,
25326
+ "description": "Set to `1` to request a synthetic graph. Same gating as the stream endpoint. A fixture response carries `fixture: true`.",
25327
+ "schema": {
25328
+ "type": "string",
25329
+ "enum": [
25330
+ "1",
25331
+ "true"
25332
+ ]
25333
+ }
25334
+ }
25335
+ ],
25336
+ "responses": {
25337
+ "200": {
25338
+ "description": "Topology snapshot",
25339
+ "content": {
25340
+ "application/json": {
25341
+ "schema": {
25342
+ "type": "object",
25343
+ "required": [
25344
+ "nodes",
25345
+ "edges",
25346
+ "truncated",
25347
+ "total_nodes"
25348
+ ],
25349
+ "properties": {
25350
+ "nodes": {
25351
+ "type": "array",
25352
+ "items": {
25353
+ "type": "object",
25354
+ "required": [
25355
+ "id",
25356
+ "kind",
25357
+ "label"
25358
+ ],
25359
+ "properties": {
25360
+ "id": {
25361
+ "type": "string",
25362
+ "description": "Namespaced by kind, e.g. `agent:<uuid>`."
25363
+ },
25364
+ "kind": {
25365
+ "type": "string",
25366
+ "enum": [
25367
+ "agent",
25368
+ "vault",
25369
+ "policy",
25370
+ "connector",
25371
+ "chain"
25372
+ ]
25373
+ },
25374
+ "label": {
25375
+ "type": "string"
25376
+ },
25377
+ "status": {
25378
+ "type": "string",
25379
+ "description": "Agents only. Derived, not stored.",
25380
+ "enum": [
25381
+ "compromised",
25382
+ "warn",
25383
+ "suspended",
25384
+ "ok"
25385
+ ]
25386
+ }
25387
+ }
25388
+ }
25389
+ },
25390
+ "edges": {
25391
+ "type": "array",
25392
+ "items": {
25393
+ "type": "object",
25394
+ "required": [
25395
+ "from",
25396
+ "to",
25397
+ "kind"
25398
+ ],
25399
+ "properties": {
25400
+ "from": {
25401
+ "type": "string"
25402
+ },
25403
+ "to": {
25404
+ "type": "string"
25405
+ },
25406
+ "kind": {
25407
+ "type": "string",
25408
+ "enum": [
25409
+ "calls",
25410
+ "grants",
25411
+ "holds",
25412
+ "signs"
25413
+ ]
25414
+ }
25415
+ }
25416
+ }
25417
+ },
25418
+ "truncated": {
25419
+ "type": "boolean"
25420
+ },
25421
+ "total_nodes": {
25422
+ "type": "integer",
25423
+ "description": "Node count before the cap."
25424
+ },
25425
+ "fixture": {
25426
+ "type": "boolean",
25427
+ "description": "Present and true only for synthetic data."
25428
+ }
25429
+ }
25430
+ }
25431
+ }
25432
+ }
25433
+ },
25434
+ "401": {
25435
+ "description": "Unauthenticated"
25436
+ },
25437
+ "403": {
25438
+ "description": "Not a human user, or fixtures are not available here"
25439
+ }
25440
+ }
25441
+ }
25442
+ },
25060
25443
  "/v1/runtimes/{runtime_id}/logs/stream": {
25061
25444
  "parameters": [
25062
25445
  {
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.2"
5
+ version: "0.61.4"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -16118,6 +16118,243 @@ paths:
16118
16118
  description: Forbidden, or the plan does not include this
16119
16119
  '404':
16120
16120
  description: Not found
16121
+ /otel/v1/stream:
16122
+ get:
16123
+ tags: [Observability]
16124
+ summary: "SSE stream of this org's telemetry signals"
16125
+ description: >-
16126
+ Server-sent events carrying spans, metrics and events for the
16127
+ caller's organization. Human users only: an agent must not be
16128
+ able to subscribe to org-wide telemetry.
16129
+
16130
+
16131
+ Every message carries an `id:` field. On reconnect, send the
16132
+ last one back as the `Last-Event-ID` header to resume. If that
16133
+ id has fallen out of the server's buffer, or came from another
16134
+ replica, the stream opens with an `event: gap` message and the
16135
+ client must refetch topology rather than assume continuity. A
16136
+ `gap` is also emitted, without closing the connection, when a
16137
+ subscriber falls behind.
16138
+ operationId: stream_otel_signals
16139
+ parameters:
16140
+ - name: fixture
16141
+ in: query
16142
+ required: false
16143
+ description: >-
16144
+ Set to `1` to request synthetic data. Available only on
16145
+ deployments with fixtures enabled, or to callers in the
16146
+ platform organization; refused with 403 otherwise.
16147
+ schema:
16148
+ type: string
16149
+ enum: ["1", "true"]
16150
+ - name: Last-Event-ID
16151
+ in: header
16152
+ required: false
16153
+ description: Resume after this event id.
16154
+ schema:
16155
+ type: string
16156
+ responses:
16157
+ '200':
16158
+ description: An event stream
16159
+ content:
16160
+ text/event-stream:
16161
+ schema:
16162
+ type: string
16163
+ '401':
16164
+ description: Unauthenticated
16165
+ '403':
16166
+ description: Not a human user, or fixtures are not available here
16167
+ '429':
16168
+ description: Too many concurrent streams for this user
16169
+ /otel/v1/threats:
16170
+ get:
16171
+ tags: [Observability]
16172
+ summary: "Durable threat register for the org, worst reach first"
16173
+ description: >-
16174
+ Threats are ranked by blast radius — the size of the affected
16175
+ agent's topology neighbourhood (vaults + connectors + chains) —
16176
+ not by recency or severity alone, so the row an operator should
16177
+ look at first is first. Ties fall back to recency.
16178
+
16179
+
16180
+ `shadow: true` marks a threat the trust engine produced while
16181
+ running in recommend-only mode. Those are shown with a badge and
16182
+ never acted on automatically.
16183
+
16184
+
16185
+ Evidence carries trace and span ids and a note. It never
16186
+ contains secret values or HTTP bodies.
16187
+ operationId: list_otel_threats
16188
+ parameters:
16189
+ - name: state
16190
+ in: query
16191
+ required: false
16192
+ description: "`open` (default) returns anything not yet resolved; `all` includes resolved."
16193
+ schema:
16194
+ type: string
16195
+ enum: [open, all]
16196
+ responses:
16197
+ '200':
16198
+ description: Threats, highest blast radius first
16199
+ content:
16200
+ application/json:
16201
+ schema:
16202
+ type: array
16203
+ items:
16204
+ type: object
16205
+ required: [id, agent_id, class, severity, detected_by, status, shadow, blast_radius, blast_radius_size]
16206
+ properties:
16207
+ id: { type: string, format: uuid }
16208
+ agent_id: { type: string, format: uuid }
16209
+ class:
16210
+ type: string
16211
+ enum: [prompt_injection, policy_breach, spend_anomaly, key_exfil, off_hours, consensus_bypass, trust_breach]
16212
+ severity: { type: string, enum: [critical, warn] }
16213
+ detected_by: { type: string }
16214
+ status: { type: string, enum: [open, acknowledged, resolved] }
16215
+ shadow: { type: boolean }
16216
+ evidence: { type: array, items: { type: object } }
16217
+ blast_radius:
16218
+ type: object
16219
+ properties:
16220
+ vaults: { type: integer }
16221
+ connectors: { type: integer }
16222
+ chains: { type: integer }
16223
+ blast_radius_size:
16224
+ type: integer
16225
+ description: Sum of the blast radius. The sort key.
16226
+ resolved_by: { type: string, nullable: true }
16227
+ created_at: { type: string, format: date-time }
16228
+ updated_at: { type: string, format: date-time }
16229
+ '401':
16230
+ description: Unauthenticated
16231
+ '403':
16232
+ description: Not a human user
16233
+ /otel/v1/summary:
16234
+ get:
16235
+ tags: [Observability]
16236
+ summary: "Posture score and the counts behind it"
16237
+ description: >-
16238
+ `posture_score` is the mean agent trust score, less a penalty
16239
+ per open critical threat scaled by the fraction of the
16240
+ organization that threat can reach. Scaling by fraction rather
16241
+ than count is what makes the number comparable between a
16242
+ seven-agent org and a fifty-agent one.
16243
+
16244
+
16245
+ It returns 100 when there are no agents, and also while the
16246
+ trust engine is still in shadow mode and no scores exist yet —
16247
+ absence of data is not evidence of compromise. It never goes
16248
+ below 0.
16249
+
16250
+
16251
+ `top_threats` uses the same ranking as `/otel/v1/threats`, so
16252
+ clicking through from the summary lands on the same first row.
16253
+ operationId: get_otel_summary
16254
+ responses:
16255
+ '200':
16256
+ description: Posture summary
16257
+ content:
16258
+ application/json:
16259
+ schema:
16260
+ type: object
16261
+ required: [posture_score, open_threats, open_critical, pending_approvals, agent_count, top_threats]
16262
+ properties:
16263
+ posture_score: { type: integer, minimum: 0, maximum: 100 }
16264
+ open_threats: { type: integer }
16265
+ open_critical: { type: integer }
16266
+ pending_approvals: { type: integer }
16267
+ agent_count: { type: integer }
16268
+ top_threats:
16269
+ type: array
16270
+ description: At most five, same ranking as /otel/v1/threats.
16271
+ items: { type: object }
16272
+ '401':
16273
+ description: Unauthenticated
16274
+ '403':
16275
+ description: Not a human user
16276
+ /otel/v1/topology:
16277
+ get:
16278
+ tags: [Observability]
16279
+ summary: "Agent, vault, policy, connector and chain graph for the org"
16280
+ description: >-
16281
+ A snapshot of the organization's resources and how they connect.
16282
+ Human users only.
16283
+
16284
+
16285
+ Capped at 500 nodes. When the cap applies, `truncated` is true
16286
+ and `total_nodes` reports the count before capping — a client
16287
+ must not present a truncated graph as complete. Agents are kept
16288
+ in preference to everything else, and edges that lose an
16289
+ endpoint to the cap are removed.
16290
+
16291
+
16292
+ Agent `status` is derived at request time, never stored, so it
16293
+ cannot go stale.
16294
+ operationId: get_otel_topology
16295
+ parameters:
16296
+ - name: fixture
16297
+ in: query
16298
+ required: false
16299
+ description: >-
16300
+ Set to `1` to request a synthetic graph. Same gating as
16301
+ the stream endpoint. A fixture response carries
16302
+ `fixture: true`.
16303
+ schema:
16304
+ type: string
16305
+ enum: ["1", "true"]
16306
+ responses:
16307
+ '200':
16308
+ description: Topology snapshot
16309
+ content:
16310
+ application/json:
16311
+ schema:
16312
+ type: object
16313
+ required: [nodes, edges, truncated, total_nodes]
16314
+ properties:
16315
+ nodes:
16316
+ type: array
16317
+ items:
16318
+ type: object
16319
+ required: [id, kind, label]
16320
+ properties:
16321
+ id:
16322
+ type: string
16323
+ description: Namespaced by kind, e.g. `agent:<uuid>`.
16324
+ kind:
16325
+ type: string
16326
+ enum: [agent, vault, policy, connector, chain]
16327
+ label:
16328
+ type: string
16329
+ status:
16330
+ type: string
16331
+ description: Agents only. Derived, not stored.
16332
+ enum: [compromised, warn, suspended, ok]
16333
+ edges:
16334
+ type: array
16335
+ items:
16336
+ type: object
16337
+ required: [from, to, kind]
16338
+ properties:
16339
+ from:
16340
+ type: string
16341
+ to:
16342
+ type: string
16343
+ kind:
16344
+ type: string
16345
+ enum: [calls, grants, holds, signs]
16346
+ truncated:
16347
+ type: boolean
16348
+ total_nodes:
16349
+ type: integer
16350
+ description: Node count before the cap.
16351
+ fixture:
16352
+ type: boolean
16353
+ description: Present and true only for synthetic data.
16354
+ '401':
16355
+ description: Unauthenticated
16356
+ '403':
16357
+ description: Not a human user, or fixtures are not available here
16121
16358
  /v1/runtimes/{runtime_id}/logs/stream:
16122
16359
  parameters:
16123
16360
  - name: runtime_id
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.61.2",
3
+ "version": "0.61.4",
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": {