@hazeljs/agent 1.0.0 → 1.0.2
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 +19 -19
- package/PERSISTENCE.md +49 -0
- package/PRODUCTION_READINESS.md +42 -15
- package/QUICKSTART.md +20 -0
- package/README.md +44 -5
- package/STATE_VS_MEMORY.md +20 -3
- package/dist/agent.module.d.ts +23 -0
- package/dist/agent.module.d.ts.map +1 -1
- package/dist/agent.module.js +54 -1
- package/dist/agent.module.js.map +1 -1
- package/dist/approval/approval-store.interface.d.ts +18 -0
- package/dist/approval/approval-store.interface.d.ts.map +1 -0
- package/dist/approval/approval-store.interface.js +6 -0
- package/dist/approval/approval-store.interface.js.map +1 -0
- package/dist/approval/create-approval-store.d.ts +8 -0
- package/dist/approval/create-approval-store.d.ts.map +1 -0
- package/dist/approval/create-approval-store.js +15 -0
- package/dist/approval/create-approval-store.js.map +1 -0
- package/dist/approval/in-memory-approval.store.d.ts +22 -0
- package/dist/approval/in-memory-approval.store.d.ts.map +1 -0
- package/dist/approval/in-memory-approval.store.js +64 -0
- package/dist/approval/in-memory-approval.store.js.map +1 -0
- package/dist/approval/redis-approval.store.d.ts +34 -0
- package/dist/approval/redis-approval.store.d.ts.map +1 -0
- package/dist/approval/redis-approval.store.js +122 -0
- package/dist/approval/redis-approval.store.js.map +1 -0
- package/dist/context/agent.context.d.ts +1 -1
- package/dist/context/agent.context.d.ts.map +1 -1
- package/dist/context/agent.context.js +4 -2
- package/dist/context/agent.context.js.map +1 -1
- package/dist/events/event.emitter.d.ts +5 -0
- package/dist/events/event.emitter.d.ts.map +1 -1
- package/dist/events/event.emitter.js +12 -3
- package/dist/events/event.emitter.js.map +1 -1
- package/dist/executor/agent.executor.d.ts +9 -1
- package/dist/executor/agent.executor.d.ts.map +1 -1
- package/dist/executor/agent.executor.js +23 -3
- package/dist/executor/agent.executor.js.map +1 -1
- package/dist/executor/tool.executor.d.ts +15 -31
- package/dist/executor/tool.executor.d.ts.map +1 -1
- package/dist/executor/tool.executor.js +56 -78
- package/dist/executor/tool.executor.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/agent.runtime.d.ts +13 -0
- package/dist/runtime/agent.runtime.d.ts.map +1 -1
- package/dist/runtime/agent.runtime.js +43 -9
- package/dist/runtime/agent.runtime.js.map +1 -1
- package/dist/state/create-state-manager.d.ts +38 -0
- package/dist/state/create-state-manager.d.ts.map +1 -0
- package/dist/state/create-state-manager.js +148 -0
- package/dist/state/create-state-manager.js.map +1 -0
- package/dist/state/database-state.manager.d.ts +2 -3
- package/dist/state/database-state.manager.d.ts.map +1 -1
- package/dist/state/database-state.manager.js.map +1 -1
- package/dist/state/redis-client.types.d.ts +38 -0
- package/dist/state/redis-client.types.d.ts.map +1 -0
- package/dist/state/redis-client.types.js +3 -0
- package/dist/state/redis-client.types.js.map +1 -0
- package/dist/state/redis-state.manager.d.ts +2 -3
- package/dist/state/redis-state.manager.d.ts.map +1 -1
- package/dist/state/redis-state.manager.js +1 -1
- package/dist/state/redis-state.manager.js.map +1 -1
- package/dist/testing/mocks/hazeljs-eval.d.ts +7 -0
- package/dist/testing/mocks/hazeljs-eval.d.ts.map +1 -0
- package/dist/testing/mocks/hazeljs-eval.js +19 -0
- package/dist/testing/mocks/hazeljs-eval.js.map +1 -0
- package/dist/types/event.types.d.ts +1 -0
- package/dist/types/event.types.d.ts.map +1 -1
- package/dist/types/event.types.js +1 -0
- package/dist/types/event.types.js.map +1 -1
- package/dist/types/observability.types.d.ts +13 -0
- package/dist/types/observability.types.d.ts.map +1 -0
- package/dist/types/observability.types.js +6 -0
- package/dist/types/observability.types.js.map +1 -0
- package/dist/utils/agent-tracing.d.ts +10 -0
- package/dist/utils/agent-tracing.d.ts.map +1 -0
- package/dist/utils/agent-tracing.js +114 -0
- package/dist/utils/agent-tracing.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +6 -30
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +21 -58
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/retry.d.ts +3 -21
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +37 -69
- package/dist/utils/retry.js.map +1 -1
- package/package.json +23 -13
- package/tsconfig.jest.json +15 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional OpenTelemetry span helpers for agent runtime (no hard dependency on @hazeljs/observability).
|
|
3
|
+
*/
|
|
4
|
+
import type { ObservabilityProvider } from '../types/observability.types';
|
|
5
|
+
export declare function withAgentSpan<T>(name: string, attributes: Record<string, string | number | boolean>, fn: () => Promise<T>, observability?: ObservabilityProvider): Promise<T>;
|
|
6
|
+
export declare function trackLlmCost(observability: ObservabilityProvider | undefined, model: string | undefined, usage?: {
|
|
7
|
+
promptTokens?: number;
|
|
8
|
+
completionTokens?: number;
|
|
9
|
+
}): void;
|
|
10
|
+
//# sourceMappingURL=agent-tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tracing.d.ts","sourceRoot":"","sources":["../../src/utils/agent-tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AA+C1E,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACrD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,aAAa,CAAC,EAAE,qBAAqB,GACpC,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED,wBAAgB,YAAY,CAC1B,aAAa,EAAE,qBAAqB,GAAG,SAAS,EAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,IAAI,CAGN"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Optional OpenTelemetry span helpers for agent runtime (no hard dependency on @hazeljs/observability).
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.withAgentSpan = withAgentSpan;
|
|
40
|
+
exports.trackLlmCost = trackLlmCost;
|
|
41
|
+
const SPAN_OK = 1;
|
|
42
|
+
const SPAN_ERROR = 2;
|
|
43
|
+
let otelApi;
|
|
44
|
+
let otelLoadFailed = false;
|
|
45
|
+
function getOtelApiSync() {
|
|
46
|
+
if (otelApi !== undefined) {
|
|
47
|
+
return otelApi;
|
|
48
|
+
}
|
|
49
|
+
if (otelLoadFailed) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
54
|
+
otelApi = require('@opentelemetry/api');
|
|
55
|
+
return otelApi;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
otelLoadFailed = true;
|
|
59
|
+
otelApi = null;
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function loadOtelApi() {
|
|
64
|
+
const sync = getOtelApiSync();
|
|
65
|
+
if (sync)
|
|
66
|
+
return sync;
|
|
67
|
+
if (otelLoadFailed)
|
|
68
|
+
return null;
|
|
69
|
+
try {
|
|
70
|
+
otelApi = await Promise.resolve().then(() => __importStar(require('@opentelemetry/api')));
|
|
71
|
+
return otelApi;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
otelLoadFailed = true;
|
|
75
|
+
otelApi = null;
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function withAgentSpan(name, attributes, fn, observability) {
|
|
80
|
+
if (!observability) {
|
|
81
|
+
return fn();
|
|
82
|
+
}
|
|
83
|
+
const api = getOtelApiSync() ?? (await loadOtelApi());
|
|
84
|
+
if (!api) {
|
|
85
|
+
return fn();
|
|
86
|
+
}
|
|
87
|
+
const tracer = observability?.getTracer('hazeljs-agent') ?? api.trace.getTracer('hazeljs-agent');
|
|
88
|
+
return tracer.startActiveSpan(name, async (span) => {
|
|
89
|
+
const activeSpan = span;
|
|
90
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
91
|
+
activeSpan.setAttribute(key, value);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const result = await fn();
|
|
95
|
+
activeSpan.setStatus({ code: SPAN_OK });
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
100
|
+
activeSpan.recordException(err);
|
|
101
|
+
activeSpan.setStatus({ code: SPAN_ERROR, message: err.message });
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
activeSpan.end();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function trackLlmCost(observability, model, usage) {
|
|
110
|
+
if (!observability || !model || !usage)
|
|
111
|
+
return;
|
|
112
|
+
observability.trackCost(model, usage.promptTokens ?? 0, usage.completionTokens ?? 0);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=agent-tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tracing.js","sourceRoot":"","sources":["../../src/utils/agent-tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* @deprecated Use TokenBucketLimiter from @hazeljs/resilience directly.
|
|
3
|
+
* Adapter preserving tokensPerMinute / waitForToken API used by AgentRuntime.
|
|
4
4
|
*/
|
|
5
5
|
export interface RateLimiterConfig {
|
|
6
6
|
tokensPerMinute: number;
|
|
7
7
|
burstSize?: number;
|
|
8
8
|
}
|
|
9
9
|
export declare class RateLimiter {
|
|
10
|
-
private
|
|
11
|
-
private
|
|
12
|
-
private readonly
|
|
13
|
-
private readonly burstSize;
|
|
14
|
-
private readonly refillRate;
|
|
10
|
+
private limiter;
|
|
11
|
+
private readonly maxTokens;
|
|
12
|
+
private readonly refillRatePerSecond;
|
|
15
13
|
constructor(config: RateLimiterConfig);
|
|
16
|
-
/**
|
|
17
|
-
* Try to consume a token
|
|
18
|
-
* @returns true if token was consumed, false if rate limit exceeded
|
|
19
|
-
*/
|
|
20
14
|
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
15
|
waitForToken(timeoutMs?: number): Promise<boolean>;
|
|
27
|
-
/**
|
|
28
|
-
* Get current token count
|
|
29
|
-
*/
|
|
16
|
+
/** Approximate peek: 1 when a token is available, 0 otherwise. */
|
|
30
17
|
getAvailableTokens(): number;
|
|
31
|
-
/**
|
|
32
|
-
* Reset the rate limiter
|
|
33
|
-
*/
|
|
34
18
|
reset(): void;
|
|
35
|
-
/**
|
|
36
|
-
* Refill tokens based on elapsed time
|
|
37
|
-
*/
|
|
38
|
-
private refill;
|
|
39
|
-
/**
|
|
40
|
-
* Sleep utility
|
|
41
|
-
*/
|
|
42
|
-
private sleep;
|
|
43
19
|
}
|
|
44
20
|
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAEjC,MAAM,EAAE,iBAAiB;IAMrC,UAAU,IAAI,OAAO;IAIf,YAAY,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB/D,kEAAkE;IAClE,kBAAkB,IAAI,MAAM;IAI5B,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -1,82 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* @deprecated Use TokenBucketLimiter from @hazeljs/resilience directly.
|
|
4
|
+
* Adapter preserving tokensPerMinute / waitForToken API used by AgentRuntime.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.RateLimiter = void 0;
|
|
8
|
+
const resilience_1 = require("@hazeljs/resilience");
|
|
8
9
|
class RateLimiter {
|
|
9
10
|
constructor(config) {
|
|
10
|
-
this.
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
13
|
-
this.lastRefill = Date.now();
|
|
14
|
-
this.refillRate = this.tokensPerMinute / 60000; // tokens per millisecond
|
|
11
|
+
this.maxTokens = config.burstSize ?? config.tokensPerMinute;
|
|
12
|
+
this.refillRatePerSecond = config.tokensPerMinute / 60;
|
|
13
|
+
this.limiter = new resilience_1.TokenBucketLimiter(this.maxTokens, this.refillRatePerSecond);
|
|
15
14
|
}
|
|
16
|
-
/**
|
|
17
|
-
* Try to consume a token
|
|
18
|
-
* @returns true if token was consumed, false if rate limit exceeded
|
|
19
|
-
*/
|
|
20
15
|
tryConsume() {
|
|
21
|
-
this.
|
|
22
|
-
if (this.tokens >= 1) {
|
|
23
|
-
this.tokens -= 1;
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
return false;
|
|
16
|
+
return this.limiter.tryAcquire();
|
|
27
17
|
}
|
|
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
18
|
async waitForToken(timeoutMs = 30000) {
|
|
34
|
-
const
|
|
35
|
-
while (Date.now() -
|
|
36
|
-
if (this.
|
|
19
|
+
const start = Date.now();
|
|
20
|
+
while (Date.now() - start < timeoutMs) {
|
|
21
|
+
if (this.limiter.tryAcquire()) {
|
|
37
22
|
return true;
|
|
38
23
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const actualWaitMs = Math.min(waitMs, remainingTimeout, 1000);
|
|
44
|
-
if (actualWaitMs > 0) {
|
|
45
|
-
await this.sleep(actualWaitMs);
|
|
24
|
+
const waitMs = Math.min(this.limiter.getRetryAfterMs(), 1000, timeoutMs - (Date.now() - start));
|
|
25
|
+
if (waitMs <= 0) {
|
|
26
|
+
await sleep(50);
|
|
27
|
+
continue;
|
|
46
28
|
}
|
|
29
|
+
await sleep(waitMs);
|
|
47
30
|
}
|
|
48
31
|
return false;
|
|
49
32
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Get current token count
|
|
52
|
-
*/
|
|
33
|
+
/** Approximate peek: 1 when a token is available, 0 otherwise. */
|
|
53
34
|
getAvailableTokens() {
|
|
54
|
-
this.
|
|
55
|
-
return Math.floor(this.tokens);
|
|
35
|
+
return this.limiter.getRetryAfterMs() === 0 ? 1 : 0;
|
|
56
36
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Reset the rate limiter
|
|
59
|
-
*/
|
|
60
37
|
reset() {
|
|
61
|
-
this.
|
|
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));
|
|
38
|
+
this.limiter = new resilience_1.TokenBucketLimiter(this.maxTokens, this.refillRatePerSecond);
|
|
79
39
|
}
|
|
80
40
|
}
|
|
81
41
|
exports.RateLimiter = RateLimiter;
|
|
42
|
+
function sleep(ms) {
|
|
43
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
44
|
+
}
|
|
82
45
|
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,oDAAyD;AAOzD,MAAa,WAAW;IAKtB,YAAY,MAAyB;QACnC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC;QAC5D,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,eAAe,GAAG,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,IAAI,+BAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClF,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAAoB,KAAK;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC9B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAC9B,IAAI,EACJ,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CACjC,CAAC;YACF,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kEAAkE;IAClE,kBAAkB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,+BAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClF,CAAC;CACF;AA3CD,kCA2CC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/utils/retry.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* @deprecated Use RetryPolicy from @hazeljs/resilience directly.
|
|
3
|
+
* Thin adapter preserving the legacy RetryHandler API.
|
|
4
4
|
*/
|
|
5
5
|
export interface RetryConfig {
|
|
6
6
|
maxRetries: number;
|
|
@@ -16,27 +16,9 @@ export declare class RetryError extends Error {
|
|
|
16
16
|
constructor(message: string, attempts: number, lastError: Error);
|
|
17
17
|
}
|
|
18
18
|
export declare class RetryHandler {
|
|
19
|
-
private
|
|
19
|
+
private readonly policy;
|
|
20
20
|
constructor(config?: Partial<RetryConfig>);
|
|
21
|
-
/**
|
|
22
|
-
* Execute a function with retry logic
|
|
23
|
-
*/
|
|
24
21
|
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
22
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Decorator for automatic retry
|
|
40
|
-
*/
|
|
41
23
|
export declare function Retry(config?: Partial<RetryConfig>): MethodDecorator;
|
|
42
24
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,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,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IA+BvC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAenD;AAED,wBAAgB,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,eAAe,CAYpE"}
|
package/dist/utils/retry.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* @deprecated Use RetryPolicy from @hazeljs/resilience directly.
|
|
4
|
+
* Thin adapter preserving the legacy RetryHandler API.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.RetryHandler = exports.RetryError = void 0;
|
|
8
8
|
exports.Retry = Retry;
|
|
9
|
+
const resilience_1 = require("@hazeljs/resilience");
|
|
9
10
|
class RetryError extends Error {
|
|
10
11
|
constructor(message, attempts, lastError) {
|
|
11
12
|
super(message);
|
|
@@ -17,82 +18,49 @@ class RetryError extends Error {
|
|
|
17
18
|
exports.RetryError = RetryError;
|
|
18
19
|
class RetryHandler {
|
|
19
20
|
constructor(config = {}) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
21
|
+
const retryableErrors = config.retryableErrors ?? [
|
|
22
|
+
'ECONNRESET',
|
|
23
|
+
'ETIMEDOUT',
|
|
24
|
+
'ENOTFOUND',
|
|
25
|
+
'ECONNREFUSED',
|
|
26
|
+
'RATE_LIMIT',
|
|
27
|
+
'SERVICE_UNAVAILABLE',
|
|
28
|
+
'TIMEOUT',
|
|
29
|
+
];
|
|
30
|
+
this.policy = new resilience_1.RetryPolicy({
|
|
31
|
+
maxAttempts: config.maxRetries ?? 3,
|
|
32
|
+
baseDelay: config.initialDelayMs ?? 1000,
|
|
33
|
+
maxDelay: config.maxDelayMs ?? 30000,
|
|
34
|
+
backoff: 'exponential',
|
|
35
|
+
jitter: true,
|
|
36
|
+
onRetry: config.onRetry
|
|
37
|
+
? (error, attempt) => config.onRetry(attempt, error)
|
|
38
|
+
: undefined,
|
|
39
|
+
retryPredicate: (error) => {
|
|
40
|
+
const err = error;
|
|
41
|
+
const errorCode = err.code || err.name;
|
|
42
|
+
const errorMessage = err.message.toUpperCase();
|
|
43
|
+
return retryableErrors.some((retryableError) => errorCode === retryableError || errorMessage.includes(retryableError.toUpperCase()));
|
|
44
|
+
},
|
|
45
|
+
});
|
|
36
46
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Execute a function with retry logic
|
|
39
|
-
*/
|
|
40
47
|
async execute(fn) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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);
|
|
48
|
+
try {
|
|
49
|
+
return await this.policy.execute(fn);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof resilience_1.RetryExhaustedError) {
|
|
53
|
+
const totalAttempts = error.attempts + 1;
|
|
54
|
+
throw new RetryError(`Failed after ${totalAttempts} attempts`, totalAttempts, error.lastError);
|
|
59
55
|
}
|
|
56
|
+
throw error;
|
|
60
57
|
}
|
|
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
58
|
}
|
|
88
59
|
}
|
|
89
60
|
exports.RetryHandler = RetryHandler;
|
|
90
|
-
/**
|
|
91
|
-
* Decorator for automatic retry
|
|
92
|
-
*/
|
|
93
61
|
function Retry(config) {
|
|
94
62
|
const retryHandler = new RetryHandler(config);
|
|
95
|
-
return function (
|
|
63
|
+
return function (_target, _propertyKey, descriptor) {
|
|
96
64
|
const originalMethod = descriptor.value;
|
|
97
65
|
descriptor.value = async function (...args) {
|
|
98
66
|
return retryHandler.execute(() => originalMethod.apply(this, args));
|
package/dist/utils/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2EH,sBAYC;AArFD,oDAAuE;AAWvE,MAAa,UAAW,SAAQ,KAAK;IACnC,YACE,OAAe,EACC,QAAgB,EAChB,SAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAO;QAGhC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AATD,gCASC;AAED,MAAa,YAAY;IAGvB,YAAY,SAA+B,EAAE;QAC3C,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI;YAChD,YAAY;YACZ,WAAW;YACX,WAAW;YACX,cAAc;YACd,YAAY;YACZ,qBAAqB;YACrB,SAAS;SACV,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAW,CAAC;YAC5B,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YACnC,SAAS,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;YACxC,QAAQ,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;YACpC,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,MAAM,CAAC,OAAO;gBACrB,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAQ,EAAE,CAAC,MAAM,CAAC,OAAQ,CAAC,OAAO,EAAE,KAAc,CAAC;gBACpE,CAAC,CAAC,SAAS;YACb,cAAc,EAAE,CAAC,KAAK,EAAW,EAAE;gBACjC,MAAM,GAAG,GAAG,KAAkC,CAAC;gBAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;gBACvC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC/C,OAAO,eAAe,CAAC,IAAI,CACzB,CAAC,cAAc,EAAE,EAAE,CACjB,SAAS,KAAK,cAAc,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CACtF,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gCAAmB,EAAE,CAAC;gBACzC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACzC,MAAM,IAAI,UAAU,CAClB,gBAAgB,aAAa,WAAW,EACxC,aAAa,EACb,KAAK,CAAC,SAAkB,CACzB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAjDD,oCAiDC;AAED,SAAgB,KAAK,CAAC,MAA6B;IACjD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO,UAAU,OAAe,EAAE,YAA6B,EAAE,UAA8B;QAC7F,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QAExC,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAe;YACnD,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hazeljs/agent",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "AI-native Agent Runtime for HazelJS - stateful, long-running agents with tools, memory, and human-in-the-loop",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"license": "Apache-2.0",
|
|
27
27
|
"repository": {
|
|
28
28
|
"type": "git",
|
|
29
|
-
"url": "
|
|
29
|
+
"url": "https://github.com/hazel-js/hazeljs",
|
|
30
30
|
"directory": "packages/agent"
|
|
31
31
|
},
|
|
32
32
|
"publishConfig": {
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"zod-to-json-schema": "^3.25.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@hazeljs/core": "^1.0.
|
|
42
|
-
"@hazeljs/eval": "^1.0.
|
|
43
|
-
"@hazeljs/prompts": "^1.0.
|
|
44
|
-
"@hazeljs/rag": "^1.0.
|
|
45
|
-
"@hazeljs/resilience": "^1.0.
|
|
41
|
+
"@hazeljs/core": "^1.0.2",
|
|
42
|
+
"@hazeljs/eval": "^1.0.2",
|
|
43
|
+
"@hazeljs/prompts": "^1.0.2",
|
|
44
|
+
"@hazeljs/rag": "^1.0.2",
|
|
45
|
+
"@hazeljs/resilience": "^1.0.2",
|
|
46
46
|
"@types/jest": "^29.5.14",
|
|
47
47
|
"@types/node": "^20.19.39",
|
|
48
48
|
"jest": "^29.7.0",
|
|
@@ -50,12 +50,14 @@
|
|
|
50
50
|
"typescript": "^5.9.3"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@hazeljs/core": "^1.0.
|
|
54
|
-
"@hazeljs/eval": "^1.0.
|
|
55
|
-
"@hazeljs/guardrails": "^1.0.
|
|
56
|
-
"@hazeljs/prompts": "^1.0.
|
|
57
|
-
"@hazeljs/rag": "^1.0.
|
|
58
|
-
"@hazeljs/resilience": "^1.0.
|
|
53
|
+
"@hazeljs/core": "^1.0.2",
|
|
54
|
+
"@hazeljs/eval": "^1.0.2",
|
|
55
|
+
"@hazeljs/guardrails": "^1.0.2",
|
|
56
|
+
"@hazeljs/prompts": "^1.0.2",
|
|
57
|
+
"@hazeljs/rag": "^1.0.2",
|
|
58
|
+
"@hazeljs/resilience": "^1.0.2",
|
|
59
|
+
"@hazeljs/observability": "^1.0.2",
|
|
60
|
+
"@opentelemetry/api": "^1.9.0",
|
|
59
61
|
"redis": ">=4.0.0"
|
|
60
62
|
},
|
|
61
63
|
"peerDependenciesMeta": {
|
|
@@ -74,6 +76,14 @@
|
|
|
74
76
|
"@hazeljs/guardrails": {
|
|
75
77
|
"optional": true,
|
|
76
78
|
"description": "Optional guardrails for tool input/output validation"
|
|
79
|
+
},
|
|
80
|
+
"@hazeljs/observability": {
|
|
81
|
+
"optional": true,
|
|
82
|
+
"description": "OpenTelemetry spans and LLM cost tracking"
|
|
83
|
+
},
|
|
84
|
+
"@opentelemetry/api": {
|
|
85
|
+
"optional": true,
|
|
86
|
+
"description": "OpenTelemetry API for agent execution spans"
|
|
77
87
|
}
|
|
78
88
|
},
|
|
79
89
|
"bugs": {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"composite": false,
|
|
5
|
+
"declaration": false,
|
|
6
|
+
"declarationMap": false,
|
|
7
|
+
"paths": {
|
|
8
|
+
"@hazeljs/eval": ["src/testing/mocks/hazeljs-eval.ts"],
|
|
9
|
+
"@hazeljs/prompts": ["../prompts/src"],
|
|
10
|
+
"@hazeljs/rag": ["../rag/src"],
|
|
11
|
+
"@hazeljs/resilience": ["../resilience/src"]
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"include": ["src/**/*", "tests/**/*"]
|
|
15
|
+
}
|