From 313d87194867c68fe4d7e0a8a0b1694dfebee2aa Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 23 Mar 2026 18:16:15 +0100 Subject: [PATCH] chore: update design system to v0.0.2, regenerate schema.d.ts Bumped @cameleer/design-system from ^0.0.1 to ^0.0.2 (adds onLogout prop to TopBar). Fetched openapi.json from remote backend, stripped /api/v1 prefix, patched ExecutionDetail with groupName and children fields to match UI expectations, then regenerated schema.d.ts via openapi-typescript. TypeScript compiles clean. Co-Authored-By: Claude Sonnet 4.6 --- ui/package-lock.json | 72 +- ui/package.json | 3 +- ui/src/api/openapi.json | 4515 +++++++++++++++++++++++++++++++++++++++ ui/src/api/schema.d.ts | 3769 ++++++++++++++++++++++++++++++-- 4 files changed, 8127 insertions(+), 232 deletions(-) create mode 100644 ui/src/api/openapi.json diff --git a/ui/package-lock.json b/ui/package-lock.json index f74004f4..3e242ee0 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -8,7 +8,7 @@ "name": "ui", "version": "0.0.0", "dependencies": { - "@cameleer/design-system": "^0.0.1", + "@cameleer/design-system": "^0.0.2", "@tanstack/react-query": "^5.90.21", "openapi-fetch": "^0.17.0", "react": "^19.2.4", @@ -19,6 +19,7 @@ }, "devDependencies": { "@eslint/js": "^9.39.4", + "@playwright/test": "^1.58.2", "@types/node": "^24.12.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", @@ -274,9 +275,9 @@ } }, "node_modules/@cameleer/design-system": { - "version": "0.0.1", - "resolved": "https://gitea.siegeln.net/api/packages/cameleer/npm/%40cameleer%2Fdesign-system/-/0.0.1/design-system-0.0.1.tgz", - "integrity": "sha512-8rMAp7JhZBlAw4jcTnSBLuZe8cd94lPAgL96KDtVIk2QpXKdsJLoVfk7CuPG635/h6pu4YKplfBhJmKpsS8A8g==", + "version": "0.0.2", + "resolved": "https://gitea.siegeln.net/api/packages/cameleer/npm/%40cameleer%2Fdesign-system/-/0.0.2/design-system-0.0.2.tgz", + "integrity": "sha512-6PbqtrW4E1yVE+ou2BCYVdHItvN88kNStS2pIKHuJhcerY3vCctLNU4pZSORkLUfvB181I+QIkBIEFa1CKSG8Q==", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0", @@ -608,6 +609,22 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@redocly/ajv": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", @@ -2763,6 +2780,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", diff --git a/ui/package.json b/ui/package.json index 7e3fa3f2..c453df76 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,7 +12,7 @@ "generate-api:live": "curl -s http://localhost:8081/api/v1/api-docs -o src/api/openapi.json && openapi-typescript src/api/openapi.json -o src/api/schema.d.ts" }, "dependencies": { - "@cameleer/design-system": "^0.0.1", + "@cameleer/design-system": "^0.0.2", "@tanstack/react-query": "^5.90.21", "openapi-fetch": "^0.17.0", "react": "^19.2.4", @@ -23,6 +23,7 @@ }, "devDependencies": { "@eslint/js": "^9.39.4", + "@playwright/test": "^1.58.2", "@types/node": "^24.12.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", diff --git a/ui/src/api/openapi.json b/ui/src/api/openapi.json new file mode 100644 index 00000000..91b1c054 --- /dev/null +++ b/ui/src/api/openapi.json @@ -0,0 +1,4515 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Cameleer3 Server API", + "version": "1.0" + }, + "servers": [], + "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": "Group Admin", + "description": "Group management (ADMIN only)" + }, + { + "name": "Diagrams", + "description": "Diagram rendering endpoints" + }, + { + "name": "OpenSearch Admin", + "description": "OpenSearch monitoring and management (ADMIN only)" + }, + { + "name": "Detail", + "description": "Execution detail and processor snapshot endpoints" + }, + { + "name": "Route Catalog", + "description": "Route catalog and discovery" + } + ], + "paths": { + "/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", + "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": "group", + "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" + }, + "503": { + "description": "Buffer full, retry later" + } + } + } + }, + "/data/executions": { + "post": { + "tags": [ + "Ingestion" + ], + "summary": "Ingest route execution data", + "description": "Accepts a single RouteExecution or an array of RouteExecutions", + "operationId": "ingestExecutions", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Data accepted for processing" + } + } + } + }, + "/data/diagrams": { + "post": { + "tags": [ + "Ingestion" + ], + "summary": "Ingest route diagram data", + "description": "Accepts a single RouteGraph or an array of RouteGraphs", + "operationId": "ingestDiagrams", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Data accepted for processing" + } + } + } + }, + "/auth/refresh": { + "post": { + "tags": [ + "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 config-update, deep-trace, or replay command to the specified agent", + "operationId": "sendCommand", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$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", + "operationId": "acknowledgeCommand", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "commandId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Command acknowledged" + }, + "404": { + "description": "Command not found" + } + } + } + }, + "/agents/register": { + "post": { + "tags": [ + "Agent Management" + ], + "summary": "Register an agent", + "description": "Registers a new agent or re-registers an existing one. Requires bootstrap token in Authorization header.", + "operationId": "register", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$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}/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": "group", + "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": "group", + "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/catalog": { + "get": { + "tags": [ + "Route Catalog" + ], + "summary": "Get route catalog", + "description": "Returns all applications with their routes, agents, and health status", + "operationId": "getCatalog", + "responses": { + "200": { + "description": "Catalog returned", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AppCatalogEntry" + } + } + } + } + } + } + } + }, + "/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" + } + } + } + } + } + } + } + }, + "/diagrams": { + "get": { + "tags": [ + "Diagrams" + ], + "summary": "Find diagram by application group and route ID", + "description": "Resolves group to agent IDs and finds the latest diagram for the route", + "operationId": "findByGroupAndRoute", + "parameters": [ + { + "name": "group", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "routeId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Diagram layout returned", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/DiagramLayout" + } + } + } + }, + "404": { + "description": "No diagram found for the given group 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" + } + } + ], + "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" + } + } + } + } + } + } + }, + "/auth/oidc/config": { + "get": { + "tags": [ + "Authentication" + ], + "summary": "Get OIDC config for SPA login flow", + "operationId": "getConfig_1", + "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 group", + "operationId": "listAgents", + "parameters": [ + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "group", + "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/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": "" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/IndicesPageResponse" + } + } + } + } + } + } + }, + "/admin/database/tables": { + "get": { + "tags": [ + "Database Admin" + ], + "summary": "Get table sizes and row counts", + "operationId": "getTables", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableSizeResponse" + } + } + } + } + } + } + } + }, + "/admin/database/status": { + "get": { + "tags": [ + "Database Admin" + ], + "summary": "Get database connection status and version", + "operationId": "getStatus_1", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/DatabaseStatusResponse" + } + } + } + } + } + } + }, + "/admin/database/queries": { + "get": { + "tags": [ + "Database Admin" + ], + "summary": "Get active queries", + "operationId": "getQueries", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActiveQueryResponse" + } + } + } + } + } + } + } + }, + "/admin/database/pool": { + "get": { + "tags": [ + "Database Admin" + ], + "summary": "Get HikariCP connection pool stats", + "operationId": "getPool", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ConnectionPoolResponse" + } + } + } + } + } + } + }, + "/admin/audit": { + "get": { + "tags": [ + "Audit Log" + ], + "summary": "Search audit log entries with pagination", + "operationId": "getAuditLog", + "parameters": [ + { + "name": "username", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "category", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "search", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "from", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "to", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "timestamp" + } + }, + { + "name": "order", + "in": "query", + "required": false, + "schema": { + "type": "string", + "default": "desc" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32", + "default": 25 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/AuditLogPageResponse" + } + } + } + } + } + } + }, + "/admin/opensearch/indices/{name}": { + "delete": { + "tags": [ + "OpenSearch Admin" + ], + "summary": "Delete an OpenSearch index", + "operationId": "deleteIndex", + "parameters": [ + { + "name": "name", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + } + }, + "components": { + "schemas": { + "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" + }, + "group": { + "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" + }, + "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" + } + }, + "required": [ + "agentId", + "correlationId", + "diagramContentHash", + "durationMs", + "endTime", + "errorMessage", + "executionId", + "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" + ] + }, + "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" + ] + }, + "AgentRegistrationRequest": { + "type": "object", + "description": "Agent registration payload", + "properties": { + "agentId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "group": { + "type": "string", + "default": "default" + }, + "version": { + "type": "string" + }, + "routeIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "capabilities": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + }, + "required": [ + "agentId", + "name" + ] + }, + "AgentRegistrationResponse": { + "type": "object", + "description": "Agent registration result with JWT tokens and SSE endpoint", + "properties": { + "agentId": { + "type": "string" + }, + "sseEndpoint": { + "type": "string" + }, + "heartbeatIntervalMs": { + "type": "integer", + "format": "int64" + }, + "serverPublicKey": { + "type": "string" + }, + "accessToken": { + "type": "string" + }, + "refreshToken": { + "type": "string" + } + }, + "required": [ + "accessToken", + "agentId", + "refreshToken", + "serverPublicKey", + "sseEndpoint" + ] + }, + "CommandBroadcastResponse": { + "type": "object", + "description": "Result of broadcasting a command to multiple agents", + "properties": { + "commandIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "targetCount": { + "type": "integer", + "format": "int32" + } + }, + "required": [ + "commandIds" + ] + }, + "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" + } + } + } + }, + "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" + ] + }, + "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" + ] + }, + "ExecutionDetail": { + "type": "object", + "properties": { + "executionId": { + "type": "string" + }, + "routeId": { + "type": "string" + }, + "agentId": { + "type": "string" + }, + "status": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + }, + "durationMs": { + "type": "integer", + "format": "int64" + }, + "correlationId": { + "type": "string" + }, + "exchangeId": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "errorStackTrace": { + "type": "string" + }, + "diagramContentHash": { + "type": "string" + }, + "processors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProcessorNode" + } + }, + "groupName": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProcessorNode" + } + } + }, + "required": [ + "agentId", + "correlationId", + "diagramContentHash", + "durationMs", + "endTime", + "errorMessage", + "errorStackTrace", + "exchangeId", + "executionId", + "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" + }, + "diagramNodeId": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "errorStackTrace": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProcessorNode" + } + } + }, + "required": [ + "children", + "diagramNodeId", + "durationMs", + "endTime", + "errorMessage", + "errorStackTrace", + "processorId", + "processorType", + "startTime", + "status" + ] + }, + "DiagramLayout": { + "type": "object", + "properties": { + "width": { + "type": "number", + "format": "double" + }, + "height": { + "type": "number", + "format": "double" + }, + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PositionedNode" + } + }, + "edges": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PositionedEdge" + } + } + } + }, + "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" + }, + "group": { + "type": "string" + }, + "status": { + "type": "string" + }, + "routeIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "registeredAt": { + "type": "string", + "format": "date-time" + }, + "lastHeartbeat": { + "type": "string", + "format": "date-time" + }, + "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", + "errorRate", + "group", + "id", + "lastHeartbeat", + "name", + "registeredAt", + "routeIds", + "status", + "totalRoutes", + "tps", + "uptimeSeconds" + ] + }, + "SseEmitter": { + "type": "object", + "properties": { + "timeout": { + "type": "integer", + "format": "int64" + } + } + }, + "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" + ] + }, + "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" + } + } + } +} diff --git a/ui/src/api/schema.d.ts b/ui/src/api/schema.d.ts index 1bb3c15b..ceac9c32 100644 --- a/ui/src/api/schema.d.ts +++ b/ui/src/api/schema.d.ts @@ -1,248 +1,3563 @@ -// Placeholder — regenerate with: npm run generate-api:live -// This file will be overwritten by openapi-typescript when the backend is running. +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ export interface paths { - '/auth/login': { - post: { - requestBody: { content: { 'application/json': { username: string; password: string } } }; - responses: { 200: { content: { 'application/json': { accessToken: string; refreshToken: string; displayName?: string } } } }; + "/admin/users/{userId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get user by ID with RBAC detail */ + get: operations["getUser"]; + /** Update user display name or email */ + put: operations["updateUser"]; + post?: never; + /** Delete user */ + delete: operations["deleteUser"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/auth/refresh': { - post: { - requestBody: { content: { 'application/json': { refreshToken: string } } }; - responses: { 200: { content: { 'application/json': { accessToken: string; refreshToken: string; displayName?: string } } } }; + "/admin/thresholds": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get current threshold configuration */ + get: operations["getThresholds"]; + /** Update threshold configuration */ + put: operations["updateThresholds"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/auth/oidc/config': { - get: { - responses: { 200: { content: { 'application/json': { clientId?: string; authorizationEndpoint?: string; endSessionEndpoint?: string } } } }; + "/admin/roles/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get role by ID with effective principals */ + get: operations["getRole"]; + /** Update a custom role */ + put: operations["updateRole"]; + post?: never; + /** Delete a custom role */ + delete: operations["deleteRole"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/auth/oidc/callback': { - post: { - requestBody: { content: { 'application/json': { code: string; redirectUri: string } } }; - responses: { 200: { content: { 'application/json': { accessToken: string; refreshToken: string; displayName?: string; idToken?: string } } } }; + "/admin/oidc": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get OIDC configuration */ + get: operations["getConfig"]; + /** Save OIDC configuration */ + put: operations["saveConfig"]; + post?: never; + /** Delete OIDC configuration */ + delete: operations["deleteConfig"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/agents': { - get: { - parameters: { query?: { status?: string; group?: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['AgentInstanceResponse'][] } } }; + "/admin/groups/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get group by ID with effective roles */ + get: operations["getGroup"]; + /** Update group name or parent */ + put: operations["updateGroup"]; + post?: never; + /** Delete group */ + delete: operations["deleteGroup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/agents/events-log': { - get: { - parameters: { query?: { appId?: string; agentId?: string; from?: string; to?: string; limit?: number } }; - responses: { 200: { content: { 'application/json': components['schemas']['AgentEventResponse'][] } } }; + "/search/executions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Search executions with basic filters */ + get: operations["searchGet"]; + put?: never; + /** Advanced search with all filters */ + post: operations["searchPost"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/search/executions': { - post: { - requestBody: { content: { 'application/json': components['schemas']['SearchRequest'] } }; - responses: { 200: { content: { 'application/json': components['schemas']['SearchResultExecutionSummary'] } } }; + "/data/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Ingest agent metrics + * @description Accepts an array of MetricsSnapshot objects + */ + post: operations["ingestMetrics"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/search/stats': { - get: { - parameters: { query: { from: string; to?: string; routeId?: string; group?: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['ExecutionStats'] } } }; + "/data/executions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Ingest route execution data + * @description Accepts a single RouteExecution or an array of RouteExecutions + */ + post: operations["ingestExecutions"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/search/stats/timeseries': { - get: { - parameters: { query: { from: string; to?: string; buckets?: number; routeId?: string; group?: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['StatsTimeseries'] } } }; + "/data/diagrams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Ingest route diagram data + * @description Accepts a single RouteGraph or an array of RouteGraphs + */ + post: operations["ingestDiagrams"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/executions/{executionId}': { - get: { - parameters: { path: { executionId: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['ExecutionDetail'] } } }; + "/auth/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Refresh access token */ + post: operations["refresh"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/executions/{executionId}/processors/{index}/snapshot': { - get: { - parameters: { path: { executionId: string; index: number } }; - responses: { 200: { content: { 'application/json': Record } } }; + "/auth/oidc/callback": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Exchange OIDC authorization code for JWTs */ + post: operations["callback"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/diagrams/{contentHash}/render': { - get: { - parameters: { path: { contentHash: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['DiagramLayout'] } } }; + "/auth/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Login with local credentials */ + post: operations["login"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/diagrams': { - get: { - parameters: { query: { group: string; routeId: string } }; - responses: { 200: { content: { 'application/json': Record } } }; + "/agents/{id}/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Refresh access token + * @description Issues a new access JWT from a valid refresh token + */ + post: operations["refresh_1"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/routes/catalog': { - get: { - responses: { 200: { content: { 'application/json': components['schemas']['AppCatalogEntry'][] } } }; + "/agents/{id}/heartbeat": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Agent heartbeat ping + * @description Updates the agent's last heartbeat timestamp + */ + post: operations["heartbeat"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; - '/routes/metrics': { - get: { - parameters: { query?: { from?: string; to?: string; appId?: string } }; - responses: { 200: { content: { 'application/json': components['schemas']['RouteMetrics'][] } } }; + "/agents/{id}/commands": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Send command to a specific agent + * @description Sends a config-update, deep-trace, or replay command to the specified agent + */ + post: operations["sendCommand"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/{id}/commands/{commandId}/ack": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Acknowledge command receipt + * @description Agent acknowledges that it has received and processed a command + */ + post: operations["acknowledgeCommand"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/register": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Register an agent + * @description Registers a new agent or re-registers an existing one. Requires bootstrap token in Authorization header. + */ + post: operations["register"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/groups/{group}/commands": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Send command to all agents in a group + * @description Sends a command to all LIVE agents in the specified group + */ + post: operations["sendGroupCommand"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/commands": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Broadcast command to all live agents + * @description Sends a command to all agents currently in LIVE state + */ + post: operations["broadcastCommand"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all users with RBAC detail */ + get: operations["listUsers"]; + put?: never; + /** Create a local user */ + post: operations["createUser"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/users/{userId}/roles/{roleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Assign a role to a user */ + post: operations["assignRoleToUser"]; + /** Remove a role from a user */ + delete: operations["removeRoleFromUser"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/users/{userId}/groups/{groupId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Add a user to a group */ + post: operations["addUserToGroup"]; + /** Remove a user from a group */ + delete: operations["removeUserFromGroup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/roles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all roles (system and custom) */ + get: operations["listRoles"]; + put?: never; + /** Create a custom role */ + post: operations["createRole"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/oidc/test": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Test OIDC provider connectivity */ + post: operations["testConnection"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all groups with hierarchy and effective roles */ + get: operations["listGroups"]; + put?: never; + /** Create a new group */ + post: operations["createGroup"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/groups/{id}/roles/{roleId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Assign a role to a group */ + post: operations["assignRoleToGroup"]; + /** Remove a role from a group */ + delete: operations["removeRoleFromGroup"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/queries/{pid}/kill": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Terminate a query by PID */ + post: operations["killQuery"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/stats": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Aggregate execution stats (P99 latency, active count) */ + get: operations["stats"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/search/stats/timeseries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Bucketed time-series stats over a time window */ + get: operations["timeseries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/routes/metrics": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get route metrics + * @description Returns aggregated performance metrics per route for the given time window + */ + get: operations["getMetrics"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/routes/catalog": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get route catalog + * @description Returns all applications with their routes, agents, and health status + */ + get: operations["getCatalog"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/executions/{executionId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get execution detail with nested processor tree */ + get: operations["getDetail"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/executions/{executionId}/processors/{index}/snapshot": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get exchange snapshot for a specific processor */ + get: operations["getProcessorSnapshot"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/diagrams": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Find diagram by application group and route ID + * @description Resolves group to agent IDs and finds the latest diagram for the route + */ + get: operations["findByGroupAndRoute"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/diagrams/{contentHash}/render": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Render a route diagram + * @description Returns SVG (default) or JSON layout based on Accept header + */ + get: operations["renderDiagram"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/oidc/config": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get OIDC config for SPA login flow */ + get: operations["getConfig_1"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List all agents + * @description Returns all registered agents with runtime metrics, optionally filtered by status and/or group + */ + get: operations["listAgents"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/{id}/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 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. + */ + get: operations["events"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/agents/events-log": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Query agent events + * @description Returns agent lifecycle events, optionally filtered by app and/or agent ID + */ + get: operations["getEvents"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/rbac/stats": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get RBAC statistics for the dashboard */ + get: operations["getStats"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/opensearch/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get OpenSearch cluster status and version */ + get: operations["getStatus"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/opensearch/pipeline": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get indexing pipeline statistics */ + get: operations["getPipeline"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/opensearch/performance": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get OpenSearch performance metrics */ + get: operations["getPerformance"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/opensearch/indices": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get OpenSearch indices with pagination */ + get: operations["getIndices"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/tables": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get table sizes and row counts */ + get: operations["getTables"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get database connection status and version */ + get: operations["getStatus_1"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/queries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get active queries */ + get: operations["getQueries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/database/pool": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get HikariCP connection pool stats */ + get: operations["getPool"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/audit": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Search audit log entries with pagination */ + get: operations["getAuditLog"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/opensearch/indices/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete an OpenSearch index */ + delete: operations["deleteIndex"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - }; } - +export type webhooks = Record; export interface components { - schemas: { - ExecutionSummary: { - executionId: string; - routeId: string; - agentId: string; - groupName: string; - status: string; - startTime: string; - endTime?: string; - durationMs: number; - errorMessage?: string; - correlationId?: string; - exchangeId?: string; + schemas: { + UpdateUserRequest: { + displayName?: string; + email?: string; + }; + /** @description Database monitoring thresholds */ + DatabaseThresholdsRequest: { + /** + * Format: int32 + * @description Connection pool usage warning threshold (percentage) + */ + connectionPoolWarning?: number; + /** + * Format: int32 + * @description Connection pool usage critical threshold (percentage) + */ + connectionPoolCritical?: number; + /** + * Format: double + * @description Query duration warning threshold (seconds) + */ + queryDurationWarning?: number; + /** + * Format: double + * @description Query duration critical threshold (seconds) + */ + queryDurationCritical?: number; + }; + /** @description OpenSearch monitoring thresholds */ + OpenSearchThresholdsRequest: { + /** @description Cluster health warning threshold (GREEN, YELLOW, RED) */ + clusterHealthWarning?: string; + /** @description Cluster health critical threshold (GREEN, YELLOW, RED) */ + clusterHealthCritical?: string; + /** + * Format: int32 + * @description Queue depth warning threshold + */ + queueDepthWarning?: number; + /** + * Format: int32 + * @description Queue depth critical threshold + */ + queueDepthCritical?: number; + /** + * Format: int32 + * @description JVM heap usage warning threshold (percentage) + */ + jvmHeapWarning?: number; + /** + * Format: int32 + * @description JVM heap usage critical threshold (percentage) + */ + jvmHeapCritical?: number; + /** + * Format: int32 + * @description Failed document count warning threshold + */ + failedDocsWarning?: number; + /** + * Format: int32 + * @description Failed document count critical threshold + */ + failedDocsCritical?: number; + }; + /** @description Threshold configuration for admin monitoring */ + ThresholdConfigRequest: { + database: components["schemas"]["DatabaseThresholdsRequest"]; + opensearch: components["schemas"]["OpenSearchThresholdsRequest"]; + }; + DatabaseThresholds: { + /** Format: int32 */ + connectionPoolWarning?: number; + /** Format: int32 */ + connectionPoolCritical?: number; + /** Format: double */ + queryDurationWarning?: number; + /** Format: double */ + queryDurationCritical?: number; + }; + OpenSearchThresholds: { + clusterHealthWarning?: string; + clusterHealthCritical?: string; + /** Format: int32 */ + queueDepthWarning?: number; + /** Format: int32 */ + queueDepthCritical?: number; + /** Format: int32 */ + jvmHeapWarning?: number; + /** Format: int32 */ + jvmHeapCritical?: number; + /** Format: int32 */ + failedDocsWarning?: number; + /** Format: int32 */ + failedDocsCritical?: number; + }; + ThresholdConfig: { + database?: components["schemas"]["DatabaseThresholds"]; + opensearch?: components["schemas"]["OpenSearchThresholds"]; + }; + UpdateRoleRequest: { + name?: string; + description?: string; + scope?: string; + }; + /** @description OIDC configuration update request */ + OidcAdminConfigRequest: { + enabled?: boolean; + issuerUri?: string; + clientId?: string; + clientSecret?: string; + rolesClaim?: string; + defaultRoles?: string[]; + autoSignup?: boolean; + displayNameClaim?: string; + }; + /** @description Error response */ + ErrorResponse: { + message: string; + }; + /** @description OIDC configuration for admin management */ + OidcAdminConfigResponse: { + configured?: boolean; + enabled?: boolean; + issuerUri?: string; + clientId?: string; + clientSecretSet?: boolean; + rolesClaim?: string; + defaultRoles?: string[]; + autoSignup?: boolean; + displayNameClaim?: string; + }; + UpdateGroupRequest: { + name?: string; + /** Format: uuid */ + parentGroupId?: string; + }; + SearchRequest: { + status?: string; + /** Format: date-time */ + timeFrom?: string; + /** Format: date-time */ + timeTo?: string; + /** Format: int64 */ + durationMin?: number; + /** Format: int64 */ + durationMax?: number; + correlationId?: string; + text?: string; + textInBody?: string; + textInHeaders?: string; + textInErrors?: string; + routeId?: string; + agentId?: string; + processorType?: string; + group?: string; + agentIds?: string[]; + /** Format: int32 */ + offset?: number; + /** Format: int32 */ + limit?: number; + sortField?: string; + sortDir?: string; + }; + ExecutionSummary: { + executionId: string; + routeId: string; + agentId: string; + status: string; + /** Format: date-time */ + startTime: string; + /** Format: date-time */ + endTime: string; + /** Format: int64 */ + durationMs: number; + correlationId: string; + errorMessage: string; + diagramContentHash: string; + }; + SearchResultExecutionSummary: { + data: components["schemas"]["ExecutionSummary"][]; + /** Format: int64 */ + total: number; + /** Format: int32 */ + offset: number; + /** Format: int32 */ + limit: number; + }; + RefreshRequest: { + refreshToken?: string; + }; + /** @description JWT token pair */ + AuthTokenResponse: { + accessToken: string; + refreshToken: string; + displayName: string; + /** @description OIDC id_token for end-session logout (only present after OIDC login) */ + idToken?: string; + }; + CallbackRequest: { + code?: string; + redirectUri?: string; + }; + LoginRequest: { + username?: string; + password?: string; + }; + /** @description Agent token refresh request */ + AgentRefreshRequest: { + refreshToken: string; + }; + /** @description Refreshed access and refresh tokens */ + AgentRefreshResponse: { + accessToken: string; + refreshToken: string; + }; + /** @description Command to send to agent(s) */ + CommandRequest: { + /** @description Command type: config-update, deep-trace, or replay */ + type: string; + /** @description Command payload JSON */ + payload?: Record; + }; + /** @description Result of sending a command to a single agent */ + CommandSingleResponse: { + commandId: string; + status: string; + }; + /** @description Agent registration payload */ + AgentRegistrationRequest: { + agentId: string; + name: string; + /** @default default */ + group: string; + version?: string; + routeIds?: string[]; + capabilities?: { + [key: string]: Record; + }; + }; + /** @description Agent registration result with JWT tokens and SSE endpoint */ + AgentRegistrationResponse: { + agentId: string; + sseEndpoint: string; + /** Format: int64 */ + heartbeatIntervalMs?: number; + serverPublicKey: string; + accessToken: string; + refreshToken: string; + }; + /** @description Result of broadcasting a command to multiple agents */ + CommandBroadcastResponse: { + commandIds: string[]; + /** Format: int32 */ + targetCount?: number; + }; + CreateUserRequest: { + username?: string; + displayName?: string; + email?: string; + password?: string; + }; + GroupSummary: { + /** Format: uuid */ + id?: string; + name?: string; + }; + RoleSummary: { + /** Format: uuid */ + id?: string; + name?: string; + system?: boolean; + source?: string; + }; + UserDetail: { + userId?: string; + provider?: string; + email?: string; + displayName?: string; + /** Format: date-time */ + createdAt?: string; + directRoles?: components["schemas"]["RoleSummary"][]; + directGroups?: components["schemas"]["GroupSummary"][]; + effectiveRoles?: components["schemas"]["RoleSummary"][]; + effectiveGroups?: components["schemas"]["GroupSummary"][]; + }; + CreateRoleRequest: { + name?: string; + description?: string; + scope?: string; + }; + /** @description OIDC provider connectivity test result */ + OidcTestResult: { + status: string; + authorizationEndpoint: string; + }; + CreateGroupRequest: { + name?: string; + /** Format: uuid */ + parentGroupId?: string; + }; + ExecutionStats: { + /** Format: int64 */ + totalCount: number; + /** Format: int64 */ + failedCount: number; + /** Format: int64 */ + avgDurationMs: number; + /** Format: int64 */ + p99LatencyMs: number; + /** Format: int64 */ + activeCount: number; + /** Format: int64 */ + totalToday: number; + /** Format: int64 */ + prevTotalCount: number; + /** Format: int64 */ + prevFailedCount: number; + /** Format: int64 */ + prevAvgDurationMs: number; + /** Format: int64 */ + prevP99LatencyMs: number; + }; + StatsTimeseries: { + buckets: components["schemas"]["TimeseriesBucket"][]; + }; + TimeseriesBucket: { + /** Format: date-time */ + time: string; + /** Format: int64 */ + totalCount: number; + /** Format: int64 */ + failedCount: number; + /** Format: int64 */ + avgDurationMs: number; + /** Format: int64 */ + p99DurationMs: number; + /** Format: int64 */ + activeCount: number; + }; + /** @description Aggregated route performance metrics */ + RouteMetrics: { + routeId: string; + appId: string; + /** Format: int64 */ + exchangeCount: number; + /** Format: double */ + successRate: number; + /** Format: double */ + avgDurationMs: number; + /** Format: double */ + p99DurationMs: number; + /** Format: double */ + errorRate: number; + /** Format: double */ + throughputPerSec: number; + sparkline: number[]; + }; + /** @description Summary of an agent instance for sidebar display */ + AgentSummary: { + id: string; + name: string; + status: string; + /** Format: double */ + tps: number; + }; + /** @description Application catalog entry with routes and agents */ + AppCatalogEntry: { + appId: string; + routes: components["schemas"]["RouteSummary"][]; + agents: components["schemas"]["AgentSummary"][]; + /** Format: int32 */ + agentCount: number; + health: string; + /** Format: int64 */ + exchangeCount: number; + }; + /** @description Summary of a route within an application */ + RouteSummary: { + routeId: string; + /** Format: int64 */ + exchangeCount: number; + /** Format: date-time */ + lastSeen: string; + }; + ExecutionDetail: { + executionId: string; + routeId: string; + agentId: string; + status: string; + /** Format: date-time */ + startTime: string; + /** Format: date-time */ + endTime: string; + /** Format: int64 */ + durationMs: number; + correlationId: string; + exchangeId: string; + errorMessage: string; + errorStackTrace: string; + diagramContentHash: string; + processors: components["schemas"]["ProcessorNode"][]; + groupName?: string; + children?: components["schemas"]["ProcessorNode"][]; + }; + ProcessorNode: { + processorId: string; + processorType: string; + status: string; + /** Format: date-time */ + startTime: string; + /** Format: date-time */ + endTime: string; + /** Format: int64 */ + durationMs: number; + diagramNodeId: string; + errorMessage: string; + errorStackTrace: string; + children: components["schemas"]["ProcessorNode"][]; + }; + DiagramLayout: { + /** Format: double */ + width?: number; + /** Format: double */ + height?: number; + nodes?: components["schemas"]["PositionedNode"][]; + edges?: components["schemas"]["PositionedEdge"][]; + }; + PositionedEdge: { + sourceId?: string; + targetId?: string; + label?: string; + points?: number[][]; + }; + PositionedNode: { + id?: string; + label?: string; + type?: string; + /** Format: double */ + x?: number; + /** Format: double */ + y?: number; + /** Format: double */ + width?: number; + /** Format: double */ + height?: number; + }; + /** @description OIDC configuration for SPA login flow */ + OidcPublicConfigResponse: { + issuer: string; + clientId: string; + authorizationEndpoint: string; + /** @description Present if the provider supports RP-initiated logout */ + endSessionEndpoint?: string; + }; + /** @description Agent instance summary with runtime metrics */ + AgentInstanceResponse: { + id: string; + name: string; + group: string; + status: string; + routeIds: string[]; + /** Format: date-time */ + registeredAt: string; + /** Format: date-time */ + lastHeartbeat: string; + /** Format: double */ + tps: number; + /** Format: double */ + errorRate: number; + /** Format: int32 */ + activeRoutes: number; + /** Format: int32 */ + totalRoutes: number; + /** Format: int64 */ + uptimeSeconds: number; + }; + SseEmitter: { + /** Format: int64 */ + timeout?: number; + }; + /** @description Agent lifecycle event */ + AgentEventResponse: { + /** Format: int64 */ + id: number; + agentId: string; + appId: string; + eventType: string; + detail: string; + /** Format: date-time */ + timestamp: string; + }; + RoleDetail: { + /** Format: uuid */ + id?: string; + name?: string; + description?: string; + scope?: string; + system?: boolean; + /** Format: date-time */ + createdAt?: string; + assignedGroups?: components["schemas"]["GroupSummary"][]; + directUsers?: components["schemas"]["UserSummary"][]; + effectivePrincipals?: components["schemas"]["UserSummary"][]; + }; + UserSummary: { + userId?: string; + displayName?: string; + provider?: string; + }; + RbacStats: { + /** Format: int32 */ + userCount?: number; + /** Format: int32 */ + activeUserCount?: number; + /** Format: int32 */ + groupCount?: number; + /** Format: int32 */ + maxGroupDepth?: number; + /** Format: int32 */ + roleCount?: number; + }; + /** @description OpenSearch cluster status */ + OpenSearchStatusResponse: { + /** @description Whether the cluster is reachable */ + reachable?: boolean; + /** @description Cluster health status (GREEN, YELLOW, RED) */ + clusterHealth?: string; + /** @description OpenSearch version */ + version?: string; + /** + * Format: int32 + * @description Number of nodes in the cluster + */ + nodeCount?: number; + /** @description OpenSearch host */ + host?: string; + }; + /** @description Search indexing pipeline statistics */ + PipelineStatsResponse: { + /** + * Format: int32 + * @description Current queue depth + */ + queueDepth?: number; + /** + * Format: int32 + * @description Maximum queue size + */ + maxQueueSize?: number; + /** + * Format: int64 + * @description Number of failed indexing operations + */ + failedCount?: number; + /** + * Format: int64 + * @description Number of successfully indexed documents + */ + indexedCount?: number; + /** + * Format: int64 + * @description Debounce interval in milliseconds + */ + debounceMs?: number; + /** + * Format: double + * @description Current indexing rate (docs/sec) + */ + indexingRate?: number; + /** + * Format: date-time + * @description Timestamp of last indexed document + */ + lastIndexedAt?: string; + }; + /** @description OpenSearch performance metrics */ + PerformanceResponse: { + /** + * Format: double + * @description Query cache hit rate (0.0-1.0) + */ + queryCacheHitRate?: number; + /** + * Format: double + * @description Request cache hit rate (0.0-1.0) + */ + requestCacheHitRate?: number; + /** + * Format: double + * @description Average search latency in milliseconds + */ + searchLatencyMs?: number; + /** + * Format: double + * @description Average indexing latency in milliseconds + */ + indexingLatencyMs?: number; + /** + * Format: int64 + * @description JVM heap used in bytes + */ + jvmHeapUsedBytes?: number; + /** + * Format: int64 + * @description JVM heap max in bytes + */ + jvmHeapMaxBytes?: number; + }; + /** @description OpenSearch index information */ + IndexInfoResponse: { + /** @description Index name */ + name?: string; + /** + * Format: int64 + * @description Document count + */ + docCount?: number; + /** @description Human-readable index size */ + size?: string; + /** + * Format: int64 + * @description Index size in bytes + */ + sizeBytes?: number; + /** @description Index health status */ + health?: string; + /** + * Format: int32 + * @description Number of primary shards + */ + primaryShards?: number; + /** + * Format: int32 + * @description Number of replica shards + */ + replicaShards?: number; + }; + /** @description Paginated list of OpenSearch indices */ + IndicesPageResponse: { + /** @description Index list for current page */ + indices?: components["schemas"]["IndexInfoResponse"][]; + /** + * Format: int64 + * @description Total number of indices + */ + totalIndices?: number; + /** + * Format: int64 + * @description Total document count across all indices + */ + totalDocs?: number; + /** @description Human-readable total size */ + totalSize?: string; + /** + * Format: int32 + * @description Current page number (0-based) + */ + page?: number; + /** + * Format: int32 + * @description Page size + */ + pageSize?: number; + /** + * Format: int32 + * @description Total number of pages + */ + totalPages?: number; + }; + GroupDetail: { + /** Format: uuid */ + id?: string; + name?: string; + /** Format: uuid */ + parentGroupId?: string; + /** Format: date-time */ + createdAt?: string; + directRoles?: components["schemas"]["RoleSummary"][]; + effectiveRoles?: components["schemas"]["RoleSummary"][]; + members?: components["schemas"]["UserSummary"][]; + childGroups?: components["schemas"]["GroupSummary"][]; + }; + /** @description Table size and row count information */ + TableSizeResponse: { + /** @description Table name */ + tableName?: string; + /** + * Format: int64 + * @description Approximate row count + */ + rowCount?: number; + /** @description Human-readable data size */ + dataSize?: string; + /** @description Human-readable index size */ + indexSize?: string; + /** + * Format: int64 + * @description Data size in bytes + */ + dataSizeBytes?: number; + /** + * Format: int64 + * @description Index size in bytes + */ + indexSizeBytes?: number; + }; + /** @description Database connection and version status */ + DatabaseStatusResponse: { + /** @description Whether the database is reachable */ + connected?: boolean; + /** @description PostgreSQL version string */ + version?: string; + /** @description Database host */ + host?: string; + /** @description Current schema search path */ + schema?: string; + /** @description Whether TimescaleDB extension is available */ + timescaleDb?: boolean; + }; + /** @description Currently running database query */ + ActiveQueryResponse: { + /** + * Format: int32 + * @description Backend process ID + */ + pid?: number; + /** + * Format: double + * @description Query duration in seconds + */ + durationSeconds?: number; + /** @description Backend state (active, idle, etc.) */ + state?: string; + /** @description SQL query text */ + query?: string; + }; + /** @description HikariCP connection pool statistics */ + ConnectionPoolResponse: { + /** + * Format: int32 + * @description Number of currently active connections + */ + activeConnections?: number; + /** + * Format: int32 + * @description Number of idle connections + */ + idleConnections?: number; + /** + * Format: int32 + * @description Number of threads waiting for a connection + */ + pendingThreads?: number; + /** + * Format: int64 + * @description Maximum wait time in milliseconds + */ + maxWaitMs?: number; + /** + * Format: int32 + * @description Maximum pool size + */ + maxPoolSize?: number; + }; + /** @description Paginated audit log entries */ + AuditLogPageResponse: { + /** @description Audit log entries */ + items?: components["schemas"]["AuditRecord"][]; + /** + * Format: int64 + * @description Total number of matching entries + */ + totalCount?: number; + /** + * Format: int32 + * @description Current page number (0-based) + */ + page?: number; + /** + * Format: int32 + * @description Page size + */ + pageSize?: number; + /** + * Format: int32 + * @description Total number of pages + */ + totalPages?: number; + }; + AuditRecord: { + /** Format: int64 */ + id?: number; + /** Format: date-time */ + timestamp?: string; + username?: string; + action?: string; + /** @enum {string} */ + category?: "INFRA" | "AUTH" | "USER_MGMT" | "CONFIG" | "RBAC"; + target?: string; + detail?: { + [key: string]: Record; + }; + /** @enum {string} */ + result?: "SUCCESS" | "FAILURE"; + ipAddress?: string; + userAgent?: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getUser: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User found */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserDetail"]; + }; + }; + /** @description User not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserDetail"]; + }; + }; + }; + }; + updateUser: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateUserRequest"]; + }; + }; + responses: { + /** @description User updated */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteUser: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getThresholds: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ThresholdConfig"]; + }; + }; + }; + }; + updateThresholds: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ThresholdConfigRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ThresholdConfig"]; + }; + }; + }; + }; + getRole: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role found */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RoleDetail"]; + }; + }; + /** @description Role not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RoleDetail"]; + }; + }; + }; + }; + updateRole: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateRoleRequest"]; + }; + }; + responses: { + /** @description Role updated */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Cannot modify system role */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Role not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteRole: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Cannot delete system role */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Role not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Current OIDC configuration (client_secret masked) */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OidcAdminConfigResponse"]; + }; + }; + }; + }; + saveConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["OidcAdminConfigRequest"]; + }; + }; + responses: { + /** @description Configuration saved */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OidcAdminConfigResponse"]; + }; + }; + /** @description Invalid configuration */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + deleteConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Configuration deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Group found */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["GroupDetail"]; + }; + }; + /** @description Group not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["GroupDetail"]; + }; + }; + }; + }; + updateGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UpdateGroupRequest"]; + }; + }; + responses: { + /** @description Group updated */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Group not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Cycle detected in group hierarchy */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + deleteGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Group deleted */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Group not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + searchGet: { + parameters: { + query?: { + status?: string; + timeFrom?: string; + timeTo?: string; + correlationId?: string; + text?: string; + routeId?: string; + agentId?: string; + processorType?: string; + group?: string; + offset?: number; + limit?: number; + sortField?: string; + sortDir?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SearchResultExecutionSummary"]; + }; + }; + }; + }; + searchPost: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["SearchRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["SearchResultExecutionSummary"]; + }; + }; + }; + }; + ingestMetrics: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Data accepted for processing */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Buffer full, retry later */ + 503: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + ingestExecutions: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Data accepted for processing */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + ingestDiagrams: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": string; + }; + }; + responses: { + /** @description Data accepted for processing */ + 202: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + refresh: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RefreshRequest"]; + }; + }; + responses: { + /** @description Token refreshed */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AuthTokenResponse"]; + }; + }; + /** @description Invalid refresh token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + callback: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CallbackRequest"]; + }; + }; + responses: { + /** @description Authentication successful */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AuthTokenResponse"]; + }; + }; + /** @description OIDC authentication failed */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Account not provisioned */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description OIDC not configured or disabled */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AuthTokenResponse"]; + }; + }; + }; + }; + login: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["LoginRequest"]; + }; + }; + responses: { + /** @description Login successful */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AuthTokenResponse"]; + }; + }; + /** @description Invalid credentials */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + refresh_1: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AgentRefreshRequest"]; + }; + }; + responses: { + /** @description New access token issued */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentRefreshResponse"]; + }; + }; + /** @description Invalid or expired refresh token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentRefreshResponse"]; + }; + }; + /** @description Agent not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentRefreshResponse"]; + }; + }; + }; + }; + heartbeat: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Heartbeat accepted */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Agent not registered */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + sendCommand: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CommandRequest"]; + }; + }; + responses: { + /** @description Command accepted */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandSingleResponse"]; + }; + }; + /** @description Invalid command payload */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandSingleResponse"]; + }; + }; + /** @description Agent not registered */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandSingleResponse"]; + }; + }; + }; + }; + acknowledgeCommand: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + commandId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Command acknowledged */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Command not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + register: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AgentRegistrationRequest"]; + }; + }; + responses: { + /** @description Agent registered successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentRegistrationResponse"]; + }; + }; + /** @description Invalid registration payload */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description Missing or invalid bootstrap token */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentRegistrationResponse"]; + }; + }; + }; + }; + sendGroupCommand: { + parameters: { + query?: never; + header?: never; + path: { + group: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CommandRequest"]; + }; + }; + responses: { + /** @description Commands accepted */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandBroadcastResponse"]; + }; + }; + /** @description Invalid command payload */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandBroadcastResponse"]; + }; + }; + }; + }; + broadcastCommand: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CommandRequest"]; + }; + }; + responses: { + /** @description Commands accepted */ + 202: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandBroadcastResponse"]; + }; + }; + /** @description Invalid command payload */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["CommandBroadcastResponse"]; + }; + }; + }; + }; + listUsers: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User list returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserDetail"][]; + }; + }; + }; + }; + createUser: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateUserRequest"]; + }; + }; + responses: { + /** @description User created */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["UserDetail"]; + }; + }; + }; + }; + assignRoleToUser: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + roleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role assigned */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description User or role not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + removeRoleFromUser: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + roleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role removed */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + addUserToGroup: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User added to group */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + removeUserFromGroup: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + groupId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description User removed from group */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + listRoles: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role list returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RoleDetail"][]; + }; + }; + }; + }; + createRole: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateRoleRequest"]; + }; + }; + responses: { + /** @description Role created */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: string; + }; + }; + }; + }; + }; + testConnection: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Provider reachable */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OidcTestResult"]; + }; + }; + /** @description Provider unreachable or misconfigured */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listGroups: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Group list returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["GroupDetail"][]; + }; + }; + }; + }; + createGroup: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateGroupRequest"]; + }; + }; + responses: { + /** @description Group created */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: string; + }; + }; + }; + }; + }; + assignRoleToGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + roleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role assigned to group */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Group not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + removeRoleFromGroup: { + parameters: { + query?: never; + header?: never; + path: { + id: string; + roleId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Role removed from group */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Group not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + killQuery: { + parameters: { + query?: never; + header?: never; + path: { + pid: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + stats: { + parameters: { + query: { + from: string; + to?: string; + routeId?: string; + group?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ExecutionStats"]; + }; + }; + }; + }; + timeseries: { + parameters: { + query: { + from: string; + to?: string; + buckets?: number; + routeId?: string; + group?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["StatsTimeseries"]; + }; + }; + }; + }; + getMetrics: { + parameters: { + query?: { + from?: string; + to?: string; + appId?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Metrics returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RouteMetrics"][]; + }; + }; + }; + }; + getCatalog: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Catalog returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AppCatalogEntry"][]; + }; + }; + }; + }; + getDetail: { + parameters: { + query?: never; + header?: never; + path: { + executionId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Execution detail found */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ExecutionDetail"]; + }; + }; + /** @description Execution not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ExecutionDetail"]; + }; + }; + }; + }; + getProcessorSnapshot: { + parameters: { + query?: never; + header?: never; + path: { + executionId: string; + index: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Snapshot data */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: string; + }; + }; + }; + /** @description Snapshot not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": { + [key: string]: string; + }; + }; + }; + }; + }; + findByGroupAndRoute: { + parameters: { + query: { + group: string; + routeId: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Diagram layout returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["DiagramLayout"]; + }; + }; + /** @description No diagram found for the given group and route */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["DiagramLayout"]; + }; + }; + }; + }; + renderDiagram: { + parameters: { + query?: never; + header?: never; + path: { + contentHash: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Diagram rendered successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "image/svg+xml": string; + "application/json": components["schemas"]["DiagramLayout"]; + }; + }; + /** @description Diagram not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": Record; + }; + }; + }; + }; + getConfig_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OIDC configuration */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OidcPublicConfigResponse"]; + }; + }; + /** @description OIDC not configured or disabled */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OidcPublicConfigResponse"]; + }; + }; + /** @description Failed to retrieve OIDC provider metadata */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + listAgents: { + parameters: { + query?: { + status?: string; + group?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Agent list returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentInstanceResponse"][]; + }; + }; + /** @description Invalid status filter */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + events: { + parameters: { + query?: never; + header?: { + /** @description Last received event ID (no replay, acknowledged only) */ + "Last-Event-ID"?: string; + }; + path: { + id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description SSE stream opened */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/event-stream": components["schemas"]["SseEmitter"]; + }; + }; + /** @description Agent not registered */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "text/event-stream": components["schemas"]["SseEmitter"]; + }; + }; + }; + }; + getEvents: { + parameters: { + query?: { + appId?: string; + agentId?: string; + from?: string; + to?: string; + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Events returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AgentEventResponse"][]; + }; + }; + }; + }; + getStats: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description RBAC stats returned */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["RbacStats"]; + }; + }; + }; + }; + getStatus: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["OpenSearchStatusResponse"]; + }; + }; + }; + }; + getPipeline: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PipelineStatsResponse"]; + }; + }; + }; + }; + getPerformance: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["PerformanceResponse"]; + }; + }; + }; + }; + getIndices: { + parameters: { + query?: { + page?: number; + size?: number; + search?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["IndicesPageResponse"]; + }; + }; + }; + }; + getTables: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["TableSizeResponse"][]; + }; + }; + }; + }; + getStatus_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["DatabaseStatusResponse"]; + }; + }; + }; + }; + getQueries: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ActiveQueryResponse"][]; + }; + }; + }; + }; + getPool: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["ConnectionPoolResponse"]; + }; + }; + }; + }; + getAuditLog: { + parameters: { + query?: { + username?: string; + category?: string; + search?: string; + from?: string; + to?: string; + sort?: string; + order?: string; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "*/*": components["schemas"]["AuditLogPageResponse"]; + }; + }; + }; + }; + deleteIndex: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; }; - SearchRequest: { - timeFrom?: string; - timeTo?: string; - routeId?: string; - group?: string; - agentId?: string; - status?: string; - text?: string; - offset?: number; - limit?: number; - sortField?: string; - sortDir?: string; - }; - ExecutionDetail: { - executionId: string; - routeId: string; - agentId: string; - groupName: string; - status: string; - startTime: string; - endTime?: string; - durationMs: number; - errorMessage?: string; - errorStacktrace?: string; - correlationId?: string; - exchangeId?: string; - diagramContentHash?: string; - children: components['schemas']['ProcessorNode'][]; - }; - ProcessorNode: { - processorId: string; - processorType: string; - diagramNodeId?: string; - status: string; - startTime: string; - endTime?: string; - durationMs: number; - errorMessage?: string; - children: components['schemas']['ProcessorNode'][]; - }; - ExecutionStats: { - totalCount: number; - failedCount: number; - avgDurationMs: number; - p99LatencyMs: number; - activeCount: number; - totalToday: number; - prevTotalCount: number; - prevFailedCount: number; - prevAvgDurationMs: number; - prevP99DurationMs: number; - }; - StatsTimeseries: { - buckets: components['schemas']['TimeseriesBucket'][]; - }; - TimeseriesBucket: { - time: string; - totalCount: number; - failedCount: number; - avgDurationMs: number; - p99DurationMs: number; - activeCount: number; - }; - SearchResultExecutionSummary: { - data: components['schemas']['ExecutionSummary'][]; - total: number; - offset: number; - limit: number; - }; - UserInfo: { - userId: string; - provider: string; - email: string; - displayName: string; - createdAt: string; - }; - AgentInstanceResponse: { - id: string; - name: string; - group: string; - status: string; - routeIds: string[]; - registeredAt: string; - lastHeartbeat: string; - tps: number; - errorRate: number; - activeRoutes: number; - totalRoutes: number; - uptimeSeconds: number; - }; - AgentEventResponse: { - id: number; - agentId: string; - appId: string; - eventType: string; - detail?: string; - timestamp: string; - }; - AppCatalogEntry: { - appId: string; - routes: components['schemas']['RouteSummary'][]; - agents: components['schemas']['AgentSummary'][]; - agentCount: number; - health: string; - exchangeCount: number; - }; - RouteSummary: { - routeId: string; - exchangeCount: number; - lastSeen?: string; - }; - AgentSummary: { - id: string; - name: string; - status: string; - tps: number; - }; - RouteMetrics: { - routeId: string; - appId: string; - exchangeCount: number; - successRate: number; - avgDurationMs: number; - p99LatencyMs: number; - errorRate: number; - throughputPerSec: number; - sparkline: number[]; - }; - DiagramLayout: Record; - PositionedNode: Record; - PositionedEdge: Record; - OidcAdminConfigResponse: Record; - OidcAdminConfigRequest: Record; - OidcTestResult: Record; - OidcPublicConfigResponse: Record; - AuthTokenResponse: { accessToken: string; refreshToken: string; displayName?: string }; - ErrorResponse: { error: string; details?: string }; - }; }