2026-03-14 14:43:18 +01:00
{
"openapi" : "3.1.0" ,
"info" : {
2026-03-14 15:33:37 +01:00
"title" : "Cameleer3 Server API" ,
"version" : "1.0"
2026-03-14 14:43:18 +01:00
} ,
2026-03-17 16:37:43 +01:00
"servers" : [
{
"url" : "/api/v1" ,
"description" : "Relative"
}
] ,
2026-03-14 15:33:37 +01:00
"security" : [
{
"bearer" : [ ]
}
] ,
2026-03-14 14:43:18 +01:00
"tags" : [
{
2026-03-17 16:37:43 +01:00
"name" : "Database Admin" ,
"description" : "Database monitoring and management (ADMIN only)"
} ,
{
"name" : "Threshold Admin" ,
"description" : "Monitoring threshold configuration (ADMIN only)"
2026-03-14 14:43:18 +01:00
} ,
{
"name" : "Agent Commands" ,
"description" : "Command push endpoints for agent communication"
} ,
{
"name" : "User Admin" ,
"description" : "User management (ADMIN only)"
} ,
{
"name" : "Agent Management" ,
"description" : "Agent registration and lifecycle endpoints"
} ,
2026-03-14 15:33:37 +01:00
{
"name" : "Authentication" ,
"description" : "Login and token refresh endpoints"
} ,
2026-03-17 18:11:10 +01:00
{
"name" : "Role Admin" ,
"description" : "Role management (ADMIN only)"
} ,
{
"name" : "RBAC Stats" ,
"description" : "RBAC statistics (ADMIN only)"
} ,
2026-03-14 14:43:18 +01:00
{
"name" : "OIDC Config Admin" ,
"description" : "OIDC provider configuration (ADMIN only)"
} ,
2026-03-17 16:37:43 +01:00
{
"name" : "Search" ,
"description" : "Transaction search endpoints"
} ,
{
"name" : "Agent SSE" ,
"description" : "Server-Sent Events endpoint for agent communication"
} ,
{
"name" : "Ingestion" ,
"description" : "Data ingestion endpoints"
} ,
{
"name" : "Audit Log" ,
"description" : "Audit log viewer (ADMIN only)"
} ,
2026-03-17 18:11:10 +01:00
{
"name" : "Group Admin" ,
"description" : "Group management (ADMIN only)"
} ,
2026-03-14 14:43:18 +01:00
{
"name" : "Diagrams" ,
"description" : "Diagram rendering endpoints"
} ,
{
2026-03-17 16:37:43 +01:00
"name" : "OpenSearch Admin" ,
"description" : "OpenSearch monitoring and management (ADMIN only)"
2026-03-14 14:43:18 +01:00
} ,
{
2026-03-17 16:37:43 +01:00
"name" : "Detail" ,
"description" : "Execution detail and processor snapshot endpoints"
2026-03-14 14:43:18 +01:00
}
] ,
"paths" : {
2026-03-17 18:11:10 +01:00
"/admin/thresholds" : {
"get" : {
2026-03-14 14:43:18 +01:00
"tags" : [
2026-03-17 18:11:10 +01:00
"Threshold Admin"
2026-03-14 14:43:18 +01:00
] ,
2026-03-17 18:11:10 +01:00
"summary" : "Get current threshold configuration" ,
"operationId" : "getThresholds" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ThresholdConfig"
}
}
2026-03-14 14:43:18 +01:00
}
}
2026-03-17 18:11:10 +01:00
}
} ,
"put" : {
"tags" : [
"Threshold Admin"
2026-03-14 14:43:18 +01:00
] ,
2026-03-17 18:11:10 +01:00
"summary" : "Update threshold configuration" ,
"operationId" : "updateThresholds" ,
2026-03-14 14:43:18 +01:00
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/ThresholdConfigRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-17 18:11:10 +01:00
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ThresholdConfig"
}
}
}
2026-03-14 14:43:18 +01:00
}
}
}
} ,
2026-03-17 18:11:10 +01:00
"/admin/roles/{id}" : {
2026-03-17 16:37:43 +01:00
"get" : {
"tags" : [
2026-03-17 18:11:10 +01:00
"Role Admin"
] ,
"summary" : "Get role by ID with effective principals" ,
"operationId" : "getRole" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
2026-03-17 16:37:43 +01:00
] ,
"responses" : {
"200" : {
2026-03-17 18:11:10 +01:00
"description" : "Role found" ,
2026-03-17 16:37:43 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/RoleDetail"
}
}
}
} ,
"404" : {
"description" : "Role not found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/RoleDetail"
2026-03-17 16:37:43 +01:00
}
}
}
}
}
} ,
"put" : {
"tags" : [
2026-03-17 18:11:10 +01:00
"Role Admin"
] ,
"summary" : "Update a custom role" ,
"operationId" : "updateRole" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
2026-03-17 16:37:43 +01:00
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/UpdateRoleRequest"
2026-03-17 16:37:43 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-17 18:11:10 +01:00
"description" : "Role updated"
} ,
"403" : {
"description" : "Cannot modify system role"
} ,
"404" : {
"description" : "Role not found"
}
}
} ,
"delete" : {
"tags" : [
"Role Admin"
] ,
"summary" : "Delete a custom role" ,
"operationId" : "deleteRole" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
2026-03-17 16:37:43 +01:00
}
}
2026-03-17 18:11:10 +01:00
] ,
"responses" : {
"204" : {
"description" : "Role deleted"
} ,
"403" : {
"description" : "Cannot delete system role"
} ,
"404" : {
"description" : "Role not found"
}
2026-03-17 16:37:43 +01:00
}
}
} ,
2026-03-14 14:43:18 +01:00
"/admin/oidc" : {
"get" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Get OIDC configuration" ,
"operationId" : "getConfig" ,
"responses" : {
"200" : {
"description" : "Current OIDC configuration (client_secret masked)" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
} ,
"put" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Save OIDC configuration" ,
"operationId" : "saveConfig" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Configuration saved" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid configuration" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
} ,
"delete" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Delete OIDC configuration" ,
"operationId" : "deleteConfig" ,
"responses" : {
"204" : {
"description" : "Configuration deleted"
}
}
}
} ,
2026-03-17 18:11:10 +01:00
"/admin/groups/{id}" : {
"get" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Get group by ID with effective roles" ,
"operationId" : "getGroup" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"200" : {
"description" : "Group found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/GroupDetail"
}
}
}
} ,
"404" : {
"description" : "Group not found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/GroupDetail"
}
}
}
}
}
} ,
"put" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Update group name or parent" ,
"operationId" : "updateGroup" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/UpdateGroupRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Group updated"
} ,
"404" : {
"description" : "Group not found"
} ,
"409" : {
"description" : "Cycle detected in group hierarchy"
}
}
} ,
"delete" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Delete group" ,
"operationId" : "deleteGroup" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"204" : {
"description" : "Group deleted"
} ,
"404" : {
"description" : "Group not found"
}
}
}
} ,
2026-03-14 14:43:18 +01:00
"/search/executions" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Search executions with basic filters" ,
"operationId" : "searchGet" ,
"parameters" : [
{
"name" : "status" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "timeFrom" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "timeTo" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "correlationId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "text" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "agentId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "processorType" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
2026-03-14 14:43:18 +01:00
{
"name" : "offset" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 0
}
} ,
{
"name" : "limit" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 50
}
2026-03-14 19:34:22 +01:00
} ,
{
"name" : "sortField" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "sortDir" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/SearchResultExecutionSummary"
}
}
}
}
}
} ,
"post" : {
"tags" : [
"Search"
] ,
"summary" : "Advanced search with all filters" ,
"operationId" : "searchPost" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/SearchRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/SearchResultExecutionSummary"
}
}
}
}
}
}
} ,
"/data/metrics" : {
"post" : {
"tags" : [
"Ingestion"
] ,
"summary" : "Ingest agent metrics" ,
"description" : "Accepts an array of MetricsSnapshot objects" ,
"operationId" : "ingestMetrics" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"type" : "string"
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Data accepted for processing"
} ,
"503" : {
"description" : "Buffer full, retry later"
}
}
}
} ,
"/data/executions" : {
"post" : {
"tags" : [
"Ingestion"
] ,
"summary" : "Ingest route execution data" ,
"description" : "Accepts a single RouteExecution or an array of RouteExecutions" ,
"operationId" : "ingestExecutions" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"type" : "string"
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Data accepted for processing"
}
}
}
} ,
"/data/diagrams" : {
"post" : {
"tags" : [
"Ingestion"
] ,
"summary" : "Ingest route diagram data" ,
"description" : "Accepts a single RouteGraph or an array of RouteGraphs" ,
"operationId" : "ingestDiagrams" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"type" : "string"
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Data accepted for processing"
}
}
}
} ,
"/auth/refresh" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Refresh access token" ,
2026-03-14 14:43:18 +01:00
"operationId" : "refresh" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/RefreshRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Token refreshed" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "Invalid refresh token" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/auth/oidc/callback" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Exchange OIDC authorization code for JWTs" ,
2026-03-14 14:43:18 +01:00
"operationId" : "callback" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/CallbackRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Authentication successful" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "OIDC authentication failed" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
}
}
}
} ,
"403" : {
"description" : "Account not provisioned" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
}
}
}
} ,
"404" : {
"description" : "OIDC not configured or disabled" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/AuthTokenResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/auth/login" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Login with local credentials" ,
2026-03-14 14:43:18 +01:00
"operationId" : "login" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/LoginRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Login successful" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "Invalid credentials" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/refresh" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Refresh access token" ,
"description" : "Issues a new access JWT from a valid refresh token" ,
"operationId" : "refresh_1" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "New access token issued" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"401" : {
"description" : "Invalid or expired refresh token" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Agent not found" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/heartbeat" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Agent heartbeat ping" ,
"description" : "Updates the agent's last heartbeat timestamp" ,
"operationId" : "heartbeat" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Heartbeat accepted"
} ,
"404" : {
"description" : "Agent not registered"
}
}
}
} ,
"/agents/{id}/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Send command to a specific agent" ,
"description" : "Sends a config-update, deep-trace, or replay command to the specified agent" ,
"operationId" : "sendCommand" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Command accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Agent not registered" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/commands/{commandId}/ack" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Acknowledge command receipt" ,
"description" : "Agent acknowledges that it has received and processed a command" ,
"operationId" : "acknowledgeCommand" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "commandId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Command acknowledged"
} ,
"404" : {
"description" : "Command not found"
}
}
}
} ,
"/agents/register" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Register an agent" ,
"description" : "Registers a new agent or re-registers an existing one. Requires bootstrap token in Authorization header." ,
"operationId" : "register" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Agent registered successfully" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid registration payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"401" : {
"description" : "Missing or invalid bootstrap token" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/groups/{group}/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Send command to all agents in a group" ,
"description" : "Sends a command to all LIVE agents in the specified group" ,
"operationId" : "sendGroupCommand" ,
"parameters" : [
{
"name" : "group" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Commands accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Broadcast command to all live agents" ,
"description" : "Sends a command to all agents currently in LIVE state" ,
"operationId" : "broadcastCommand" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Commands accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
2026-03-17 18:11:10 +01:00
}
}
} ,
"/admin/users/{userId}/roles/{roleId}" : {
"post" : {
"tags" : [
"User Admin"
] ,
"summary" : "Assign a role to a user" ,
"operationId" : "assignRoleToUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "roleId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"200" : {
"description" : "Role assigned"
} ,
"404" : {
"description" : "User or role not found"
}
}
} ,
"delete" : {
"tags" : [
"User Admin"
] ,
"summary" : "Remove a role from a user" ,
"operationId" : "removeRoleFromUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "roleId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"204" : {
"description" : "Role removed"
}
}
}
} ,
"/admin/users/{userId}/groups/{groupId}" : {
"post" : {
"tags" : [
"User Admin"
] ,
"summary" : "Add a user to a group" ,
"operationId" : "addUserToGroup" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "groupId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"200" : {
"description" : "User added to group"
}
}
} ,
"delete" : {
"tags" : [
"User Admin"
] ,
"summary" : "Remove a user from a group" ,
"operationId" : "removeUserFromGroup" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "groupId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
] ,
"responses" : {
"204" : {
"description" : "User removed from group"
}
}
}
} ,
"/admin/roles" : {
"get" : {
"tags" : [
"Role Admin"
] ,
"summary" : "List all roles (system and custom)" ,
"operationId" : "listRoles" ,
"responses" : {
"200" : {
"description" : "Role list returned" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/RoleDetail"
}
}
}
}
}
}
} ,
"post" : {
"tags" : [
"Role Admin"
] ,
"summary" : "Create a custom role" ,
"operationId" : "createRole" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/CreateRoleRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Role created" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string" ,
"format" : "uuid"
}
}
}
}
}
}
}
} ,
"/admin/oidc/test" : {
"post" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Test OIDC provider connectivity" ,
"operationId" : "testConnection" ,
"responses" : {
"200" : {
"description" : "Provider reachable" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/OidcTestResult"
}
}
}
} ,
"400" : {
"description" : "Provider unreachable or misconfigured" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
} ,
"/admin/groups" : {
"get" : {
"tags" : [
"Group Admin"
] ,
"summary" : "List all groups with hierarchy and effective roles" ,
"operationId" : "listGroups" ,
"responses" : {
"200" : {
"description" : "Group list returned" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/GroupDetail"
}
}
}
}
}
}
} ,
"post" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Create a new group" ,
"operationId" : "createGroup" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/CreateGroupRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Group created" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string" ,
"format" : "uuid"
}
}
}
}
}
}
}
} ,
"/admin/groups/{id}/roles/{roleId}" : {
"post" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Assign a role to a group" ,
"operationId" : "assignRoleToGroup" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
} ,
{
"name" : "roleId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
}
}
2026-03-14 14:43:18 +01:00
] ,
"responses" : {
"200" : {
2026-03-17 18:11:10 +01:00
"description" : "Role assigned to group"
} ,
"404" : {
"description" : "Group not found"
}
}
} ,
"delete" : {
"tags" : [
"Group Admin"
] ,
"summary" : "Remove a role from a group" ,
"operationId" : "removeRoleFromGroup" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
2026-03-14 14:43:18 +01:00
}
} ,
2026-03-17 18:11:10 +01:00
{
"name" : "roleId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "uuid"
2026-03-14 14:43:18 +01:00
}
}
2026-03-17 18:11:10 +01:00
] ,
"responses" : {
"204" : {
"description" : "Role removed from group"
} ,
"404" : {
"description" : "Group not found"
}
2026-03-14 14:43:18 +01:00
}
}
} ,
2026-03-17 16:37:43 +01:00
"/admin/database/queries/{pid}/kill" : {
"post" : {
"tags" : [
"Database Admin"
] ,
"summary" : "Terminate a query by PID" ,
"operationId" : "killQuery" ,
"parameters" : [
{
"name" : "pid" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "integer" ,
"format" : "int32"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK"
}
}
}
} ,
2026-03-14 14:43:18 +01:00
"/search/stats" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Aggregate execution stats (P99 latency, active count)" ,
"operationId" : "stats" ,
"parameters" : [
{
"name" : "from" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "to" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionStats"
}
}
}
}
}
}
} ,
"/search/stats/timeseries" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Bucketed time-series stats over a time window" ,
"operationId" : "timeseries" ,
"parameters" : [
{
"name" : "from" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "to" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "buckets" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 24
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/StatsTimeseries"
}
}
}
}
}
}
} ,
"/executions/{executionId}" : {
"get" : {
"tags" : [
"Detail"
] ,
"summary" : "Get execution detail with nested processor tree" ,
"operationId" : "getDetail" ,
"parameters" : [
{
"name" : "executionId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Execution detail found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionDetail"
}
}
}
} ,
"404" : {
"description" : "Execution not found" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionDetail"
}
}
}
}
}
}
} ,
"/executions/{executionId}/processors/{index}/snapshot" : {
"get" : {
"tags" : [
"Detail"
] ,
"summary" : "Get exchange snapshot for a specific processor" ,
"operationId" : "getProcessorSnapshot" ,
"parameters" : [
{
"name" : "executionId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "index" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "integer" ,
"format" : "int32"
}
}
] ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Snapshot data" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string"
}
}
}
}
} ,
"404" : {
"description" : "Snapshot not found" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string"
}
}
}
}
}
}
}
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"/diagrams" : {
"get" : {
"tags" : [
"Diagrams"
] ,
"summary" : "Find diagram by application group and route ID" ,
"description" : "Resolves group to agent IDs and finds the latest diagram for the route" ,
"operationId" : "findByGroupAndRoute" ,
"parameters" : [
{
"name" : "group" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Diagram layout returned" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/DiagramLayout"
}
}
}
} ,
"404" : {
2026-03-17 16:37:43 +01:00
"description" : "No diagram found for the given group and route" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/DiagramLayout"
}
}
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
}
}
}
} ,
2026-03-14 14:43:18 +01:00
"/diagrams/{contentHash}/render" : {
"get" : {
"tags" : [
"Diagrams"
] ,
"summary" : "Render a route diagram" ,
"description" : "Returns SVG (default) or JSON layout based on Accept header" ,
"operationId" : "renderDiagram" ,
"parameters" : [
{
"name" : "contentHash" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Diagram rendered successfully" ,
"content" : {
2026-03-14 15:33:37 +01:00
"image/svg+xml" : {
2026-03-14 14:43:18 +01:00
"schema" : {
2026-03-14 15:33:37 +01:00
"type" : "string"
}
} ,
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/DiagramLayout"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Diagram not found" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object"
}
}
}
}
}
}
} ,
"/auth/oidc/config" : {
"get" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Get OIDC config for SPA login flow" ,
2026-03-14 14:43:18 +01:00
"operationId" : "getConfig_1" ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "OIDC configuration" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcPublicConfigResponse"
}
}
}
} ,
"404" : {
"description" : "OIDC not configured or disabled" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/OidcPublicConfigResponse"
}
}
}
} ,
"500" : {
"description" : "Failed to retrieve OIDC provider metadata" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents" : {
"get" : {
"tags" : [
"Agent Management"
] ,
"summary" : "List all agents" ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"description" : "Returns all registered agents, optionally filtered by status and/or group" ,
2026-03-14 14:43:18 +01:00
"operationId" : "listAgents" ,
"parameters" : [
{
"name" : "status" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "Agent list returned" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/AgentInstanceResponse"
}
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid status filter" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/events" : {
"get" : {
"tags" : [
"Agent SSE"
] ,
"summary" : "Open SSE event stream" ,
"description" : "Opens a Server-Sent Events stream for the specified agent. Commands (config-update, deep-trace, replay) are pushed as events. Ping keepalive comments sent every 15 seconds." ,
"operationId" : "events" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "Last-Event-ID" ,
"in" : "header" ,
"description" : "Last received event ID (no replay, acknowledged only)" ,
"required" : false ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "SSE stream opened" ,
"content" : {
"text/event-stream" : {
"schema" : {
"$ref" : "#/components/schemas/SseEmitter"
}
}
}
} ,
"404" : {
"description" : "Agent not registered" ,
"content" : {
"text/event-stream" : {
"schema" : {
"$ref" : "#/components/schemas/SseEmitter"
}
}
}
}
}
}
} ,
"/admin/users" : {
"get" : {
"tags" : [
"User Admin"
] ,
2026-03-17 18:11:10 +01:00
"summary" : "List all users with RBAC detail" ,
2026-03-14 14:43:18 +01:00
"operationId" : "listUsers" ,
"responses" : {
"200" : {
"description" : "User list returned" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/UserDetail"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
}
} ,
"/admin/users/{userId}" : {
"get" : {
"tags" : [
"User Admin"
] ,
2026-03-17 18:11:10 +01:00
"summary" : "Get user by ID with RBAC detail" ,
2026-03-14 14:43:18 +01:00
"operationId" : "getUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "User found" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/UserDetail"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "User not found" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/UserDetail"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
} ,
"delete" : {
"tags" : [
"User Admin"
] ,
"summary" : "Delete user" ,
"operationId" : "deleteUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"204" : {
"description" : "User deleted"
}
}
}
2026-03-17 16:37:43 +01:00
} ,
2026-03-17 18:11:10 +01:00
"/admin/rbac/stats" : {
"get" : {
"tags" : [
"RBAC Stats"
] ,
"summary" : "Get RBAC statistics for the dashboard" ,
"operationId" : "getStats" ,
"responses" : {
"200" : {
"description" : "RBAC stats returned" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/RbacStats"
}
}
}
}
}
}
} ,
2026-03-17 16:37:43 +01:00
"/admin/opensearch/status" : {
"get" : {
"tags" : [
"OpenSearch Admin"
] ,
"summary" : "Get OpenSearch cluster status and version" ,
"operationId" : "getStatus" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/OpenSearchStatusResponse"
}
}
2026-03-14 14:43:18 +01:00
}
}
}
2026-03-17 16:37:43 +01:00
}
} ,
"/admin/opensearch/pipeline" : {
"get" : {
"tags" : [
"OpenSearch Admin"
] ,
"summary" : "Get indexing pipeline statistics" ,
"operationId" : "getPipeline" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/PipelineStatsResponse"
}
}
2026-03-14 14:43:18 +01:00
}
}
}
2026-03-17 16:37:43 +01:00
}
} ,
"/admin/opensearch/performance" : {
"get" : {
"tags" : [
"OpenSearch Admin"
] ,
"summary" : "Get OpenSearch performance metrics" ,
"operationId" : "getPerformance" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/PerformanceResponse"
}
}
}
2026-03-14 15:33:37 +01:00
}
2026-03-17 16:37:43 +01:00
}
}
} ,
"/admin/opensearch/indices" : {
"get" : {
"tags" : [
"OpenSearch Admin"
] ,
"summary" : "Get OpenSearch indices with pagination" ,
"operationId" : "getIndices" ,
"parameters" : [
{
"name" : "page" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 0
2026-03-14 15:33:37 +01:00
}
} ,
2026-03-17 16:37:43 +01:00
{
"name" : "size" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 20
}
2026-03-14 16:09:24 +01:00
} ,
2026-03-17 16:37:43 +01:00
{
"name" : "search" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"default" : ""
}
2026-03-14 15:33:37 +01:00
}
2026-03-17 16:37:43 +01:00
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/IndicesPageResponse"
}
}
}
}
}
}
} ,
"/admin/database/tables" : {
"get" : {
"tags" : [
"Database Admin"
] ,
"summary" : "Get table sizes and row counts" ,
"operationId" : "getTables" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/TableSizeResponse"
}
}
}
}
}
}
}
} ,
"/admin/database/status" : {
"get" : {
"tags" : [
"Database Admin"
] ,
"summary" : "Get database connection status and version" ,
"operationId" : "getStatus_1" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/DatabaseStatusResponse"
}
}
}
}
}
}
} ,
"/admin/database/queries" : {
"get" : {
"tags" : [
"Database Admin"
] ,
"summary" : "Get active queries" ,
"operationId" : "getQueries" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ActiveQueryResponse"
}
}
}
}
}
}
}
} ,
"/admin/database/pool" : {
"get" : {
"tags" : [
"Database Admin"
] ,
"summary" : "Get HikariCP connection pool stats" ,
"operationId" : "getPool" ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ConnectionPoolResponse"
}
}
}
}
}
}
} ,
"/admin/audit" : {
"get" : {
"tags" : [
"Audit Log"
] ,
"summary" : "Search audit log entries with pagination" ,
"operationId" : "getAuditLog" ,
"parameters" : [
{
"name" : "username" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "category" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "search" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "from" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date"
}
} ,
{
"name" : "to" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date"
}
} ,
{
"name" : "sort" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"default" : "timestamp"
}
} ,
{
"name" : "order" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"default" : "desc"
}
} ,
{
"name" : "page" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 0
}
} ,
{
"name" : "size" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 25
}
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/AuditLogPageResponse"
}
}
}
}
}
}
} ,
"/admin/opensearch/indices/{name}" : {
"delete" : {
"tags" : [
"OpenSearch Admin"
] ,
"summary" : "Delete an OpenSearch index" ,
"operationId" : "deleteIndex" ,
"parameters" : [
{
"name" : "name" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "OK"
}
}
}
}
} ,
"components" : {
"schemas" : {
"DatabaseThresholdsRequest" : {
"type" : "object" ,
"description" : "Database monitoring thresholds" ,
"properties" : {
"connectionPoolWarning" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Connection pool usage warning threshold (percentage)" ,
"maximum" : 100 ,
"minimum" : 0
} ,
"connectionPoolCritical" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Connection pool usage critical threshold (percentage)" ,
"maximum" : 100 ,
"minimum" : 0
} ,
"queryDurationWarning" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Query duration warning threshold (seconds)"
} ,
"queryDurationCritical" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Query duration critical threshold (seconds)"
}
}
} ,
"OpenSearchThresholdsRequest" : {
"type" : "object" ,
"description" : "OpenSearch monitoring thresholds" ,
"properties" : {
"clusterHealthWarning" : {
"type" : "string" ,
"description" : "Cluster health warning threshold (GREEN, YELLOW, RED)" ,
"minLength" : 1
} ,
"clusterHealthCritical" : {
"type" : "string" ,
"description" : "Cluster health critical threshold (GREEN, YELLOW, RED)" ,
"minLength" : 1
} ,
"queueDepthWarning" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Queue depth warning threshold" ,
"minimum" : 0
} ,
"queueDepthCritical" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Queue depth critical threshold" ,
"minimum" : 0
} ,
"jvmHeapWarning" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "JVM heap usage warning threshold (percentage)" ,
"maximum" : 100 ,
"minimum" : 0
} ,
"jvmHeapCritical" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "JVM heap usage critical threshold (percentage)" ,
"maximum" : 100 ,
"minimum" : 0
} ,
"failedDocsWarning" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Failed document count warning threshold" ,
"minimum" : 0
} ,
"failedDocsCritical" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Failed document count critical threshold" ,
"minimum" : 0
}
}
} ,
"ThresholdConfigRequest" : {
"type" : "object" ,
"description" : "Threshold configuration for admin monitoring" ,
"properties" : {
"database" : {
"$ref" : "#/components/schemas/DatabaseThresholdsRequest"
} ,
"opensearch" : {
"$ref" : "#/components/schemas/OpenSearchThresholdsRequest"
}
} ,
"required" : [
"database" ,
"opensearch"
]
} ,
"DatabaseThresholds" : {
"type" : "object" ,
"properties" : {
"connectionPoolWarning" : {
"type" : "integer" ,
"format" : "int32"
} ,
"connectionPoolCritical" : {
"type" : "integer" ,
"format" : "int32"
} ,
"queryDurationWarning" : {
"type" : "number" ,
"format" : "double"
} ,
"queryDurationCritical" : {
"type" : "number" ,
"format" : "double"
}
}
} ,
"OpenSearchThresholds" : {
"type" : "object" ,
"properties" : {
"clusterHealthWarning" : {
"type" : "string"
} ,
"clusterHealthCritical" : {
"type" : "string"
} ,
"queueDepthWarning" : {
"type" : "integer" ,
"format" : "int32"
} ,
"queueDepthCritical" : {
"type" : "integer" ,
"format" : "int32"
} ,
"jvmHeapWarning" : {
"type" : "integer" ,
"format" : "int32"
} ,
"jvmHeapCritical" : {
"type" : "integer" ,
"format" : "int32"
} ,
"failedDocsWarning" : {
"type" : "integer" ,
"format" : "int32"
} ,
"failedDocsCritical" : {
"type" : "integer" ,
"format" : "int32"
}
}
} ,
"ThresholdConfig" : {
"type" : "object" ,
"properties" : {
"database" : {
"$ref" : "#/components/schemas/DatabaseThresholds"
} ,
"opensearch" : {
"$ref" : "#/components/schemas/OpenSearchThresholds"
}
}
} ,
2026-03-17 18:11:10 +01:00
"UpdateRoleRequest" : {
"type" : "object" ,
"properties" : {
"name" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"scope" : {
"type" : "string"
}
}
} ,
2026-03-17 16:37:43 +01:00
"OidcAdminConfigRequest" : {
"type" : "object" ,
"description" : "OIDC configuration update request" ,
"properties" : {
"enabled" : {
"type" : "boolean"
} ,
"issuerUri" : {
"type" : "string"
} ,
"clientId" : {
"type" : "string"
} ,
"clientSecret" : {
"type" : "string"
} ,
"rolesClaim" : {
"type" : "string"
} ,
"defaultRoles" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"autoSignup" : {
"type" : "boolean"
} ,
"displayNameClaim" : {
"type" : "string"
}
}
} ,
"ErrorResponse" : {
"type" : "object" ,
"description" : "Error response" ,
"properties" : {
"message" : {
"type" : "string"
}
} ,
"required" : [
"message"
]
} ,
"OidcAdminConfigResponse" : {
"type" : "object" ,
"description" : "OIDC configuration for admin management" ,
"properties" : {
"configured" : {
"type" : "boolean"
} ,
"enabled" : {
"type" : "boolean"
} ,
"issuerUri" : {
"type" : "string"
} ,
"clientId" : {
"type" : "string"
} ,
"clientSecretSet" : {
"type" : "boolean"
} ,
"rolesClaim" : {
"type" : "string"
} ,
"defaultRoles" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"autoSignup" : {
"type" : "boolean"
} ,
"displayNameClaim" : {
"type" : "string"
}
}
} ,
2026-03-17 18:11:10 +01:00
"UpdateGroupRequest" : {
"type" : "object" ,
"properties" : {
"name" : {
"type" : "string"
} ,
"parentGroupId" : {
"type" : "string" ,
"format" : "uuid"
}
}
} ,
2026-03-17 16:37:43 +01:00
"SearchRequest" : {
"type" : "object" ,
2026-03-14 14:43:18 +01:00
"properties" : {
"status" : {
"type" : "string"
} ,
"timeFrom" : {
"type" : "string" ,
"format" : "date-time"
} ,
"timeTo" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMin" : {
"type" : "integer" ,
"format" : "int64"
} ,
"durationMax" : {
"type" : "integer" ,
"format" : "int64"
} ,
"correlationId" : {
"type" : "string"
} ,
"text" : {
"type" : "string"
} ,
"textInBody" : {
"type" : "string"
} ,
"textInHeaders" : {
"type" : "string"
} ,
"textInErrors" : {
"type" : "string"
} ,
"routeId" : {
"type" : "string"
} ,
"agentId" : {
"type" : "string"
} ,
"processorType" : {
"type" : "string"
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"group" : {
"type" : "string"
} ,
"agentIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
2026-03-14 14:43:18 +01:00
"offset" : {
"type" : "integer" ,
"format" : "int32"
} ,
"limit" : {
"type" : "integer" ,
"format" : "int32"
2026-03-14 19:34:22 +01:00
} ,
"sortField" : {
"type" : "string"
} ,
"sortDir" : {
"type" : "string"
2026-03-14 14:43:18 +01:00
}
}
} ,
"ExecutionSummary" : {
"type" : "object" ,
"properties" : {
"executionId" : {
"type" : "string"
} ,
"routeId" : {
"type" : "string"
} ,
"agentId" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"correlationId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"diagramContentHash" : {
"type" : "string"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"agentId" ,
"correlationId" ,
"diagramContentHash" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"executionId" ,
"routeId" ,
"startTime" ,
"status"
]
2026-03-14 14:43:18 +01:00
} ,
"SearchResultExecutionSummary" : {
"type" : "object" ,
"properties" : {
"data" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ExecutionSummary"
}
} ,
"total" : {
"type" : "integer" ,
"format" : "int64"
} ,
"offset" : {
"type" : "integer" ,
"format" : "int32"
} ,
"limit" : {
"type" : "integer" ,
"format" : "int32"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"data" ,
"limit" ,
"offset" ,
"total"
]
2026-03-14 14:43:18 +01:00
} ,
"RefreshRequest" : {
"type" : "object" ,
"properties" : {
"refreshToken" : {
"type" : "string"
}
}
} ,
2026-03-14 15:33:37 +01:00
"AuthTokenResponse" : {
"type" : "object" ,
"description" : "JWT token pair" ,
"properties" : {
"accessToken" : {
"type" : "string"
} ,
"refreshToken" : {
"type" : "string"
2026-03-14 16:09:24 +01:00
} ,
"displayName" : {
"type" : "string"
2026-03-14 16:14:07 +01:00
} ,
"idToken" : {
"type" : "string" ,
"description" : "OIDC id_token for end-session logout (only present after OIDC login)"
2026-03-14 15:33:37 +01:00
}
} ,
"required" : [
"accessToken" ,
2026-03-17 16:37:43 +01:00
"displayName" ,
"refreshToken"
2026-03-14 15:33:37 +01:00
]
} ,
2026-03-14 14:43:18 +01:00
"CallbackRequest" : {
"type" : "object" ,
"properties" : {
"code" : {
"type" : "string"
} ,
"redirectUri" : {
"type" : "string"
}
}
} ,
"LoginRequest" : {
"type" : "object" ,
"properties" : {
"username" : {
"type" : "string"
} ,
"password" : {
"type" : "string"
}
}
} ,
2026-03-14 15:33:37 +01:00
"AgentRefreshRequest" : {
"type" : "object" ,
"description" : "Agent token refresh request" ,
"properties" : {
"refreshToken" : {
"type" : "string"
}
} ,
"required" : [
"refreshToken"
]
} ,
"AgentRefreshResponse" : {
"type" : "object" ,
2026-03-18 16:44:16 +01:00
"description" : "Refreshed access and refresh tokens" ,
2026-03-14 15:33:37 +01:00
"properties" : {
"accessToken" : {
"type" : "string"
2026-03-18 16:44:16 +01:00
} ,
"refreshToken" : {
"type" : "string"
2026-03-14 15:33:37 +01:00
}
} ,
"required" : [
2026-03-18 16:44:16 +01:00
"accessToken" ,
"refreshToken"
2026-03-14 15:33:37 +01:00
]
} ,
"CommandRequest" : {
"type" : "object" ,
"description" : "Command to send to agent(s)" ,
"properties" : {
"type" : {
"type" : "string" ,
"description" : "Command type: config-update, deep-trace, or replay"
} ,
"payload" : {
"type" : "object" ,
"description" : "Command payload JSON"
}
} ,
"required" : [
"type"
]
} ,
"CommandSingleResponse" : {
"type" : "object" ,
"description" : "Result of sending a command to a single agent" ,
"properties" : {
"commandId" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
}
} ,
"required" : [
"commandId" ,
"status"
]
} ,
"AgentRegistrationRequest" : {
"type" : "object" ,
"description" : "Agent registration payload" ,
"properties" : {
"agentId" : {
"type" : "string"
} ,
"name" : {
"type" : "string"
} ,
"group" : {
"type" : "string" ,
"default" : "default"
} ,
"version" : {
"type" : "string"
} ,
"routeIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"capabilities" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "object"
}
}
} ,
"required" : [
"agentId" ,
"name"
]
} ,
"AgentRegistrationResponse" : {
"type" : "object" ,
"description" : "Agent registration result with JWT tokens and SSE endpoint" ,
"properties" : {
"agentId" : {
"type" : "string"
} ,
"sseEndpoint" : {
"type" : "string"
} ,
"heartbeatIntervalMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"serverPublicKey" : {
"type" : "string"
} ,
"accessToken" : {
"type" : "string"
} ,
"refreshToken" : {
"type" : "string"
}
} ,
"required" : [
"accessToken" ,
"agentId" ,
"refreshToken" ,
"serverPublicKey" ,
"sseEndpoint"
]
} ,
"CommandBroadcastResponse" : {
"type" : "object" ,
"description" : "Result of broadcasting a command to multiple agents" ,
"properties" : {
"commandIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"targetCount" : {
"type" : "integer" ,
"format" : "int32"
}
} ,
"required" : [
"commandIds"
]
} ,
2026-03-17 18:11:10 +01:00
"CreateRoleRequest" : {
"type" : "object" ,
"properties" : {
"name" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"scope" : {
"type" : "string"
}
}
} ,
2026-03-14 15:33:37 +01:00
"OidcTestResult" : {
"type" : "object" ,
"description" : "OIDC provider connectivity test result" ,
"properties" : {
"status" : {
"type" : "string"
} ,
"authorizationEndpoint" : {
"type" : "string"
}
} ,
"required" : [
"authorizationEndpoint" ,
"status"
]
} ,
2026-03-17 18:11:10 +01:00
"CreateGroupRequest" : {
"type" : "object" ,
"properties" : {
"name" : {
"type" : "string"
} ,
"parentGroupId" : {
"type" : "string" ,
"format" : "uuid"
}
}
} ,
2026-03-14 14:43:18 +01:00
"ExecutionStats" : {
"type" : "object" ,
"properties" : {
"totalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"failedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"avgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"p99LatencyMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"activeCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"totalToday" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevTotalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevFailedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevAvgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevP99LatencyMs" : {
"type" : "integer" ,
"format" : "int64"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"activeCount" ,
"avgDurationMs" ,
"failedCount" ,
"p99LatencyMs" ,
"prevAvgDurationMs" ,
"prevFailedCount" ,
"prevP99LatencyMs" ,
"prevTotalCount" ,
"totalCount" ,
"totalToday"
]
2026-03-14 14:43:18 +01:00
} ,
"StatsTimeseries" : {
"type" : "object" ,
"properties" : {
"buckets" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/TimeseriesBucket"
}
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"buckets"
]
2026-03-14 14:43:18 +01:00
} ,
"TimeseriesBucket" : {
"type" : "object" ,
"properties" : {
"time" : {
"type" : "string" ,
"format" : "date-time"
} ,
"totalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"failedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"avgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"p99DurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"activeCount" : {
"type" : "integer" ,
"format" : "int64"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"activeCount" ,
"avgDurationMs" ,
"failedCount" ,
"p99DurationMs" ,
"time" ,
"totalCount"
]
2026-03-14 14:43:18 +01:00
} ,
"ExecutionDetail" : {
"type" : "object" ,
"properties" : {
"executionId" : {
"type" : "string"
} ,
"routeId" : {
"type" : "string"
} ,
"agentId" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"correlationId" : {
"type" : "string"
} ,
"exchangeId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"errorStackTrace" : {
"type" : "string"
} ,
"diagramContentHash" : {
"type" : "string"
} ,
"processors" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ProcessorNode"
}
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"agentId" ,
"correlationId" ,
"diagramContentHash" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"errorStackTrace" ,
"exchangeId" ,
"executionId" ,
"processors" ,
"routeId" ,
"startTime" ,
"status"
]
2026-03-14 14:43:18 +01:00
} ,
"ProcessorNode" : {
"type" : "object" ,
"properties" : {
"processorId" : {
"type" : "string"
} ,
"processorType" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"diagramNodeId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"errorStackTrace" : {
"type" : "string"
2026-03-14 15:33:37 +01:00
} ,
"children" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ProcessorNode"
}
}
} ,
"required" : [
"children" ,
"diagramNodeId" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"errorStackTrace" ,
"processorId" ,
"processorType" ,
"startTime" ,
"status"
]
} ,
"DiagramLayout" : {
"type" : "object" ,
"properties" : {
"width" : {
"type" : "number" ,
"format" : "double"
} ,
"height" : {
"type" : "number" ,
"format" : "double"
} ,
"nodes" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedNode"
}
} ,
"edges" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedEdge"
}
2026-03-14 14:43:18 +01:00
}
}
} ,
2026-03-14 15:33:37 +01:00
"PositionedEdge" : {
"type" : "object" ,
"properties" : {
"sourceId" : {
"type" : "string"
} ,
"targetId" : {
"type" : "string"
} ,
"label" : {
"type" : "string"
} ,
"points" : {
"type" : "array" ,
"items" : {
"type" : "array" ,
"items" : {
"type" : "number" ,
"format" : "double"
}
}
}
}
} ,
"PositionedNode" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"label" : {
"type" : "string"
} ,
"type" : {
"type" : "string"
} ,
"x" : {
"type" : "number" ,
"format" : "double"
} ,
"y" : {
"type" : "number" ,
"format" : "double"
} ,
"width" : {
"type" : "number" ,
"format" : "double"
} ,
"height" : {
"type" : "number" ,
"format" : "double"
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
"children" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedNode"
}
2026-03-14 15:33:37 +01:00
}
}
} ,
"OidcPublicConfigResponse" : {
"type" : "object" ,
"description" : "OIDC configuration for SPA login flow" ,
"properties" : {
"issuer" : {
"type" : "string"
} ,
"clientId" : {
"type" : "string"
} ,
"authorizationEndpoint" : {
"type" : "string"
} ,
"endSessionEndpoint" : {
"type" : "string" ,
"description" : "Present if the provider supports RP-initiated logout"
}
} ,
"required" : [
"authorizationEndpoint" ,
"clientId" ,
"issuer"
]
} ,
"AgentInstanceResponse" : {
"type" : "object" ,
"description" : "Agent instance summary" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"name" : {
"type" : "string"
} ,
"group" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"routeIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"registeredAt" : {
"type" : "string" ,
"format" : "date-time"
} ,
"lastHeartbeat" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
"required" : [
"group" ,
"id" ,
"lastHeartbeat" ,
"name" ,
"registeredAt" ,
"routeIds" ,
"status"
]
} ,
2026-03-14 14:43:18 +01:00
"SseEmitter" : {
"type" : "object" ,
"properties" : {
"timeout" : {
"type" : "integer" ,
"format" : "int64"
}
}
} ,
2026-03-17 18:11:10 +01:00
"GroupSummary" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string" ,
"format" : "uuid"
} ,
"name" : {
"type" : "string"
}
}
} ,
"RoleSummary" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string" ,
"format" : "uuid"
} ,
"name" : {
"type" : "string"
} ,
"system" : {
"type" : "boolean"
} ,
"source" : {
"type" : "string"
}
}
} ,
"UserDetail" : {
2026-03-14 14:43:18 +01:00
"type" : "object" ,
"properties" : {
"userId" : {
"type" : "string"
} ,
"provider" : {
"type" : "string"
} ,
"email" : {
"type" : "string"
} ,
"displayName" : {
"type" : "string"
} ,
2026-03-17 18:11:10 +01:00
"createdAt" : {
"type" : "string" ,
"format" : "date-time"
} ,
"directRoles" : {
2026-03-14 14:43:18 +01:00
"type" : "array" ,
"items" : {
2026-03-17 18:11:10 +01:00
"$ref" : "#/components/schemas/RoleSummary"
}
} ,
"directGroups" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/GroupSummary"
}
} ,
"effectiveRoles" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/RoleSummary"
}
} ,
"effectiveGroups" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/GroupSummary"
2026-03-14 14:43:18 +01:00
}
2026-03-17 18:11:10 +01:00
}
}
} ,
"RoleDetail" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string" ,
"format" : "uuid"
} ,
"name" : {
"type" : "string"
} ,
"description" : {
"type" : "string"
} ,
"scope" : {
"type" : "string"
} ,
"system" : {
"type" : "boolean"
2026-03-14 14:43:18 +01:00
} ,
"createdAt" : {
"type" : "string" ,
"format" : "date-time"
2026-03-17 18:11:10 +01:00
} ,
"assignedGroups" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/GroupSummary"
}
} ,
"directUsers" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/UserSummary"
}
} ,
"effectivePrincipals" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/UserSummary"
}
2026-03-14 14:43:18 +01:00
}
2026-03-17 18:11:10 +01:00
}
} ,
"UserSummary" : {
"type" : "object" ,
"properties" : {
"userId" : {
"type" : "string"
} ,
"displayName" : {
"type" : "string"
} ,
"provider" : {
"type" : "string"
}
}
} ,
"RbacStats" : {
"type" : "object" ,
"properties" : {
"userCount" : {
"type" : "integer" ,
"format" : "int32"
} ,
"activeUserCount" : {
"type" : "integer" ,
"format" : "int32"
} ,
"groupCount" : {
"type" : "integer" ,
"format" : "int32"
} ,
"maxGroupDepth" : {
"type" : "integer" ,
"format" : "int32"
} ,
"roleCount" : {
"type" : "integer" ,
"format" : "int32"
}
}
2026-03-17 16:37:43 +01:00
} ,
"OpenSearchStatusResponse" : {
"type" : "object" ,
"description" : "OpenSearch cluster status" ,
"properties" : {
"reachable" : {
"type" : "boolean" ,
"description" : "Whether the cluster is reachable"
} ,
"clusterHealth" : {
"type" : "string" ,
"description" : "Cluster health status (GREEN, YELLOW, RED)"
} ,
"version" : {
"type" : "string" ,
"description" : "OpenSearch version"
} ,
"nodeCount" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of nodes in the cluster"
} ,
"host" : {
"type" : "string" ,
"description" : "OpenSearch host"
}
}
} ,
"PipelineStatsResponse" : {
"type" : "object" ,
"description" : "Search indexing pipeline statistics" ,
"properties" : {
"queueDepth" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Current queue depth"
} ,
"maxQueueSize" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Maximum queue size"
} ,
"failedCount" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Number of failed indexing operations"
} ,
"indexedCount" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Number of successfully indexed documents"
} ,
"debounceMs" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Debounce interval in milliseconds"
} ,
"indexingRate" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Current indexing rate (docs/sec)"
} ,
"lastIndexedAt" : {
"type" : "string" ,
"format" : "date-time" ,
"description" : "Timestamp of last indexed document"
}
}
} ,
"PerformanceResponse" : {
"type" : "object" ,
"description" : "OpenSearch performance metrics" ,
"properties" : {
"queryCacheHitRate" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Query cache hit rate (0.0-1.0)"
} ,
"requestCacheHitRate" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Request cache hit rate (0.0-1.0)"
} ,
"searchLatencyMs" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Average search latency in milliseconds"
} ,
"indexingLatencyMs" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Average indexing latency in milliseconds"
} ,
"jvmHeapUsedBytes" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "JVM heap used in bytes"
} ,
"jvmHeapMaxBytes" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "JVM heap max in bytes"
}
}
} ,
"IndexInfoResponse" : {
"type" : "object" ,
"description" : "OpenSearch index information" ,
"properties" : {
"name" : {
"type" : "string" ,
"description" : "Index name"
} ,
"docCount" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Document count"
} ,
"size" : {
"type" : "string" ,
"description" : "Human-readable index size"
} ,
"sizeBytes" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Index size in bytes"
} ,
"health" : {
"type" : "string" ,
"description" : "Index health status"
} ,
"primaryShards" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of primary shards"
} ,
"replicaShards" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of replica shards"
}
}
} ,
"IndicesPageResponse" : {
"type" : "object" ,
"description" : "Paginated list of OpenSearch indices" ,
"properties" : {
"indices" : {
"type" : "array" ,
"description" : "Index list for current page" ,
"items" : {
"$ref" : "#/components/schemas/IndexInfoResponse"
}
} ,
"totalIndices" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Total number of indices"
} ,
"totalDocs" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Total document count across all indices"
} ,
"totalSize" : {
"type" : "string" ,
"description" : "Human-readable total size"
} ,
"page" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Current page number (0-based)"
} ,
"pageSize" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Page size"
} ,
"totalPages" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Total number of pages"
}
}
} ,
2026-03-17 18:11:10 +01:00
"GroupDetail" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string" ,
"format" : "uuid"
} ,
"name" : {
"type" : "string"
} ,
"parentGroupId" : {
"type" : "string" ,
"format" : "uuid"
} ,
"createdAt" : {
"type" : "string" ,
"format" : "date-time"
} ,
"directRoles" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/RoleSummary"
}
} ,
"effectiveRoles" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/RoleSummary"
}
} ,
"members" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/UserSummary"
}
} ,
"childGroups" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/GroupSummary"
}
}
}
} ,
2026-03-17 16:37:43 +01:00
"TableSizeResponse" : {
"type" : "object" ,
"description" : "Table size and row count information" ,
"properties" : {
"tableName" : {
"type" : "string" ,
"description" : "Table name"
} ,
"rowCount" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Approximate row count"
} ,
"dataSize" : {
"type" : "string" ,
"description" : "Human-readable data size"
} ,
"indexSize" : {
"type" : "string" ,
"description" : "Human-readable index size"
} ,
"dataSizeBytes" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Data size in bytes"
} ,
"indexSizeBytes" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Index size in bytes"
}
}
} ,
"DatabaseStatusResponse" : {
"type" : "object" ,
"description" : "Database connection and version status" ,
"properties" : {
"connected" : {
"type" : "boolean" ,
"description" : "Whether the database is reachable"
} ,
"version" : {
"type" : "string" ,
"description" : "PostgreSQL version string"
} ,
"host" : {
"type" : "string" ,
"description" : "Database host"
} ,
"schema" : {
"type" : "string" ,
"description" : "Current schema search path"
} ,
"timescaleDb" : {
"type" : "boolean" ,
"description" : "Whether TimescaleDB extension is available"
}
}
} ,
"ActiveQueryResponse" : {
"type" : "object" ,
"description" : "Currently running database query" ,
"properties" : {
"pid" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Backend process ID"
} ,
"durationSeconds" : {
"type" : "number" ,
"format" : "double" ,
"description" : "Query duration in seconds"
} ,
"state" : {
"type" : "string" ,
"description" : "Backend state (active, idle, etc.)"
} ,
"query" : {
"type" : "string" ,
"description" : "SQL query text"
}
}
} ,
"ConnectionPoolResponse" : {
"type" : "object" ,
"description" : "HikariCP connection pool statistics" ,
"properties" : {
"activeConnections" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of currently active connections"
} ,
"idleConnections" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of idle connections"
} ,
"pendingThreads" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Number of threads waiting for a connection"
} ,
"maxWaitMs" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Maximum wait time in milliseconds"
} ,
"maxPoolSize" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Maximum pool size"
}
}
} ,
"AuditLogPageResponse" : {
"type" : "object" ,
"description" : "Paginated audit log entries" ,
"properties" : {
"items" : {
"type" : "array" ,
"description" : "Audit log entries" ,
"items" : {
"$ref" : "#/components/schemas/AuditRecord"
}
} ,
"totalCount" : {
"type" : "integer" ,
"format" : "int64" ,
"description" : "Total number of matching entries"
} ,
"page" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Current page number (0-based)"
} ,
"pageSize" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Page size"
} ,
"totalPages" : {
"type" : "integer" ,
"format" : "int32" ,
"description" : "Total number of pages"
}
}
} ,
"AuditRecord" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "integer" ,
"format" : "int64"
} ,
"timestamp" : {
"type" : "string" ,
"format" : "date-time"
} ,
"username" : {
"type" : "string"
} ,
"action" : {
"type" : "string"
} ,
"category" : {
"type" : "string" ,
"enum" : [
"INFRA" ,
"AUTH" ,
"USER_MGMT" ,
2026-03-17 18:11:10 +01:00
"CONFIG" ,
"RBAC"
2026-03-17 16:37:43 +01:00
]
} ,
"target" : {
"type" : "string"
} ,
"detail" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "object"
}
} ,
"result" : {
"type" : "string" ,
"enum" : [
"SUCCESS" ,
"FAILURE"
]
} ,
"ipAddress" : {
"type" : "string"
} ,
"userAgent" : {
"type" : "string"
}
}
2026-03-14 15:33:37 +01:00
}
} ,
"securitySchemes" : {
"bearer" : {
"type" : "http" ,
"scheme" : "bearer" ,
"bearerFormat" : "JWT"
2026-03-14 14:43:18 +01:00
}
}
}
2026-03-17 18:11:10 +01:00
}