diff --git a/ui/src/api/openapi.json b/ui/src/api/openapi.json index 56e71656..ed542361 100644 --- a/ui/src/api/openapi.json +++ b/ui/src/api/openapi.json @@ -1,5473 +1 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Cameleer3 Server API", - "version": "1.0" - }, - "servers": [ - { - "url": "/api/v1", - "description": "Relative" - } - ], - "security": [ - { - "bearer": [] - } - ], - "tags": [ - { - "name": "Agent Events", - "description": "Agent lifecycle event log" - }, - { - "name": "Database Admin", - "description": "Database monitoring and management (ADMIN only)" - }, - { - "name": "Threshold Admin", - "description": "Monitoring threshold configuration (ADMIN only)" - }, - { - "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" - }, - { - "name": "Authentication", - "description": "Login and token refresh endpoints" - }, - { - "name": "Role Admin", - "description": "Role management (ADMIN only)" - }, - { - "name": "RBAC Stats", - "description": "RBAC statistics (ADMIN only)" - }, - { - "name": "OIDC Config Admin", - "description": "OIDC provider configuration (ADMIN only)" - }, - { - "name": "Route Metrics", - "description": "Route performance metrics" - }, - { - "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)" - }, - { - "name": "Application Logs", - "description": "Query application logs stored in OpenSearch" - }, - { - "name": "Group Admin", - "description": "Group management (ADMIN only)" - }, - { - "name": "Diagrams", - "description": "Diagram rendering endpoints" - }, - { - "name": "OpenSearch Admin", - "description": "OpenSearch monitoring and management (ADMIN only)" - }, - { - "name": "Application Config", - "description": "Per-application observability configuration" - }, - { - "name": "Detail", - "description": "Execution detail and processor snapshot endpoints" - }, - { - "name": "Route Catalog", - "description": "Route catalog and discovery" - } - ], - "paths": { - "/config/{application}": { - "get": { - "tags": [ - "Application Config" - ], - "summary": "Get application config", - "description": "Returns the current configuration for an application. Returns defaults if none stored.", - "operationId": "getConfig", - "parameters": [ - { - "name": "application", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Config returned", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ApplicationConfig" - } - } - } - } - } - }, - "put": { - "tags": [ - "Application Config" - ], - "summary": "Update application config", - "description": "Saves config and pushes CONFIG_UPDATE to all LIVE agents of this application", - "operationId": "updateConfig", - "parameters": [ - { - "name": "application", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplicationConfig" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Config saved and pushed", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ApplicationConfig" - } - } - } - } - } - } - }, - "/admin/users/{userId}": { - "get": { - "tags": [ - "User Admin" - ], - "summary": "Get user by ID with RBAC detail", - "operationId": "getUser", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "User found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/UserDetail" - } - } - } - }, - "404": { - "description": "User not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/UserDetail" - } - } - } - } - } - }, - "put": { - "tags": [ - "User Admin" - ], - "summary": "Update user display name or email", - "operationId": "updateUser", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateUserRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "User updated" - }, - "404": { - "description": "User not found" - } - } - }, - "delete": { - "tags": [ - "User Admin" - ], - "summary": "Delete user", - "operationId": "deleteUser", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "User deleted" - } - } - } - }, - "/admin/thresholds": { - "get": { - "tags": [ - "Threshold Admin" - ], - "summary": "Get current threshold configuration", - "operationId": "getThresholds", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ThresholdConfig" - } - } - } - } - } - }, - "put": { - "tags": [ - "Threshold Admin" - ], - "summary": "Update threshold configuration", - "operationId": "updateThresholds", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ThresholdConfigRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ThresholdConfig" - } - } - } - } - } - } - }, - "/admin/roles/{id}": { - "get": { - "tags": [ - "Role Admin" - ], - "summary": "Get role by ID with effective principals", - "operationId": "getRole", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "200": { - "description": "Role found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/RoleDetail" - } - } - } - }, - "404": { - "description": "Role not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/RoleDetail" - } - } - } - } - } - }, - "put": { - "tags": [ - "Role Admin" - ], - "summary": "Update a custom role", - "operationId": "updateRole", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateRoleRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "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" - } - } - ], - "responses": { - "204": { - "description": "Role deleted" - }, - "403": { - "description": "Cannot delete system role" - }, - "404": { - "description": "Role not found" - } - } - } - }, - "/admin/oidc": { - "get": { - "tags": [ - "OIDC Config Admin" - ], - "summary": "Get OIDC configuration", - "operationId": "getConfig_1", - "responses": { - "200": { - "description": "Current OIDC configuration (client_secret masked)", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/OidcAdminConfigResponse" - } - } - } - } - } - }, - "put": { - "tags": [ - "OIDC Config Admin" - ], - "summary": "Save OIDC configuration", - "operationId": "saveConfig", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OidcAdminConfigRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Configuration saved", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/OidcAdminConfigResponse" - } - } - } - }, - "400": { - "description": "Invalid configuration", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - }, - "delete": { - "tags": [ - "OIDC Config Admin" - ], - "summary": "Delete OIDC configuration", - "operationId": "deleteConfig", - "responses": { - "204": { - "description": "Configuration deleted" - } - } - } - }, - "/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" - } - } - } - }, - "/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" - } - }, - { - "name": "application", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "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 - } - }, - { - "name": "sortField", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sortDir", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "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" - }, - "400": { - "description": "Invalid payload" - }, - "503": { - "description": "Buffer full, retry later" - } - } - } - }, - "/data/logs": { - "post": { - "tags": [ - "Ingestion" - ], - "summary": "Ingest application log entries", - "description": "Accepts a batch of log entries from an agent. Entries are indexed in OpenSearch.", - "operationId": "ingestLogs", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LogBatch" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Logs accepted for indexing" - } - } - } - }, - "/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" - } - } - } - }, - "/config/{application}/test-expression": { - "post": { - "tags": [ - "Application Config" - ], - "summary": "Test a tap expression against sample data via a live agent", - "operationId": "testExpression", - "parameters": [ - { - "name": "application", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TestExpressionRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Expression evaluated successfully", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TestExpressionResponse" - } - } - } - }, - "404": { - "description": "No live agent available for this application", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TestExpressionResponse" - } - } - } - }, - "504": { - "description": "Agent did not respond in time", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/TestExpressionResponse" - } - } - } - } - } - } - }, - "/auth/refresh": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Refresh access token", - "operationId": "refresh", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RefreshRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Token refreshed", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AuthTokenResponse" - } - } - } - }, - "401": { - "description": "Invalid refresh token", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/auth/oidc/callback": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Exchange OIDC authorization code for JWTs", - "operationId": "callback", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CallbackRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Authentication successful", - "content": { - "*/*": { - "schema": { - "$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" - } - } - } - } - } - } - }, - "/auth/login": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Login with local credentials", - "operationId": "login", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LoginRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Login successful", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AuthTokenResponse" - } - } - } - }, - "401": { - "description": "Invalid credentials", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/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": { - "$ref": "#/components/schemas/AgentRefreshRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "New access token issued", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentRefreshResponse" - } - } - } - }, - "401": { - "description": "Invalid or expired refresh token", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentRefreshResponse" - } - } - } - }, - "404": { - "description": "Agent not found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentRefreshResponse" - } - } - } - } - } - } - }, - "/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 command to the specified agent via SSE", - "operationId": "sendCommand", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CommandRequest" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Command accepted", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandSingleResponse" - } - } - } - }, - "400": { - "description": "Invalid command payload", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandSingleResponse" - } - } - } - }, - "404": { - "description": "Agent not registered", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandSingleResponse" - } - } - } - } - } - } - }, - "/agents/{id}/commands/{commandId}/ack": { - "post": { - "tags": [ - "Agent Commands" - ], - "summary": "Acknowledge command receipt", - "description": "Agent acknowledges that it has received and processed a command, with result status and message", - "operationId": "acknowledgeCommand", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "commandId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CommandAckRequest" - } - } - } - }, - "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": { - "$ref": "#/components/schemas/AgentRegistrationRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Agent registered successfully", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentRegistrationResponse" - } - } - } - }, - "400": { - "description": "Invalid registration payload", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "401": { - "description": "Missing or invalid bootstrap token", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentRegistrationResponse" - } - } - } - } - } - } - }, - "/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": { - "$ref": "#/components/schemas/CommandRequest" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Commands accepted", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandBroadcastResponse" - } - } - } - }, - "400": { - "description": "Invalid command payload", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandBroadcastResponse" - } - } - } - } - } - } - }, - "/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": { - "$ref": "#/components/schemas/CommandRequest" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Commands accepted", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandBroadcastResponse" - } - } - } - }, - "400": { - "description": "Invalid command payload", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/CommandBroadcastResponse" - } - } - } - } - } - } - }, - "/admin/users": { - "get": { - "tags": [ - "User Admin" - ], - "summary": "List all users with RBAC detail", - "operationId": "listUsers", - "responses": { - "200": { - "description": "User list returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserDetail" - } - } - } - } - } - } - }, - "post": { - "tags": [ - "User Admin" - ], - "summary": "Create a local user", - "operationId": "createUser", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateUserRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "User created", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/UserDetail" - } - } - } - } - } - } - }, - "/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}/password": { - "post": { - "tags": [ - "User Admin" - ], - "summary": "Reset user password", - "operationId": "resetPassword", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetPasswordRequest" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Password reset" - } - } - } - }, - "/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" - } - } - ], - "responses": { - "200": { - "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" - } - }, - { - "name": "roleId", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid" - } - } - ], - "responses": { - "204": { - "description": "Role removed from group" - }, - "404": { - "description": "Group not found" - } - } - } - }, - "/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" - } - } - } - }, - "/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" - } - }, - { - "name": "routeId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "application", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "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 - } - }, - { - "name": "routeId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "application", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/StatsTimeseries" - } - } - } - } - } - } - }, - "/routes/metrics": { - "get": { - "tags": [ - "Route Metrics" - ], - "summary": "Get route metrics", - "description": "Returns aggregated performance metrics per route for the given time window", - "operationId": "getMetrics", - "parameters": [ - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "appId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Metrics returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RouteMetrics" - } - } - } - } - } - } - } - }, - "/routes/metrics/processors": { - "get": { - "tags": [ - "Route Metrics" - ], - "summary": "Get processor metrics", - "description": "Returns aggregated performance metrics per processor for the given route and time window", - "operationId": "getProcessorMetrics", - "parameters": [ - { - "name": "routeId", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "appId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - } - ], - "responses": { - "200": { - "description": "Metrics returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProcessorMetrics" - } - } - } - } - } - } - } - }, - "/routes/catalog": { - "get": { - "tags": [ - "Route Catalog" - ], - "summary": "Get route catalog", - "description": "Returns all applications with their routes, agents, and health status", - "operationId": "getCatalog", - "parameters": [ - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Catalog returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AppCatalogEntry" - } - } - } - } - } - } - } - }, - "/logs": { - "get": { - "tags": [ - "Application Logs" - ], - "summary": "Search application log entries", - "description": "Returns log entries for a given application, optionally filtered by agent, level, time range, and text query", - "operationId": "searchLogs", - "parameters": [ - { - "name": "application", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "agentId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "level", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "query", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "exchangeId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 200 - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LogEntryResponse" - } - } - } - } - } - } - } - }, - "/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": { - "description": "Execution detail found", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ExecutionDetail" - } - } - } - }, - "404": { - "description": "Execution not found", - "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": { - "description": "Snapshot data", - "content": { - "*/*": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - }, - "404": { - "description": "Snapshot not found", - "content": { - "*/*": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - } - } - }, - "/executions/{executionId}/processors/by-id/{processorId}/snapshot": { - "get": { - "tags": [ - "Detail" - ], - "summary": "Get exchange snapshot for a processor by processorId", - "operationId": "getProcessorSnapshotById", - "parameters": [ - { - "name": "executionId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "processorId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Snapshot data", - "content": { - "*/*": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - }, - "404": { - "description": "Snapshot not found", - "content": { - "*/*": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - } - } - } - } - }, - "/diagrams": { - "get": { - "tags": [ - "Diagrams" - ], - "summary": "Find diagram by application and route ID", - "description": "Resolves application to agent IDs and finds the latest diagram for the route", - "operationId": "findByApplicationAndRoute", - "parameters": [ - { - "name": "application", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "routeId", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "direction", - "in": "query", - "description": "Layout direction: LR (left-to-right) or TB (top-to-bottom)", - "required": false, - "schema": { - "type": "string", - "default": "LR", - "enum": [ - "LR", - "TB" - ] - } - } - ], - "responses": { - "200": { - "description": "Diagram layout returned", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/DiagramLayout" - } - } - } - }, - "404": { - "description": "No diagram found for the given application and route", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/DiagramLayout" - } - } - } - } - } - } - }, - "/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" - } - }, - { - "name": "direction", - "in": "query", - "description": "Layout direction: LR (left-to-right) or TB (top-to-bottom)", - "required": false, - "schema": { - "type": "string", - "default": "LR", - "enum": [ - "LR", - "TB" - ] - } - } - ], - "responses": { - "200": { - "description": "Diagram rendered successfully", - "content": { - "image/svg+xml": { - "schema": { - "type": "string" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/DiagramLayout" - } - } - } - }, - "404": { - "description": "Diagram not found", - "content": { - "*/*": { - "schema": { - "type": "object" - } - } - } - } - } - } - }, - "/config": { - "get": { - "tags": [ - "Application Config" - ], - "summary": "List all application configs", - "description": "Returns stored configurations for all applications", - "operationId": "listConfigs", - "responses": { - "200": { - "description": "Configs returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationConfig" - } - } - } - } - } - } - } - }, - "/auth/oidc/config": { - "get": { - "tags": [ - "Authentication" - ], - "summary": "Get OIDC config for SPA login flow", - "operationId": "getConfig_2", - "responses": { - "200": { - "description": "OIDC configuration", - "content": { - "*/*": { - "schema": { - "$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" - } - } - } - } - } - } - }, - "/agents": { - "get": { - "tags": [ - "Agent Management" - ], - "summary": "List all agents", - "description": "Returns all registered agents with runtime metrics, optionally filtered by status and/or application", - "operationId": "listAgents", - "parameters": [ - { - "name": "status", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "application", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Agent list returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AgentInstanceResponse" - } - } - } - } - }, - "400": { - "description": "Invalid status filter", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/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" - } - } - } - } - } - } - }, - "/agents/{agentId}/metrics": { - "get": { - "tags": [ - "agent-metrics-controller" - ], - "operationId": "getMetrics_1", - "parameters": [ - { - "name": "agentId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "names", - "in": "query", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "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": 60 - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/AgentMetricsResponse" - } - } - } - } - } - } - }, - "/agents/events-log": { - "get": { - "tags": [ - "Agent Events" - ], - "summary": "Query agent events", - "description": "Returns agent lifecycle events, optionally filtered by app and/or agent ID", - "operationId": "getEvents", - "parameters": [ - { - "name": "appId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "agentId", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "from", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 50 - } - } - ], - "responses": { - "200": { - "description": "Events returned", - "content": { - "*/*": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AgentEventResponse" - } - } - } - } - } - } - } - }, - "/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" - } - } - } - } - } - } - }, - "/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" - } - } - } - } - } - } - }, - "/admin/opensearch/pipeline": { - "get": { - "tags": [ - "OpenSearch Admin" - ], - "summary": "Get indexing pipeline statistics", - "operationId": "getPipeline", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/PipelineStatsResponse" - } - } - } - } - } - } - }, - "/admin/opensearch/performance": { - "get": { - "tags": [ - "OpenSearch Admin" - ], - "summary": "Get OpenSearch performance metrics", - "operationId": "getPerformance", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "$ref": "#/components/schemas/PerformanceResponse" - } - } - } - } - } - } - }, - "/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 - } - }, - { - "name": "size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int32", - "default": 20 - } - }, - { - "name": "search", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "" - } - }, - { - "name": "prefix", - "in": "query", - "required": false, - "schema": { - "type": "string", - "default": "executions" - } - } - ], - "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/database/metrics-pipeline": { - "get": { - "tags": [ - "Database Admin" - ], - "summary": "Get metrics ingestion pipeline diagnostics", - "operationId": "getMetricsPipeline", - "responses": { - "200": { - "description": "OK", - "content": { - "*/*": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "object" - } - } - } - } - } - } - } - }, - "/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-time" - } - }, - { - "name": "to", - "in": "query", - "required": false, - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "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": { - "ApplicationConfig": { - "type": "object", - "properties": { - "application": { - "type": "string" - }, - "version": { - "type": "integer", - "format": "int32" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "engineLevel": { - "type": "string" - }, - "payloadCaptureMode": { - "type": "string" - }, - "metricsEnabled": { - "type": "boolean" - }, - "samplingRate": { - "type": "number", - "format": "double" - }, - "tracedProcessors": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "logForwardingLevel": { - "type": "string" - }, - "taps": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TapDefinition" - } - }, - "tapVersion": { - "type": "integer", - "format": "int32" - }, - "routeRecording": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - }, - "compressSuccess": { - "type": "boolean" - } - } - }, - "TapDefinition": { - "type": "object", - "properties": { - "tapId": { - "type": "string" - }, - "processorId": { - "type": "string" - }, - "target": { - "type": "string" - }, - "expression": { - "type": "string" - }, - "language": { - "type": "string" - }, - "attributeName": { - "type": "string" - }, - "attributeType": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "version": { - "type": "integer", - "format": "int32" - } - } - }, - "UpdateUserRequest": { - "type": "object", - "properties": { - "displayName": { - "type": "string" - }, - "email": { - "type": "string" - } - } - }, - "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" - } - } - }, - "UpdateRoleRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "scope": { - "type": "string" - } - } - }, - "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" - } - } - }, - "UpdateGroupRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "parentGroupId": { - "type": "string", - "format": "uuid" - } - } - }, - "SearchRequest": { - "type": "object", - "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" - }, - "application": { - "type": "string" - }, - "agentIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "offset": { - "type": "integer", - "format": "int32" - }, - "limit": { - "type": "integer", - "format": "int32" - }, - "sortField": { - "type": "string" - }, - "sortDir": { - "type": "string" - } - } - }, - "ExecutionSummary": { - "type": "object", - "properties": { - "executionId": { - "type": "string" - }, - "routeId": { - "type": "string" - }, - "agentId": { - "type": "string" - }, - "applicationName": { - "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" - }, - "highlight": { - "type": "string" - }, - "attributes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "agentId", - "applicationName", - "attributes", - "correlationId", - "diagramContentHash", - "durationMs", - "endTime", - "errorMessage", - "executionId", - "highlight", - "routeId", - "startTime", - "status" - ] - }, - "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" - } - }, - "required": [ - "data", - "limit", - "offset", - "total" - ] - }, - "LogBatch": { - "type": "object", - "properties": { - "entries": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LogEntry" - } - } - } - }, - "LogEntry": { - "type": "object", - "properties": { - "timestamp": { - "type": "string", - "format": "date-time" - }, - "level": { - "type": "string" - }, - "loggerName": { - "type": "string" - }, - "message": { - "type": "string" - }, - "threadName": { - "type": "string" - }, - "stackTrace": { - "type": "string" - }, - "mdc": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "TestExpressionRequest": { - "type": "object", - "properties": { - "expression": { - "type": "string" - }, - "language": { - "type": "string" - }, - "body": { - "type": "string" - }, - "target": { - "type": "string" - } - } - }, - "TestExpressionResponse": { - "type": "object", - "properties": { - "result": { - "type": "string" - }, - "error": { - "type": "string" - } - } - }, - "RefreshRequest": { - "type": "object", - "properties": { - "refreshToken": { - "type": "string" - } - } - }, - "AuthTokenResponse": { - "type": "object", - "description": "JWT token pair", - "properties": { - "accessToken": { - "type": "string" - }, - "refreshToken": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "idToken": { - "type": "string", - "description": "OIDC id_token for end-session logout (only present after OIDC login)" - } - }, - "required": [ - "accessToken", - "displayName", - "refreshToken" - ] - }, - "CallbackRequest": { - "type": "object", - "properties": { - "code": { - "type": "string" - }, - "redirectUri": { - "type": "string" - } - } - }, - "LoginRequest": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - } - }, - "AgentRefreshRequest": { - "type": "object", - "description": "Agent token refresh request", - "properties": { - "refreshToken": { - "type": "string" - } - }, - "required": [ - "refreshToken" - ] - }, - "AgentRefreshResponse": { - "type": "object", - "description": "Refreshed access and refresh tokens", - "properties": { - "accessToken": { - "type": "string" - }, - "refreshToken": { - "type": "string" - } - }, - "required": [ - "accessToken", - "refreshToken" - ] - }, - "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" - ] - }, - "CommandAckRequest": { - "type": "object", - "properties": { - "status": { - "type": "string" - }, - "message": { - "type": "string" - }, - "data": { - "type": "string" - } - } - }, - "AgentRegistrationRequest": { - "type": "object", - "description": "Agent registration payload", - "properties": { - "agentId": { - "type": "string" - }, - "name": { - "type": "string" - }, - "application": { - "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" - ] - }, - "CreateUserRequest": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - } - } - }, - "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": { - "type": "object", - "properties": { - "userId": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "email": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "directRoles": { - "type": "array", - "items": { - "$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" - } - } - } - }, - "SetPasswordRequest": { - "type": "object", - "properties": { - "password": { - "type": "string", - "minLength": 1 - } - } - }, - "CreateRoleRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "scope": { - "type": "string" - } - } - }, - "OidcTestResult": { - "type": "object", - "description": "OIDC provider connectivity test result", - "properties": { - "status": { - "type": "string" - }, - "authorizationEndpoint": { - "type": "string" - } - }, - "required": [ - "authorizationEndpoint", - "status" - ] - }, - "CreateGroupRequest": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "parentGroupId": { - "type": "string", - "format": "uuid" - } - } - }, - "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" - } - }, - "required": [ - "activeCount", - "avgDurationMs", - "failedCount", - "p99LatencyMs", - "prevAvgDurationMs", - "prevFailedCount", - "prevP99LatencyMs", - "prevTotalCount", - "totalCount", - "totalToday" - ] - }, - "StatsTimeseries": { - "type": "object", - "properties": { - "buckets": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TimeseriesBucket" - } - } - }, - "required": [ - "buckets" - ] - }, - "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" - } - }, - "required": [ - "activeCount", - "avgDurationMs", - "failedCount", - "p99DurationMs", - "time", - "totalCount" - ] - }, - "RouteMetrics": { - "type": "object", - "description": "Aggregated route performance metrics", - "properties": { - "routeId": { - "type": "string" - }, - "appId": { - "type": "string" - }, - "exchangeCount": { - "type": "integer", - "format": "int64" - }, - "successRate": { - "type": "number", - "format": "double" - }, - "avgDurationMs": { - "type": "number", - "format": "double" - }, - "p99DurationMs": { - "type": "number", - "format": "double" - }, - "errorRate": { - "type": "number", - "format": "double" - }, - "throughputPerSec": { - "type": "number", - "format": "double" - }, - "sparkline": { - "type": "array", - "items": { - "type": "number", - "format": "double" - } - } - }, - "required": [ - "appId", - "avgDurationMs", - "errorRate", - "exchangeCount", - "p99DurationMs", - "routeId", - "sparkline", - "successRate", - "throughputPerSec" - ] - }, - "ProcessorMetrics": { - "type": "object", - "properties": { - "processorId": { - "type": "string" - }, - "processorType": { - "type": "string" - }, - "routeId": { - "type": "string" - }, - "appId": { - "type": "string" - }, - "totalCount": { - "type": "integer", - "format": "int64" - }, - "failedCount": { - "type": "integer", - "format": "int64" - }, - "avgDurationMs": { - "type": "number", - "format": "double" - }, - "p99DurationMs": { - "type": "number", - "format": "double" - }, - "errorRate": { - "type": "number", - "format": "double" - } - }, - "required": [ - "appId", - "avgDurationMs", - "errorRate", - "failedCount", - "p99DurationMs", - "processorId", - "processorType", - "routeId", - "totalCount" - ] - }, - "AgentSummary": { - "type": "object", - "description": "Summary of an agent instance for sidebar display", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "status": { - "type": "string" - }, - "tps": { - "type": "number", - "format": "double" - } - }, - "required": [ - "id", - "name", - "status", - "tps" - ] - }, - "AppCatalogEntry": { - "type": "object", - "description": "Application catalog entry with routes and agents", - "properties": { - "appId": { - "type": "string" - }, - "routes": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RouteSummary" - } - }, - "agents": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AgentSummary" - } - }, - "agentCount": { - "type": "integer", - "format": "int32" - }, - "health": { - "type": "string" - }, - "exchangeCount": { - "type": "integer", - "format": "int64" - } - }, - "required": [ - "agentCount", - "agents", - "appId", - "exchangeCount", - "health", - "routes" - ] - }, - "RouteSummary": { - "type": "object", - "description": "Summary of a route within an application", - "properties": { - "routeId": { - "type": "string" - }, - "exchangeCount": { - "type": "integer", - "format": "int64" - }, - "lastSeen": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "exchangeCount", - "lastSeen", - "routeId" - ] - }, - "LogEntryResponse": { - "type": "object", - "description": "Application log entry from OpenSearch", - "properties": { - "timestamp": { - "type": "string", - "description": "Log timestamp (ISO-8601)" - }, - "level": { - "type": "string", - "description": "Log level (INFO, WARN, ERROR, DEBUG)" - }, - "loggerName": { - "type": "string", - "description": "Logger name" - }, - "message": { - "type": "string", - "description": "Log message" - }, - "threadName": { - "type": "string", - "description": "Thread name" - }, - "stackTrace": { - "type": "string", - "description": "Stack trace (if present)" - } - } - }, - "ExecutionDetail": { - "type": "object", - "properties": { - "executionId": { - "type": "string" - }, - "routeId": { - "type": "string" - }, - "agentId": { - "type": "string" - }, - "applicationName": { - "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" - } - }, - "inputBody": { - "type": "string" - }, - "outputBody": { - "type": "string" - }, - "inputHeaders": { - "type": "string" - }, - "outputHeaders": { - "type": "string" - }, - "attributes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "required": [ - "agentId", - "applicationName", - "attributes", - "correlationId", - "diagramContentHash", - "durationMs", - "endTime", - "errorMessage", - "errorStackTrace", - "exchangeId", - "executionId", - "inputBody", - "inputHeaders", - "outputBody", - "outputHeaders", - "processors", - "routeId", - "startTime", - "status" - ] - }, - "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" - }, - "loopIndex": { - "type": "integer", - "format": "int32" - }, - "loopSize": { - "type": "integer", - "format": "int32" - }, - "splitIndex": { - "type": "integer", - "format": "int32" - }, - "splitSize": { - "type": "integer", - "format": "int32" - }, - "multicastIndex": { - "type": "integer", - "format": "int32" - }, - "errorMessage": { - "type": "string" - }, - "errorStackTrace": { - "type": "string" - }, - "attributes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "children": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ProcessorNode" - } - } - }, - "required": [ - "attributes", - "children", - "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" - } - } - } - }, - "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" - } - } - }, - "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 with runtime metrics", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "application": { - "type": "string" - }, - "status": { - "type": "string" - }, - "routeIds": { - "type": "array", - "items": { - "type": "string" - } - }, - "registeredAt": { - "type": "string", - "format": "date-time" - }, - "lastHeartbeat": { - "type": "string", - "format": "date-time" - }, - "version": { - "type": "string" - }, - "capabilities": { - "type": "object", - "additionalProperties": { - "type": "object" - } - }, - "tps": { - "type": "number", - "format": "double" - }, - "errorRate": { - "type": "number", - "format": "double" - }, - "activeRoutes": { - "type": "integer", - "format": "int32" - }, - "totalRoutes": { - "type": "integer", - "format": "int32" - }, - "uptimeSeconds": { - "type": "integer", - "format": "int64" - } - }, - "required": [ - "activeRoutes", - "application", - "capabilities", - "errorRate", - "id", - "lastHeartbeat", - "name", - "registeredAt", - "routeIds", - "status", - "totalRoutes", - "tps", - "uptimeSeconds", - "version" - ] - }, - "SseEmitter": { - "type": "object", - "properties": { - "timeout": { - "type": "integer", - "format": "int64" - } - } - }, - "AgentMetricsResponse": { - "type": "object", - "properties": { - "metrics": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MetricBucket" - } - } - } - }, - "required": [ - "metrics" - ] - }, - "MetricBucket": { - "type": "object", - "properties": { - "time": { - "type": "string", - "format": "date-time" - }, - "value": { - "type": "number", - "format": "double" - } - }, - "required": [ - "time", - "value" - ] - }, - "AgentEventResponse": { - "type": "object", - "description": "Agent lifecycle event", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "agentId": { - "type": "string" - }, - "appId": { - "type": "string" - }, - "eventType": { - "type": "string" - }, - "detail": { - "type": "string" - }, - "timestamp": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "agentId", - "appId", - "detail", - "eventType", - "id", - "timestamp" - ] - }, - "RoleDetail": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "scope": { - "type": "string" - }, - "system": { - "type": "boolean" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "assignedGroups": { - "type": "array", - "items": { - "$ref": "#/components/schemas/GroupSummary" - } - }, - "directUsers": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserSummary" - } - }, - "effectivePrincipals": { - "type": "array", - "items": { - "$ref": "#/components/schemas/UserSummary" - } - } - } - }, - "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" - } - } - }, - "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" - } - } - }, - "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" - } - } - } - }, - "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", - "CONFIG", - "RBAC", - "AGENT" - ] - }, - "target": { - "type": "string" - }, - "detail": { - "type": "object", - "additionalProperties": { - "type": "object" - } - }, - "result": { - "type": "string", - "enum": [ - "SUCCESS", - "FAILURE" - ] - }, - "ipAddress": { - "type": "string" - }, - "userAgent": { - "type": "string" - } - } - } - }, - "securitySchemes": { - "bearer": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - } - } -} +{"openapi":"3.1.0","info":{"title":"Cameleer3 Server API","version":"1.0"},"servers":[{"url":"/api/v1","description":"Relative"}],"security":[{"bearer":[]}],"tags":[{"name":"Agent Events","description":"Agent lifecycle event log"},{"name":"Database Admin","description":"Database monitoring and management (ADMIN only)"},{"name":"Threshold Admin","description":"Monitoring threshold configuration (ADMIN only)"},{"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"},{"name":"Authentication","description":"Login and token refresh endpoints"},{"name":"Role Admin","description":"Role management (ADMIN only)"},{"name":"RBAC Stats","description":"RBAC statistics (ADMIN only)"},{"name":"OIDC Config Admin","description":"OIDC provider configuration (ADMIN only)"},{"name":"Route Metrics","description":"Route performance metrics"},{"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)"},{"name":"Application Logs","description":"Query application logs stored in OpenSearch"},{"name":"Group Admin","description":"Group management (ADMIN only)"},{"name":"Diagrams","description":"Diagram rendering endpoints"},{"name":"OpenSearch Admin","description":"OpenSearch monitoring and management (ADMIN only)"},{"name":"Application Config","description":"Per-application observability configuration"},{"name":"Detail","description":"Execution detail and processor snapshot endpoints"},{"name":"Route Catalog","description":"Route catalog and discovery"},{"name":"App Settings","description":"Per-application dashboard settings (ADMIN/OPERATOR)"}],"paths":{"/config/{application}":{"get":{"tags":["Application Config"],"summary":"Get application config","description":"Returns the current configuration for an application. Returns defaults if none stored.","operationId":"getConfig","parameters":[{"name":"application","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Config returned","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApplicationConfig"}}}}}},"put":{"tags":["Application Config"],"summary":"Update application config","description":"Saves config and pushes CONFIG_UPDATE to all LIVE agents of this application","operationId":"updateConfig","parameters":[{"name":"application","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationConfig"}}},"required":true},"responses":{"200":{"description":"Config saved and pushed","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApplicationConfig"}}}}}}},"/admin/users/{userId}":{"get":{"tags":["User Admin"],"summary":"Get user by ID with RBAC detail","operationId":"getUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"User found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserDetail"}}}},"404":{"description":"User not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserDetail"}}}}}},"put":{"tags":["User Admin"],"summary":"Update user display name or email","operationId":"updateUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"User updated"},"404":{"description":"User not found"}}},"delete":{"tags":["User Admin"],"summary":"Delete user","operationId":"deleteUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"User deleted"}}}},"/admin/thresholds":{"get":{"tags":["Threshold Admin"],"summary":"Get current threshold configuration","operationId":"getThresholds","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ThresholdConfig"}}}}}},"put":{"tags":["Threshold Admin"],"summary":"Update threshold configuration","operationId":"updateThresholds","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThresholdConfigRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ThresholdConfig"}}}}}}},"/admin/roles/{id}":{"get":{"tags":["Role Admin"],"summary":"Get role by ID with effective principals","operationId":"getRole","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Role found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoleDetail"}}}},"404":{"description":"Role not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoleDetail"}}}}}},"put":{"tags":["Role Admin"],"summary":"Update a custom role","operationId":"updateRole","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleRequest"}}},"required":true},"responses":{"200":{"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"}}],"responses":{"204":{"description":"Role deleted"},"403":{"description":"Cannot delete system role"},"404":{"description":"Role not found"}}}},"/admin/oidc":{"get":{"tags":["OIDC Config Admin"],"summary":"Get OIDC configuration","operationId":"getConfig_1","responses":{"200":{"description":"Current OIDC configuration (client_secret masked)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OidcAdminConfigResponse"}}}}}},"put":{"tags":["OIDC Config Admin"],"summary":"Save OIDC configuration","operationId":"saveConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OidcAdminConfigRequest"}}},"required":true},"responses":{"200":{"description":"Configuration saved","content":{"*/*":{"schema":{"$ref":"#/components/schemas/OidcAdminConfigResponse"}}}},"400":{"description":"Invalid configuration","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["OIDC Config Admin"],"summary":"Delete OIDC configuration","operationId":"deleteConfig","responses":{"204":{"description":"Configuration deleted"}}}},"/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"}}}},"/admin/app-settings/{appId}":{"get":{"tags":["App Settings"],"summary":"Get settings for a specific application (returns defaults if not configured)","operationId":"getByAppId","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AppSettings"}}}}}},"put":{"tags":["App Settings"],"summary":"Create or update settings for an application","operationId":"update","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettingsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AppSettings"}}}}}},"delete":{"tags":["App Settings"],"summary":"Delete application settings (reverts to defaults)","operationId":"delete","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/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"}},{"name":"application","in":"query","required":false,"schema":{"type":"string"}},{"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}},{"name":"sortField","in":"query","required":false,"schema":{"type":"string"}},{"name":"sortDir","in":"query","required":false,"schema":{"type":"string"}}],"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"},"400":{"description":"Invalid payload"},"503":{"description":"Buffer full, retry later"}}}},"/data/logs":{"post":{"tags":["Ingestion"],"summary":"Ingest application log entries","description":"Accepts a batch of log entries from an agent. Entries are indexed in OpenSearch.","operationId":"ingestLogs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogBatch"}}},"required":true},"responses":{"202":{"description":"Logs accepted for indexing"}}}},"/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"}}}},"/config/{application}/test-expression":{"post":{"tags":["Application Config"],"summary":"Test a tap expression against sample data via a live agent","operationId":"testExpression","parameters":[{"name":"application","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestExpressionRequest"}}},"required":true},"responses":{"200":{"description":"Expression evaluated successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TestExpressionResponse"}}}},"404":{"description":"No live agent available for this application","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TestExpressionResponse"}}}},"504":{"description":"Agent did not respond in time","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TestExpressionResponse"}}}}}}},"/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh access token","operationId":"refresh","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Token refreshed","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"401":{"description":"Invalid refresh token","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/auth/oidc/callback":{"post":{"tags":["Authentication"],"summary":"Exchange OIDC authorization code for JWTs","operationId":"callback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallbackRequest"}}},"required":true},"responses":{"200":{"description":"Authentication successful","content":{"*/*":{"schema":{"$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"}}}}}}},"/auth/login":{"post":{"tags":["Authentication"],"summary":"Login with local credentials","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Login successful","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"401":{"description":"Invalid credentials","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/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":{"$ref":"#/components/schemas/AgentRefreshRequest"}}},"required":true},"responses":{"200":{"description":"New access token issued","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentRefreshResponse"}}}},"401":{"description":"Invalid or expired refresh token","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentRefreshResponse"}}}},"404":{"description":"Agent not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentRefreshResponse"}}}}}}},"/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 command to the specified agent via SSE","operationId":"sendCommand","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandRequest"}}},"required":true},"responses":{"202":{"description":"Command accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandSingleResponse"}}}},"400":{"description":"Invalid command payload","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandSingleResponse"}}}},"404":{"description":"Agent not registered","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandSingleResponse"}}}}}}},"/agents/{id}/commands/{commandId}/ack":{"post":{"tags":["Agent Commands"],"summary":"Acknowledge command receipt","description":"Agent acknowledges that it has received and processed a command, with result status and message","operationId":"acknowledgeCommand","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"commandId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandAckRequest"}}}},"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":{"$ref":"#/components/schemas/AgentRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Agent registered successfully","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentRegistrationResponse"}}}},"400":{"description":"Invalid registration payload","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid bootstrap token","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentRegistrationResponse"}}}}}}},"/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":{"$ref":"#/components/schemas/CommandRequest"}}},"required":true},"responses":{"202":{"description":"Commands accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandBroadcastResponse"}}}},"400":{"description":"Invalid command payload","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandBroadcastResponse"}}}}}}},"/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":{"$ref":"#/components/schemas/CommandRequest"}}},"required":true},"responses":{"202":{"description":"Commands accepted","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandBroadcastResponse"}}}},"400":{"description":"Invalid command payload","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CommandBroadcastResponse"}}}}}}},"/admin/users":{"get":{"tags":["User Admin"],"summary":"List all users with RBAC detail","operationId":"listUsers","responses":{"200":{"description":"User list returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserDetail"}}}}}}},"post":{"tags":["User Admin"],"summary":"Create a local user","operationId":"createUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}},"required":true},"responses":{"200":{"description":"User created","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UserDetail"}}}}}}},"/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}/password":{"post":{"tags":["User Admin"],"summary":"Reset user password","operationId":"resetPassword","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPasswordRequest"}}},"required":true},"responses":{"204":{"description":"Password reset"}}}},"/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"}}],"responses":{"200":{"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"}},{"name":"roleId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Role removed from group"},"404":{"description":"Group not found"}}}},"/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"}}}},"/search/stats":{"get":{"tags":["Search"],"summary":"Aggregate execution stats (P99 latency, active count, SLA compliance)","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"}},{"name":"routeId","in":"query","required":false,"schema":{"type":"string"}},{"name":"application","in":"query","required":false,"schema":{"type":"string"}}],"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}},{"name":"routeId","in":"query","required":false,"schema":{"type":"string"}},{"name":"application","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatsTimeseries"}}}}}}},"/search/stats/timeseries/by-route":{"get":{"tags":["Search"],"summary":"Timeseries grouped by route for an application","operationId":"timeseriesByRoute","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}},{"name":"application","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/StatsTimeseries"}}}}}}}},"/search/stats/timeseries/by-app":{"get":{"tags":["Search"],"summary":"Timeseries grouped by application","operationId":"timeseriesByApp","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}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/StatsTimeseries"}}}}}}}},"/search/stats/punchcard":{"get":{"tags":["Search"],"summary":"Transaction punchcard: weekday x hour grid (rolling 7 days)","operationId":"punchcard","parameters":[{"name":"application","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PunchcardCell"}}}}}}}},"/search/errors/top":{"get":{"tags":["Search"],"summary":"Top N errors with velocity trend","operationId":"topErrors","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":"application","in":"query","required":false,"schema":{"type":"string"}},{"name":"routeId","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":5}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TopError"}}}}}}}},"/routes/metrics":{"get":{"tags":["Route Metrics"],"summary":"Get route metrics","description":"Returns aggregated performance metrics per route for the given time window","operationId":"getMetrics","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Metrics returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RouteMetrics"}}}}}}}},"/routes/metrics/processors":{"get":{"tags":["Route Metrics"],"summary":"Get processor metrics","description":"Returns aggregated performance metrics per processor for the given route and time window","operationId":"getProcessorMetrics","parameters":[{"name":"routeId","in":"query","required":true,"schema":{"type":"string"}},{"name":"appId","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Metrics returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProcessorMetrics"}}}}}}}},"/routes/catalog":{"get":{"tags":["Route Catalog"],"summary":"Get route catalog","description":"Returns all applications with their routes, agents, and health status","operationId":"getCatalog","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Catalog returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppCatalogEntry"}}}}}}}},"/logs":{"get":{"tags":["Application Logs"],"summary":"Search application log entries","description":"Returns log entries for a given application, optionally filtered by agent, level, time range, and text query","operationId":"searchLogs","parameters":[{"name":"application","in":"query","required":true,"schema":{"type":"string"}},{"name":"agentId","in":"query","required":false,"schema":{"type":"string"}},{"name":"level","in":"query","required":false,"schema":{"type":"string"}},{"name":"query","in":"query","required":false,"schema":{"type":"string"}},{"name":"exchangeId","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":200}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LogEntryResponse"}}}}}}}},"/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":{"description":"Execution detail found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExecutionDetail"}}}},"404":{"description":"Execution not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExecutionDetail"}}}}}}},"/executions/{executionId}/processors/{index}/snapshot":{"get":{"tags":["Detail"],"summary":"Get exchange snapshot for a specific processor by index","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":{"description":"Snapshot data","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"404":{"description":"Snapshot not found","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/executions/{executionId}/processors/by-id/{processorId}/snapshot":{"get":{"tags":["Detail"],"summary":"Get exchange snapshot for a specific processor by processorId","operationId":"processorSnapshotById","parameters":[{"name":"executionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"processorId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Snapshot data","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"404":{"description":"Snapshot not found","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/diagrams":{"get":{"tags":["Diagrams"],"summary":"Find diagram by application and route ID","description":"Resolves application to agent IDs and finds the latest diagram for the route","operationId":"findByApplicationAndRoute","parameters":[{"name":"application","in":"query","required":true,"schema":{"type":"string"}},{"name":"routeId","in":"query","required":true,"schema":{"type":"string"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"LR"}}],"responses":{"200":{"description":"Diagram layout returned","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DiagramLayout"}}}},"404":{"description":"No diagram found for the given application and route","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DiagramLayout"}}}}}}},"/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"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"LR"}}],"responses":{"200":{"description":"Diagram rendered successfully","content":{"image/svg+xml":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/DiagramLayout"}}}},"404":{"description":"Diagram not found","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/config":{"get":{"tags":["Application Config"],"summary":"List all application configs","description":"Returns stored configurations for all applications","operationId":"listConfigs","responses":{"200":{"description":"Configs returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationConfig"}}}}}}}},"/config/{application}/processor-routes":{"get":{"tags":["Application Config"],"summary":"Get processor to route mapping","description":"Returns a map of processorId → routeId for all processors seen in this application","operationId":"getProcessorRouteMapping","parameters":[{"name":"application","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Mapping returned","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}}}},"/auth/oidc/config":{"get":{"tags":["Authentication"],"summary":"Get OIDC config for SPA login flow","operationId":"getConfig_2","responses":{"200":{"description":"OIDC configuration","content":{"*/*":{"schema":{"$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"}}}}}}},"/agents":{"get":{"tags":["Agent Management"],"summary":"List all agents","description":"Returns all registered agents with runtime metrics, optionally filtered by status and/or application","operationId":"listAgents","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"application","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Agent list returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentInstanceResponse"}}}}},"400":{"description":"Invalid status filter","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/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"}}}}}}},"/agents/{agentId}/metrics":{"get":{"tags":["agent-metrics-controller"],"operationId":"getMetrics_1","parameters":[{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}},{"name":"names","in":"query","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"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":60}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AgentMetricsResponse"}}}}}}},"/agents/events-log":{"get":{"tags":["Agent Events"],"summary":"Query agent events","description":"Returns agent lifecycle events, optionally filtered by app and/or agent ID","operationId":"getEvents","parameters":[{"name":"appId","in":"query","required":false,"schema":{"type":"string"}},{"name":"agentId","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Events returned","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentEventResponse"}}}}}}}},"/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"}}}}}}},"/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"}}}}}}},"/admin/opensearch/pipeline":{"get":{"tags":["OpenSearch Admin"],"summary":"Get indexing pipeline statistics","operationId":"getPipeline","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PipelineStatsResponse"}}}}}}},"/admin/opensearch/performance":{"get":{"tags":["OpenSearch Admin"],"summary":"Get OpenSearch performance metrics","operationId":"getPerformance","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PerformanceResponse"}}}}}}},"/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}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":""}},{"name":"prefix","in":"query","required":false,"schema":{"type":"string","default":"executions"}}],"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/database/metrics-pipeline":{"get":{"tags":["Database Admin"],"summary":"Get metrics ingestion pipeline diagnostics","operationId":"getMetricsPipeline","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/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-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"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/app-settings":{"get":{"tags":["App Settings"],"summary":"List all application settings","operationId":"getAll","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppSettings"}}}}}}}},"/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":{"ApplicationConfig":{"type":"object","properties":{"application":{"type":"string"},"version":{"type":"integer","format":"int32"},"updatedAt":{"type":"string","format":"date-time"},"engineLevel":{"type":"string"},"payloadCaptureMode":{"type":"string"},"metricsEnabled":{"type":"boolean"},"samplingRate":{"type":"number","format":"double"},"tracedProcessors":{"type":"object","additionalProperties":{"type":"string"}},"applicationLogLevel":{"type":"string"},"taps":{"type":"array","items":{"$ref":"#/components/schemas/TapDefinition"}},"tapVersion":{"type":"integer","format":"int32"},"routeRecording":{"type":"object","additionalProperties":{"type":"boolean"}},"compressSuccess":{"type":"boolean"},"agentLogLevel":{"type":"string"},"routeSamplingRates":{"type":"object","additionalProperties":{"type":"number","format":"double"}}}},"TapDefinition":{"type":"object","properties":{"tapId":{"type":"string"},"processorId":{"type":"string"},"target":{"type":"string"},"expression":{"type":"string"},"language":{"type":"string"},"attributeName":{"type":"string"},"attributeType":{"type":"string"},"enabled":{"type":"boolean"},"version":{"type":"integer","format":"int32"}}},"UpdateUserRequest":{"type":"object","properties":{"displayName":{"type":"string"},"email":{"type":"string"}}},"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"}}},"UpdateRoleRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"scope":{"type":"string"}}},"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"}}},"UpdateGroupRequest":{"type":"object","properties":{"name":{"type":"string"},"parentGroupId":{"type":"string","format":"uuid"}}},"AppSettingsRequest":{"type":"object","description":"Per-application dashboard settings","properties":{"slaThresholdMs":{"type":"integer","format":"int32","description":"SLA duration threshold in milliseconds","minimum":1},"healthErrorWarn":{"type":"number","format":"double","description":"Error rate % threshold for warning (yellow) health dot","maximum":100,"minimum":0},"healthErrorCrit":{"type":"number","format":"double","description":"Error rate % threshold for critical (red) health dot","maximum":100,"minimum":0},"healthSlaWarn":{"type":"number","format":"double","description":"SLA compliance % threshold for warning (yellow) health dot","maximum":100,"minimum":0},"healthSlaCrit":{"type":"number","format":"double","description":"SLA compliance % threshold for critical (red) health dot","maximum":100,"minimum":0}},"required":["healthErrorCrit","healthErrorWarn","healthSlaCrit","healthSlaWarn","slaThresholdMs"]},"AppSettings":{"type":"object","properties":{"appId":{"type":"string"},"slaThresholdMs":{"type":"integer","format":"int32"},"healthErrorWarn":{"type":"number","format":"double"},"healthErrorCrit":{"type":"number","format":"double"},"healthSlaWarn":{"type":"number","format":"double"},"healthSlaCrit":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"SearchRequest":{"type":"object","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"},"application":{"type":"string"},"agentIds":{"type":"array","items":{"type":"string"}},"offset":{"type":"integer","format":"int32"},"limit":{"type":"integer","format":"int32"},"sortField":{"type":"string"},"sortDir":{"type":"string"}}},"ExecutionSummary":{"type":"object","properties":{"executionId":{"type":"string"},"routeId":{"type":"string"},"agentId":{"type":"string"},"applicationName":{"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"},"highlight":{"type":"string"},"attributes":{"type":"object","additionalProperties":{"type":"string"}},"hasTraceData":{"type":"boolean"}},"required":["agentId","applicationName","attributes","correlationId","diagramContentHash","durationMs","endTime","errorMessage","executionId","hasTraceData","highlight","routeId","startTime","status"]},"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"}},"required":["data","limit","offset","total"]},"LogBatch":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/LogEntry"}}}},"LogEntry":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"level":{"type":"string"},"loggerName":{"type":"string"},"message":{"type":"string"},"threadName":{"type":"string"},"stackTrace":{"type":"string"},"mdc":{"type":"object","additionalProperties":{"type":"string"}}}},"TestExpressionRequest":{"type":"object","properties":{"expression":{"type":"string"},"language":{"type":"string"},"body":{"type":"string"},"target":{"type":"string"}}},"TestExpressionResponse":{"type":"object","properties":{"result":{"type":"string"},"error":{"type":"string"}}},"RefreshRequest":{"type":"object","properties":{"refreshToken":{"type":"string"}}},"AuthTokenResponse":{"type":"object","description":"JWT token pair","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"displayName":{"type":"string"},"idToken":{"type":"string","description":"OIDC id_token for end-session logout (only present after OIDC login)"}},"required":["accessToken","displayName","refreshToken"]},"CallbackRequest":{"type":"object","properties":{"code":{"type":"string"},"redirectUri":{"type":"string"}}},"LoginRequest":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}}},"AgentRefreshRequest":{"type":"object","description":"Agent token refresh request","properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"]},"AgentRefreshResponse":{"type":"object","description":"Refreshed access and refresh tokens","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"required":["accessToken","refreshToken"]},"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"]},"CommandAckRequest":{"type":"object","properties":{"status":{"type":"string"},"message":{"type":"string"},"data":{"type":"string"}}},"AgentRegistrationRequest":{"type":"object","description":"Agent registration payload","properties":{"agentId":{"type":"string"},"name":{"type":"string"},"application":{"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"]},"CreateUserRequest":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"email":{"type":"string"},"password":{"type":"string"}}},"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":{"type":"object","properties":{"userId":{"type":"string"},"provider":{"type":"string"},"email":{"type":"string"},"displayName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"directRoles":{"type":"array","items":{"$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"}}}},"SetPasswordRequest":{"type":"object","properties":{"password":{"type":"string","minLength":1}}},"CreateRoleRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"scope":{"type":"string"}}},"OidcTestResult":{"type":"object","description":"OIDC provider connectivity test result","properties":{"status":{"type":"string"},"authorizationEndpoint":{"type":"string"}},"required":["authorizationEndpoint","status"]},"CreateGroupRequest":{"type":"object","properties":{"name":{"type":"string"},"parentGroupId":{"type":"string","format":"uuid"}}},"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"},"slaCompliance":{"type":"number","format":"double"}},"required":["activeCount","avgDurationMs","failedCount","p99LatencyMs","prevAvgDurationMs","prevFailedCount","prevP99LatencyMs","prevTotalCount","slaCompliance","totalCount","totalToday"]},"StatsTimeseries":{"type":"object","properties":{"buckets":{"type":"array","items":{"$ref":"#/components/schemas/TimeseriesBucket"}}},"required":["buckets"]},"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"}},"required":["activeCount","avgDurationMs","failedCount","p99DurationMs","time","totalCount"]},"PunchcardCell":{"type":"object","properties":{"weekday":{"type":"integer","format":"int32"},"hour":{"type":"integer","format":"int32"},"totalCount":{"type":"integer","format":"int64"},"failedCount":{"type":"integer","format":"int64"}}},"TopError":{"type":"object","properties":{"errorType":{"type":"string"},"routeId":{"type":"string"},"processorId":{"type":"string"},"count":{"type":"integer","format":"int64"},"velocity":{"type":"number","format":"double"},"trend":{"type":"string"},"lastSeen":{"type":"string","format":"date-time"}}},"RouteMetrics":{"type":"object","description":"Aggregated route performance metrics","properties":{"routeId":{"type":"string"},"appId":{"type":"string"},"exchangeCount":{"type":"integer","format":"int64"},"successRate":{"type":"number","format":"double"},"avgDurationMs":{"type":"number","format":"double"},"p99DurationMs":{"type":"number","format":"double"},"errorRate":{"type":"number","format":"double"},"throughputPerSec":{"type":"number","format":"double"},"sparkline":{"type":"array","items":{"type":"number","format":"double"}},"slaCompliance":{"type":"number","format":"double"}},"required":["appId","avgDurationMs","errorRate","exchangeCount","p99DurationMs","routeId","slaCompliance","sparkline","successRate","throughputPerSec"]},"ProcessorMetrics":{"type":"object","properties":{"processorId":{"type":"string"},"processorType":{"type":"string"},"routeId":{"type":"string"},"appId":{"type":"string"},"totalCount":{"type":"integer","format":"int64"},"failedCount":{"type":"integer","format":"int64"},"avgDurationMs":{"type":"number","format":"double"},"p99DurationMs":{"type":"number","format":"double"},"errorRate":{"type":"number","format":"double"}},"required":["appId","avgDurationMs","errorRate","failedCount","p99DurationMs","processorId","processorType","routeId","totalCount"]},"AgentSummary":{"type":"object","description":"Summary of an agent instance for sidebar display","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"tps":{"type":"number","format":"double"}},"required":["id","name","status","tps"]},"AppCatalogEntry":{"type":"object","description":"Application catalog entry with routes and agents","properties":{"appId":{"type":"string"},"routes":{"type":"array","items":{"$ref":"#/components/schemas/RouteSummary"}},"agents":{"type":"array","items":{"$ref":"#/components/schemas/AgentSummary"}},"agentCount":{"type":"integer","format":"int32"},"health":{"type":"string"},"exchangeCount":{"type":"integer","format":"int64"}},"required":["agentCount","agents","appId","exchangeCount","health","routes"]},"RouteSummary":{"type":"object","description":"Summary of a route within an application","properties":{"routeId":{"type":"string"},"exchangeCount":{"type":"integer","format":"int64"},"lastSeen":{"type":"string","format":"date-time"},"fromEndpointUri":{"type":"string","description":"The from() endpoint URI, e.g. 'direct:processOrder'"}},"required":["exchangeCount","fromEndpointUri","lastSeen","routeId"]},"LogEntryResponse":{"type":"object","description":"Application log entry from OpenSearch","properties":{"timestamp":{"type":"string","description":"Log timestamp (ISO-8601)"},"level":{"type":"string","description":"Log level (INFO, WARN, ERROR, DEBUG)"},"loggerName":{"type":"string","description":"Logger name"},"message":{"type":"string","description":"Log message"},"threadName":{"type":"string","description":"Thread name"},"stackTrace":{"type":"string","description":"Stack trace (if present)"}}},"ExecutionDetail":{"type":"object","properties":{"executionId":{"type":"string"},"routeId":{"type":"string"},"agentId":{"type":"string"},"applicationName":{"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"}},"inputBody":{"type":"string"},"outputBody":{"type":"string"},"inputHeaders":{"type":"string"},"outputHeaders":{"type":"string"},"attributes":{"type":"object","additionalProperties":{"type":"string"}},"errorType":{"type":"string"},"errorCategory":{"type":"string"},"rootCauseType":{"type":"string"},"rootCauseMessage":{"type":"string"},"traceId":{"type":"string"},"spanId":{"type":"string"}},"required":["agentId","applicationName","attributes","correlationId","diagramContentHash","durationMs","endTime","errorCategory","errorMessage","errorStackTrace","errorType","exchangeId","executionId","inputBody","inputHeaders","outputBody","outputHeaders","processors","rootCauseMessage","rootCauseType","routeId","spanId","startTime","status","traceId"]},"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"},"errorMessage":{"type":"string"},"errorStackTrace":{"type":"string"},"attributes":{"type":"object","additionalProperties":{"type":"string"}},"loopIndex":{"type":"integer","format":"int32"},"loopSize":{"type":"integer","format":"int32"},"splitIndex":{"type":"integer","format":"int32"},"splitSize":{"type":"integer","format":"int32"},"multicastIndex":{"type":"integer","format":"int32"},"resolvedEndpointUri":{"type":"string"},"errorType":{"type":"string"},"errorCategory":{"type":"string"},"rootCauseType":{"type":"string"},"rootCauseMessage":{"type":"string"},"errorHandlerType":{"type":"string"},"circuitBreakerState":{"type":"string"},"fallbackTriggered":{"type":"boolean"},"filterMatched":{"type":"boolean"},"duplicateMessage":{"type":"boolean"},"hasTraceData":{"type":"boolean"},"children":{"type":"array","items":{"$ref":"#/components/schemas/ProcessorNode"}}},"required":["attributes","children","circuitBreakerState","duplicateMessage","durationMs","endTime","errorCategory","errorHandlerType","errorMessage","errorStackTrace","errorType","fallbackTriggered","filterMatched","hasTraceData","loopIndex","loopSize","multicastIndex","processorId","processorType","resolvedEndpointUri","rootCauseMessage","rootCauseType","splitIndex","splitSize","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"}}}},"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"},"endpointUri":{"type":"string"}}},"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 with runtime metrics","properties":{"id":{"type":"string"},"name":{"type":"string"},"application":{"type":"string"},"status":{"type":"string"},"routeIds":{"type":"array","items":{"type":"string"}},"registeredAt":{"type":"string","format":"date-time"},"lastHeartbeat":{"type":"string","format":"date-time"},"version":{"type":"string"},"capabilities":{"type":"object","additionalProperties":{"type":"object"}},"tps":{"type":"number","format":"double"},"errorRate":{"type":"number","format":"double"},"activeRoutes":{"type":"integer","format":"int32"},"totalRoutes":{"type":"integer","format":"int32"},"uptimeSeconds":{"type":"integer","format":"int64"}},"required":["activeRoutes","application","capabilities","errorRate","id","lastHeartbeat","name","registeredAt","routeIds","status","totalRoutes","tps","uptimeSeconds","version"]},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64"}}},"AgentMetricsResponse":{"type":"object","properties":{"metrics":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/MetricBucket"}}}},"required":["metrics"]},"MetricBucket":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"value":{"type":"number","format":"double"}},"required":["time","value"]},"AgentEventResponse":{"type":"object","description":"Agent lifecycle event","properties":{"id":{"type":"integer","format":"int64"},"agentId":{"type":"string"},"appId":{"type":"string"},"eventType":{"type":"string"},"detail":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}},"required":["agentId","appId","detail","eventType","id","timestamp"]},"RoleDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"scope":{"type":"string"},"system":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"assignedGroups":{"type":"array","items":{"$ref":"#/components/schemas/GroupSummary"}},"directUsers":{"type":"array","items":{"$ref":"#/components/schemas/UserSummary"}},"effectivePrincipals":{"type":"array","items":{"$ref":"#/components/schemas/UserSummary"}}}},"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"}}},"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"}}},"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"}}}},"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","CONFIG","RBAC","AGENT"]},"target":{"type":"string"},"detail":{"type":"object","additionalProperties":{"type":"object"}},"result":{"type":"string","enum":["SUCCESS","FAILURE"]},"ipAddress":{"type":"string"},"userAgent":{"type":"string"}}}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file diff --git a/ui/src/api/schema.d.ts b/ui/src/api/schema.d.ts index 2a68d869..b9a3ac93 100644 --- a/ui/src/api/schema.d.ts +++ b/ui/src/api/schema.d.ts @@ -122,6 +122,25 @@ export interface paths { patch?: never; trace?: never; }; + "/admin/app-settings/{appId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get settings for a specific application (returns defaults if not configured) */ + get: operations["getByAppId"]; + /** Create or update settings for an application */ + put: operations["update"]; + post?: never; + /** Delete application settings (reverts to defaults) */ + delete: operations["delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/search/executions": { parameters: { query?: never; @@ -594,7 +613,7 @@ export interface paths { path?: never; cookie?: never; }; - /** Aggregate execution stats (P99 latency, active count) */ + /** Aggregate execution stats (P99 latency, active count, SLA compliance) */ get: operations["stats"]; put?: never; post?: never; @@ -621,6 +640,74 @@ export interface paths { patch?: never; trace?: never; }; + "/search/stats/timeseries/by-route": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Timeseries grouped by route for an application */ + get: operations["timeseriesByRoute"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/stats/timeseries/by-app": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Timeseries grouped by application */ + get: operations["timeseriesByApp"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/stats/punchcard": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Transaction punchcard: weekday x hour grid (rolling 7 days) */ + get: operations["punchcard"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/errors/top": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Top N errors with velocity trend */ + get: operations["topErrors"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/routes/metrics": { parameters: { query?: never; @@ -725,7 +812,7 @@ export interface paths { path?: never; cookie?: never; }; - /** Get exchange snapshot for a specific processor */ + /** Get exchange snapshot for a specific processor by index */ get: operations["getProcessorSnapshot"]; put?: never; post?: never; @@ -742,8 +829,8 @@ export interface paths { path?: never; cookie?: never; }; - /** Get exchange snapshot for a processor by processorId */ - get: operations["getProcessorSnapshotById"]; + /** Get exchange snapshot for a specific processor by processorId */ + get: operations["processorSnapshotById"]; put?: never; post?: never; delete?: never; @@ -812,6 +899,26 @@ export interface paths { patch?: never; trace?: never; }; + "/config/{application}/processor-routes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get processor to route mapping + * @description Returns a map of processorId → routeId for all processors seen in this application + */ + get: operations["getProcessorRouteMapping"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/auth/oidc/config": { parameters: { query?: never; @@ -1092,6 +1199,23 @@ export interface paths { patch?: never; trace?: never; }; + "/admin/app-settings": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all application settings */ + get: operations["getAll"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/admin/opensearch/indices/{name}": { parameters: { query?: never; @@ -1127,7 +1251,7 @@ export interface components { tracedProcessors?: { [key: string]: string; }; - logForwardingLevel?: string; + applicationLogLevel?: string; taps?: components["schemas"]["TapDefinition"][]; /** Format: int32 */ tapVersion?: number; @@ -1135,6 +1259,10 @@ export interface components { [key: string]: boolean; }; compressSuccess?: boolean; + agentLogLevel?: string; + routeSamplingRates?: { + [key: string]: number; + }; }; TapDefinition: { tapId?: string; @@ -1284,6 +1412,51 @@ export interface components { /** Format: uuid */ parentGroupId?: string; }; + /** @description Per-application dashboard settings */ + AppSettingsRequest: { + /** + * Format: int32 + * @description SLA duration threshold in milliseconds + */ + slaThresholdMs: number; + /** + * Format: double + * @description Error rate % threshold for warning (yellow) health dot + */ + healthErrorWarn: number; + /** + * Format: double + * @description Error rate % threshold for critical (red) health dot + */ + healthErrorCrit: number; + /** + * Format: double + * @description SLA compliance % threshold for warning (yellow) health dot + */ + healthSlaWarn: number; + /** + * Format: double + * @description SLA compliance % threshold for critical (red) health dot + */ + healthSlaCrit: number; + }; + AppSettings: { + appId?: string; + /** Format: int32 */ + slaThresholdMs?: number; + /** Format: double */ + healthErrorWarn?: number; + /** Format: double */ + healthErrorCrit?: number; + /** Format: double */ + healthSlaWarn?: number; + /** Format: double */ + healthSlaCrit?: number; + /** Format: date-time */ + createdAt?: string; + /** Format: date-time */ + updatedAt?: string; + }; SearchRequest: { status?: string; /** Format: date-time */ @@ -1330,7 +1503,7 @@ export interface components { attributes: { [key: string]: string; }; - hasTraceData?: boolean; + hasTraceData: boolean; }; SearchResultExecutionSummary: { data: components["schemas"]["ExecutionSummary"][]; @@ -1508,6 +1681,8 @@ export interface components { prevAvgDurationMs: number; /** Format: int64 */ prevP99LatencyMs: number; + /** Format: double */ + slaCompliance: number; }; StatsTimeseries: { buckets: components["schemas"]["TimeseriesBucket"][]; @@ -1526,6 +1701,28 @@ export interface components { /** Format: int64 */ activeCount: number; }; + PunchcardCell: { + /** Format: int32 */ + weekday?: number; + /** Format: int32 */ + hour?: number; + /** Format: int64 */ + totalCount?: number; + /** Format: int64 */ + failedCount?: number; + }; + TopError: { + errorType?: string; + routeId?: string; + processorId?: string; + /** Format: int64 */ + count?: number; + /** Format: double */ + velocity?: number; + trend?: string; + /** Format: date-time */ + lastSeen?: string; + }; /** @description Aggregated route performance metrics */ RouteMetrics: { routeId: string; @@ -1543,6 +1740,8 @@ export interface components { /** Format: double */ throughputPerSec: number; sparkline: number[]; + /** Format: double */ + slaCompliance: number; }; ProcessorMetrics: { processorId: string; @@ -1586,6 +1785,8 @@ export interface components { exchangeCount: number; /** Format: date-time */ lastSeen: string; + /** @description The from() endpoint URI, e.g. 'direct:processOrder' */ + fromEndpointUri: string; }; /** @description Application log entry from OpenSearch */ LogEntryResponse: { @@ -1627,12 +1828,12 @@ export interface components { attributes: { [key: string]: string; }; - errorType?: string; - errorCategory?: string; - rootCauseType?: string; - rootCauseMessage?: string; - traceId?: string; - spanId?: string; + errorType: string; + errorCategory: string; + rootCauseType: string; + rootCauseMessage: string; + traceId: string; + spanId: string; }; ProcessorNode: { processorId: string; @@ -1644,30 +1845,32 @@ export interface components { endTime: string; /** Format: int64 */ durationMs: number; - /** Format: int32 */ - loopIndex?: number; - /** Format: int32 */ - loopSize?: number; - /** Format: int32 */ - splitIndex?: number; - /** Format: int32 */ - splitSize?: number; - /** Format: int32 */ - multicastIndex?: number; errorMessage: string; errorStackTrace: string; attributes: { [key: string]: string; }; - resolvedEndpointUri?: string; - errorType?: string; - errorCategory?: string; - rootCauseType?: string; - rootCauseMessage?: string; - errorHandlerType?: string; - circuitBreakerState?: string; - fallbackTriggered?: boolean; - hasTraceData?: boolean; + /** Format: int32 */ + loopIndex: number; + /** Format: int32 */ + loopSize: number; + /** Format: int32 */ + splitIndex: number; + /** Format: int32 */ + splitSize: number; + /** Format: int32 */ + multicastIndex: number; + resolvedEndpointUri: string; + errorType: string; + errorCategory: string; + rootCauseType: string; + rootCauseMessage: string; + errorHandlerType: string; + circuitBreakerState: string; + fallbackTriggered: boolean; + filterMatched: boolean; + duplicateMessage: boolean; + hasTraceData: boolean; children: components["schemas"]["ProcessorNode"][]; }; DiagramLayout: { @@ -2527,6 +2730,74 @@ export interface operations { }; }; }; + getByAppId: { + parameters: { + query?: never; + header?: never; + path: { + appId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AppSettings"]; + }; + }; + }; + }; + update: { + parameters: { + query?: never; + header?: never; + path: { + appId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AppSettingsRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AppSettings"]; + }; + }; + }; + }; + delete: { + parameters: { + query?: never; + header?: never; + path: { + appId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; searchGet: { parameters: { query?: { @@ -3512,6 +3783,107 @@ export interface operations { }; }; }; + timeseriesByRoute: { + parameters: { + query: { + from: string; + to?: string; + buckets?: number; + application: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: components["schemas"]["StatsTimeseries"]; + }; + }; + }; + }; + }; + timeseriesByApp: { + parameters: { + query: { + from: string; + to?: string; + buckets?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: components["schemas"]["StatsTimeseries"]; + }; + }; + }; + }; + }; + punchcard: { + parameters: { + query?: { + application?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PunchcardCell"][]; + }; + }; + }; + }; + topErrors: { + parameters: { + query: { + from: string; + to?: string; + application?: string; + routeId?: string; + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TopError"][]; + }; + }; + }; + }; getMetrics: { parameters: { query?: { @@ -3680,7 +4052,7 @@ export interface operations { }; }; }; - getProcessorSnapshotById: { + processorSnapshotById: { parameters: { query?: never; header?: never; @@ -3721,8 +4093,7 @@ export interface operations { query: { application: string; routeId: string; - /** @description Layout direction: LR (left-to-right) or TB (top-to-bottom) */ - direction?: "LR" | "TB"; + direction?: string; }; header?: never; path?: never; @@ -3753,8 +4124,7 @@ export interface operations { renderDiagram: { parameters: { query?: { - /** @description Layout direction: LR (left-to-right) or TB (top-to-bottom) */ - direction?: "LR" | "TB"; + direction?: string; }; header?: never; path: { @@ -3805,6 +4175,30 @@ export interface operations { }; }; }; + getProcessorRouteMapping: { + parameters: { + query?: never; + header?: never; + path: { + application: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Mapping returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: string; + }; + }; + }; + }; + }; getConfig_2: { parameters: { query?: never; @@ -4199,6 +4593,26 @@ export interface operations { }; }; }; + getAll: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AppSettings"][]; + }; + }; + }; + }; deleteIndex: { parameters: { query?: never; diff --git a/ui/src/components/ExecutionDiagram/useExecutionOverlay.ts b/ui/src/components/ExecutionDiagram/useExecutionOverlay.ts index a734499a..4e506182 100644 --- a/ui/src/components/ExecutionDiagram/useExecutionOverlay.ts +++ b/ui/src/components/ExecutionDiagram/useExecutionOverlay.ts @@ -61,8 +61,8 @@ function buildOverlay( subRouteFailed: subRouteFailed || undefined, hasTraceData: !!proc.hasTraceData, resolvedEndpointUri: proc.resolvedEndpointUri || undefined, - filterMatched: (proc as Record).filterMatched as boolean | undefined, - duplicateMessage: (proc as Record).duplicateMessage as boolean | undefined, + filterMatched: proc.filterMatched ?? undefined, + duplicateMessage: proc.duplicateMessage ?? undefined, }); // Recurse into children diff --git a/ui/src/pages/DashboardTab/DashboardL1.tsx b/ui/src/pages/DashboardTab/DashboardL1.tsx index d3c38e03..d091eaff 100644 --- a/ui/src/pages/DashboardTab/DashboardL1.tsx +++ b/ui/src/pages/DashboardTab/DashboardL1.tsx @@ -142,7 +142,7 @@ function aggregateByApp( // SLA compliance: weighted average of per-route slaCompliance from backend const appSettings = settingsMap.get(appId); - const slaWeightedSum = routes.reduce((s, r) => s + ((r as Record).slaCompliance as number ?? 100) * r.exchangeCount, 0); + const slaWeightedSum = routes.reduce((s, r) => s + (r.slaCompliance ?? 100) * r.exchangeCount, 0); const slaCompliance = totalExchanges > 0 ? slaWeightedSum / totalExchanges : 100; const errorCount = Math.round(totalFailed); @@ -316,7 +316,7 @@ export default function DashboardL1() { ); // Global SLA compliance from backend stats (exact calculation from executions table) - const globalSlaCompliance = (stats as Record)?.slaCompliance as number ?? -1; + const globalSlaCompliance = stats?.slaCompliance ?? -1; const effectiveSlaCompliance = globalSlaCompliance >= 0 ? globalSlaCompliance : 100; // Active error count = distinct error types diff --git a/ui/src/pages/DashboardTab/DashboardL2.tsx b/ui/src/pages/DashboardTab/DashboardL2.tsx index 51cb0c69..d16b65d7 100644 --- a/ui/src/pages/DashboardTab/DashboardL2.tsx +++ b/ui/src/pages/DashboardTab/DashboardL2.tsx @@ -292,7 +292,7 @@ export default function DashboardL2() { successRate: m.successRate, avgDurationMs: m.avgDurationMs, p99DurationMs: m.p99DurationMs, - slaCompliance: (m as Record).slaCompliance as number ?? -1, + slaCompliance: m.slaCompliance ?? -1, sparkline: m.sparkline ?? [], })), [metrics],