agentic-qe 1.8.4 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/agentic-jujutsu/SKILL.md +645 -0
- package/CHANGELOG.md +375 -0
- package/README.md +86 -18
- package/dist/App.d.ts +5 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +15 -0
- package/dist/App.js.map +1 -0
- package/dist/cli/commands/constitution.d.ts +34 -0
- package/dist/cli/commands/constitution.d.ts.map +1 -0
- package/dist/cli/commands/constitution.js +679 -0
- package/dist/cli/commands/constitution.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -75
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +22 -2292
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +36 -0
- package/dist/cli/commands/telemetry.d.ts.map +1 -0
- package/dist/cli/commands/telemetry.js +364 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/index.js +66 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agents.d.ts +22 -0
- package/dist/cli/init/agents.d.ts.map +1 -0
- package/dist/cli/init/agents.js +522 -0
- package/dist/cli/init/agents.js.map +1 -0
- package/dist/cli/init/bash-wrapper.d.ts +14 -0
- package/dist/cli/init/bash-wrapper.d.ts.map +1 -0
- package/dist/cli/init/bash-wrapper.js +47 -0
- package/dist/cli/init/bash-wrapper.js.map +1 -0
- package/dist/cli/init/claude-config.d.ts +24 -0
- package/dist/cli/init/claude-config.d.ts.map +1 -0
- package/dist/cli/init/claude-config.js +275 -0
- package/dist/cli/init/claude-config.js.map +1 -0
- package/dist/cli/init/claude-md.d.ts +19 -0
- package/dist/cli/init/claude-md.d.ts.map +1 -0
- package/dist/cli/init/claude-md.js +153 -0
- package/dist/cli/init/claude-md.js.map +1 -0
- package/dist/cli/init/commands.d.ts +6 -0
- package/dist/cli/init/commands.d.ts.map +1 -0
- package/dist/cli/init/commands.js +83 -0
- package/dist/cli/init/commands.js.map +1 -0
- package/dist/cli/init/database-init.d.ts +15 -0
- package/dist/cli/init/database-init.d.ts.map +1 -0
- package/dist/cli/init/database-init.js +203 -0
- package/dist/cli/init/database-init.js.map +1 -0
- package/dist/cli/init/directory-structure.d.ts +14 -0
- package/dist/cli/init/directory-structure.d.ts.map +1 -0
- package/dist/cli/init/directory-structure.js +107 -0
- package/dist/cli/init/directory-structure.js.map +1 -0
- package/dist/cli/init/documentation.d.ts +14 -0
- package/dist/cli/init/documentation.d.ts.map +1 -0
- package/dist/cli/init/documentation.js +195 -0
- package/dist/cli/init/documentation.js.map +1 -0
- package/dist/cli/init/fleet-config.d.ts +34 -0
- package/dist/cli/init/fleet-config.d.ts.map +1 -0
- package/dist/cli/init/fleet-config.js +269 -0
- package/dist/cli/init/fleet-config.js.map +1 -0
- package/dist/cli/init/helpers.d.ts +6 -0
- package/dist/cli/init/helpers.d.ts.map +1 -0
- package/dist/cli/init/helpers.js +94 -0
- package/dist/cli/init/helpers.js.map +1 -0
- package/dist/cli/init/index.d.ts +32 -0
- package/dist/cli/init/index.d.ts.map +1 -0
- package/dist/cli/init/index.js +294 -0
- package/dist/cli/init/index.js.map +1 -0
- package/dist/cli/init/skills.d.ts +6 -0
- package/dist/cli/init/skills.d.ts.map +1 -0
- package/dist/cli/init/skills.js +138 -0
- package/dist/cli/init/skills.js.map +1 -0
- package/dist/cli/init/utils/file-utils.d.ts +74 -0
- package/dist/cli/init/utils/file-utils.d.ts.map +1 -0
- package/dist/cli/init/utils/file-utils.js +187 -0
- package/dist/cli/init/utils/file-utils.js.map +1 -0
- package/dist/cli/init/utils/index.d.ts +18 -0
- package/dist/cli/init/utils/index.d.ts.map +1 -0
- package/dist/cli/init/utils/index.js +48 -0
- package/dist/cli/init/utils/index.js.map +1 -0
- package/dist/cli/init/utils/log-utils.d.ts +47 -0
- package/dist/cli/init/utils/log-utils.d.ts.map +1 -0
- package/dist/cli/init/utils/log-utils.js +68 -0
- package/dist/cli/init/utils/log-utils.js.map +1 -0
- package/dist/cli/init/utils/path-utils.d.ts +91 -0
- package/dist/cli/init/utils/path-utils.d.ts.map +1 -0
- package/dist/cli/init/utils/path-utils.js +208 -0
- package/dist/cli/init/utils/path-utils.js.map +1 -0
- package/dist/cli/init/utils/validation-utils.d.ts +44 -0
- package/dist/cli/init/utils/validation-utils.d.ts.map +1 -0
- package/dist/cli/init/utils/validation-utils.js +68 -0
- package/dist/cli/init/utils/validation-utils.js.map +1 -0
- package/dist/cli/init/utils.d.ts +183 -0
- package/dist/cli/init/utils.d.ts.map +1 -0
- package/dist/cli/init/utils.js +354 -0
- package/dist/cli/init/utils.js.map +1 -0
- package/dist/components/Dashboard/Dashboard.d.ts +4 -0
- package/dist/components/Dashboard/Dashboard.d.ts.map +1 -0
- package/dist/components/Dashboard/Dashboard.js +148 -0
- package/dist/components/Dashboard/Dashboard.js.map +1 -0
- package/dist/components/Dashboard/DashboardHeader.d.ts +4 -0
- package/dist/components/Dashboard/DashboardHeader.d.ts.map +1 -0
- package/dist/components/Dashboard/DashboardHeader.js +138 -0
- package/dist/components/Dashboard/DashboardHeader.js.map +1 -0
- package/dist/constitution/evaluators/ast-evaluator.d.ts +42 -0
- package/dist/constitution/evaluators/ast-evaluator.d.ts.map +1 -0
- package/dist/constitution/evaluators/ast-evaluator.js +303 -0
- package/dist/constitution/evaluators/ast-evaluator.js.map +1 -0
- package/dist/constitution/evaluators/base.d.ts +144 -0
- package/dist/constitution/evaluators/base.d.ts.map +1 -0
- package/dist/constitution/evaluators/base.js +144 -0
- package/dist/constitution/evaluators/base.js.map +1 -0
- package/dist/constitution/evaluators/index.d.ts +19 -0
- package/dist/constitution/evaluators/index.d.ts.map +1 -0
- package/dist/constitution/evaluators/index.js +56 -0
- package/dist/constitution/evaluators/index.js.map +1 -0
- package/dist/constitution/evaluators/metric-evaluator.d.ts +59 -0
- package/dist/constitution/evaluators/metric-evaluator.d.ts.map +1 -0
- package/dist/constitution/evaluators/metric-evaluator.js +195 -0
- package/dist/constitution/evaluators/metric-evaluator.js.map +1 -0
- package/dist/constitution/evaluators/pattern-evaluator.d.ts +66 -0
- package/dist/constitution/evaluators/pattern-evaluator.d.ts.map +1 -0
- package/dist/constitution/evaluators/pattern-evaluator.js +221 -0
- package/dist/constitution/evaluators/pattern-evaluator.js.map +1 -0
- package/dist/constitution/evaluators/semantic-evaluator.d.ts +68 -0
- package/dist/constitution/evaluators/semantic-evaluator.d.ts.map +1 -0
- package/dist/constitution/evaluators/semantic-evaluator.js +250 -0
- package/dist/constitution/evaluators/semantic-evaluator.js.map +1 -0
- package/dist/contexts/DashboardContext.d.ts +41 -0
- package/dist/contexts/DashboardContext.d.ts.map +1 -0
- package/dist/contexts/DashboardContext.js +187 -0
- package/dist/contexts/DashboardContext.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +40 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +279 -120
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/hooks/useKeyboardShortcuts.d.ts +12 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.js +69 -0
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/telemetry/instrumentation/agent.d.ts +158 -0
- package/dist/telemetry/instrumentation/agent.d.ts.map +1 -0
- package/dist/telemetry/instrumentation/agent.js +372 -0
- package/dist/telemetry/instrumentation/agent.js.map +1 -0
- package/dist/telemetry/instrumentation/index.d.ts +24 -0
- package/dist/telemetry/instrumentation/index.d.ts.map +1 -0
- package/dist/telemetry/instrumentation/index.js +54 -0
- package/dist/telemetry/instrumentation/index.js.map +1 -0
- package/dist/telemetry/instrumentation/memory.d.ts +313 -0
- package/dist/telemetry/instrumentation/memory.d.ts.map +1 -0
- package/dist/telemetry/instrumentation/memory.js +552 -0
- package/dist/telemetry/instrumentation/memory.js.map +1 -0
- package/dist/telemetry/instrumentation/task.d.ts +146 -0
- package/dist/telemetry/instrumentation/task.d.ts.map +1 -0
- package/dist/telemetry/instrumentation/task.js +305 -0
- package/dist/telemetry/instrumentation/task.js.map +1 -0
- package/dist/telemetry/metrics/collectors/cost.d.ts +246 -0
- package/dist/telemetry/metrics/collectors/cost.d.ts.map +1 -0
- package/dist/telemetry/metrics/collectors/cost.js +526 -0
- package/dist/telemetry/metrics/collectors/cost.js.map +1 -0
- package/dist/telemetry/metrics/collectors/pricing-config.d.ts +87 -0
- package/dist/telemetry/metrics/collectors/pricing-config.d.ts.map +1 -0
- package/dist/telemetry/metrics/collectors/pricing-config.js +207 -0
- package/dist/telemetry/metrics/collectors/pricing-config.js.map +1 -0
- package/dist/telemetry/metrics/index.d.ts +4 -1
- package/dist/telemetry/metrics/index.d.ts.map +1 -1
- package/dist/telemetry/metrics/index.js +18 -2
- package/dist/telemetry/metrics/index.js.map +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/telemetry/types.d.ts.map +1 -1
- package/dist/visualization/api/RestEndpoints.d.ts +136 -0
- package/dist/visualization/api/RestEndpoints.d.ts.map +1 -0
- package/dist/visualization/api/RestEndpoints.js +428 -0
- package/dist/visualization/api/RestEndpoints.js.map +1 -0
- package/dist/visualization/api/WebSocketServer.d.ts +165 -0
- package/dist/visualization/api/WebSocketServer.d.ts.map +1 -0
- package/dist/visualization/api/WebSocketServer.js +518 -0
- package/dist/visualization/api/WebSocketServer.js.map +1 -0
- package/dist/visualization/core/DataTransformer.d.ts +89 -0
- package/dist/visualization/core/DataTransformer.d.ts.map +1 -0
- package/dist/visualization/core/DataTransformer.js +478 -0
- package/dist/visualization/core/DataTransformer.js.map +1 -0
- package/dist/visualization/index.d.ts +92 -0
- package/dist/visualization/index.d.ts.map +1 -0
- package/dist/visualization/index.js +121 -0
- package/dist/visualization/index.js.map +1 -0
- package/dist/visualization/types.d.ts +148 -0
- package/dist/visualization/types.d.ts.map +1 -0
- package/dist/visualization/types.js +7 -0
- package/dist/visualization/types.js.map +1 -0
- package/dist/voting/consensus.d.ts +87 -0
- package/dist/voting/consensus.d.ts.map +1 -0
- package/dist/voting/consensus.js +568 -0
- package/dist/voting/consensus.js.map +1 -0
- package/dist/voting/index.d.ts +12 -0
- package/dist/voting/index.d.ts.map +1 -0
- package/dist/voting/index.js +36 -0
- package/dist/voting/index.js.map +1 -0
- package/dist/voting/orchestrator.d.ts +65 -0
- package/dist/voting/orchestrator.d.ts.map +1 -0
- package/dist/voting/orchestrator.js +306 -0
- package/dist/voting/orchestrator.js.map +1 -0
- package/dist/voting/panel-assembly.d.ts +54 -0
- package/dist/voting/panel-assembly.d.ts.map +1 -0
- package/dist/voting/panel-assembly.js +192 -0
- package/dist/voting/panel-assembly.js.map +1 -0
- package/dist/voting/protocol.d.ts +119 -0
- package/dist/voting/protocol.d.ts.map +1 -0
- package/dist/voting/protocol.js +18 -0
- package/dist/voting/protocol.js.map +1 -0
- package/dist/voting/types.d.ts +125 -0
- package/dist/voting/types.d.ts.map +1 -0
- package/dist/voting/types.js +7 -0
- package/dist/voting/types.js.map +1 -0
- package/package.json +27 -2
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview REST API endpoints for visualization data
|
|
4
|
+
* @module visualization/api/RestEndpoints
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.RestApiServer = void 0;
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const cors_1 = __importDefault(require("cors"));
|
|
13
|
+
const DataTransformer_1 = require("../core/DataTransformer");
|
|
14
|
+
const api_1 = require("@opentelemetry/api");
|
|
15
|
+
/**
|
|
16
|
+
* REST API server for visualization data
|
|
17
|
+
*
|
|
18
|
+
* Endpoints:
|
|
19
|
+
* - GET /api/visualization/events - List events with pagination and filtering
|
|
20
|
+
* - GET /api/visualization/reasoning/:taskId - Get reasoning chain details
|
|
21
|
+
* - GET /api/visualization/metrics - Get aggregated metrics
|
|
22
|
+
* - GET /api/visualization/agents/:agentId/history - Get agent activity history
|
|
23
|
+
* - GET /api/visualization/sessions/:sessionId - Get complete session visualization
|
|
24
|
+
* - GET /api/visualization/graph/:sessionId - Get visualization graph
|
|
25
|
+
*
|
|
26
|
+
* Features:
|
|
27
|
+
* - Cursor-based pagination
|
|
28
|
+
* - ETag response caching
|
|
29
|
+
* - OpenTelemetry instrumentation
|
|
30
|
+
* - Comprehensive error handling
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const api = new RestApiServer(eventStore, reasoningStore, {
|
|
35
|
+
* port: 3000,
|
|
36
|
+
* enableEtag: true,
|
|
37
|
+
* enableCors: true
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* await api.start();
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
class RestApiServer {
|
|
44
|
+
constructor(eventStore, reasoningStore, config = {}) {
|
|
45
|
+
this.tracer = api_1.trace.getTracer('aqe-visualization-api');
|
|
46
|
+
this.eventStore = eventStore;
|
|
47
|
+
this.reasoningStore = reasoningStore;
|
|
48
|
+
this.transformer = new DataTransformer_1.DataTransformer(eventStore, reasoningStore);
|
|
49
|
+
this.config = { ...RestApiServer.DEFAULT_CONFIG, ...config };
|
|
50
|
+
this.isRunning = false;
|
|
51
|
+
this.etagCache = new Map();
|
|
52
|
+
// Initialize Express app
|
|
53
|
+
this.app = (0, express_1.default)();
|
|
54
|
+
this.setupMiddleware();
|
|
55
|
+
this.setupRoutes();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Setup Express middleware
|
|
59
|
+
*/
|
|
60
|
+
setupMiddleware() {
|
|
61
|
+
// CORS configuration
|
|
62
|
+
if (this.config.enableCors) {
|
|
63
|
+
this.app.use((0, cors_1.default)({
|
|
64
|
+
origin: this.config.corsOrigins,
|
|
65
|
+
methods: ['GET', 'OPTIONS'],
|
|
66
|
+
allowedHeaders: ['Content-Type', 'Authorization', 'If-None-Match'],
|
|
67
|
+
maxAge: 86400,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
// Body parsing
|
|
71
|
+
this.app.use(express_1.default.json());
|
|
72
|
+
this.app.use(express_1.default.urlencoded({ extended: true }));
|
|
73
|
+
// Request logging middleware
|
|
74
|
+
this.app.use((req, res, next) => {
|
|
75
|
+
const requestId = this.generateRequestId();
|
|
76
|
+
req.requestId = requestId;
|
|
77
|
+
req.startTime = Date.now();
|
|
78
|
+
const span = this.tracer.startSpan(`HTTP ${req.method} ${req.path}`, {
|
|
79
|
+
attributes: {
|
|
80
|
+
'http.method': req.method,
|
|
81
|
+
'http.url': req.path,
|
|
82
|
+
'http.request_id': requestId,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
req.span = span;
|
|
86
|
+
next();
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Setup Express routes
|
|
91
|
+
*/
|
|
92
|
+
setupRoutes() {
|
|
93
|
+
// GET /api/visualization/events
|
|
94
|
+
this.app.get('/api/visualization/events', this.handleGetEvents.bind(this));
|
|
95
|
+
// GET /api/visualization/reasoning/:chainId
|
|
96
|
+
this.app.get('/api/visualization/reasoning/:chainId', this.handleGetReasoningRoute.bind(this));
|
|
97
|
+
// GET /api/visualization/metrics
|
|
98
|
+
this.app.get('/api/visualization/metrics', this.handleGetMetricsRoute.bind(this));
|
|
99
|
+
// GET /api/visualization/agents/:agentId/history
|
|
100
|
+
this.app.get('/api/visualization/agents/:agentId/history', this.handleGetAgentHistoryRoute.bind(this));
|
|
101
|
+
// GET /api/visualization/sessions/:sessionId
|
|
102
|
+
this.app.get('/api/visualization/sessions/:sessionId', this.handleGetSessionRoute.bind(this));
|
|
103
|
+
// GET /api/visualization/graph/:sessionId
|
|
104
|
+
this.app.get('/api/visualization/graph/:sessionId', this.handleGetGraphRoute.bind(this));
|
|
105
|
+
// Error handling middleware
|
|
106
|
+
this.app.use((err, req, res, next) => {
|
|
107
|
+
const span = req.span;
|
|
108
|
+
if (span) {
|
|
109
|
+
span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: err.message });
|
|
110
|
+
span.recordException(err);
|
|
111
|
+
span.end();
|
|
112
|
+
}
|
|
113
|
+
const statusCode = err.message.startsWith('Not found') ? 404 : 500;
|
|
114
|
+
res.status(statusCode).json({
|
|
115
|
+
success: false,
|
|
116
|
+
error: err.message,
|
|
117
|
+
metadata: {
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
request_id: req.requestId || 'unknown',
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
// 404 handler
|
|
124
|
+
this.app.use((req, res) => {
|
|
125
|
+
res.status(404).json({
|
|
126
|
+
success: false,
|
|
127
|
+
error: `Not found: ${req.path}`,
|
|
128
|
+
metadata: {
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
request_id: req.requestId || 'unknown',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Start the REST API server
|
|
137
|
+
*/
|
|
138
|
+
async start() {
|
|
139
|
+
if (this.isRunning) {
|
|
140
|
+
throw new Error('REST API server is already running');
|
|
141
|
+
}
|
|
142
|
+
await new Promise((resolve, reject) => {
|
|
143
|
+
this.server = this.app.listen(this.config.port, () => {
|
|
144
|
+
this.isRunning = true;
|
|
145
|
+
console.log(`REST API server listening on port ${this.config.port}`);
|
|
146
|
+
resolve();
|
|
147
|
+
});
|
|
148
|
+
this.server.on('error', reject);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Stop the REST API server
|
|
153
|
+
*/
|
|
154
|
+
async stop() {
|
|
155
|
+
if (!this.isRunning || !this.server) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
await new Promise((resolve) => {
|
|
159
|
+
this.server.close(() => {
|
|
160
|
+
this.isRunning = false;
|
|
161
|
+
resolve();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* GET /api/visualization/events?since=timestamp&limit=100&offset=0
|
|
167
|
+
*/
|
|
168
|
+
async handleGetEvents(req, res) {
|
|
169
|
+
try {
|
|
170
|
+
const { since, limit: limitStr, offset: offsetStr } = req.query;
|
|
171
|
+
const limit = Math.min(parseInt(limitStr || String(this.config.defaultLimit)), this.config.maxLimit);
|
|
172
|
+
const offset = parseInt(offsetStr || '0');
|
|
173
|
+
let events;
|
|
174
|
+
if (since) {
|
|
175
|
+
events = this.eventStore.getEventsByTimeRange({ start: since, end: new Date().toISOString() }, { limit, offset });
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
events = this.eventStore.getRecentEvents(limit, offset);
|
|
179
|
+
}
|
|
180
|
+
// Get total count for pagination
|
|
181
|
+
const stats = this.eventStore.getStatistics();
|
|
182
|
+
const total = stats.totalEvents;
|
|
183
|
+
this.sendSuccessResponse(res, req, events, {
|
|
184
|
+
limit,
|
|
185
|
+
offset,
|
|
186
|
+
total,
|
|
187
|
+
has_more: offset + events.length < total,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* GET /api/visualization/reasoning/:chainId
|
|
196
|
+
*/
|
|
197
|
+
async handleGetReasoningRoute(req, res) {
|
|
198
|
+
try {
|
|
199
|
+
const { chainId } = req.params;
|
|
200
|
+
const tree = this.transformer.buildReasoningTree(chainId);
|
|
201
|
+
if (!tree) {
|
|
202
|
+
throw new Error(`Reasoning chain not found: ${chainId}`);
|
|
203
|
+
}
|
|
204
|
+
this.sendSuccessResponse(res, req, tree);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* GET /api/visualization/metrics?timeRange=1h|24h|7d
|
|
212
|
+
*/
|
|
213
|
+
async handleGetMetricsRoute(req, res) {
|
|
214
|
+
try {
|
|
215
|
+
const { timeRange } = req.query;
|
|
216
|
+
// Calculate time range
|
|
217
|
+
const now = new Date();
|
|
218
|
+
let startTime;
|
|
219
|
+
switch (timeRange) {
|
|
220
|
+
case '1h':
|
|
221
|
+
startTime = new Date(now.getTime() - 60 * 60 * 1000);
|
|
222
|
+
break;
|
|
223
|
+
case '24h':
|
|
224
|
+
startTime = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
225
|
+
break;
|
|
226
|
+
case '7d':
|
|
227
|
+
startTime = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
228
|
+
break;
|
|
229
|
+
default:
|
|
230
|
+
startTime = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
231
|
+
}
|
|
232
|
+
const events = this.eventStore.getEventsByTimeRange({
|
|
233
|
+
start: startTime.toISOString(),
|
|
234
|
+
end: now.toISOString(),
|
|
235
|
+
});
|
|
236
|
+
const eventStats = this.eventStore.getStatistics();
|
|
237
|
+
const reasoningStats = this.reasoningStore.getStatistics();
|
|
238
|
+
const metrics = {
|
|
239
|
+
time_range: {
|
|
240
|
+
start: startTime.toISOString(),
|
|
241
|
+
end: now.toISOString(),
|
|
242
|
+
duration_ms: now.getTime() - startTime.getTime(),
|
|
243
|
+
},
|
|
244
|
+
events: {
|
|
245
|
+
total: events.length,
|
|
246
|
+
by_type: this.groupByType(events),
|
|
247
|
+
by_agent: this.groupByAgent(events),
|
|
248
|
+
},
|
|
249
|
+
reasoning: {
|
|
250
|
+
total_chains: reasoningStats.totalChains,
|
|
251
|
+
total_steps: reasoningStats.totalSteps,
|
|
252
|
+
completed_chains: reasoningStats.completedChains,
|
|
253
|
+
failed_chains: reasoningStats.failedChains,
|
|
254
|
+
avg_steps_per_chain: reasoningStats.avgStepsPerChain,
|
|
255
|
+
avg_confidence: reasoningStats.avgConfidence,
|
|
256
|
+
},
|
|
257
|
+
overall: {
|
|
258
|
+
unique_agents: eventStats.uniqueAgents,
|
|
259
|
+
unique_sessions: eventStats.uniqueSessions,
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
this.sendSuccessResponse(res, req, metrics);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* GET /api/visualization/agents/:agentId/history?limit=100&offset=0
|
|
270
|
+
*/
|
|
271
|
+
async handleGetAgentHistoryRoute(req, res) {
|
|
272
|
+
try {
|
|
273
|
+
const { agentId } = req.params;
|
|
274
|
+
const { limit: limitStr, offset: offsetStr } = req.query;
|
|
275
|
+
const limit = Math.min(parseInt(limitStr || String(this.config.defaultLimit)), this.config.maxLimit);
|
|
276
|
+
const offset = parseInt(offsetStr || '0');
|
|
277
|
+
const events = this.eventStore.getEventsByAgent(agentId, { limit, offset });
|
|
278
|
+
const chains = this.reasoningStore.getChainsByAgent(agentId, { limit, offset });
|
|
279
|
+
const total = this.eventStore.countEventsByAgent(agentId);
|
|
280
|
+
const history = {
|
|
281
|
+
agent_id: agentId,
|
|
282
|
+
events,
|
|
283
|
+
reasoning_chains: chains,
|
|
284
|
+
total_events: total,
|
|
285
|
+
};
|
|
286
|
+
this.sendSuccessResponse(res, req, history, {
|
|
287
|
+
limit,
|
|
288
|
+
offset,
|
|
289
|
+
total,
|
|
290
|
+
has_more: offset + events.length < total,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
throw error;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* GET /api/visualization/sessions/:sessionId
|
|
299
|
+
*/
|
|
300
|
+
async handleGetSessionRoute(req, res) {
|
|
301
|
+
try {
|
|
302
|
+
const { sessionId } = req.params;
|
|
303
|
+
const visualization = this.transformer.buildSessionVisualization(sessionId);
|
|
304
|
+
this.sendSuccessResponse(res, req, visualization);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* GET /api/visualization/graph/:sessionId?algorithm=hierarchical&spacing=100
|
|
312
|
+
*/
|
|
313
|
+
async handleGetGraphRoute(req, res) {
|
|
314
|
+
try {
|
|
315
|
+
const { sessionId } = req.params;
|
|
316
|
+
const { algorithm, spacing } = req.query;
|
|
317
|
+
const layoutOptions = {
|
|
318
|
+
algorithm: algorithm || 'hierarchical',
|
|
319
|
+
spacing: parseInt(spacing || '100'),
|
|
320
|
+
direction: 'TB',
|
|
321
|
+
};
|
|
322
|
+
const graph = this.transformer.buildSessionGraph(sessionId, layoutOptions);
|
|
323
|
+
this.sendSuccessResponse(res, req, graph);
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Send success response
|
|
331
|
+
*/
|
|
332
|
+
sendSuccessResponse(res, req, data, pagination) {
|
|
333
|
+
const requestId = req.requestId || 'unknown';
|
|
334
|
+
const span = req.span;
|
|
335
|
+
const response = {
|
|
336
|
+
success: true,
|
|
337
|
+
data,
|
|
338
|
+
metadata: {
|
|
339
|
+
timestamp: new Date().toISOString(),
|
|
340
|
+
request_id: requestId,
|
|
341
|
+
pagination,
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
// Calculate ETag if enabled
|
|
345
|
+
if (this.config.enableEtag) {
|
|
346
|
+
const etag = this.calculateEtag(data);
|
|
347
|
+
res.setHeader('ETag', etag);
|
|
348
|
+
// Check If-None-Match header
|
|
349
|
+
const ifNoneMatch = req.headers['if-none-match'];
|
|
350
|
+
if (ifNoneMatch === etag) {
|
|
351
|
+
if (span) {
|
|
352
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
|
353
|
+
span.end();
|
|
354
|
+
}
|
|
355
|
+
res.status(304).end();
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Set cache headers
|
|
360
|
+
res.setHeader('Cache-Control', 'private, max-age=60');
|
|
361
|
+
if (span) {
|
|
362
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
|
363
|
+
span.end();
|
|
364
|
+
}
|
|
365
|
+
res.status(200).json(response);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Calculate ETag for response caching
|
|
369
|
+
*/
|
|
370
|
+
calculateEtag(data) {
|
|
371
|
+
const hash = require('crypto')
|
|
372
|
+
.createHash('md5')
|
|
373
|
+
.update(JSON.stringify(data))
|
|
374
|
+
.digest('hex');
|
|
375
|
+
return `"${hash}"`;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Generate unique request ID
|
|
379
|
+
*/
|
|
380
|
+
generateRequestId() {
|
|
381
|
+
return `req-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Group events by type
|
|
385
|
+
*/
|
|
386
|
+
groupByType(events) {
|
|
387
|
+
const groups = {};
|
|
388
|
+
for (const event of events) {
|
|
389
|
+
const e = event;
|
|
390
|
+
groups[e.event_type] = (groups[e.event_type] || 0) + 1;
|
|
391
|
+
}
|
|
392
|
+
return groups;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Group events by agent
|
|
396
|
+
*/
|
|
397
|
+
groupByAgent(events) {
|
|
398
|
+
const groups = {};
|
|
399
|
+
for (const event of events) {
|
|
400
|
+
const e = event;
|
|
401
|
+
groups[e.agent_id] = (groups[e.agent_id] || 0) + 1;
|
|
402
|
+
}
|
|
403
|
+
return groups;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Get server status
|
|
407
|
+
*/
|
|
408
|
+
getStatus() {
|
|
409
|
+
return {
|
|
410
|
+
isRunning: this.isRunning,
|
|
411
|
+
port: this.config.port,
|
|
412
|
+
etagCacheSize: this.etagCache.size,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
exports.RestApiServer = RestApiServer;
|
|
417
|
+
/**
|
|
418
|
+
* Default configuration
|
|
419
|
+
*/
|
|
420
|
+
RestApiServer.DEFAULT_CONFIG = {
|
|
421
|
+
port: 3001,
|
|
422
|
+
enableEtag: true,
|
|
423
|
+
defaultLimit: 50,
|
|
424
|
+
maxLimit: 1000,
|
|
425
|
+
enableCors: true,
|
|
426
|
+
corsOrigins: ['*'],
|
|
427
|
+
};
|
|
428
|
+
//# sourceMappingURL=RestEndpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RestEndpoints.js","sourceRoot":"","sources":["../../../src/visualization/api/RestEndpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WebSocket server for real-time event streaming
|
|
3
|
+
* @module visualization/api/WebSocketServer
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { EventStore } from '../../persistence/event-store';
|
|
7
|
+
import { ReasoningStore } from '../../persistence/reasoning-store';
|
|
8
|
+
import { RealtimeEventMessage, SubscriptionOptions } from '../types';
|
|
9
|
+
import * as http from 'http';
|
|
10
|
+
/**
|
|
11
|
+
* WebSocket server configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface WebSocketServerConfig {
|
|
14
|
+
/** HTTP server to attach to */
|
|
15
|
+
server?: http.Server;
|
|
16
|
+
/** Port to listen on (if no server provided) */
|
|
17
|
+
port?: number;
|
|
18
|
+
/** Heartbeat interval in milliseconds */
|
|
19
|
+
heartbeatInterval?: number;
|
|
20
|
+
/** Client timeout in milliseconds */
|
|
21
|
+
clientTimeout?: number;
|
|
22
|
+
/** Maximum backlog size per client */
|
|
23
|
+
maxBacklogSize?: number;
|
|
24
|
+
/** Enable message compression */
|
|
25
|
+
compression?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* WebSocket server for real-time visualization event streaming
|
|
29
|
+
*
|
|
30
|
+
* Features:
|
|
31
|
+
* - Real-time event streaming with <500ms latency
|
|
32
|
+
* - Client subscription management with filtering
|
|
33
|
+
* - Backpressure handling for high-throughput scenarios
|
|
34
|
+
* - Automatic heartbeat and connection management
|
|
35
|
+
* - Message types: event, reasoning, metrics, heartbeat
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const wsServer = new WebSocketServer(eventStore, reasoningStore, {
|
|
40
|
+
* port: 8080,
|
|
41
|
+
* heartbeatInterval: 30000,
|
|
42
|
+
* maxBacklogSize: 1000
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* await wsServer.start();
|
|
46
|
+
*
|
|
47
|
+
* // Broadcast event to subscribed clients
|
|
48
|
+
* wsServer.broadcastEvent({
|
|
49
|
+
* type: 'event',
|
|
50
|
+
* timestamp: new Date().toISOString(),
|
|
51
|
+
* data: { agent_id: 'test-gen', event_type: 'test_generated' }
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare class WebSocketServer extends EventEmitter {
|
|
56
|
+
private clients;
|
|
57
|
+
private eventStore;
|
|
58
|
+
private reasoningStore;
|
|
59
|
+
private transformer;
|
|
60
|
+
private config;
|
|
61
|
+
private heartbeatTimer?;
|
|
62
|
+
private isRunning;
|
|
63
|
+
private messageQueue;
|
|
64
|
+
private wss?;
|
|
65
|
+
private httpServer?;
|
|
66
|
+
/**
|
|
67
|
+
* Default configuration
|
|
68
|
+
*/
|
|
69
|
+
private static readonly DEFAULT_CONFIG;
|
|
70
|
+
constructor(eventStore: EventStore, reasoningStore: ReasoningStore, config?: WebSocketServerConfig);
|
|
71
|
+
/**
|
|
72
|
+
* Start the WebSocket server
|
|
73
|
+
*/
|
|
74
|
+
start(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Stop the WebSocket server
|
|
77
|
+
*/
|
|
78
|
+
stop(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Handle new WebSocket connection
|
|
81
|
+
*/
|
|
82
|
+
private handleConnection;
|
|
83
|
+
/**
|
|
84
|
+
* Send initial data to newly connected client
|
|
85
|
+
*/
|
|
86
|
+
private sendInitialData;
|
|
87
|
+
/**
|
|
88
|
+
* Handle incoming message from client
|
|
89
|
+
*/
|
|
90
|
+
private handleMessage;
|
|
91
|
+
/**
|
|
92
|
+
* Handle client disconnection
|
|
93
|
+
*/
|
|
94
|
+
private handleDisconnect;
|
|
95
|
+
/**
|
|
96
|
+
* Handle client error
|
|
97
|
+
*/
|
|
98
|
+
private handleError;
|
|
99
|
+
/**
|
|
100
|
+
* Handle pong response (heartbeat)
|
|
101
|
+
*/
|
|
102
|
+
private handlePong;
|
|
103
|
+
/**
|
|
104
|
+
* Disconnect a client
|
|
105
|
+
*/
|
|
106
|
+
private disconnectClient;
|
|
107
|
+
/**
|
|
108
|
+
* Update client subscription
|
|
109
|
+
*/
|
|
110
|
+
private updateSubscription;
|
|
111
|
+
/**
|
|
112
|
+
* Remove client subscription
|
|
113
|
+
*/
|
|
114
|
+
private removeSubscription;
|
|
115
|
+
/**
|
|
116
|
+
* Broadcast event to all subscribed clients
|
|
117
|
+
* @param message - Event message to broadcast
|
|
118
|
+
*/
|
|
119
|
+
broadcastEvent(message: RealtimeEventMessage): void;
|
|
120
|
+
/**
|
|
121
|
+
* Send message to specific client with backpressure handling
|
|
122
|
+
*/
|
|
123
|
+
private sendMessage;
|
|
124
|
+
/**
|
|
125
|
+
* Flush message queue for a client
|
|
126
|
+
*/
|
|
127
|
+
private flushMessageQueue;
|
|
128
|
+
/**
|
|
129
|
+
* Check if message should be sent to client based on subscriptions
|
|
130
|
+
*/
|
|
131
|
+
private shouldSendToClient;
|
|
132
|
+
/**
|
|
133
|
+
* Start heartbeat timer
|
|
134
|
+
*/
|
|
135
|
+
private startHeartbeat;
|
|
136
|
+
/**
|
|
137
|
+
* Stop heartbeat timer
|
|
138
|
+
*/
|
|
139
|
+
private stopHeartbeat;
|
|
140
|
+
/**
|
|
141
|
+
* Generate unique client ID
|
|
142
|
+
*/
|
|
143
|
+
private generateClientId;
|
|
144
|
+
/**
|
|
145
|
+
* Parse subscription options from URL query parameters
|
|
146
|
+
*/
|
|
147
|
+
private parseSubscriptionOptions;
|
|
148
|
+
/**
|
|
149
|
+
* Get server statistics
|
|
150
|
+
*/
|
|
151
|
+
getStatistics(): {
|
|
152
|
+
isRunning: boolean;
|
|
153
|
+
connectedClients: number;
|
|
154
|
+
totalMessagesSent: number;
|
|
155
|
+
averageQueueSize: number;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Get connected clients
|
|
159
|
+
*/
|
|
160
|
+
getConnectedClients(): Array<{
|
|
161
|
+
id: string;
|
|
162
|
+
subscriptions: SubscriptionOptions;
|
|
163
|
+
}>;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=WebSocketServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../../src/visualization/api/WebSocketServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAa7B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;IACrB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,GAAG,CAAC,CAAW;IACvB,OAAO,CAAC,UAAU,CAAC,CAAc;IAEjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAOpC;gBAGA,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,MAAM,GAAE,qBAA0B;IAYpC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAkBnD;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAchC;;OAEG;IACH,aAAa,IAAI;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B;IAcD;;OAEG;IACH,mBAAmB,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,mBAAmB,CAAA;KAAE,CAAC;CAMjF"}
|