@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.
- package/openapi.json +384 -1
- package/openapi.yaml +238 -1
- 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.
|
|
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.
|
|
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
|