@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.
Files changed (166) hide show
  1. package/IMPLEMENTATION_SUMMARY.md +400 -0
  2. package/LICENSE +192 -0
  3. package/PERSISTENCE.md +201 -0
  4. package/PRISMA_INTEGRATION.md +499 -0
  5. package/PRODUCTION_READINESS.md +264 -0
  6. package/QUICKSTART.md +135 -0
  7. package/README.md +541 -0
  8. package/STATE_VS_MEMORY.md +243 -0
  9. package/benchmarks/performance.benchmark.ts +157 -0
  10. package/coverage/clover.xml +1508 -0
  11. package/coverage/lcov-report/base.css +224 -0
  12. package/coverage/lcov-report/block-navigation.js +87 -0
  13. package/coverage/lcov-report/favicon.png +0 -0
  14. package/coverage/lcov-report/index.html +296 -0
  15. package/coverage/lcov-report/prettify.css +1 -0
  16. package/coverage/lcov-report/prettify.js +2 -0
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +210 -0
  19. package/coverage/lcov.info +2722 -0
  20. package/dist/agent.module.d.ts +57 -0
  21. package/dist/agent.module.d.ts.map +1 -0
  22. package/dist/agent.module.js +99 -0
  23. package/dist/agent.module.js.map +1 -0
  24. package/dist/context/agent.context.d.ts +27 -0
  25. package/dist/context/agent.context.d.ts.map +1 -0
  26. package/dist/context/agent.context.js +98 -0
  27. package/dist/context/agent.context.js.map +1 -0
  28. package/dist/decorators/agent.decorator.d.ts +21 -0
  29. package/dist/decorators/agent.decorator.d.ts.map +1 -0
  30. package/dist/decorators/agent.decorator.js +38 -0
  31. package/dist/decorators/agent.decorator.js.map +1 -0
  32. package/dist/decorators/delegate.decorator.d.ts +66 -0
  33. package/dist/decorators/delegate.decorator.d.ts.map +1 -0
  34. package/dist/decorators/delegate.decorator.js +108 -0
  35. package/dist/decorators/delegate.decorator.js.map +1 -0
  36. package/dist/decorators/tool.decorator.d.ts +23 -0
  37. package/dist/decorators/tool.decorator.d.ts.map +1 -0
  38. package/dist/decorators/tool.decorator.js +61 -0
  39. package/dist/decorators/tool.decorator.js.map +1 -0
  40. package/dist/events/event.emitter.d.ts +45 -0
  41. package/dist/events/event.emitter.d.ts.map +1 -0
  42. package/dist/events/event.emitter.js +96 -0
  43. package/dist/events/event.emitter.js.map +1 -0
  44. package/dist/executor/agent.executor.d.ts +58 -0
  45. package/dist/executor/agent.executor.d.ts.map +1 -0
  46. package/dist/executor/agent.executor.js +312 -0
  47. package/dist/executor/agent.executor.js.map +1 -0
  48. package/dist/executor/tool.executor.d.ts +55 -0
  49. package/dist/executor/tool.executor.d.ts.map +1 -0
  50. package/dist/executor/tool.executor.js +266 -0
  51. package/dist/executor/tool.executor.js.map +1 -0
  52. package/dist/graph/agent-graph.d.ts +131 -0
  53. package/dist/graph/agent-graph.d.ts.map +1 -0
  54. package/dist/graph/agent-graph.js +462 -0
  55. package/dist/graph/agent-graph.js.map +1 -0
  56. package/dist/graph/agent-graph.types.d.ts +210 -0
  57. package/dist/graph/agent-graph.types.d.ts.map +1 -0
  58. package/dist/graph/agent-graph.types.js +12 -0
  59. package/dist/graph/agent-graph.types.js.map +1 -0
  60. package/dist/index.d.ts +34 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +51 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/prompts/agent-system.prompt.d.ts +10 -0
  65. package/dist/prompts/agent-system.prompt.d.ts.map +1 -0
  66. package/dist/prompts/agent-system.prompt.js +18 -0
  67. package/dist/prompts/agent-system.prompt.js.map +1 -0
  68. package/dist/prompts/index.d.ts +4 -0
  69. package/dist/prompts/index.d.ts.map +1 -0
  70. package/dist/prompts/index.js +20 -0
  71. package/dist/prompts/index.js.map +1 -0
  72. package/dist/prompts/supervisor-routing.prompt.d.ts +9 -0
  73. package/dist/prompts/supervisor-routing.prompt.d.ts.map +1 -0
  74. package/dist/prompts/supervisor-routing.prompt.js +22 -0
  75. package/dist/prompts/supervisor-routing.prompt.js.map +1 -0
  76. package/dist/prompts/supervisor-system.prompt.d.ts +9 -0
  77. package/dist/prompts/supervisor-system.prompt.d.ts.map +1 -0
  78. package/dist/prompts/supervisor-system.prompt.js +21 -0
  79. package/dist/prompts/supervisor-system.prompt.js.map +1 -0
  80. package/dist/registry/agent.registry.d.ts +49 -0
  81. package/dist/registry/agent.registry.d.ts.map +1 -0
  82. package/dist/registry/agent.registry.js +90 -0
  83. package/dist/registry/agent.registry.js.map +1 -0
  84. package/dist/registry/tool.registry.d.ts +54 -0
  85. package/dist/registry/tool.registry.d.ts.map +1 -0
  86. package/dist/registry/tool.registry.js +153 -0
  87. package/dist/registry/tool.registry.js.map +1 -0
  88. package/dist/runtime/agent.runtime.d.ts +218 -0
  89. package/dist/runtime/agent.runtime.d.ts.map +1 -0
  90. package/dist/runtime/agent.runtime.extensions.d.ts +49 -0
  91. package/dist/runtime/agent.runtime.extensions.d.ts.map +1 -0
  92. package/dist/runtime/agent.runtime.extensions.js +93 -0
  93. package/dist/runtime/agent.runtime.extensions.js.map +1 -0
  94. package/dist/runtime/agent.runtime.js +448 -0
  95. package/dist/runtime/agent.runtime.js.map +1 -0
  96. package/dist/state/agent-state.interface.d.ts +63 -0
  97. package/dist/state/agent-state.interface.d.ts.map +1 -0
  98. package/dist/state/agent-state.interface.js +7 -0
  99. package/dist/state/agent-state.interface.js.map +1 -0
  100. package/dist/state/agent.state.d.ts +67 -0
  101. package/dist/state/agent.state.d.ts.map +1 -0
  102. package/dist/state/agent.state.js +172 -0
  103. package/dist/state/agent.state.js.map +1 -0
  104. package/dist/state/database-state.manager.d.ts +63 -0
  105. package/dist/state/database-state.manager.d.ts.map +1 -0
  106. package/dist/state/database-state.manager.js +282 -0
  107. package/dist/state/database-state.manager.js.map +1 -0
  108. package/dist/state/redis-state.manager.d.ts +81 -0
  109. package/dist/state/redis-state.manager.d.ts.map +1 -0
  110. package/dist/state/redis-state.manager.js +253 -0
  111. package/dist/state/redis-state.manager.js.map +1 -0
  112. package/dist/supervisor/supervisor.d.ts +81 -0
  113. package/dist/supervisor/supervisor.d.ts.map +1 -0
  114. package/dist/supervisor/supervisor.js +220 -0
  115. package/dist/supervisor/supervisor.js.map +1 -0
  116. package/dist/types/agent.types.d.ts +166 -0
  117. package/dist/types/agent.types.d.ts.map +1 -0
  118. package/dist/types/agent.types.js +32 -0
  119. package/dist/types/agent.types.js.map +1 -0
  120. package/dist/types/event.types.d.ts +198 -0
  121. package/dist/types/event.types.d.ts.map +1 -0
  122. package/dist/types/event.types.js +46 -0
  123. package/dist/types/event.types.js.map +1 -0
  124. package/dist/types/llm.types.d.ts +66 -0
  125. package/dist/types/llm.types.d.ts.map +1 -0
  126. package/dist/types/llm.types.js +7 -0
  127. package/dist/types/llm.types.js.map +1 -0
  128. package/dist/types/rag.types.d.ts +40 -0
  129. package/dist/types/rag.types.d.ts.map +1 -0
  130. package/dist/types/rag.types.js +7 -0
  131. package/dist/types/rag.types.js.map +1 -0
  132. package/dist/types/tool.types.d.ts +118 -0
  133. package/dist/types/tool.types.d.ts.map +1 -0
  134. package/dist/types/tool.types.js +19 -0
  135. package/dist/types/tool.types.js.map +1 -0
  136. package/dist/utils/circuit-breaker.d.ts +9 -0
  137. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  138. package/dist/utils/circuit-breaker.js +16 -0
  139. package/dist/utils/circuit-breaker.js.map +1 -0
  140. package/dist/utils/health-check.d.ts +71 -0
  141. package/dist/utils/health-check.d.ts.map +1 -0
  142. package/dist/utils/health-check.js +156 -0
  143. package/dist/utils/health-check.js.map +1 -0
  144. package/dist/utils/logger.d.ts +53 -0
  145. package/dist/utils/logger.d.ts.map +1 -0
  146. package/dist/utils/logger.js +133 -0
  147. package/dist/utils/logger.js.map +1 -0
  148. package/dist/utils/metrics.d.ts +90 -0
  149. package/dist/utils/metrics.d.ts.map +1 -0
  150. package/dist/utils/metrics.js +186 -0
  151. package/dist/utils/metrics.js.map +1 -0
  152. package/dist/utils/rate-limiter.d.ts +44 -0
  153. package/dist/utils/rate-limiter.d.ts.map +1 -0
  154. package/dist/utils/rate-limiter.js +82 -0
  155. package/dist/utils/rate-limiter.js.map +1 -0
  156. package/dist/utils/retry.d.ts +42 -0
  157. package/dist/utils/retry.d.ts.map +1 -0
  158. package/dist/utils/retry.js +103 -0
  159. package/dist/utils/retry.js.map +1 -0
  160. package/jest.config.js +30 -0
  161. package/logs/combined.log +1 -0
  162. package/logs/error.log +0 -0
  163. package/package.json +74 -0
  164. package/prisma-schema.example.prisma +76 -0
  165. package/tests/setup.ts +17 -0
  166. 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":"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"}
@@ -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