{ "x-generated-by": "scripts/ci/generate-openapi-schemas.mjs; rebuild @evofw/shared first", "components": { "schemas": { "Agent": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "hostname": { "nullable": true, "type": "string" }, "platform": { "type": "string", "enum": [ "linux", "mikrotik" ] }, "token_prefix": { "type": "string" }, "status": { "type": "string", "enum": [ "invited", "pending", "approved", "revoked" ] }, "default_action": { "type": "string", "enum": [ "accept", "drop" ] }, "policy_mode": { "type": "string", "enum": [ "blacklist", "whitelist" ] }, "policy_generation": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "last_seen_at": { "nullable": true, "type": "string" }, "last_seen_ip": { "nullable": true, "type": "string" }, "last_apply_at": { "nullable": true, "type": "string" }, "last_apply_status": { "nullable": true, "type": "string" }, "last_apply_error": { "nullable": true, "type": "string" }, "last_apply_prefix_count": { "nullable": true, "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "last_apply_packets_dropped": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "last_apply_packets_accepted": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "total_packets_dropped": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "total_packets_accepted": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "last_apply_kernel_method": { "nullable": true, "type": "string" }, "client_version": { "nullable": true, "type": "string" }, "settings_json": { "type": "string" }, "created_at": { "type": "string" }, "approved_at": { "nullable": true, "type": "string" }, "revoked_at": { "nullable": true, "type": "string" }, "install_curl": { "nullable": true, "type": "string" }, "install_link_id": { "nullable": true, "type": "string" }, "diagnostics": { "type": "object", "properties": { "desired_revision": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "desired_hash": { "nullable": true, "type": "string" }, "applied_revision": { "nullable": true, "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "applied_hash": { "nullable": true, "type": "string" }, "agent_version": { "nullable": true, "type": "string" }, "capabilities": { "type": "array", "items": { "type": "string" } }, "last_contact_at": { "nullable": true, "type": "string" }, "last_telemetry_at": { "nullable": true, "type": "string" }, "last_apply_at": { "nullable": true, "type": "string" }, "apply_error": { "nullable": true, "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "status": { "type": "string", "enum": [ "pending", "applying", "in_sync", "failed", "drift", "unsupported" ] }, "telemetry_version": { "nullable": true, "type": "number" }, "quality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] }, "detail_counts": { "nullable": true, "type": "object", "properties": { "ip_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "ip_sent": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_sent": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip_found", "ip_sent", "port_found", "port_sent" ] } }, "required": [ "desired_revision", "desired_hash", "applied_revision", "applied_hash", "agent_version", "capabilities", "last_contact_at", "last_telemetry_at", "last_apply_at", "apply_error", "status", "telemetry_version", "quality" ] } }, "required": [ "id", "name", "platform", "token_prefix", "status", "default_action", "policy_generation", "created_at" ] }, "AgentDiagnostics": { "type": "object", "properties": { "desired_revision": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "desired_hash": { "nullable": true, "type": "string" }, "applied_revision": { "nullable": true, "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "applied_hash": { "nullable": true, "type": "string" }, "agent_version": { "nullable": true, "type": "string" }, "capabilities": { "type": "array", "items": { "type": "string" } }, "last_contact_at": { "nullable": true, "type": "string" }, "last_telemetry_at": { "nullable": true, "type": "string" }, "last_apply_at": { "nullable": true, "type": "string" }, "apply_error": { "nullable": true, "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "status": { "type": "string", "enum": [ "pending", "applying", "in_sync", "failed", "drift", "unsupported" ] }, "telemetry_version": { "nullable": true, "type": "number" }, "quality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] }, "detail_counts": { "nullable": true, "type": "object", "properties": { "ip_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "ip_sent": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_sent": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip_found", "ip_sent", "port_found", "port_sent" ] } }, "required": [ "desired_revision", "desired_hash", "applied_revision", "applied_hash", "agent_version", "capabilities", "last_contact_at", "last_telemetry_at", "last_apply_at", "apply_error", "status", "telemetry_version", "quality" ] }, "AgentPolicy": { "type": "object", "properties": { "generation": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "hash": { "type": "string" }, "apply_version": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "default_action": { "type": "string", "enum": [ "accept", "drop" ] }, "policy_mode": { "type": "string", "enum": [ "blacklist", "whitelist" ] }, "deny_cidrs": { "type": "array", "items": { "type": "string" } }, "allow_cidrs": { "type": "array", "items": { "type": "string" } }, "port_rules": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "action": { "type": "string", "enum": [ "open", "close" ] }, "protocol": { "type": "string", "enum": [ "tcp", "udp" ] }, "port_start": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "port_end": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "src_cidrs": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "action", "protocol", "port_start", "port_end", "src_cidrs" ] } }, "sync_interval_sec": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "script_sha256": { "type": "string" } }, "required": [ "generation", "hash", "apply_version", "default_action", "deny_cidrs", "allow_cidrs", "sync_interval_sec" ] }, "ApplyReport": { "anyOf": [ { "type": "object", "properties": { "status": { "type": "string" }, "prefix_count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_dropped": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_accepted": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "kernel_method": { "type": "string" }, "error": { "type": "string", "maxLength": 2048 }, "apply_error": { "nullable": true, "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "source": { "type": "string" }, "ip_hits": { "maxItems": 200, "type": "array", "items": { "type": "object", "properties": { "ip": { "anyOf": [ { "type": "string" }, { "type": "string" } ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "packets" ] } }, "port_hits": { "maxItems": 500, "type": "array", "items": { "type": "object", "properties": { "ip": { "type": "string" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "protocol": { "type": "string", "enum": [ "tcp", "udp" ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "port", "protocol", "packets" ] } }, "host_firewall": { "type": "object", "properties": { "rules": { "default": [], "maxItems": 500, "type": "array", "items": {} }, "listeners": { "default": [], "maxItems": 200, "type": "array", "items": {} } } }, "telemetry_version": { "type": "number", "enum": [ 2 ] }, "report_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "boot_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "observed_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" }, "interval_ms": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "counter_epoch": { "type": "object", "properties": { "traffic": { "type": "string", "minLength": 1, "maxLength": 128 }, "ip": { "type": "string", "minLength": 1, "maxLength": 128 }, "port": { "type": "string", "minLength": 1, "maxLength": 128 } }, "required": [ "traffic" ] }, "applied_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }, "applied_revision": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "agent_version": { "type": "string", "minLength": 1, "maxLength": 128 }, "capabilities": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "quality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] }, "detail_counts": { "type": "object", "properties": { "ip_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "ip_sent": { "type": "integer", "minimum": 0, "maximum": 200 }, "port_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_sent": { "type": "integer", "minimum": 0, "maximum": 500 } }, "required": [ "ip_found", "ip_sent", "port_found", "port_sent" ] } }, "required": [ "status", "telemetry_version", "report_id", "sequence", "boot_id", "observed_at", "interval_ms", "counter_epoch", "capabilities", "quality" ] }, { "type": "object", "properties": { "status": { "type": "string" }, "prefix_count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_dropped": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_accepted": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "kernel_method": { "type": "string" }, "error": { "type": "string", "maxLength": 2048 }, "apply_error": { "nullable": true, "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "source": { "type": "string" }, "ip_hits": { "maxItems": 200, "type": "array", "items": { "type": "object", "properties": { "ip": { "anyOf": [ { "type": "string" }, { "type": "string" } ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "packets" ] } }, "port_hits": { "maxItems": 500, "type": "array", "items": { "type": "object", "properties": { "ip": { "type": "string" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "protocol": { "type": "string", "enum": [ "tcp", "udp" ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "port", "protocol", "packets" ] } }, "host_firewall": { "type": "object", "properties": { "rules": { "default": [], "maxItems": 500, "type": "array", "items": {} }, "listeners": { "default": [], "maxItems": 200, "type": "array", "items": {} } } }, "telemetry_version": { "type": "number", "enum": [ 1 ] } }, "required": [ "status" ] } ] }, "ApplyReportV2": { "type": "object", "properties": { "status": { "type": "string" }, "prefix_count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_dropped": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_accepted": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "kernel_method": { "type": "string" }, "error": { "type": "string", "maxLength": 2048 }, "apply_error": { "nullable": true, "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "source": { "type": "string" }, "ip_hits": { "maxItems": 200, "type": "array", "items": { "type": "object", "properties": { "ip": { "anyOf": [ { "type": "string" }, { "type": "string" } ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "packets" ] } }, "port_hits": { "maxItems": 500, "type": "array", "items": { "type": "object", "properties": { "ip": { "type": "string" }, "port": { "type": "integer", "minimum": 1, "maximum": 65535 }, "protocol": { "type": "string", "enum": [ "tcp", "udp" ] }, "packets": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "ip", "port", "protocol", "packets" ] } }, "host_firewall": { "type": "object", "properties": { "rules": { "default": [], "maxItems": 500, "type": "array", "items": {} }, "listeners": { "default": [], "maxItems": 200, "type": "array", "items": {} } } }, "telemetry_version": { "type": "number", "enum": [ 2 ] }, "report_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "boot_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "observed_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" }, "interval_ms": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "counter_epoch": { "type": "object", "properties": { "traffic": { "type": "string", "minLength": 1, "maxLength": 128 }, "ip": { "type": "string", "minLength": 1, "maxLength": 128 }, "port": { "type": "string", "minLength": 1, "maxLength": 128 } }, "required": [ "traffic" ] }, "applied_hash": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }, "applied_revision": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "agent_version": { "type": "string", "minLength": 1, "maxLength": 128 }, "capabilities": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "quality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] }, "detail_counts": { "type": "object", "properties": { "ip_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "ip_sent": { "type": "integer", "minimum": 0, "maximum": 200 }, "port_found": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "port_sent": { "type": "integer", "minimum": 0, "maximum": 500 } }, "required": [ "ip_found", "ip_sent", "port_found", "port_sent" ] } }, "required": [ "status", "telemetry_version", "report_id", "sequence", "boot_id", "observed_at", "interval_ms", "counter_epoch", "capabilities", "quality" ] }, "TelemetryQuality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] }, "ApplyError": { "type": "object", "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 2048 }, "stage": { "type": "string", "maxLength": 128 }, "retryable": { "type": "boolean" } }, "required": [ "code", "message" ] }, "TimeseriesResponse": { "type": "object", "properties": { "from": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "to": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "resolution": { "type": "string", "enum": [ "1m", "1h", "1d" ] }, "items": { "maxItems": 1440, "type": "array", "items": { "type": "object", "properties": { "timestamp": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "packets_dropped": { "nullable": true, "type": "number", "minimum": 0 }, "packets_accepted": { "nullable": true, "type": "number", "minimum": 0 }, "pps": { "nullable": true, "type": "number", "minimum": 0 }, "coverage": { "type": "number", "minimum": 0, "maximum": 1 }, "estimated": { "type": "boolean" }, "quality": { "type": "object", "properties": { "partial": { "type": "boolean" }, "truncated": { "type": "boolean" }, "unsupported": { "maxItems": 64, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "lost_reports": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "partial", "truncated", "unsupported", "lost_reports" ] } }, "required": [ "timestamp", "packets_dropped", "packets_accepted", "pps", "coverage", "estimated", "quality" ] } }, "agent_ids": { "maxItems": 100, "type": "array", "items": { "type": "string" } } }, "required": [ "from", "to", "resolution", "items", "agent_ids" ] }, "UiSummary": { "type": "object", "properties": { "updated_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" }, "dashboard": { "type": "object", "properties": { "agents_total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "agents_approved": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "agents_online": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "agents_pending": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_dropped": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "packets_accepted": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "lists_total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "agents_total", "agents_approved", "agents_online", "agents_pending", "packets_dropped", "packets_accepted", "lists_total" ] }, "agents": { "type": "object", "properties": { "approved": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "online": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "pending": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "offline": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "approved", "online", "pending", "offline" ] }, "lists": { "type": "object", "properties": { "total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "failed": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "total", "failed" ] }, "policies": { "type": "object", "properties": { "sets_total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "rules_total": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "sets_total", "rules_total" ] } }, "required": [ "updated_at" ] }, "ExplainResponse": { "type": "object", "properties": { "agent_id": { "type": "string" }, "query": { "type": "object", "properties": { "ip": { "type": "string" }, "protocol": { "nullable": true, "type": "string", "enum": [ "tcp", "udp" ] }, "port": { "nullable": true, "type": "number" }, "chain": { "type": "string", "enum": [ "input", "forward" ] }, "dnat": { "type": "boolean" }, "connection_state": { "type": "string", "enum": [ "new", "established", "related" ] } }, "required": [ "ip", "protocol", "port", "chain", "dnat", "connection_state" ] }, "desired": { "type": "object", "properties": { "revision": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "hash": { "type": "string" }, "decision": { "nullable": true, "type": "string", "enum": [ "accept", "drop" ] }, "stage": { "type": "string", "enum": [ "stateful", "deny", "port_close", "port_open", "port_implicit_close", "allow", "default", "external", "unsupported", "transport_unknown" ] }, "match": { "nullable": true, "type": "object", "properties": { "rule_id": { "nullable": true, "type": "string" }, "set_id": { "nullable": true, "type": "string" }, "list_id": { "nullable": true, "type": "string" }, "override_id": { "nullable": true, "type": "string" }, "cidr": { "nullable": true, "type": "string" }, "label": { "type": "string" }, "stage": { "type": "string", "enum": [ "stateful", "deny", "port_close", "port_open", "port_implicit_close", "allow", "default", "external", "unsupported", "transport_unknown" ] } }, "required": [ "rule_id", "set_id", "list_id", "override_id", "cidr", "label", "stage" ] } }, "required": [ "revision", "hash", "decision", "stage", "match" ] }, "applied": { "type": "object", "properties": { "revision": { "nullable": true, "type": "number" }, "hash": { "nullable": true, "type": "string" }, "same_as_desired": { "nullable": true, "type": "boolean" }, "status": { "type": "string", "enum": [ "pending", "applying", "in_sync", "failed", "drift", "unsupported" ] } }, "required": [ "revision", "hash", "same_as_desired", "status" ] }, "matches": { "maxItems": 100, "type": "array", "items": { "type": "object", "properties": { "rule_id": { "nullable": true, "type": "string" }, "set_id": { "nullable": true, "type": "string" }, "list_id": { "nullable": true, "type": "string" }, "override_id": { "nullable": true, "type": "string" }, "cidr": { "nullable": true, "type": "string" }, "label": { "type": "string" }, "stage": { "type": "string", "enum": [ "stateful", "deny", "port_close", "port_open", "port_implicit_close", "allow", "default", "external", "unsupported", "transport_unknown" ] } }, "required": [ "rule_id", "set_id", "list_id", "override_id", "cidr", "label", "stage" ] } }, "matches_total": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "truncated": { "type": "boolean" }, "limits": { "type": "array", "items": { "type": "string" } }, "external_firewall": { "type": "object", "properties": { "observed_at": { "nullable": true, "type": "string" }, "rule_count": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "complete": { "type": "boolean", "enum": [ false ] } }, "required": [ "observed_at", "rule_count", "complete" ] } }, "required": [ "agent_id", "query", "desired", "applied", "matches", "matches_total", "truncated", "limits", "external_firewall" ] }, "CreateOverride": { "type": "object", "properties": { "cidr": { "type": "string" }, "action": { "type": "string", "enum": [ "allow", "deny" ] }, "comment": { "nullable": true, "type": "string" }, "reason": { "type": "string", "minLength": 1, "maxLength": 1024 }, "expires_at": { "nullable": true, "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$" }, "ttl_seconds": { "type": "integer", "minimum": 60, "maximum": 2592000 } }, "required": [ "cidr", "action" ] }, "IpOverride": { "type": "object", "properties": { "id": { "type": "string" }, "agent_id": { "type": "string" }, "cidr": { "type": "string" }, "action": { "type": "string", "enum": [ "allow", "deny" ] }, "comment": { "nullable": true, "type": "string" }, "created_at": { "type": "string" }, "reason": { "nullable": true, "type": "string" }, "created_by_user_id": { "nullable": true, "type": "string" }, "created_by_name": { "nullable": true, "type": "string" }, "expires_at": { "nullable": true, "type": "string" }, "expired": { "type": "boolean" }, "expiration_enforcement": { "type": "string", "enum": [ "next_policy_sync" ] } }, "required": [ "id", "agent_id", "cidr", "action", "created_at" ] }, "IpList": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "type": { "type": "string", "enum": [ "static", "json_url", "domains", "evobgp_community" ] }, "config_json": { "type": "string" }, "content_hash": { "nullable": true, "type": "string" }, "refreshed_at": { "nullable": true, "type": "string" }, "last_error": { "nullable": true, "type": "string" }, "entry_count": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, "created_at": { "type": "string" }, "updated_at": { "type": "string" } }, "required": [ "id", "name", "type", "config_json", "created_at", "updated_at" ] }, "CreateWebhook": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "url": { "type": "string", "maxLength": 2048, "format": "uri" }, "secret": { "type": "string", "minLength": 32, "maxLength": 256 }, "events": { "minItems": 1, "maxItems": 4, "type": "array", "items": { "type": "string", "enum": [ "agent.offline", "agent.apply_failed", "agent.drift", "source.error" ] } }, "enabled": { "default": true, "type": "boolean" } }, "required": [ "name", "url", "secret", "events" ], "additionalProperties": false }, "PatchWebhook": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 100 }, "url": { "type": "string", "maxLength": 2048, "format": "uri" }, "secret": { "type": "string", "minLength": 32, "maxLength": 256 }, "events": { "minItems": 1, "maxItems": 4, "type": "array", "items": { "type": "string", "enum": [ "agent.offline", "agent.apply_failed", "agent.drift", "source.error" ] } }, "enabled": { "default": true, "type": "boolean" } }, "additionalProperties": false }, "EnrollWithCredential": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 255 }, "hostname": { "type": "string", "maxLength": 255 }, "platform": { "default": "linux", "type": "string", "enum": [ "linux", "mikrotik" ] }, "token": { "type": "string", "minLength": 16, "maxLength": 256 }, "client_version": { "type": "string", "maxLength": 100 }, "install_link_id": { "type": "string", "minLength": 8, "maxLength": 128 } }, "required": [ "name", "token", "install_link_id" ], "additionalProperties": false }, "TokenRotationExchange": { "type": "object", "properties": { "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "next_token": { "type": "string", "pattern": "^evofw_[A-Za-z0-9_-]{32,128}$" } }, "required": [ "request_id", "next_token" ], "additionalProperties": false }, "CredentialStatus": { "type": "object", "properties": { "client_id": { "type": "string" }, "rotation": { "nullable": true, "type": "object", "properties": { "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "expires_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" } }, "required": [ "request_id", "expires_at" ] }, "completed_rotation": { "nullable": true, "type": "object", "properties": { "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "required": [ "request_id" ] } }, "required": [ "client_id", "rotation", "completed_rotation" ] }, "TokenRotationAck": { "type": "object", "properties": { "ok": { "type": "boolean", "enum": [ true ] }, "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "client_id": { "type": "string" } }, "required": [ "ok", "request_id", "client_id" ] }, "AdminCredentialStatus": { "type": "object", "properties": { "agent_id": { "type": "string" }, "supported": { "type": "boolean" }, "client_version": { "nullable": true, "type": "string" }, "agent_status": { "type": "string", "enum": [ "invited", "pending", "approved", "revoked" ] }, "rotation": { "nullable": true, "type": "object", "properties": { "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" }, "expires_at": { "type": "string", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$" } }, "required": [ "request_id", "expires_at" ] }, "completed_rotation": { "nullable": true, "type": "object", "properties": { "request_id": { "type": "string", "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" } }, "required": [ "request_id" ] } }, "required": [ "agent_id", "supported", "client_version", "agent_status", "rotation", "completed_rotation" ] }, "ListImportSummary": { "type": "object", "properties": { "count": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "content_hash": { "nullable": true, "type": "string" }, "changed": { "type": "boolean" } }, "required": [ "count", "content_hash", "changed" ], "additionalProperties": false }, "CreatePolicySnapshot": { "type": "object", "properties": { "source_agent_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "name": { "type": "string", "minLength": 1, "maxLength": 120 } }, "required": [ "source_agent_id", "name" ], "additionalProperties": false }, "PolicySnapshotDiffRequest": { "type": "object", "properties": { "agent_ids": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "required": [ "agent_ids" ], "additionalProperties": false }, "CreatePolicyRollout": { "type": "object", "properties": { "snapshot_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "targets": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "object", "properties": { "agent_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "expected_generation": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "maximum": 9007199254740991 } }, "required": [ "agent_id", "expected_generation" ], "additionalProperties": false } }, "canary_ids": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "required": [ "snapshot_id", "targets", "canary_ids" ], "additionalProperties": false }, "PolicyRolloutTransition": { "type": "object", "properties": { "expected_version": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "maximum": 9007199254740991 } }, "required": [ "expected_version" ], "additionalProperties": false }, "ReleasePolicyPin": { "type": "object", "properties": { "rollout_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "expected_generation": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "maximum": 9007199254740991 } }, "required": [ "rollout_id", "expected_generation" ], "additionalProperties": false }, "CreateAgentLabel": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 64 }, "color": { "nullable": true, "type": "string", "enum": [ "primary", "success", "warning", "destructive", "secondary", "info" ] } }, "required": [ "name" ], "additionalProperties": false }, "PatchAgentLabel": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 64 }, "color": { "nullable": true, "type": "string", "enum": [ "primary", "success", "warning", "destructive", "secondary", "info" ] } }, "additionalProperties": false }, "PutAgentLabels": { "type": "object", "properties": { "label_ids": { "maxItems": 20, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "required": [ "label_ids" ], "additionalProperties": false }, "PreviewLabelAssignment": { "type": "object", "properties": { "selector": { "type": "object", "properties": { "agent_ids": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "label_ids": { "maxItems": 20, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "additionalProperties": false }, "mode": { "type": "string", "enum": [ "add", "replace" ] }, "set_ids": { "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "required": [ "selector", "mode", "set_ids" ], "additionalProperties": false }, "ApplyLabelAssignment": { "type": "object", "properties": { "selector": { "type": "object", "properties": { "agent_ids": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "label_ids": { "maxItems": 20, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "additionalProperties": false }, "mode": { "type": "string", "enum": [ "add", "replace" ] }, "set_ids": { "maxItems": 100, "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "expected": { "minItems": 1, "maxItems": 100, "type": "array", "items": { "type": "object", "properties": { "agent_id": { "type": "string", "minLength": 1, "maxLength": 128 }, "generation": { "type": "integer", "minimum": 0, "exclusiveMinimum": true, "maximum": 9007199254740991 } }, "required": [ "agent_id", "generation" ], "additionalProperties": false } } }, "required": [ "selector", "mode", "set_ids", "expected" ], "additionalProperties": false } } }, "paths": { "/v1/agent/credentials": { "get": { "summary": "Agent credential status; no-store; approved current token only", "tags": [ "ops" ], "security": [ { "agentToken": [] } ], "responses": { "200": { "description": "Agent credential status; no-store; approved current token only", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CredentialStatus" } } } }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/v1/agent/token-rotation": { "post": { "summary": "Atomic token exchange; old-token retry only for exact completed exchange within 24 hours; no-store", "tags": [ "ops" ], "security": [ { "agentToken": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokenRotationExchange" } } } }, "responses": { "200": { "description": "Atomic token exchange; old-token retry only for exact completed exchange within 24 hours; no-store", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TokenRotationAck" } } } }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agents/{id}/token-rotation": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "get": { "summary": "Operator credential rotation status; agents read permission; no-store", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Operator credential rotation status; agents read permission; no-store", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdminCredentialStatus" } } } }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } }, "post": { "summary": "Request rotation for a supported approved client; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "202": { "description": "Request rotation for a supported approved client; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/snapshots": { "get": { "summary": "List immutable snapshot metadata; policies read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "List immutable snapshot metadata; policies read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } }, "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 20 } }, { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "maximum": 10000, "default": 0 } } ] }, "post": { "summary": "Capture immutable effective policy for source agent; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatePolicySnapshot" } } } }, "responses": { "201": { "description": "Capture immutable effective policy for source agent; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/snapshots/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "get": { "summary": "Get immutable snapshot and payload; policies read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Get immutable snapshot and payload; policies read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } }, "delete": { "summary": "Delete unreferenced snapshot; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Delete unreferenced snapshot; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/snapshots/{id}/diff": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "post": { "summary": "Read-only bounded diff for up to 100 agents; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PolicySnapshotDiffRequest" } } } }, "responses": { "200": { "description": "Read-only bounded diff for up to 100 agents; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/rollouts": { "get": { "summary": "List rollout metadata; policies read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "List rollout metadata; policies read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } }, "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 20 } }, { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "maximum": 10000, "default": 0 } } ] }, "post": { "summary": "Start explicitly selected canary rollout with generation checks; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreatePolicyRollout" } } } }, "responses": { "201": { "description": "Start explicitly selected canary rollout with generation checks; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/rollouts/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "get": { "summary": "Get rollout and per-target acknowledgement; policies read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Get rollout and per-target acknowledgement; policies read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } }, "delete": { "summary": "Delete finished rollout after all pins released; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Delete finished rollout after all pins released; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/rollouts/{id}/confirm": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "post": { "summary": "Confirm rollout at expected version after fresh exact canary acknowledgement; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PolicyRolloutTransition" } } } }, "responses": { "200": { "description": "Confirm rollout at expected version after fresh exact canary acknowledgement; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/policies/rollouts/{id}/rollback": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "post": { "summary": "Rollback to captured per-agent immutable policies; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PolicyRolloutTransition" } } } }, "responses": { "200": { "description": "Rollback to captured per-agent immutable policies; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agents/{id}/policy-pin/release": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "post": { "summary": "Release selected rollout pin with expected generation; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReleasePolicyPin" } } } }, "responses": { "200": { "description": "Release selected rollout pin with expected generation; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agent-labels": { "get": { "summary": "List labels; agents read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "List labels; agents read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } }, "parameters": [ { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 50, "default": 20 } }, { "name": "offset", "in": "query", "schema": { "type": "integer", "minimum": 0, "maximum": 10000, "default": 0 } } ] }, "post": { "summary": "Create unique agent label; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateAgentLabel" } } } }, "responses": { "201": { "description": "Create unique agent label; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agent-labels/{id}": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "patch": { "summary": "Update label; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PatchAgentLabel" } } } }, "responses": { "200": { "description": "Update label; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } }, "delete": { "summary": "Delete label without deleting assigned agents; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Delete label without deleting assigned agents; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agents/{id}/labels": { "parameters": [ { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "minLength": 1, "maxLength": 128 } } ], "get": { "summary": "Read agent label IDs; agents read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Read agent label IDs; agents read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } }, "put": { "summary": "Replace agent labels atomically; agents write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PutAgentLabels" } } } }, "responses": { "200": { "description": "Replace agent labels atomically; agents write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agent-labels/preview-assignment": { "post": { "summary": "Preview add/replace policy-set assignment from explicit agent IDs or labels; policies read permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PreviewLabelAssignment" } } } }, "responses": { "200": { "description": "Preview add/replace policy-set assignment from explicit agent IDs or labels; policies read permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } }, "/api/v1/agent-labels/assign-policy-sets": { "post": { "summary": "Apply previously reviewed assignment with exact per-agent generations; policies write permission", "tags": [ "ops" ], "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApplyLabelAssignment" } } } }, "responses": { "200": { "description": "Apply previously reviewed assignment with exact per-agent generations; policies write permission" }, "400": { "description": "Invalid request" }, "401": { "description": "Authentication required" }, "403": { "description": "Insufficient permission" }, "409": { "description": "Stale revision, conflicting operation or resource still referenced" } } } } } }