@gotza02/smartagent 1.2.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/LICENSE +21 -0
- package/README.md +422 -0
- package/dist/config/index.d.ts +72 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +329 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/agent-manager.d.ts +116 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +460 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/context-manager.d.ts +107 -0
- package/dist/core/context-manager.d.ts.map +1 -0
- package/dist/core/context-manager.js +467 -0
- package/dist/core/context-manager.js.map +1 -0
- package/dist/core/database.d.ts +82 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +751 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/event-emitter.d.ts +110 -0
- package/dist/core/event-emitter.d.ts.map +1 -0
- package/dist/core/event-emitter.js +240 -0
- package/dist/core/event-emitter.js.map +1 -0
- package/dist/core/metrics.d.ts +108 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +281 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/middleware.d.ts +63 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +194 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/plugin-system.d.ts +86 -0
- package/dist/core/plugin-system.d.ts.map +1 -0
- package/dist/core/plugin-system.js +251 -0
- package/dist/core/plugin-system.js.map +1 -0
- package/dist/core/task-scheduler.d.ts +130 -0
- package/dist/core/task-scheduler.d.ts.map +1 -0
- package/dist/core/task-scheduler.js +401 -0
- package/dist/core/task-scheduler.js.map +1 -0
- package/dist/engines/auto-router.d.ts +76 -0
- package/dist/engines/auto-router.d.ts.map +1 -0
- package/dist/engines/auto-router.js +445 -0
- package/dist/engines/auto-router.js.map +1 -0
- package/dist/engines/parallel-execution.d.ts +104 -0
- package/dist/engines/parallel-execution.d.ts.map +1 -0
- package/dist/engines/parallel-execution.js +591 -0
- package/dist/engines/parallel-execution.js.map +1 -0
- package/dist/engines/sequential-thinking.d.ts +88 -0
- package/dist/engines/sequential-thinking.d.ts.map +1 -0
- package/dist/engines/sequential-thinking.js +406 -0
- package/dist/engines/sequential-thinking.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1101 -0
- package/dist/index.js.map +1 -0
- package/dist/security/validation.d.ts +87 -0
- package/dist/security/validation.d.ts.map +1 -0
- package/dist/security/validation.js +465 -0
- package/dist/security/validation.js.map +1 -0
- package/dist/tools/filesystem.d.ts +90 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +292 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/terminal.d.ts +99 -0
- package/dist/tools/terminal.d.ts.map +1 -0
- package/dist/tools/terminal.js +363 -0
- package/dist/tools/terminal.js.map +1 -0
- package/dist/types/index.d.ts +306 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +54 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +189 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics & Monitoring System
|
|
3
|
+
* Performance metrics collection and reporting
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
/**
|
|
7
|
+
* Metrics Manager
|
|
8
|
+
* Collects and manages performance metrics
|
|
9
|
+
*/
|
|
10
|
+
export class MetricsManager {
|
|
11
|
+
metrics = new Map();
|
|
12
|
+
snapshots = [];
|
|
13
|
+
maxSnapshots = 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Register a counter metric
|
|
16
|
+
*/
|
|
17
|
+
registerCounter(name, description) {
|
|
18
|
+
this.metrics.set(name, {
|
|
19
|
+
name,
|
|
20
|
+
type: "counter",
|
|
21
|
+
description,
|
|
22
|
+
values: [],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Register a gauge metric
|
|
27
|
+
*/
|
|
28
|
+
registerGauge(name, description) {
|
|
29
|
+
this.metrics.set(name, {
|
|
30
|
+
name,
|
|
31
|
+
type: "gauge",
|
|
32
|
+
description,
|
|
33
|
+
values: [],
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register a histogram metric
|
|
38
|
+
*/
|
|
39
|
+
registerHistogram(name, description, buckets = [0.1, 0.5, 1, 2, 5, 10]) {
|
|
40
|
+
const metric = {
|
|
41
|
+
name,
|
|
42
|
+
type: "histogram",
|
|
43
|
+
description,
|
|
44
|
+
values: [],
|
|
45
|
+
buckets: [...buckets, Infinity],
|
|
46
|
+
bucketCounts: new Map(),
|
|
47
|
+
};
|
|
48
|
+
for (const bucket of metric.buckets) {
|
|
49
|
+
metric.bucketCounts.set(bucket, 0);
|
|
50
|
+
}
|
|
51
|
+
this.metrics.set(name, metric);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Increment counter
|
|
55
|
+
*/
|
|
56
|
+
increment(name, value = 1, labels) {
|
|
57
|
+
const metric = this.metrics.get(name);
|
|
58
|
+
if (!metric || metric.type !== "counter") {
|
|
59
|
+
logger.warn(`Counter metric not found: ${name}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
metric.values.push({
|
|
63
|
+
value,
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
labels,
|
|
66
|
+
});
|
|
67
|
+
// Keep only recent values
|
|
68
|
+
if (metric.values.length > 1000) {
|
|
69
|
+
metric.values = metric.values.slice(-1000);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Set gauge value
|
|
74
|
+
*/
|
|
75
|
+
setGauge(name, value, labels) {
|
|
76
|
+
const metric = this.metrics.get(name);
|
|
77
|
+
if (!metric || metric.type !== "gauge") {
|
|
78
|
+
logger.warn(`Gauge metric not found: ${name}`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
metric.values.push({
|
|
82
|
+
value,
|
|
83
|
+
timestamp: Date.now(),
|
|
84
|
+
labels,
|
|
85
|
+
});
|
|
86
|
+
// Keep only recent values
|
|
87
|
+
if (metric.values.length > 1000) {
|
|
88
|
+
metric.values = metric.values.slice(-1000);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Observe histogram value
|
|
93
|
+
*/
|
|
94
|
+
observe(name, value, labels) {
|
|
95
|
+
const metric = this.metrics.get(name);
|
|
96
|
+
if (!metric || metric.type !== "histogram") {
|
|
97
|
+
logger.warn(`Histogram metric not found: ${name}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
metric.values.push({
|
|
101
|
+
value,
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
labels,
|
|
104
|
+
});
|
|
105
|
+
// Update bucket counts
|
|
106
|
+
for (const bucket of metric.buckets) {
|
|
107
|
+
if (value <= bucket) {
|
|
108
|
+
const current = metric.bucketCounts.get(bucket) || 0;
|
|
109
|
+
metric.bucketCounts.set(bucket, current + 1);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Keep only recent values
|
|
113
|
+
if (metric.values.length > 1000) {
|
|
114
|
+
metric.values = metric.values.slice(-1000);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get metric value
|
|
119
|
+
*/
|
|
120
|
+
getValue(name) {
|
|
121
|
+
const metric = this.metrics.get(name);
|
|
122
|
+
if (!metric || metric.values.length === 0)
|
|
123
|
+
return null;
|
|
124
|
+
const latest = metric.values[metric.values.length - 1];
|
|
125
|
+
return latest?.value ?? null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get metric summary
|
|
129
|
+
*/
|
|
130
|
+
getSummary(name) {
|
|
131
|
+
const metric = this.metrics.get(name);
|
|
132
|
+
if (!metric || metric.values.length === 0)
|
|
133
|
+
return null;
|
|
134
|
+
const values = metric.values.map((v) => v.value);
|
|
135
|
+
const sum = values.reduce((a, b) => a + b, 0);
|
|
136
|
+
return {
|
|
137
|
+
count: values.length,
|
|
138
|
+
sum,
|
|
139
|
+
avg: sum / values.length,
|
|
140
|
+
min: Math.min(...values),
|
|
141
|
+
max: Math.max(...values),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get histogram buckets
|
|
146
|
+
*/
|
|
147
|
+
getHistogramBuckets(name) {
|
|
148
|
+
const metric = this.metrics.get(name);
|
|
149
|
+
if (!metric || metric.type !== "histogram")
|
|
150
|
+
return null;
|
|
151
|
+
return metric.buckets.map((bucket) => ({
|
|
152
|
+
le: bucket,
|
|
153
|
+
count: metric.bucketCounts.get(bucket) || 0,
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get all metrics
|
|
158
|
+
*/
|
|
159
|
+
getAllMetrics() {
|
|
160
|
+
return Array.from(this.metrics.values());
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Export metrics in Prometheus format
|
|
164
|
+
*/
|
|
165
|
+
exportPrometheus() {
|
|
166
|
+
const lines = [];
|
|
167
|
+
for (const metric of this.metrics.values()) {
|
|
168
|
+
lines.push(`# HELP ${metric.name} ${metric.description}`);
|
|
169
|
+
lines.push(`# TYPE ${metric.name} ${metric.type}`);
|
|
170
|
+
if (metric.type === "histogram") {
|
|
171
|
+
const histMetric = metric;
|
|
172
|
+
for (const bucket of histMetric.buckets) {
|
|
173
|
+
const count = histMetric.bucketCounts.get(bucket) || 0;
|
|
174
|
+
const bucketLabel = bucket === Infinity ? "+Inf" : bucket.toString();
|
|
175
|
+
lines.push(`${metric.name}_bucket{le="${bucketLabel}"} ${count}`);
|
|
176
|
+
}
|
|
177
|
+
const sum = metric.values.reduce((a, v) => a + v.value, 0);
|
|
178
|
+
lines.push(`${metric.name}_sum ${sum}`);
|
|
179
|
+
lines.push(`${metric.name}_count ${metric.values.length}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
const latest = metric.values[metric.values.length - 1];
|
|
183
|
+
if (latest) {
|
|
184
|
+
const labels = latest.labels
|
|
185
|
+
? Object.entries(latest.labels)
|
|
186
|
+
.map(([k, v]) => `${k}="${v}"`)
|
|
187
|
+
.join(",")
|
|
188
|
+
: "";
|
|
189
|
+
lines.push(`${metric.name}${labels ? `{${labels}}` : ""} ${latest.value}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
lines.push("");
|
|
193
|
+
}
|
|
194
|
+
return lines.join("\n");
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Export metrics in JSON format
|
|
198
|
+
*/
|
|
199
|
+
exportJSON() {
|
|
200
|
+
const data = {};
|
|
201
|
+
for (const [name, metric] of this.metrics.entries()) {
|
|
202
|
+
data[name] = {
|
|
203
|
+
type: metric.type,
|
|
204
|
+
description: metric.description,
|
|
205
|
+
values: metric.values,
|
|
206
|
+
};
|
|
207
|
+
if (metric.type === "histogram") {
|
|
208
|
+
data[name] = {
|
|
209
|
+
...data[name],
|
|
210
|
+
buckets: this.getHistogramBuckets(name),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return JSON.stringify(data, null, 2);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Take performance snapshot
|
|
218
|
+
*/
|
|
219
|
+
takeSnapshot() {
|
|
220
|
+
const snapshot = {
|
|
221
|
+
timestamp: Date.now(),
|
|
222
|
+
metrics: {},
|
|
223
|
+
};
|
|
224
|
+
for (const [name, metric] of this.metrics.entries()) {
|
|
225
|
+
const latest = metric.values[metric.values.length - 1];
|
|
226
|
+
if (latest) {
|
|
227
|
+
snapshot.metrics[name] = latest.value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
this.snapshots.push(snapshot);
|
|
231
|
+
// Keep only recent snapshots
|
|
232
|
+
if (this.snapshots.length > this.maxSnapshots) {
|
|
233
|
+
this.snapshots = this.snapshots.slice(-this.maxSnapshots);
|
|
234
|
+
}
|
|
235
|
+
return snapshot;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get snapshots
|
|
239
|
+
*/
|
|
240
|
+
getSnapshots(options = {}) {
|
|
241
|
+
let snapshots = [...this.snapshots];
|
|
242
|
+
if (options.since) {
|
|
243
|
+
snapshots = snapshots.filter((s) => s.timestamp >= options.since.getTime());
|
|
244
|
+
}
|
|
245
|
+
if (options.limit) {
|
|
246
|
+
snapshots = snapshots.slice(-options.limit);
|
|
247
|
+
}
|
|
248
|
+
return snapshots;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Clear all metrics
|
|
252
|
+
*/
|
|
253
|
+
clear() {
|
|
254
|
+
this.metrics.clear();
|
|
255
|
+
this.snapshots = [];
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Register default metrics
|
|
259
|
+
*/
|
|
260
|
+
registerDefaultMetrics() {
|
|
261
|
+
// Agent metrics
|
|
262
|
+
this.registerGauge("swarm_agents_total", "Total number of agents");
|
|
263
|
+
this.registerGauge("swarm_agents_active", "Number of active agents");
|
|
264
|
+
this.registerGauge("swarm_agents_idle", "Number of idle agents");
|
|
265
|
+
// Task metrics
|
|
266
|
+
this.registerCounter("swarm_tasks_created_total", "Total number of tasks created");
|
|
267
|
+
this.registerCounter("swarm_tasks_completed_total", "Total number of tasks completed");
|
|
268
|
+
this.registerCounter("swarm_tasks_failed_total", "Total number of tasks failed");
|
|
269
|
+
this.registerHistogram("swarm_task_duration_seconds", "Task execution duration");
|
|
270
|
+
// Request metrics
|
|
271
|
+
this.registerCounter("swarm_requests_total", "Total number of requests");
|
|
272
|
+
this.registerCounter("swarm_requests_failed_total", "Total number of failed requests");
|
|
273
|
+
this.registerHistogram("swarm_request_duration_seconds", "Request duration");
|
|
274
|
+
// System metrics
|
|
275
|
+
this.registerGauge("swarm_memory_usage_bytes", "Memory usage in bytes");
|
|
276
|
+
this.registerGauge("swarm_cpu_usage_percent", "CPU usage percentage");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Export singleton instance
|
|
280
|
+
export const metricsManager = new MetricsManager();
|
|
281
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/core/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA+B5C;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,SAAS,GAA0B,EAAE,CAAC;IACtC,YAAY,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,eAAe,CAAC,IAAY,EAAE,WAAmB;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YACrB,IAAI;YACJ,IAAI,EAAE,SAAS;YACf,WAAW;YACX,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY,EAAE,WAAmB;QAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YACrB,IAAI;YACJ,IAAI,EAAE,OAAO;YACb,WAAW;YACX,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAY,EAAE,WAAmB,EAAE,UAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9F,MAAM,MAAM,GAAoB;YAC9B,IAAI;YACJ,IAAI,EAAE,WAAW;YACjB,WAAW;YACX,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC;YAC/B,YAAY,EAAE,IAAI,GAAG,EAAE;SACxB,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY,EAAE,QAAgB,CAAC,EAAE,MAA+B;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,MAA+B;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,MAA+B;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,uBAAuB;QACvB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QAOrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9C,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,GAAG;YACH,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACxB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,IAAY;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAoB,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAExD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrC,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAEnD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,MAAyB,CAAC;gBAC7C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxC,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACvD,MAAM,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACrE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,eAAe,WAAW,MAAM,KAAK,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;wBAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;6BAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;6BAC9B,IAAI,CAAC,GAAG,CAAC;wBACd,CAAC,CAAC,EAAE,CAAC;oBACP,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,GAAG;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,IAAgD,CAAC,IAAI,CAAC,GAAG;oBACxD,GAAI,IAAgD,CAAC,IAAI,CAAC;oBAC1D,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;iBACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,QAAQ,GAAwB;YACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,EAAE;SACZ,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9B,6BAA6B;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,UAA4C,EAAE;QACzD,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,KAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,gBAAgB;QAChB,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;QAEjE,eAAe;QACf,IAAI,CAAC,eAAe,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,CAAC;QACnF,IAAI,CAAC,eAAe,CAAC,6BAA6B,EAAE,iCAAiC,CAAC,CAAC;QACvF,IAAI,CAAC,eAAe,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,yBAAyB,CAAC,CAAC;QAEjF,kBAAkB;QAClB,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,CAAC,6BAA6B,EAAE,iCAAiC,CAAC,CAAC;QACvF,IAAI,CAAC,iBAAiB,CAAC,gCAAgC,EAAE,kBAAkB,CAAC,CAAC;QAE7E,iBAAiB;QACjB,IAAI,CAAC,aAAa,CAAC,0BAA0B,EAAE,uBAAuB,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware System
|
|
3
|
+
* Request/Response middleware pipeline
|
|
4
|
+
*/
|
|
5
|
+
import type { ApiResponse } from "../types/index.js";
|
|
6
|
+
type MiddlewareFunction<T = unknown> = (context: MiddlewareContext<T>, next: () => Promise<void>) => Promise<void>;
|
|
7
|
+
interface MiddlewareContext<T = unknown> {
|
|
8
|
+
requestId: string;
|
|
9
|
+
tool: string;
|
|
10
|
+
params: Record<string, unknown>;
|
|
11
|
+
result?: ApiResponse<T>;
|
|
12
|
+
error?: Error;
|
|
13
|
+
metadata: Record<string, unknown>;
|
|
14
|
+
startTime: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Middleware Manager
|
|
18
|
+
* Manages request/response middleware pipeline
|
|
19
|
+
*/
|
|
20
|
+
export declare class MiddlewareManager {
|
|
21
|
+
private registry;
|
|
22
|
+
private rateLimiter;
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Register default middleware
|
|
26
|
+
*/
|
|
27
|
+
private registerDefaultMiddleware;
|
|
28
|
+
/**
|
|
29
|
+
* Register before middleware
|
|
30
|
+
*/
|
|
31
|
+
useBefore(middleware: MiddlewareFunction): void;
|
|
32
|
+
/**
|
|
33
|
+
* Register after middleware
|
|
34
|
+
*/
|
|
35
|
+
useAfter(middleware: MiddlewareFunction): void;
|
|
36
|
+
/**
|
|
37
|
+
* Register error middleware
|
|
38
|
+
*/
|
|
39
|
+
useError(middleware: MiddlewareFunction): void;
|
|
40
|
+
/**
|
|
41
|
+
* Execute middleware pipeline
|
|
42
|
+
*/
|
|
43
|
+
execute<T>(tool: string, params: Record<string, unknown>, handler: () => Promise<ApiResponse<T>>, metadata?: Record<string, unknown>): Promise<ApiResponse<T>>;
|
|
44
|
+
/**
|
|
45
|
+
* Run array of middlewares
|
|
46
|
+
*/
|
|
47
|
+
private runMiddlewares;
|
|
48
|
+
/**
|
|
49
|
+
* Get middleware count
|
|
50
|
+
*/
|
|
51
|
+
getMiddlewareCount(): {
|
|
52
|
+
before: number;
|
|
53
|
+
after: number;
|
|
54
|
+
error: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Clear all middleware
|
|
58
|
+
*/
|
|
59
|
+
clear(): void;
|
|
60
|
+
}
|
|
61
|
+
export declare const middlewareManager: MiddlewareManager;
|
|
62
|
+
export type { MiddlewareFunction, MiddlewareContext };
|
|
63
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/core/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,KAAK,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,CACrC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,UAAU,iBAAiB,CAAC,CAAC,GAAG,OAAO;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAId;IACF,OAAO,CAAC,WAAW,CAAc;;IAQjC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkFjC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAI/C;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAI9C;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAI9C;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACtC,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAiD1B;;OAEG;YACW,cAAc;IAkB5B;;OAEG;IACH,kBAAkB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQtE;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAGzD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware System
|
|
3
|
+
* Request/Response middleware pipeline
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { RateLimiter } from "../security/validation.js";
|
|
7
|
+
import { configManager } from "../config/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Middleware Manager
|
|
10
|
+
* Manages request/response middleware pipeline
|
|
11
|
+
*/
|
|
12
|
+
export class MiddlewareManager {
|
|
13
|
+
registry = {
|
|
14
|
+
before: [],
|
|
15
|
+
after: [],
|
|
16
|
+
error: [],
|
|
17
|
+
};
|
|
18
|
+
rateLimiter;
|
|
19
|
+
constructor() {
|
|
20
|
+
const policy = configManager.getConfig().securityPolicy;
|
|
21
|
+
this.rateLimiter = new RateLimiter(policy);
|
|
22
|
+
this.registerDefaultMiddleware();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Register default middleware
|
|
26
|
+
*/
|
|
27
|
+
registerDefaultMiddleware() {
|
|
28
|
+
// Authentication middleware (FIRST - runs before all others)
|
|
29
|
+
this.useBefore(async (context, next) => {
|
|
30
|
+
const config = configManager.getConfig();
|
|
31
|
+
if (config.auth.enabled) {
|
|
32
|
+
const authToken = context.metadata.authToken;
|
|
33
|
+
if (!authToken) {
|
|
34
|
+
context.error = new Error("Authentication required: authToken not provided");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!config.auth.tokens.includes(authToken)) {
|
|
38
|
+
context.error = new Error("Authentication failed: invalid token");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
logger.debug("Authentication successful", {
|
|
42
|
+
requestId: context.requestId,
|
|
43
|
+
tool: context.tool,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
await next();
|
|
47
|
+
});
|
|
48
|
+
// Rate limiting middleware
|
|
49
|
+
this.useBefore(async (context, next) => {
|
|
50
|
+
const config = configManager.getConfig();
|
|
51
|
+
if (config.securityPolicy.rateLimit.enabled) {
|
|
52
|
+
const key = context.metadata.agentId?.toString() || context.requestId;
|
|
53
|
+
const result = this.rateLimiter.isAllowed(key);
|
|
54
|
+
if (!result.allowed) {
|
|
55
|
+
context.error = new Error(`Rate limit exceeded. Retry after ${result.retryAfter} seconds`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
await next();
|
|
60
|
+
});
|
|
61
|
+
// Request validation middleware
|
|
62
|
+
this.useBefore(async (context, next) => {
|
|
63
|
+
// Validate required parameters
|
|
64
|
+
if (!context.tool) {
|
|
65
|
+
context.error = new Error("Tool name is required");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
await next();
|
|
69
|
+
});
|
|
70
|
+
// Logging middleware
|
|
71
|
+
this.useAfter(async (context, next) => {
|
|
72
|
+
const duration = Date.now() - context.startTime;
|
|
73
|
+
logger.info("Tool execution completed", {
|
|
74
|
+
requestId: context.requestId,
|
|
75
|
+
tool: context.tool,
|
|
76
|
+
duration,
|
|
77
|
+
success: context.result?.success ?? false,
|
|
78
|
+
});
|
|
79
|
+
await next();
|
|
80
|
+
});
|
|
81
|
+
// Error handling middleware
|
|
82
|
+
this.useError(async (context, next) => {
|
|
83
|
+
if (context.error) {
|
|
84
|
+
logger.error("Tool execution error", {
|
|
85
|
+
requestId: context.requestId,
|
|
86
|
+
tool: context.tool,
|
|
87
|
+
error: context.error.message,
|
|
88
|
+
stack: context.error.stack,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
await next();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Register before middleware
|
|
96
|
+
*/
|
|
97
|
+
useBefore(middleware) {
|
|
98
|
+
this.registry.before.push(middleware);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Register after middleware
|
|
102
|
+
*/
|
|
103
|
+
useAfter(middleware) {
|
|
104
|
+
this.registry.after.push(middleware);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Register error middleware
|
|
108
|
+
*/
|
|
109
|
+
useError(middleware) {
|
|
110
|
+
this.registry.error.push(middleware);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Execute middleware pipeline
|
|
114
|
+
*/
|
|
115
|
+
async execute(tool, params, handler, metadata = {}) {
|
|
116
|
+
const requestId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
117
|
+
const context = {
|
|
118
|
+
requestId,
|
|
119
|
+
tool,
|
|
120
|
+
params,
|
|
121
|
+
metadata,
|
|
122
|
+
startTime: Date.now(),
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
// Execute before middleware
|
|
126
|
+
await this.runMiddlewares(this.registry.before, context);
|
|
127
|
+
// Check if error was set by middleware
|
|
128
|
+
if (context.error) {
|
|
129
|
+
throw context.error;
|
|
130
|
+
}
|
|
131
|
+
// Execute handler
|
|
132
|
+
context.result = await handler();
|
|
133
|
+
// Execute after middleware
|
|
134
|
+
await this.runMiddlewares(this.registry.after, context);
|
|
135
|
+
return context.result;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
context.error = error instanceof Error ? error : new Error(String(error));
|
|
139
|
+
// Execute error middleware
|
|
140
|
+
await this.runMiddlewares(this.registry.error, context);
|
|
141
|
+
// Return error response
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: {
|
|
145
|
+
code: "MIDDLEWARE_ERROR",
|
|
146
|
+
message: context.error.message,
|
|
147
|
+
details: { tool, params },
|
|
148
|
+
},
|
|
149
|
+
meta: {
|
|
150
|
+
timestamp: new Date().toISOString(),
|
|
151
|
+
requestId,
|
|
152
|
+
duration: Date.now() - context.startTime,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Run array of middlewares
|
|
159
|
+
*/
|
|
160
|
+
async runMiddlewares(middlewares, context) {
|
|
161
|
+
let index = 0;
|
|
162
|
+
const next = async () => {
|
|
163
|
+
if (index >= middlewares.length)
|
|
164
|
+
return;
|
|
165
|
+
const middleware = middlewares[index++];
|
|
166
|
+
if (middleware) {
|
|
167
|
+
await middleware(context, next);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
await next();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get middleware count
|
|
174
|
+
*/
|
|
175
|
+
getMiddlewareCount() {
|
|
176
|
+
return {
|
|
177
|
+
before: this.registry.before.length,
|
|
178
|
+
after: this.registry.after.length,
|
|
179
|
+
error: this.registry.error.length,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Clear all middleware
|
|
184
|
+
*/
|
|
185
|
+
clear() {
|
|
186
|
+
this.registry.before = [];
|
|
187
|
+
this.registry.after = [];
|
|
188
|
+
this.registry.error = [];
|
|
189
|
+
this.registerDefaultMiddleware();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Export singleton instance
|
|
193
|
+
export const middlewareManager = new MiddlewareManager();
|
|
194
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/core/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin System
|
|
3
|
+
* Extensible plugin architecture for custom tools and agents
|
|
4
|
+
*/
|
|
5
|
+
interface PluginManifest {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
description: string;
|
|
10
|
+
author: string;
|
|
11
|
+
dependencies?: string[];
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
}
|
|
14
|
+
interface Plugin {
|
|
15
|
+
manifest: PluginManifest;
|
|
16
|
+
initialize: () => Promise<void> | void;
|
|
17
|
+
destroy?: () => Promise<void> | void;
|
|
18
|
+
hooks?: Record<string, PluginHook>;
|
|
19
|
+
}
|
|
20
|
+
type PluginHook<T = unknown, R = unknown> = (data: T) => Promise<R> | R;
|
|
21
|
+
/**
|
|
22
|
+
* Plugin Manager
|
|
23
|
+
* Manages plugin lifecycle and hooks
|
|
24
|
+
*/
|
|
25
|
+
export declare class PluginManager {
|
|
26
|
+
private registry;
|
|
27
|
+
/**
|
|
28
|
+
* Register a plugin
|
|
29
|
+
*/
|
|
30
|
+
registerPlugin(plugin: Plugin): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Unregister a plugin
|
|
33
|
+
*/
|
|
34
|
+
unregisterPlugin(pluginId: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Register a hook
|
|
37
|
+
*/
|
|
38
|
+
registerHook(name: string, hook: PluginHook): void;
|
|
39
|
+
/**
|
|
40
|
+
* Unregister a hook
|
|
41
|
+
*/
|
|
42
|
+
unregisterHook(name: string, hook: PluginHook): void;
|
|
43
|
+
/**
|
|
44
|
+
* Execute hooks
|
|
45
|
+
*/
|
|
46
|
+
executeHooks<T, R>(name: string, data: T): Promise<R[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get plugin by ID
|
|
49
|
+
*/
|
|
50
|
+
getPlugin(pluginId: string): Plugin | null;
|
|
51
|
+
/**
|
|
52
|
+
* Get all plugins
|
|
53
|
+
*/
|
|
54
|
+
getAllPlugins(): Plugin[];
|
|
55
|
+
/**
|
|
56
|
+
* Check if plugin is registered
|
|
57
|
+
*/
|
|
58
|
+
hasPlugin(pluginId: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get plugin count
|
|
61
|
+
*/
|
|
62
|
+
getPluginCount(): number;
|
|
63
|
+
/**
|
|
64
|
+
* Get hook count
|
|
65
|
+
*/
|
|
66
|
+
getHookCount(name?: string): number;
|
|
67
|
+
/**
|
|
68
|
+
* Get available hooks
|
|
69
|
+
*/
|
|
70
|
+
getAvailableHooks(): string[];
|
|
71
|
+
/**
|
|
72
|
+
* Load plugin from file
|
|
73
|
+
*/
|
|
74
|
+
loadPluginFromFile(filePath: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Create built-in plugin
|
|
77
|
+
*/
|
|
78
|
+
createBuiltinPlugin(id: string, name: string, hooks: Record<string, PluginHook>): Plugin;
|
|
79
|
+
/**
|
|
80
|
+
* Reset plugin manager
|
|
81
|
+
*/
|
|
82
|
+
reset(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export declare const pluginManager: PluginManager;
|
|
85
|
+
export type { Plugin, PluginManifest, PluginHook };
|
|
86
|
+
//# sourceMappingURL=plugin-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-system.d.ts","sourceRoot":"","sources":["../../src/core/plugin-system.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,UAAU,MAAM;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,KAAK,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAOxE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAGd;IAEF;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsDtD;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoD1D;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAMlD;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAUpD;;OAEG;IACG,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAoB7D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAYnC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5D;;OAEG;IACH,mBAAmB,CACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,MAAM;IAgBT;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAGjD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
|