@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.
Files changed (91) hide show
  1. package/IMPLEMENTATION_SUMMARY.md +19 -19
  2. package/PERSISTENCE.md +49 -0
  3. package/PRODUCTION_READINESS.md +42 -15
  4. package/QUICKSTART.md +20 -0
  5. package/README.md +44 -5
  6. package/STATE_VS_MEMORY.md +20 -3
  7. package/dist/agent.module.d.ts +23 -0
  8. package/dist/agent.module.d.ts.map +1 -1
  9. package/dist/agent.module.js +54 -1
  10. package/dist/agent.module.js.map +1 -1
  11. package/dist/approval/approval-store.interface.d.ts +18 -0
  12. package/dist/approval/approval-store.interface.d.ts.map +1 -0
  13. package/dist/approval/approval-store.interface.js +6 -0
  14. package/dist/approval/approval-store.interface.js.map +1 -0
  15. package/dist/approval/create-approval-store.d.ts +8 -0
  16. package/dist/approval/create-approval-store.d.ts.map +1 -0
  17. package/dist/approval/create-approval-store.js +15 -0
  18. package/dist/approval/create-approval-store.js.map +1 -0
  19. package/dist/approval/in-memory-approval.store.d.ts +22 -0
  20. package/dist/approval/in-memory-approval.store.d.ts.map +1 -0
  21. package/dist/approval/in-memory-approval.store.js +64 -0
  22. package/dist/approval/in-memory-approval.store.js.map +1 -0
  23. package/dist/approval/redis-approval.store.d.ts +34 -0
  24. package/dist/approval/redis-approval.store.d.ts.map +1 -0
  25. package/dist/approval/redis-approval.store.js +122 -0
  26. package/dist/approval/redis-approval.store.js.map +1 -0
  27. package/dist/context/agent.context.d.ts +1 -1
  28. package/dist/context/agent.context.d.ts.map +1 -1
  29. package/dist/context/agent.context.js +4 -2
  30. package/dist/context/agent.context.js.map +1 -1
  31. package/dist/events/event.emitter.d.ts +5 -0
  32. package/dist/events/event.emitter.d.ts.map +1 -1
  33. package/dist/events/event.emitter.js +12 -3
  34. package/dist/events/event.emitter.js.map +1 -1
  35. package/dist/executor/agent.executor.d.ts +9 -1
  36. package/dist/executor/agent.executor.d.ts.map +1 -1
  37. package/dist/executor/agent.executor.js +23 -3
  38. package/dist/executor/agent.executor.js.map +1 -1
  39. package/dist/executor/tool.executor.d.ts +15 -31
  40. package/dist/executor/tool.executor.d.ts.map +1 -1
  41. package/dist/executor/tool.executor.js +56 -78
  42. package/dist/executor/tool.executor.js.map +1 -1
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +7 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/runtime/agent.runtime.d.ts +13 -0
  48. package/dist/runtime/agent.runtime.d.ts.map +1 -1
  49. package/dist/runtime/agent.runtime.js +43 -9
  50. package/dist/runtime/agent.runtime.js.map +1 -1
  51. package/dist/state/create-state-manager.d.ts +38 -0
  52. package/dist/state/create-state-manager.d.ts.map +1 -0
  53. package/dist/state/create-state-manager.js +148 -0
  54. package/dist/state/create-state-manager.js.map +1 -0
  55. package/dist/state/database-state.manager.d.ts +2 -3
  56. package/dist/state/database-state.manager.d.ts.map +1 -1
  57. package/dist/state/database-state.manager.js.map +1 -1
  58. package/dist/state/redis-client.types.d.ts +38 -0
  59. package/dist/state/redis-client.types.d.ts.map +1 -0
  60. package/dist/state/redis-client.types.js +3 -0
  61. package/dist/state/redis-client.types.js.map +1 -0
  62. package/dist/state/redis-state.manager.d.ts +2 -3
  63. package/dist/state/redis-state.manager.d.ts.map +1 -1
  64. package/dist/state/redis-state.manager.js +1 -1
  65. package/dist/state/redis-state.manager.js.map +1 -1
  66. package/dist/testing/mocks/hazeljs-eval.d.ts +7 -0
  67. package/dist/testing/mocks/hazeljs-eval.d.ts.map +1 -0
  68. package/dist/testing/mocks/hazeljs-eval.js +19 -0
  69. package/dist/testing/mocks/hazeljs-eval.js.map +1 -0
  70. package/dist/types/event.types.d.ts +1 -0
  71. package/dist/types/event.types.d.ts.map +1 -1
  72. package/dist/types/event.types.js +1 -0
  73. package/dist/types/event.types.js.map +1 -1
  74. package/dist/types/observability.types.d.ts +13 -0
  75. package/dist/types/observability.types.d.ts.map +1 -0
  76. package/dist/types/observability.types.js +6 -0
  77. package/dist/types/observability.types.js.map +1 -0
  78. package/dist/utils/agent-tracing.d.ts +10 -0
  79. package/dist/utils/agent-tracing.d.ts.map +1 -0
  80. package/dist/utils/agent-tracing.js +114 -0
  81. package/dist/utils/agent-tracing.js.map +1 -0
  82. package/dist/utils/rate-limiter.d.ts +6 -30
  83. package/dist/utils/rate-limiter.d.ts.map +1 -1
  84. package/dist/utils/rate-limiter.js +21 -58
  85. package/dist/utils/rate-limiter.js.map +1 -1
  86. package/dist/utils/retry.d.ts +3 -21
  87. package/dist/utils/retry.d.ts.map +1 -1
  88. package/dist/utils/retry.js +37 -69
  89. package/dist/utils/retry.js.map +1 -1
  90. package/package.json +23 -13
  91. 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
- * Rate Limiter
3
- * Token bucket algorithm for rate limiting agent executions
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 tokens;
11
- private lastRefill;
12
- private readonly tokensPerMinute;
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;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"}
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
- * Rate Limiter
4
- * Token bucket algorithm for rate limiting agent executions
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.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
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.refill();
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 startTime = Date.now();
35
- while (Date.now() - startTime < timeoutMs) {
36
- if (this.tryConsume()) {
19
+ const start = Date.now();
20
+ while (Date.now() - start < timeoutMs) {
21
+ if (this.limiter.tryAcquire()) {
37
22
  return true;
38
23
  }
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);
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.refill();
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.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));
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;;;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"}
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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Retry Logic with Exponential Backoff
3
- * Handles transient failures with configurable retry strategies
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 config;
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;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"}
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"}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  /**
3
- * Retry Logic with Exponential Backoff
4
- * Handles transient failures with configurable retry strategies
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
- 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
- };
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
- 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);
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 (target, propertyKey, descriptor) {
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));
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
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.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": "git+https://github.com/hazel-js/hazeljs.git",
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.0",
42
- "@hazeljs/eval": "^1.0.0",
43
- "@hazeljs/prompts": "^1.0.0",
44
- "@hazeljs/rag": "^1.0.0",
45
- "@hazeljs/resilience": "^1.0.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.0",
54
- "@hazeljs/eval": "^1.0.0",
55
- "@hazeljs/guardrails": "^1.0.0",
56
- "@hazeljs/prompts": "^1.0.0",
57
- "@hazeljs/rag": "^1.0.0",
58
- "@hazeljs/resilience": "^1.0.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
+ }