2026-03-14 14:43:18 +01:00
{
"openapi" : "3.1.0" ,
"info" : {
2026-03-14 15:33:37 +01:00
"title" : "Cameleer3 Server API" ,
"version" : "1.0"
2026-03-14 14:43:18 +01:00
} ,
"servers" : [ ] ,
2026-03-14 15:33:37 +01:00
"security" : [
{
"bearer" : [ ]
}
] ,
2026-03-14 14:43:18 +01:00
"tags" : [
{
"name" : "Agent SSE" ,
"description" : "Server-Sent Events endpoint for agent communication"
} ,
{
"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" : "Ingestion" ,
"description" : "Data ingestion endpoints"
} ,
2026-03-14 15:33:37 +01:00
{
"name" : "Authentication" ,
"description" : "Login and token refresh endpoints"
} ,
2026-03-14 14:43:18 +01:00
{
"name" : "OIDC Config Admin" ,
"description" : "OIDC provider configuration (ADMIN only)"
} ,
{
"name" : "Diagrams" ,
"description" : "Diagram rendering endpoints"
} ,
{
"name" : "Detail" ,
"description" : "Execution detail and processor snapshot endpoints"
} ,
{
"name" : "Search" ,
"description" : "Transaction search endpoints"
}
] ,
"paths" : {
"/admin/users/{userId}/roles" : {
"put" : {
"tags" : [
"User Admin"
] ,
"summary" : "Update user roles" ,
"operationId" : "updateRoles" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/RolesRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Roles updated"
} ,
"404" : {
"description" : "User 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" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
} ,
"put" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Save OIDC configuration" ,
"operationId" : "saveConfig" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Configuration saved" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcAdminConfigResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid configuration" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
} ,
"delete" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Delete OIDC configuration" ,
"operationId" : "deleteConfig" ,
"responses" : {
"204" : {
"description" : "Configuration deleted"
}
}
}
} ,
"/search/executions" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Search executions with basic filters" ,
"operationId" : "searchGet" ,
"parameters" : [
{
"name" : "status" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "timeFrom" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "timeTo" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "correlationId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "text" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "agentId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "processorType" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
2026-03-14 14:43:18 +01:00
{
"name" : "offset" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 0
}
} ,
{
"name" : "limit" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 50
}
2026-03-14 19:34:22 +01:00
} ,
{
"name" : "sortField" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "sortDir" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/SearchResultExecutionSummary"
}
}
}
}
}
} ,
"post" : {
"tags" : [
"Search"
] ,
"summary" : "Advanced search with all filters" ,
"operationId" : "searchPost" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/SearchRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/SearchResultExecutionSummary"
}
}
}
}
}
}
} ,
"/data/metrics" : {
"post" : {
"tags" : [
"Ingestion"
] ,
"summary" : "Ingest agent metrics" ,
"description" : "Accepts an array of MetricsSnapshot objects" ,
"operationId" : "ingestMetrics" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"type" : "string"
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Data accepted for processing"
} ,
"503" : {
"description" : "Buffer full, retry later"
}
}
}
} ,
"/data/executions" : {
"post" : {
"tags" : [
"Ingestion"
] ,
"summary" : "Ingest route execution data" ,
"description" : "Accepts a single RouteExecution or an array of RouteExecutions" ,
"operationId" : "ingestExecutions" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"type" : "string"
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Data accepted for processing"
} ,
"503" : {
"description" : "Buffer full, retry later"
}
}
}
} ,
"/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"
} ,
"503" : {
"description" : "Buffer full, retry later"
}
}
}
} ,
"/auth/refresh" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Refresh access token" ,
2026-03-14 14:43:18 +01:00
"operationId" : "refresh" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/RefreshRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Token refreshed" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "Invalid refresh token" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/auth/oidc/callback" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Exchange OIDC authorization code for JWTs" ,
2026-03-14 14:43:18 +01:00
"operationId" : "callback" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/CallbackRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Authentication successful" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "OIDC authentication failed" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
}
}
}
} ,
"403" : {
"description" : "Account not provisioned" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
}
}
}
} ,
"404" : {
"description" : "OIDC not configured or disabled" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/AuthTokenResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/auth/login" : {
"post" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Login with local credentials" ,
2026-03-14 14:43:18 +01:00
"operationId" : "login" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/LoginRequest"
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Login successful" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AuthTokenResponse"
}
}
}
} ,
"401" : {
"description" : "Invalid credentials" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/refresh" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Refresh access token" ,
"description" : "Issues a new access JWT from a valid refresh token" ,
"operationId" : "refresh_1" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "New access token issued" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"401" : {
"description" : "Invalid or expired refresh token" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Agent not found" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRefreshResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/heartbeat" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Agent heartbeat ping" ,
"description" : "Updates the agent's last heartbeat timestamp" ,
"operationId" : "heartbeat" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Heartbeat accepted"
} ,
"404" : {
"description" : "Agent not registered"
}
}
}
} ,
"/agents/{id}/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Send command to a specific agent" ,
"description" : "Sends a config-update, deep-trace, or replay command to the specified agent" ,
"operationId" : "sendCommand" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Command accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Agent not registered" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandSingleResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/commands/{commandId}/ack" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Acknowledge command receipt" ,
"description" : "Agent acknowledges that it has received and processed a command" ,
"operationId" : "acknowledgeCommand" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "commandId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Command acknowledged"
} ,
"404" : {
"description" : "Command not found"
}
}
}
} ,
"/agents/register" : {
"post" : {
"tags" : [
"Agent Management"
] ,
"summary" : "Register an agent" ,
"description" : "Registers a new agent or re-registers an existing one. Requires bootstrap token in Authorization header." ,
"operationId" : "register" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"200" : {
"description" : "Agent registered successfully" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid registration payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"401" : {
"description" : "Missing or invalid bootstrap token" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/AgentRegistrationResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/groups/{group}/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Send command to all agents in a group" ,
"description" : "Sends a command to all LIVE agents in the specified group" ,
"operationId" : "sendGroupCommand" ,
"parameters" : [
{
"name" : "group" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Commands accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/commands" : {
"post" : {
"tags" : [
"Agent Commands"
] ,
"summary" : "Broadcast command to all live agents" ,
"description" : "Sends a command to all agents currently in LIVE state" ,
"operationId" : "broadcastCommand" ,
"requestBody" : {
"content" : {
"application/json" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandRequest"
2026-03-14 14:43:18 +01:00
}
}
} ,
"required" : true
} ,
"responses" : {
"202" : {
"description" : "Commands accepted" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid command payload" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/CommandBroadcastResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/admin/oidc/test" : {
"post" : {
"tags" : [
"OIDC Config Admin"
] ,
"summary" : "Test OIDC provider connectivity" ,
"operationId" : "testConnection" ,
"responses" : {
"200" : {
"description" : "Provider reachable" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcTestResult"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Provider unreachable or misconfigured" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/search/stats" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Aggregate execution stats (P99 latency, active count)" ,
"operationId" : "stats" ,
"parameters" : [
{
"name" : "from" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "to" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionStats"
}
}
}
}
}
}
} ,
"/search/stats/timeseries" : {
"get" : {
"tags" : [
"Search"
] ,
"summary" : "Bucketed time-series stats over a time window" ,
"operationId" : "timeseries" ,
"parameters" : [
{
"name" : "from" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "to" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
{
"name" : "buckets" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "integer" ,
"format" : "int32" ,
"default" : 24
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "OK" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/StatsTimeseries"
}
}
}
}
}
}
} ,
"/executions/{executionId}" : {
"get" : {
"tags" : [
"Detail"
] ,
"summary" : "Get execution detail with nested processor tree" ,
"operationId" : "getDetail" ,
"parameters" : [
{
"name" : "executionId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Execution detail found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionDetail"
}
}
}
} ,
"404" : {
"description" : "Execution not found" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ExecutionDetail"
}
}
}
}
}
}
} ,
"/executions/{executionId}/processors/{index}/snapshot" : {
"get" : {
"tags" : [
"Detail"
] ,
"summary" : "Get exchange snapshot for a specific processor" ,
"operationId" : "getProcessorSnapshot" ,
"parameters" : [
{
"name" : "executionId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "index" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "integer" ,
"format" : "int32"
}
}
] ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "Snapshot data" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string"
}
}
}
}
} ,
"404" : {
"description" : "Snapshot not found" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
"type" : "object" ,
"additionalProperties" : {
"type" : "string"
}
}
}
}
}
}
}
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"/diagrams" : {
"get" : {
"tags" : [
"Diagrams"
] ,
"summary" : "Find diagram by application group and route ID" ,
"description" : "Resolves group to agent IDs and finds the latest diagram for the route" ,
"operationId" : "findByGroupAndRoute" ,
"parameters" : [
{
"name" : "group" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "routeId" ,
"in" : "query" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Diagram layout returned" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/DiagramLayout"
}
}
}
} ,
"404" : {
"description" : "No diagram found for the given group and route"
}
}
}
} ,
2026-03-14 14:43:18 +01:00
"/diagrams/{contentHash}/render" : {
"get" : {
"tags" : [
"Diagrams"
] ,
"summary" : "Render a route diagram" ,
"description" : "Returns SVG (default) or JSON layout based on Accept header" ,
"operationId" : "renderDiagram" ,
"parameters" : [
{
"name" : "contentHash" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "Diagram rendered successfully" ,
"content" : {
2026-03-14 15:33:37 +01:00
"image/svg+xml" : {
2026-03-14 14:43:18 +01:00
"schema" : {
2026-03-14 15:33:37 +01:00
"type" : "string"
}
} ,
"application/json" : {
"schema" : {
"$ref" : "#/components/schemas/DiagramLayout"
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"404" : {
"description" : "Diagram not found" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "object"
}
}
}
}
}
}
} ,
"/auth/oidc/config" : {
"get" : {
"tags" : [
2026-03-14 15:33:37 +01:00
"Authentication"
2026-03-14 14:43:18 +01:00
] ,
2026-03-14 15:33:37 +01:00
"summary" : "Get OIDC config for SPA login flow" ,
2026-03-14 14:43:18 +01:00
"operationId" : "getConfig_1" ,
"responses" : {
"200" : {
2026-03-14 15:33:37 +01:00
"description" : "OIDC configuration" ,
2026-03-14 14:43:18 +01:00
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/OidcPublicConfigResponse"
}
}
}
} ,
"404" : {
"description" : "OIDC not configured or disabled" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/OidcPublicConfigResponse"
}
}
}
} ,
"500" : {
"description" : "Failed to retrieve OIDC provider metadata" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents" : {
"get" : {
"tags" : [
"Agent Management"
] ,
"summary" : "List all agents" ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"description" : "Returns all registered agents, optionally filtered by status and/or group" ,
2026-03-14 14:43:18 +01:00
"operationId" : "listAgents" ,
"parameters" : [
{
"name" : "status" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
{
"name" : "group" ,
"in" : "query" ,
"required" : false ,
"schema" : {
"type" : "string"
}
2026-03-14 14:43:18 +01:00
}
] ,
"responses" : {
"200" : {
"description" : "Agent list returned" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/AgentInstanceResponse"
}
2026-03-14 14:43:18 +01:00
}
}
}
} ,
"400" : {
"description" : "Invalid status filter" ,
"content" : {
"*/*" : {
"schema" : {
2026-03-14 15:33:37 +01:00
"$ref" : "#/components/schemas/ErrorResponse"
2026-03-14 14:43:18 +01:00
}
}
}
}
}
}
} ,
"/agents/{id}/events" : {
"get" : {
"tags" : [
"Agent SSE"
] ,
"summary" : "Open SSE event stream" ,
"description" : "Opens a Server-Sent Events stream for the specified agent. Commands (config-update, deep-trace, replay) are pushed as events. Ping keepalive comments sent every 15 seconds." ,
"operationId" : "events" ,
"parameters" : [
{
"name" : "id" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
} ,
{
"name" : "Last-Event-ID" ,
"in" : "header" ,
"description" : "Last received event ID (no replay, acknowledged only)" ,
"required" : false ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "SSE stream opened" ,
"content" : {
"text/event-stream" : {
"schema" : {
"$ref" : "#/components/schemas/SseEmitter"
}
}
}
} ,
"404" : {
"description" : "Agent not registered" ,
"content" : {
"text/event-stream" : {
"schema" : {
"$ref" : "#/components/schemas/SseEmitter"
}
}
}
}
}
}
} ,
"/admin/users" : {
"get" : {
"tags" : [
"User Admin"
] ,
"summary" : "List all users" ,
"operationId" : "listUsers" ,
"responses" : {
"200" : {
"description" : "User list returned" ,
"content" : {
"*/*" : {
"schema" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/UserInfo"
}
}
}
}
}
}
}
} ,
"/admin/users/{userId}" : {
"get" : {
"tags" : [
"User Admin"
] ,
"summary" : "Get user by ID" ,
"operationId" : "getUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"200" : {
"description" : "User found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/UserInfo"
}
}
}
} ,
"404" : {
"description" : "User not found" ,
"content" : {
"*/*" : {
"schema" : {
"$ref" : "#/components/schemas/UserInfo"
}
}
}
}
}
} ,
"delete" : {
"tags" : [
"User Admin"
] ,
"summary" : "Delete user" ,
"operationId" : "deleteUser" ,
"parameters" : [
{
"name" : "userId" ,
"in" : "path" ,
"required" : true ,
"schema" : {
"type" : "string"
}
}
] ,
"responses" : {
"204" : {
"description" : "User deleted"
}
}
}
}
} ,
"components" : {
"schemas" : {
"RolesRequest" : {
"type" : "object" ,
"properties" : {
"roles" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
}
}
} ,
2026-03-14 15:33:37 +01:00
"OidcAdminConfigRequest" : {
2026-03-14 14:43:18 +01:00
"type" : "object" ,
2026-03-14 15:33:37 +01:00
"description" : "OIDC configuration update request" ,
2026-03-14 14:43:18 +01:00
"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"
2026-03-14 16:09:24 +01:00
} ,
"displayNameClaim" : {
"type" : "string"
2026-03-14 14:43:18 +01:00
}
}
} ,
2026-03-14 15:33:37 +01:00
"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"
2026-03-14 16:09:24 +01:00
} ,
"displayNameClaim" : {
"type" : "string"
2026-03-14 15:33:37 +01:00
}
}
} ,
2026-03-14 14:43:18 +01:00
"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"
} ,
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
"group" : {
"type" : "string"
} ,
"agentIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
2026-03-14 14:43:18 +01:00
"offset" : {
"type" : "integer" ,
"format" : "int32"
} ,
"limit" : {
"type" : "integer" ,
"format" : "int32"
2026-03-14 19:34:22 +01:00
} ,
"sortField" : {
"type" : "string"
} ,
"sortDir" : {
"type" : "string"
2026-03-14 14:43:18 +01:00
}
}
} ,
"ExecutionSummary" : {
"type" : "object" ,
"properties" : {
"executionId" : {
"type" : "string"
} ,
"routeId" : {
"type" : "string"
} ,
"agentId" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"correlationId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"diagramContentHash" : {
"type" : "string"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"agentId" ,
"correlationId" ,
"diagramContentHash" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"executionId" ,
"routeId" ,
"startTime" ,
"status"
]
2026-03-14 14:43:18 +01:00
} ,
"SearchResultExecutionSummary" : {
"type" : "object" ,
"properties" : {
"data" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ExecutionSummary"
}
} ,
"total" : {
"type" : "integer" ,
"format" : "int64"
} ,
"offset" : {
"type" : "integer" ,
"format" : "int32"
} ,
"limit" : {
"type" : "integer" ,
"format" : "int32"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"data" ,
"limit" ,
"offset" ,
"total"
]
2026-03-14 14:43:18 +01:00
} ,
"RefreshRequest" : {
"type" : "object" ,
"properties" : {
"refreshToken" : {
"type" : "string"
}
}
} ,
2026-03-14 15:33:37 +01:00
"AuthTokenResponse" : {
"type" : "object" ,
"description" : "JWT token pair" ,
"properties" : {
"accessToken" : {
"type" : "string"
} ,
"refreshToken" : {
"type" : "string"
2026-03-14 16:09:24 +01:00
} ,
"displayName" : {
"type" : "string"
2026-03-14 16:14:07 +01:00
} ,
"idToken" : {
"type" : "string" ,
"description" : "OIDC id_token for end-session logout (only present after OIDC login)"
2026-03-14 15:33:37 +01:00
}
} ,
"required" : [
"accessToken" ,
2026-03-14 16:09:24 +01:00
"refreshToken" ,
"displayName"
2026-03-14 15:33:37 +01:00
]
} ,
2026-03-14 14:43:18 +01:00
"CallbackRequest" : {
"type" : "object" ,
"properties" : {
"code" : {
"type" : "string"
} ,
"redirectUri" : {
"type" : "string"
}
}
} ,
"LoginRequest" : {
"type" : "object" ,
"properties" : {
"username" : {
"type" : "string"
} ,
"password" : {
"type" : "string"
}
}
} ,
2026-03-14 15:33:37 +01:00
"AgentRefreshRequest" : {
"type" : "object" ,
"description" : "Agent token refresh request" ,
"properties" : {
"refreshToken" : {
"type" : "string"
}
} ,
"required" : [
"refreshToken"
]
} ,
"AgentRefreshResponse" : {
"type" : "object" ,
"description" : "Refreshed access token" ,
"properties" : {
"accessToken" : {
"type" : "string"
}
} ,
"required" : [
"accessToken"
]
} ,
"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"
]
} ,
"OidcTestResult" : {
"type" : "object" ,
"description" : "OIDC provider connectivity test result" ,
"properties" : {
"status" : {
"type" : "string"
} ,
"authorizationEndpoint" : {
"type" : "string"
}
} ,
"required" : [
"authorizationEndpoint" ,
"status"
]
} ,
2026-03-14 14:43:18 +01:00
"ExecutionStats" : {
"type" : "object" ,
"properties" : {
"totalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"failedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"avgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"p99LatencyMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"activeCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"totalToday" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevTotalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevFailedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevAvgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"prevP99LatencyMs" : {
"type" : "integer" ,
"format" : "int64"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"activeCount" ,
"avgDurationMs" ,
"failedCount" ,
"p99LatencyMs" ,
"prevAvgDurationMs" ,
"prevFailedCount" ,
"prevP99LatencyMs" ,
"prevTotalCount" ,
"totalCount" ,
"totalToday"
]
2026-03-14 14:43:18 +01:00
} ,
"StatsTimeseries" : {
"type" : "object" ,
"properties" : {
"buckets" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/TimeseriesBucket"
}
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"buckets"
]
2026-03-14 14:43:18 +01:00
} ,
"TimeseriesBucket" : {
"type" : "object" ,
"properties" : {
"time" : {
"type" : "string" ,
"format" : "date-time"
} ,
"totalCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"failedCount" : {
"type" : "integer" ,
"format" : "int64"
} ,
"avgDurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"p99DurationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"activeCount" : {
"type" : "integer" ,
"format" : "int64"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"activeCount" ,
"avgDurationMs" ,
"failedCount" ,
"p99DurationMs" ,
"time" ,
"totalCount"
]
2026-03-14 14:43:18 +01:00
} ,
"ExecutionDetail" : {
"type" : "object" ,
"properties" : {
"executionId" : {
"type" : "string"
} ,
"routeId" : {
"type" : "string"
} ,
"agentId" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"correlationId" : {
"type" : "string"
} ,
"exchangeId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"errorStackTrace" : {
"type" : "string"
} ,
"diagramContentHash" : {
"type" : "string"
} ,
"processors" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ProcessorNode"
}
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"agentId" ,
"correlationId" ,
"diagramContentHash" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"errorStackTrace" ,
"exchangeId" ,
"executionId" ,
"processors" ,
"routeId" ,
"startTime" ,
"status"
]
2026-03-14 14:43:18 +01:00
} ,
"ProcessorNode" : {
"type" : "object" ,
"properties" : {
"processorId" : {
"type" : "string"
} ,
"processorType" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"startTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"endTime" : {
"type" : "string" ,
"format" : "date-time"
} ,
"durationMs" : {
"type" : "integer" ,
"format" : "int64"
} ,
"diagramNodeId" : {
"type" : "string"
} ,
"errorMessage" : {
"type" : "string"
} ,
"errorStackTrace" : {
"type" : "string"
2026-03-14 15:33:37 +01:00
} ,
"children" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/ProcessorNode"
}
}
} ,
"required" : [
"children" ,
"diagramNodeId" ,
"durationMs" ,
"endTime" ,
"errorMessage" ,
"errorStackTrace" ,
"processorId" ,
"processorType" ,
"startTime" ,
"status"
]
} ,
"DiagramLayout" : {
"type" : "object" ,
"properties" : {
"width" : {
"type" : "number" ,
"format" : "double"
} ,
"height" : {
"type" : "number" ,
"format" : "double"
} ,
"nodes" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedNode"
}
} ,
"edges" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedEdge"
}
2026-03-14 14:43:18 +01:00
}
}
} ,
2026-03-14 15:33:37 +01:00
"PositionedEdge" : {
"type" : "object" ,
"properties" : {
"sourceId" : {
"type" : "string"
} ,
"targetId" : {
"type" : "string"
} ,
"label" : {
"type" : "string"
} ,
"points" : {
"type" : "array" ,
"items" : {
"type" : "array" ,
"items" : {
"type" : "number" ,
"format" : "double"
}
}
}
}
} ,
"PositionedNode" : {
"type" : "object" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"label" : {
"type" : "string"
} ,
"type" : {
"type" : "string"
} ,
"x" : {
"type" : "number" ,
"format" : "double"
} ,
"y" : {
"type" : "number" ,
"format" : "double"
} ,
"width" : {
"type" : "number" ,
"format" : "double"
} ,
"height" : {
"type" : "number" ,
"format" : "double"
Add route diagram page with execution overlay and group-aware APIs
Backend: Add group filtering to agent list, search, stats, and timeseries
endpoints. Add diagram lookup by group+routeId. Resolve application group
to agent IDs server-side for ClickHouse IN-clause queries.
Frontend: New route detail page at /apps/{group}/routes/{routeId} with
three tabs (Diagram, Performance, Processor Tree). SVG diagram rendering
with panzoom, execution overlay (glow effects, duration/sequence badges,
flow particles, minimap), and processor detail panel. uPlot charts for
performance tab replacing old SVG sparklines. Ctrl+Click from
ExecutionExplorer navigates to route diagram with overlay.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:35:42 +01:00
} ,
"children" : {
"type" : "array" ,
"items" : {
"$ref" : "#/components/schemas/PositionedNode"
}
2026-03-14 15:33:37 +01:00
}
}
} ,
"OidcPublicConfigResponse" : {
"type" : "object" ,
"description" : "OIDC configuration for SPA login flow" ,
"properties" : {
"issuer" : {
"type" : "string"
} ,
"clientId" : {
"type" : "string"
} ,
"authorizationEndpoint" : {
"type" : "string"
} ,
"endSessionEndpoint" : {
"type" : "string" ,
"description" : "Present if the provider supports RP-initiated logout"
}
} ,
"required" : [
"authorizationEndpoint" ,
"clientId" ,
"issuer"
]
} ,
"AgentInstanceResponse" : {
"type" : "object" ,
"description" : "Agent instance summary" ,
"properties" : {
"id" : {
"type" : "string"
} ,
"name" : {
"type" : "string"
} ,
"group" : {
"type" : "string"
} ,
"status" : {
"type" : "string"
} ,
"routeIds" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"registeredAt" : {
"type" : "string" ,
"format" : "date-time"
} ,
"lastHeartbeat" : {
"type" : "string" ,
"format" : "date-time"
}
} ,
"required" : [
"group" ,
"id" ,
"lastHeartbeat" ,
"name" ,
"registeredAt" ,
"routeIds" ,
"status"
]
} ,
2026-03-14 14:43:18 +01:00
"SseEmitter" : {
"type" : "object" ,
"properties" : {
"timeout" : {
"type" : "integer" ,
"format" : "int64"
}
}
} ,
"UserInfo" : {
"type" : "object" ,
"properties" : {
"userId" : {
"type" : "string"
} ,
"provider" : {
"type" : "string"
} ,
"email" : {
"type" : "string"
} ,
"displayName" : {
"type" : "string"
} ,
"roles" : {
"type" : "array" ,
"items" : {
"type" : "string"
}
} ,
"createdAt" : {
"type" : "string" ,
"format" : "date-time"
}
2026-03-14 15:33:37 +01:00
} ,
"required" : [
"createdAt" ,
"displayName" ,
"email" ,
"provider" ,
"roles" ,
"userId"
]
}
} ,
"securitySchemes" : {
"bearer" : {
"type" : "http" ,
"scheme" : "bearer" ,
"bearerFormat" : "JWT"
2026-03-14 14:43:18 +01:00
}
}
}
}