@hazeljs/agent 0.2.0-alpha.1
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/IMPLEMENTATION_SUMMARY.md +400 -0
- package/LICENSE +192 -0
- package/PERSISTENCE.md +201 -0
- package/PRISMA_INTEGRATION.md +499 -0
- package/PRODUCTION_READINESS.md +264 -0
- package/QUICKSTART.md +135 -0
- package/README.md +541 -0
- package/STATE_VS_MEMORY.md +243 -0
- package/benchmarks/performance.benchmark.ts +157 -0
- package/coverage/clover.xml +1508 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +296 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +2722 -0
- package/dist/agent.module.d.ts +57 -0
- package/dist/agent.module.d.ts.map +1 -0
- package/dist/agent.module.js +99 -0
- package/dist/agent.module.js.map +1 -0
- package/dist/context/agent.context.d.ts +27 -0
- package/dist/context/agent.context.d.ts.map +1 -0
- package/dist/context/agent.context.js +98 -0
- package/dist/context/agent.context.js.map +1 -0
- package/dist/decorators/agent.decorator.d.ts +21 -0
- package/dist/decorators/agent.decorator.d.ts.map +1 -0
- package/dist/decorators/agent.decorator.js +38 -0
- package/dist/decorators/agent.decorator.js.map +1 -0
- package/dist/decorators/delegate.decorator.d.ts +66 -0
- package/dist/decorators/delegate.decorator.d.ts.map +1 -0
- package/dist/decorators/delegate.decorator.js +108 -0
- package/dist/decorators/delegate.decorator.js.map +1 -0
- package/dist/decorators/tool.decorator.d.ts +23 -0
- package/dist/decorators/tool.decorator.d.ts.map +1 -0
- package/dist/decorators/tool.decorator.js +61 -0
- package/dist/decorators/tool.decorator.js.map +1 -0
- package/dist/events/event.emitter.d.ts +45 -0
- package/dist/events/event.emitter.d.ts.map +1 -0
- package/dist/events/event.emitter.js +96 -0
- package/dist/events/event.emitter.js.map +1 -0
- package/dist/executor/agent.executor.d.ts +58 -0
- package/dist/executor/agent.executor.d.ts.map +1 -0
- package/dist/executor/agent.executor.js +312 -0
- package/dist/executor/agent.executor.js.map +1 -0
- package/dist/executor/tool.executor.d.ts +55 -0
- package/dist/executor/tool.executor.d.ts.map +1 -0
- package/dist/executor/tool.executor.js +266 -0
- package/dist/executor/tool.executor.js.map +1 -0
- package/dist/graph/agent-graph.d.ts +131 -0
- package/dist/graph/agent-graph.d.ts.map +1 -0
- package/dist/graph/agent-graph.js +462 -0
- package/dist/graph/agent-graph.js.map +1 -0
- package/dist/graph/agent-graph.types.d.ts +210 -0
- package/dist/graph/agent-graph.types.d.ts.map +1 -0
- package/dist/graph/agent-graph.types.js +12 -0
- package/dist/graph/agent-graph.types.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/agent-system.prompt.d.ts +10 -0
- package/dist/prompts/agent-system.prompt.d.ts.map +1 -0
- package/dist/prompts/agent-system.prompt.js +18 -0
- package/dist/prompts/agent-system.prompt.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +20 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/supervisor-routing.prompt.d.ts +9 -0
- package/dist/prompts/supervisor-routing.prompt.d.ts.map +1 -0
- package/dist/prompts/supervisor-routing.prompt.js +22 -0
- package/dist/prompts/supervisor-routing.prompt.js.map +1 -0
- package/dist/prompts/supervisor-system.prompt.d.ts +9 -0
- package/dist/prompts/supervisor-system.prompt.d.ts.map +1 -0
- package/dist/prompts/supervisor-system.prompt.js +21 -0
- package/dist/prompts/supervisor-system.prompt.js.map +1 -0
- package/dist/registry/agent.registry.d.ts +49 -0
- package/dist/registry/agent.registry.d.ts.map +1 -0
- package/dist/registry/agent.registry.js +90 -0
- package/dist/registry/agent.registry.js.map +1 -0
- package/dist/registry/tool.registry.d.ts +54 -0
- package/dist/registry/tool.registry.d.ts.map +1 -0
- package/dist/registry/tool.registry.js +153 -0
- package/dist/registry/tool.registry.js.map +1 -0
- package/dist/runtime/agent.runtime.d.ts +218 -0
- package/dist/runtime/agent.runtime.d.ts.map +1 -0
- package/dist/runtime/agent.runtime.extensions.d.ts +49 -0
- package/dist/runtime/agent.runtime.extensions.d.ts.map +1 -0
- package/dist/runtime/agent.runtime.extensions.js +93 -0
- package/dist/runtime/agent.runtime.extensions.js.map +1 -0
- package/dist/runtime/agent.runtime.js +448 -0
- package/dist/runtime/agent.runtime.js.map +1 -0
- package/dist/state/agent-state.interface.d.ts +63 -0
- package/dist/state/agent-state.interface.d.ts.map +1 -0
- package/dist/state/agent-state.interface.js +7 -0
- package/dist/state/agent-state.interface.js.map +1 -0
- package/dist/state/agent.state.d.ts +67 -0
- package/dist/state/agent.state.d.ts.map +1 -0
- package/dist/state/agent.state.js +172 -0
- package/dist/state/agent.state.js.map +1 -0
- package/dist/state/database-state.manager.d.ts +63 -0
- package/dist/state/database-state.manager.d.ts.map +1 -0
- package/dist/state/database-state.manager.js +282 -0
- package/dist/state/database-state.manager.js.map +1 -0
- package/dist/state/redis-state.manager.d.ts +81 -0
- package/dist/state/redis-state.manager.d.ts.map +1 -0
- package/dist/state/redis-state.manager.js +253 -0
- package/dist/state/redis-state.manager.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +81 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +220 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/types/agent.types.d.ts +166 -0
- package/dist/types/agent.types.d.ts.map +1 -0
- package/dist/types/agent.types.js +32 -0
- package/dist/types/agent.types.js.map +1 -0
- package/dist/types/event.types.d.ts +198 -0
- package/dist/types/event.types.d.ts.map +1 -0
- package/dist/types/event.types.js +46 -0
- package/dist/types/event.types.js.map +1 -0
- package/dist/types/llm.types.d.ts +66 -0
- package/dist/types/llm.types.d.ts.map +1 -0
- package/dist/types/llm.types.js +7 -0
- package/dist/types/llm.types.js.map +1 -0
- package/dist/types/rag.types.d.ts +40 -0
- package/dist/types/rag.types.d.ts.map +1 -0
- package/dist/types/rag.types.js +7 -0
- package/dist/types/rag.types.js.map +1 -0
- package/dist/types/tool.types.d.ts +118 -0
- package/dist/types/tool.types.d.ts.map +1 -0
- package/dist/types/tool.types.js +19 -0
- package/dist/types/tool.types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +9 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +16 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/health-check.d.ts +71 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +156 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/logger.d.ts +53 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +133 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +90 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +186 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +44 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +82 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +42 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +103 -0
- package/dist/utils/retry.js.map +1 -0
- package/jest.config.js +30 -0
- package/logs/combined.log +1 -0
- package/logs/error.log +0 -0
- package/package.json +74 -0
- package/prisma-schema.example.prisma +76 -0
- package/tests/setup.ts +17 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Collection
|
|
3
|
+
* Track agent performance and usage metrics
|
|
4
|
+
*/
|
|
5
|
+
export interface MetricValue {
|
|
6
|
+
count: number;
|
|
7
|
+
sum: number;
|
|
8
|
+
min: number;
|
|
9
|
+
max: number;
|
|
10
|
+
avg: number;
|
|
11
|
+
lastUpdated: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentMetrics {
|
|
14
|
+
executions: {
|
|
15
|
+
total: number;
|
|
16
|
+
successful: number;
|
|
17
|
+
failed: number;
|
|
18
|
+
successRate: number;
|
|
19
|
+
};
|
|
20
|
+
performance: {
|
|
21
|
+
averageDuration: number;
|
|
22
|
+
minDuration: number;
|
|
23
|
+
maxDuration: number;
|
|
24
|
+
p50Duration: number;
|
|
25
|
+
p95Duration: number;
|
|
26
|
+
p99Duration: number;
|
|
27
|
+
};
|
|
28
|
+
tools: {
|
|
29
|
+
totalCalls: number;
|
|
30
|
+
byTool: Record<string, number>;
|
|
31
|
+
successRate: number;
|
|
32
|
+
};
|
|
33
|
+
llm: {
|
|
34
|
+
totalCalls: number;
|
|
35
|
+
totalTokens: number;
|
|
36
|
+
averageTokensPerCall: number;
|
|
37
|
+
errors: number;
|
|
38
|
+
};
|
|
39
|
+
memory: {
|
|
40
|
+
totalRetrievals: number;
|
|
41
|
+
averageRetrievalTime: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export declare class MetricsCollector {
|
|
45
|
+
private executionCount;
|
|
46
|
+
private successCount;
|
|
47
|
+
private failureCount;
|
|
48
|
+
private durations;
|
|
49
|
+
private toolCalls;
|
|
50
|
+
private toolSuccesses;
|
|
51
|
+
private toolFailures;
|
|
52
|
+
private llmCalls;
|
|
53
|
+
private llmTokens;
|
|
54
|
+
private llmErrors;
|
|
55
|
+
private memoryRetrievals;
|
|
56
|
+
private memoryRetrievalTimes;
|
|
57
|
+
private startTime;
|
|
58
|
+
constructor();
|
|
59
|
+
/**
|
|
60
|
+
* Record an agent execution
|
|
61
|
+
*/
|
|
62
|
+
recordExecution(success: boolean, durationMs: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* Record a tool call
|
|
65
|
+
*/
|
|
66
|
+
recordToolCall(toolName: string, success: boolean): void;
|
|
67
|
+
/**
|
|
68
|
+
* Record an LLM call
|
|
69
|
+
*/
|
|
70
|
+
recordLLMCall(tokens: number, error?: boolean): void;
|
|
71
|
+
/**
|
|
72
|
+
* Record a memory retrieval
|
|
73
|
+
*/
|
|
74
|
+
recordMemoryRetrieval(durationMs: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Get all metrics
|
|
77
|
+
*/
|
|
78
|
+
getMetrics(): AgentMetrics;
|
|
79
|
+
/**
|
|
80
|
+
* Get metrics summary as string
|
|
81
|
+
*/
|
|
82
|
+
getSummary(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Reset all metrics
|
|
85
|
+
*/
|
|
86
|
+
reset(): void;
|
|
87
|
+
private calculateAverage;
|
|
88
|
+
private calculatePercentile;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,WAAW,EAAE;QACX,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAS;;IAM1B;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAe3D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IASxD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe,GAAG,IAAI;IAQ3D;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAU/C;;OAEG;IACH,UAAU,IAAI,YAAY;IAqC1B;;OAEG;IACH,UAAU,IAAI,MAAM;IA0CpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,mBAAmB;CAK5B"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Metrics Collection
|
|
4
|
+
* Track agent performance and usage metrics
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MetricsCollector = void 0;
|
|
8
|
+
class MetricsCollector {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.executionCount = 0;
|
|
11
|
+
this.successCount = 0;
|
|
12
|
+
this.failureCount = 0;
|
|
13
|
+
this.durations = [];
|
|
14
|
+
this.toolCalls = {};
|
|
15
|
+
this.toolSuccesses = 0;
|
|
16
|
+
this.toolFailures = 0;
|
|
17
|
+
this.llmCalls = 0;
|
|
18
|
+
this.llmTokens = 0;
|
|
19
|
+
this.llmErrors = 0;
|
|
20
|
+
this.memoryRetrievals = 0;
|
|
21
|
+
this.memoryRetrievalTimes = [];
|
|
22
|
+
this.startTime = Date.now();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record an agent execution
|
|
26
|
+
*/
|
|
27
|
+
recordExecution(success, durationMs) {
|
|
28
|
+
this.executionCount++;
|
|
29
|
+
if (success) {
|
|
30
|
+
this.successCount++;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.failureCount++;
|
|
34
|
+
}
|
|
35
|
+
this.durations.push(durationMs);
|
|
36
|
+
// Keep only last 1000 durations to prevent memory bloat
|
|
37
|
+
if (this.durations.length > 1000) {
|
|
38
|
+
this.durations = this.durations.slice(-1000);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Record a tool call
|
|
43
|
+
*/
|
|
44
|
+
recordToolCall(toolName, success) {
|
|
45
|
+
this.toolCalls[toolName] = (this.toolCalls[toolName] || 0) + 1;
|
|
46
|
+
if (success) {
|
|
47
|
+
this.toolSuccesses++;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.toolFailures++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Record an LLM call
|
|
55
|
+
*/
|
|
56
|
+
recordLLMCall(tokens, error = false) {
|
|
57
|
+
this.llmCalls++;
|
|
58
|
+
this.llmTokens += tokens;
|
|
59
|
+
if (error) {
|
|
60
|
+
this.llmErrors++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Record a memory retrieval
|
|
65
|
+
*/
|
|
66
|
+
recordMemoryRetrieval(durationMs) {
|
|
67
|
+
this.memoryRetrievals++;
|
|
68
|
+
this.memoryRetrievalTimes.push(durationMs);
|
|
69
|
+
// Keep only last 1000 retrieval times
|
|
70
|
+
if (this.memoryRetrievalTimes.length > 1000) {
|
|
71
|
+
this.memoryRetrievalTimes = this.memoryRetrievalTimes.slice(-1000);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all metrics
|
|
76
|
+
*/
|
|
77
|
+
getMetrics() {
|
|
78
|
+
const sortedDurations = [...this.durations].sort((a, b) => a - b);
|
|
79
|
+
const totalToolCalls = this.toolSuccesses + this.toolFailures;
|
|
80
|
+
return {
|
|
81
|
+
executions: {
|
|
82
|
+
total: this.executionCount,
|
|
83
|
+
successful: this.successCount,
|
|
84
|
+
failed: this.failureCount,
|
|
85
|
+
successRate: this.executionCount > 0 ? this.successCount / this.executionCount : 0,
|
|
86
|
+
},
|
|
87
|
+
performance: {
|
|
88
|
+
averageDuration: this.calculateAverage(this.durations),
|
|
89
|
+
minDuration: Math.min(...this.durations, Infinity),
|
|
90
|
+
maxDuration: Math.max(...this.durations, -Infinity),
|
|
91
|
+
p50Duration: this.calculatePercentile(sortedDurations, 50),
|
|
92
|
+
p95Duration: this.calculatePercentile(sortedDurations, 95),
|
|
93
|
+
p99Duration: this.calculatePercentile(sortedDurations, 99),
|
|
94
|
+
},
|
|
95
|
+
tools: {
|
|
96
|
+
totalCalls: totalToolCalls,
|
|
97
|
+
byTool: { ...this.toolCalls },
|
|
98
|
+
successRate: totalToolCalls > 0 ? this.toolSuccesses / totalToolCalls : 0,
|
|
99
|
+
},
|
|
100
|
+
llm: {
|
|
101
|
+
totalCalls: this.llmCalls,
|
|
102
|
+
totalTokens: this.llmTokens,
|
|
103
|
+
averageTokensPerCall: this.llmCalls > 0 ? this.llmTokens / this.llmCalls : 0,
|
|
104
|
+
errors: this.llmErrors,
|
|
105
|
+
},
|
|
106
|
+
memory: {
|
|
107
|
+
totalRetrievals: this.memoryRetrievals,
|
|
108
|
+
averageRetrievalTime: this.calculateAverage(this.memoryRetrievalTimes),
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get metrics summary as string
|
|
114
|
+
*/
|
|
115
|
+
getSummary() {
|
|
116
|
+
const metrics = this.getMetrics();
|
|
117
|
+
const uptime = Math.floor((Date.now() - this.startTime) / 1000);
|
|
118
|
+
return `
|
|
119
|
+
Agent Metrics Summary
|
|
120
|
+
=====================
|
|
121
|
+
Uptime: ${uptime}s
|
|
122
|
+
|
|
123
|
+
Executions:
|
|
124
|
+
Total: ${metrics.executions.total}
|
|
125
|
+
Success: ${metrics.executions.successful}
|
|
126
|
+
Failed: ${metrics.executions.failed}
|
|
127
|
+
Success Rate: ${(metrics.executions.successRate * 100).toFixed(2)}%
|
|
128
|
+
|
|
129
|
+
Performance:
|
|
130
|
+
Avg Duration: ${metrics.performance.averageDuration.toFixed(2)}ms
|
|
131
|
+
P50: ${metrics.performance.p50Duration.toFixed(2)}ms
|
|
132
|
+
P95: ${metrics.performance.p95Duration.toFixed(2)}ms
|
|
133
|
+
P99: ${metrics.performance.p99Duration.toFixed(2)}ms
|
|
134
|
+
|
|
135
|
+
Tools:
|
|
136
|
+
Total Calls: ${metrics.tools.totalCalls}
|
|
137
|
+
Success Rate: ${(metrics.tools.successRate * 100).toFixed(2)}%
|
|
138
|
+
Top Tools: ${Object.entries(metrics.tools.byTool)
|
|
139
|
+
.sort((a, b) => b[1] - a[1])
|
|
140
|
+
.slice(0, 5)
|
|
141
|
+
.map(([name, count]) => `${name} (${count})`)
|
|
142
|
+
.join(', ')}
|
|
143
|
+
|
|
144
|
+
LLM:
|
|
145
|
+
Total Calls: ${metrics.llm.totalCalls}
|
|
146
|
+
Total Tokens: ${metrics.llm.totalTokens}
|
|
147
|
+
Avg Tokens/Call: ${metrics.llm.averageTokensPerCall.toFixed(2)}
|
|
148
|
+
Errors: ${metrics.llm.errors}
|
|
149
|
+
|
|
150
|
+
Memory:
|
|
151
|
+
Total Retrievals: ${metrics.memory.totalRetrievals}
|
|
152
|
+
Avg Retrieval Time: ${metrics.memory.averageRetrievalTime.toFixed(2)}ms
|
|
153
|
+
`.trim();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Reset all metrics
|
|
157
|
+
*/
|
|
158
|
+
reset() {
|
|
159
|
+
this.executionCount = 0;
|
|
160
|
+
this.successCount = 0;
|
|
161
|
+
this.failureCount = 0;
|
|
162
|
+
this.durations = [];
|
|
163
|
+
this.toolCalls = {};
|
|
164
|
+
this.toolSuccesses = 0;
|
|
165
|
+
this.toolFailures = 0;
|
|
166
|
+
this.llmCalls = 0;
|
|
167
|
+
this.llmTokens = 0;
|
|
168
|
+
this.llmErrors = 0;
|
|
169
|
+
this.memoryRetrievals = 0;
|
|
170
|
+
this.memoryRetrievalTimes = [];
|
|
171
|
+
this.startTime = Date.now();
|
|
172
|
+
}
|
|
173
|
+
calculateAverage(values) {
|
|
174
|
+
if (values.length === 0)
|
|
175
|
+
return 0;
|
|
176
|
+
return values.reduce((sum, val) => sum + val, 0) / values.length;
|
|
177
|
+
}
|
|
178
|
+
calculatePercentile(sortedValues, percentile) {
|
|
179
|
+
if (sortedValues.length === 0)
|
|
180
|
+
return 0;
|
|
181
|
+
const index = Math.ceil((percentile / 100) * sortedValues.length) - 1;
|
|
182
|
+
return sortedValues[Math.max(0, index)] || 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.MetricsCollector = MetricsCollector;
|
|
186
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2CH,MAAa,gBAAgB;IAe3B;QAdQ,mBAAc,GAAG,CAAC,CAAC;QACnB,iBAAY,GAAG,CAAC,CAAC;QACjB,iBAAY,GAAG,CAAC,CAAC;QACjB,cAAS,GAAa,EAAE,CAAC;QACzB,cAAS,GAA2B,EAAE,CAAC;QACvC,kBAAa,GAAG,CAAC,CAAC;QAClB,iBAAY,GAAG,CAAC,CAAC;QACjB,aAAQ,GAAG,CAAC,CAAC;QACb,cAAS,GAAG,CAAC,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QACd,qBAAgB,GAAG,CAAC,CAAC;QACrB,yBAAoB,GAAa,EAAE,CAAC;QAI1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAgB,EAAE,UAAkB;QAClD,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhC,wDAAwD;QACxD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAgB,EAAE,OAAgB;QAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc,EAAE,QAAiB,KAAK;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,UAAkB;QACtC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3C,sCAAsC;QACtC,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QAE9D,OAAO;YACL,UAAU,EAAE;gBACV,KAAK,EAAE,IAAI,CAAC,cAAc;gBAC1B,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,WAAW,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;aACnF;YACD,WAAW,EAAE;gBACX,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;gBACtD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;gBAClD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;gBACnD,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC1D,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC1D,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,CAAC;aAC3D;YACD,KAAK,EAAE;gBACL,UAAU,EAAE,cAAc;gBAC1B,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;gBAC7B,WAAW,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;aAC1E;YACD,GAAG,EAAE;gBACH,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,WAAW,EAAE,IAAI,CAAC,SAAS;gBAC3B,oBAAoB,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5E,MAAM,EAAE,IAAI,CAAC,SAAS;aACvB;YACD,MAAM,EAAE;gBACN,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,oBAAoB,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC;aACvE;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAEhE,OAAO;;;UAGD,MAAM;;;WAGL,OAAO,CAAC,UAAU,CAAC,KAAK;aACtB,OAAO,CAAC,UAAU,CAAC,UAAU;YAC9B,OAAO,CAAC,UAAU,CAAC,MAAM;kBACnB,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;kBAGjD,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;SACvD,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;SAC1C,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;SAC1C,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;;;iBAGlC,OAAO,CAAC,KAAK,CAAC,UAAU;kBACvB,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;eAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;aAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;aAC5C,IAAI,CAAC,IAAI,CAAC;;;iBAGE,OAAO,CAAC,GAAG,CAAC,UAAU;kBACrB,OAAO,CAAC,GAAG,CAAC,WAAW;qBACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,MAAM;;;sBAGR,OAAO,CAAC,MAAM,CAAC,eAAe;wBAC5B,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;KACjE,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CAAC,MAAgB;QACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACnE,CAAC;IAEO,mBAAmB,CAAC,YAAsB,EAAE,UAAkB;QACpE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF;AA3LD,4CA2LC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limiter
|
|
3
|
+
* Token bucket algorithm for rate limiting agent executions
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimiterConfig {
|
|
6
|
+
tokensPerMinute: number;
|
|
7
|
+
burstSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class RateLimiter {
|
|
10
|
+
private tokens;
|
|
11
|
+
private lastRefill;
|
|
12
|
+
private readonly tokensPerMinute;
|
|
13
|
+
private readonly burstSize;
|
|
14
|
+
private readonly refillRate;
|
|
15
|
+
constructor(config: RateLimiterConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Try to consume a token
|
|
18
|
+
* @returns true if token was consumed, false if rate limit exceeded
|
|
19
|
+
*/
|
|
20
|
+
tryConsume(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Wait until a token is available
|
|
23
|
+
* @param timeoutMs Maximum time to wait in milliseconds
|
|
24
|
+
* @returns true if token was acquired, false if timeout
|
|
25
|
+
*/
|
|
26
|
+
waitForToken(timeoutMs?: number): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Get current token count
|
|
29
|
+
*/
|
|
30
|
+
getAvailableTokens(): number;
|
|
31
|
+
/**
|
|
32
|
+
* Reset the rate limiter
|
|
33
|
+
*/
|
|
34
|
+
reset(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Refill tokens based on elapsed time
|
|
37
|
+
*/
|
|
38
|
+
private refill;
|
|
39
|
+
/**
|
|
40
|
+
* Sleep utility
|
|
41
|
+
*/
|
|
42
|
+
private sleep;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,iBAAiB;IAQrC;;;OAGG;IACH,UAAU,IAAI,OAAO;IAWrB;;;;OAIG;IACG,YAAY,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB/D;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAK5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,OAAO,CAAC,MAAM;IASd;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Rate Limiter
|
|
4
|
+
* Token bucket algorithm for rate limiting agent executions
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RateLimiter = void 0;
|
|
8
|
+
class RateLimiter {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.tokensPerMinute = config.tokensPerMinute;
|
|
11
|
+
this.burstSize = config.burstSize || config.tokensPerMinute;
|
|
12
|
+
this.tokens = this.burstSize;
|
|
13
|
+
this.lastRefill = Date.now();
|
|
14
|
+
this.refillRate = this.tokensPerMinute / 60000; // tokens per millisecond
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Try to consume a token
|
|
18
|
+
* @returns true if token was consumed, false if rate limit exceeded
|
|
19
|
+
*/
|
|
20
|
+
tryConsume() {
|
|
21
|
+
this.refill();
|
|
22
|
+
if (this.tokens >= 1) {
|
|
23
|
+
this.tokens -= 1;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wait until a token is available
|
|
30
|
+
* @param timeoutMs Maximum time to wait in milliseconds
|
|
31
|
+
* @returns true if token was acquired, false if timeout
|
|
32
|
+
*/
|
|
33
|
+
async waitForToken(timeoutMs = 30000) {
|
|
34
|
+
const startTime = Date.now();
|
|
35
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
36
|
+
if (this.tryConsume()) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Calculate wait time until next token
|
|
40
|
+
const tokensNeeded = 1 - this.tokens;
|
|
41
|
+
const waitMs = Math.ceil(tokensNeeded / this.refillRate);
|
|
42
|
+
const remainingTimeout = timeoutMs - (Date.now() - startTime);
|
|
43
|
+
const actualWaitMs = Math.min(waitMs, remainingTimeout, 1000);
|
|
44
|
+
if (actualWaitMs > 0) {
|
|
45
|
+
await this.sleep(actualWaitMs);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get current token count
|
|
52
|
+
*/
|
|
53
|
+
getAvailableTokens() {
|
|
54
|
+
this.refill();
|
|
55
|
+
return Math.floor(this.tokens);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reset the rate limiter
|
|
59
|
+
*/
|
|
60
|
+
reset() {
|
|
61
|
+
this.tokens = this.burstSize;
|
|
62
|
+
this.lastRefill = Date.now();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Refill tokens based on elapsed time
|
|
66
|
+
*/
|
|
67
|
+
refill() {
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
const elapsed = now - this.lastRefill;
|
|
70
|
+
const tokensToAdd = elapsed * this.refillRate;
|
|
71
|
+
this.tokens = Math.min(this.burstSize, this.tokens + tokensToAdd);
|
|
72
|
+
this.lastRefill = now;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Sleep utility
|
|
76
|
+
*/
|
|
77
|
+
sleep(ms) {
|
|
78
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.RateLimiter = RateLimiter;
|
|
82
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,MAAa,WAAW;IAOtB,YAAY,MAAyB;QACnC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,yBAAyB;IAC3E,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,YAAoB,KAAK;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,uCAAuC;YACvC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,gBAAgB,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAE9D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,MAAM;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QACtC,MAAM,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAE9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF;AA3FD,kCA2FC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Logic with Exponential Backoff
|
|
3
|
+
* Handles transient failures with configurable retry strategies
|
|
4
|
+
*/
|
|
5
|
+
export interface RetryConfig {
|
|
6
|
+
maxRetries: number;
|
|
7
|
+
initialDelayMs: number;
|
|
8
|
+
maxDelayMs: number;
|
|
9
|
+
backoffMultiplier: number;
|
|
10
|
+
retryableErrors?: string[];
|
|
11
|
+
onRetry?: (attempt: number, error: Error) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare class RetryError extends Error {
|
|
14
|
+
readonly attempts: number;
|
|
15
|
+
readonly lastError: Error;
|
|
16
|
+
constructor(message: string, attempts: number, lastError: Error);
|
|
17
|
+
}
|
|
18
|
+
export declare class RetryHandler {
|
|
19
|
+
private config;
|
|
20
|
+
constructor(config?: Partial<RetryConfig>);
|
|
21
|
+
/**
|
|
22
|
+
* Execute a function with retry logic
|
|
23
|
+
*/
|
|
24
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if an error is retryable
|
|
27
|
+
*/
|
|
28
|
+
private isRetryable;
|
|
29
|
+
/**
|
|
30
|
+
* Calculate delay with exponential backoff and jitter
|
|
31
|
+
*/
|
|
32
|
+
private calculateDelay;
|
|
33
|
+
/**
|
|
34
|
+
* Sleep utility
|
|
35
|
+
*/
|
|
36
|
+
private sleep;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Decorator for automatic retry
|
|
40
|
+
*/
|
|
41
|
+
export declare function Retry(config?: Partial<RetryConfig>): MethodDecorator;
|
|
42
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnD;AAED,qBAAa,UAAW,SAAQ,KAAK;aAGjB,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,KAAK;gBAFhC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,KAAK;CAKnC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAmB7C;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqClD;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,eAAe,CAYpE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retry Logic with Exponential Backoff
|
|
4
|
+
* Handles transient failures with configurable retry strategies
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RetryHandler = exports.RetryError = void 0;
|
|
8
|
+
exports.Retry = Retry;
|
|
9
|
+
class RetryError extends Error {
|
|
10
|
+
constructor(message, attempts, lastError) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.attempts = attempts;
|
|
13
|
+
this.lastError = lastError;
|
|
14
|
+
this.name = 'RetryError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.RetryError = RetryError;
|
|
18
|
+
class RetryHandler {
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.config = {
|
|
21
|
+
maxRetries: config.maxRetries ?? 3,
|
|
22
|
+
initialDelayMs: config.initialDelayMs ?? 1000,
|
|
23
|
+
maxDelayMs: config.maxDelayMs ?? 30000,
|
|
24
|
+
backoffMultiplier: config.backoffMultiplier ?? 2,
|
|
25
|
+
retryableErrors: config.retryableErrors ?? [
|
|
26
|
+
'ECONNRESET',
|
|
27
|
+
'ETIMEDOUT',
|
|
28
|
+
'ENOTFOUND',
|
|
29
|
+
'ECONNREFUSED',
|
|
30
|
+
'RATE_LIMIT',
|
|
31
|
+
'SERVICE_UNAVAILABLE',
|
|
32
|
+
'TIMEOUT',
|
|
33
|
+
],
|
|
34
|
+
onRetry: config.onRetry ?? (() => { }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute a function with retry logic
|
|
39
|
+
*/
|
|
40
|
+
async execute(fn) {
|
|
41
|
+
let lastError;
|
|
42
|
+
let attempt = 0;
|
|
43
|
+
while (attempt <= this.config.maxRetries) {
|
|
44
|
+
try {
|
|
45
|
+
return await fn();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
lastError = error;
|
|
49
|
+
attempt++;
|
|
50
|
+
if (attempt > this.config.maxRetries) {
|
|
51
|
+
throw new RetryError(`Failed after ${attempt} attempts: ${lastError.message}`, attempt, lastError);
|
|
52
|
+
}
|
|
53
|
+
if (!this.isRetryable(lastError)) {
|
|
54
|
+
throw lastError;
|
|
55
|
+
}
|
|
56
|
+
const delay = this.calculateDelay(attempt);
|
|
57
|
+
this.config.onRetry(attempt, lastError);
|
|
58
|
+
await this.sleep(delay);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw new RetryError(`Failed after ${attempt} attempts: ${lastError.message}`, attempt, lastError);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if an error is retryable
|
|
65
|
+
*/
|
|
66
|
+
isRetryable(error) {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
const errorCode = error.code || error.name;
|
|
69
|
+
const errorMessage = error.message.toUpperCase();
|
|
70
|
+
return this.config.retryableErrors.some((retryableError) => errorCode === retryableError || errorMessage.includes(retryableError.toUpperCase()));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Calculate delay with exponential backoff and jitter
|
|
74
|
+
*/
|
|
75
|
+
calculateDelay(attempt) {
|
|
76
|
+
const exponentialDelay = this.config.initialDelayMs * Math.pow(this.config.backoffMultiplier, attempt - 1);
|
|
77
|
+
const delayWithCap = Math.min(exponentialDelay, this.config.maxDelayMs);
|
|
78
|
+
// Add jitter (±25%)
|
|
79
|
+
const jitter = delayWithCap * 0.25 * (Math.random() * 2 - 1);
|
|
80
|
+
return Math.max(0, delayWithCap + jitter);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Sleep utility
|
|
84
|
+
*/
|
|
85
|
+
sleep(ms) {
|
|
86
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.RetryHandler = RetryHandler;
|
|
90
|
+
/**
|
|
91
|
+
* Decorator for automatic retry
|
|
92
|
+
*/
|
|
93
|
+
function Retry(config) {
|
|
94
|
+
const retryHandler = new RetryHandler(config);
|
|
95
|
+
return function (target, propertyKey, descriptor) {
|
|
96
|
+
const originalMethod = descriptor.value;
|
|
97
|
+
descriptor.value = async function (...args) {
|
|
98
|
+
return retryHandler.execute(() => originalMethod.apply(this, args));
|
|
99
|
+
};
|
|
100
|
+
return descriptor;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: 'ts-jest',
|
|
3
|
+
testEnvironment: 'node',
|
|
4
|
+
roots: ['<rootDir>/src', '<rootDir>/tests'],
|
|
5
|
+
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
|
|
6
|
+
transform: {
|
|
7
|
+
'^.+\\.ts$': 'ts-jest',
|
|
8
|
+
},
|
|
9
|
+
collectCoverageFrom: [
|
|
10
|
+
'src/**/*.ts',
|
|
11
|
+
'!src/**/*.d.ts',
|
|
12
|
+
'!src/index.ts',
|
|
13
|
+
],
|
|
14
|
+
coverageThreshold: {
|
|
15
|
+
global: {
|
|
16
|
+
branches: 80,
|
|
17
|
+
functions: 90,
|
|
18
|
+
lines: 90,
|
|
19
|
+
statements: 90,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
coverageDirectory: 'coverage',
|
|
23
|
+
coverageReporters: ['text', 'lcov', 'clover'],
|
|
24
|
+
verbose: true,
|
|
25
|
+
moduleNameMapper: {
|
|
26
|
+
'^@hazeljs/core$': '<rootDir>/../core/src',
|
|
27
|
+
'^@hazeljs/rag$': '<rootDir>/../rag/src',
|
|
28
|
+
},
|
|
29
|
+
setupFilesAfterEnv: ['<rootDir>/tests/setup.ts'],
|
|
30
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2026-03-08 14:07:23 [INFO] Application started | {"service":"hazeljs","version":"0.1.0","environment":"test"}
|
package/logs/error.log
ADDED
|
File without changes
|