@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
|
@@ -315,36 +315,36 @@ const result = await runtime.execute('chat-agent', message, {
|
|
|
315
315
|
|
|
316
316
|
**Benefits**: Memory, tools, state, observability, resumable
|
|
317
317
|
|
|
318
|
-
##
|
|
318
|
+
## Production Considerations (v1.0.1+)
|
|
319
319
|
|
|
320
|
-
###
|
|
320
|
+
### Shipped persistence
|
|
321
321
|
|
|
322
|
-
-
|
|
323
|
-
-
|
|
324
|
-
-
|
|
322
|
+
- **State**: `AgentStateManager`, `RedisStateManager`, `DatabaseStateManager`
|
|
323
|
+
- **Approvals**: `InMemoryApprovalStore`, `RedisApprovalStore`
|
|
324
|
+
- **Module bootstrap**: `AgentModule.forRootAsync({ redis: { url } })`
|
|
325
325
|
|
|
326
|
-
###
|
|
326
|
+
### Further recommendations
|
|
327
327
|
|
|
328
|
-
1. **
|
|
329
|
-
2. **
|
|
330
|
-
3. **
|
|
331
|
-
4. **Event Bus**: Replace in-memory emitter with distributed bus
|
|
328
|
+
1. **Execution queue**: Job queue for long-running agents (future `@hazeljs/flow`)
|
|
329
|
+
2. **Event bus**: Distributed event bus for cross-service observability
|
|
330
|
+
3. **Observability**: `observabilityProvider` for OTel spans
|
|
332
331
|
|
|
333
|
-
### Scaling
|
|
332
|
+
### Scaling example
|
|
334
333
|
|
|
335
334
|
```typescript
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
return redis.get(`agent:context:${executionId}`);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
335
|
+
import { AgentModule } from '@hazeljs/agent';
|
|
336
|
+
import { createClient } from 'redis';
|
|
341
337
|
|
|
342
|
-
const
|
|
343
|
-
|
|
338
|
+
const redis = createClient({ url: process.env.REDIS_URL });
|
|
339
|
+
await redis.connect();
|
|
340
|
+
|
|
341
|
+
await AgentModule.forRootAsync({
|
|
342
|
+
redis: { client: redis },
|
|
343
|
+
useRedisApprovals: true,
|
|
344
344
|
});
|
|
345
345
|
```
|
|
346
346
|
|
|
347
|
-
##
|
|
347
|
+
## Documentation
|
|
348
348
|
|
|
349
349
|
- **README.md** - User-facing documentation with examples
|
|
350
350
|
- **ARCHITECTURE.md** - Technical architecture deep-dive
|
package/PERSISTENCE.md
CHANGED
|
@@ -26,6 +26,55 @@ The `@hazeljs/agent` package supports multiple persistence backends for agent ex
|
|
|
26
26
|
- **Pros**: Durable, queryable, full audit trail
|
|
27
27
|
- **Cons**: Slower than Redis, requires database setup
|
|
28
28
|
|
|
29
|
+
## Environment-driven setup (v1.0+)
|
|
30
|
+
|
|
31
|
+
Use `createStateManagerFromEnv()` or `AgentModule.forRootAsync()` to pick Redis automatically from `REDIS_URL`:
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { AgentModule } from '@hazeljs/agent';
|
|
35
|
+
|
|
36
|
+
// Async bootstrap (connects Redis from REDIS_URL)
|
|
37
|
+
await AgentModule.forRootAsync({
|
|
38
|
+
stateBackend: process.env.AGENT_STATE_BACKEND as 'memory' | 'redis' | 'database',
|
|
39
|
+
redis: { url: process.env.REDIS_URL },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Or sync when you already have a connected client
|
|
43
|
+
AgentModule.forRoot({
|
|
44
|
+
redis: { client: redisClient },
|
|
45
|
+
useRedisApprovals: true,
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Environment variables:
|
|
50
|
+
|
|
51
|
+
| Variable | Values | Default |
|
|
52
|
+
| --------------------- | ----------------------------- | --------------------------------------------- |
|
|
53
|
+
| `AGENT_STATE_BACKEND` | `memory`, `redis`, `database` | `memory` (or `redis` when `REDIS_URL` is set) |
|
|
54
|
+
| `REDIS_URL` | Redis connection URL | — |
|
|
55
|
+
|
|
56
|
+
Factory helpers:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { createStateManager, createStateManagerFromEnv } from '@hazeljs/agent';
|
|
60
|
+
|
|
61
|
+
const syncManager = createStateManager({ backend: 'redis', redisClient });
|
|
62
|
+
const asyncManager = await createStateManagerFromEnv({ redisUrl: process.env.REDIS_URL });
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Durable tool approvals (1.0.1+)
|
|
66
|
+
|
|
67
|
+
Redis-backed approvals for multi-instance human-in-the-loop:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
await AgentModule.forRootAsync({
|
|
71
|
+
redis: { url: process.env.REDIS_URL },
|
|
72
|
+
useRedisApprovals: true,
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Pass `redis.client` to `forRoot()` when you already have a connected client. Exports: `IApprovalStore`, `InMemoryApprovalStore`, `RedisApprovalStore`, `createApprovalStore`.
|
|
77
|
+
|
|
29
78
|
## Usage
|
|
30
79
|
|
|
31
80
|
### In-Memory (Default)
|
package/PRODUCTION_READINESS.md
CHANGED
|
@@ -43,7 +43,7 @@ This document tracks the production readiness improvements made to `@hazeljs/age
|
|
|
43
43
|
|
|
44
44
|
### 4. Rate Limiting
|
|
45
45
|
|
|
46
|
-
**Implementation**: `src/utils/rate-limiter.ts`
|
|
46
|
+
**Implementation**: `src/utils/rate-limiter.ts` (adapter over `@hazeljs/resilience` `TokenBucketLimiter`)
|
|
47
47
|
|
|
48
48
|
- Token bucket algorithm for rate limiting
|
|
49
49
|
- Configurable tokens per minute and burst size
|
|
@@ -95,7 +95,7 @@ console.log(runtime.getMetricsSummary());
|
|
|
95
95
|
|
|
96
96
|
### 7. Retry Logic
|
|
97
97
|
|
|
98
|
-
**Implementation**: `src/utils/retry.ts`
|
|
98
|
+
**Implementation**: `src/utils/retry.ts` (adapter over `@hazeljs/resilience` `RetryPolicy`)
|
|
99
99
|
|
|
100
100
|
- Exponential backoff with jitter
|
|
101
101
|
- Configurable retry attempts and delays
|
|
@@ -112,7 +112,7 @@ const runtime = new AgentRuntime({
|
|
|
112
112
|
|
|
113
113
|
### 8. Circuit Breaker
|
|
114
114
|
|
|
115
|
-
**Implementation**:
|
|
115
|
+
**Implementation**: `@hazeljs/resilience` `CircuitBreaker` (used internally by `AgentRuntime`)
|
|
116
116
|
|
|
117
117
|
- Three states: CLOSED, OPEN, HALF_OPEN
|
|
118
118
|
- Automatic state transitions
|
|
@@ -123,11 +123,14 @@ const runtime = new AgentRuntime({
|
|
|
123
123
|
**Usage**:
|
|
124
124
|
|
|
125
125
|
```typescript
|
|
126
|
+
import { CircuitBreakerError } from '@hazeljs/resilience';
|
|
127
|
+
|
|
126
128
|
const runtime = new AgentRuntime({
|
|
127
129
|
enableCircuitBreaker: true, // Enabled by default
|
|
128
130
|
});
|
|
129
131
|
|
|
130
132
|
const status = runtime.getCircuitBreakerStatus();
|
|
133
|
+
// Repeated failures throw CircuitBreakerError on execute()
|
|
131
134
|
```
|
|
132
135
|
|
|
133
136
|
### 9. Health Checks
|
|
@@ -161,19 +164,12 @@ console.log(health.status); // 'healthy' | 'degraded' | 'unhealthy'
|
|
|
161
164
|
npm run benchmark
|
|
162
165
|
```
|
|
163
166
|
|
|
164
|
-
##
|
|
165
|
-
|
|
166
|
-
### Additional Test Coverage
|
|
167
|
+
## Remaining tasks (post-1.0.1)
|
|
167
168
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- `
|
|
171
|
-
-
|
|
172
|
-
- `tests/executor/tool.executor.test.ts`
|
|
173
|
-
- `tests/state/agent.state.test.ts`
|
|
174
|
-
- `tests/registry/agent.registry.test.ts`
|
|
175
|
-
- `tests/context/agent.context.test.ts`
|
|
176
|
-
- `tests/events/event.emitter.test.ts`
|
|
169
|
+
- Durable **A2A task store** (same Redis pattern as approvals)
|
|
170
|
+
- Full **`@hazeljs/flow`** integration for long-running workflows
|
|
171
|
+
- Typed DI token replacing global `__HAZELJS_AI_ENHANCED_SERVICE__`
|
|
172
|
+
- Cross-link agent OTel spans in `@hazeljs/observability` package docs
|
|
177
173
|
|
|
178
174
|
## 📋 Installation Instructions
|
|
179
175
|
|
|
@@ -203,6 +199,37 @@ npm run test:watch
|
|
|
203
199
|
npm run build
|
|
204
200
|
```
|
|
205
201
|
|
|
202
|
+
## ✅ v1.0 Production Hardening (2026)
|
|
203
|
+
|
|
204
|
+
### Durable state & approvals
|
|
205
|
+
|
|
206
|
+
- `createStateManagerFromEnv()` / `createStateManager()` factory helpers
|
|
207
|
+
- `AgentModule.forRoot()` wires Redis when `redis.client` is provided; `forRootAsync()` connects via `REDIS_URL`
|
|
208
|
+
- `IApprovalStore` with `InMemoryApprovalStore` (dev) and `RedisApprovalStore` (multi-instance)
|
|
209
|
+
- Typed `RedisClientLike` / `PrismaClientLike` minimal interfaces for state managers
|
|
210
|
+
|
|
211
|
+
### Resilience consolidation
|
|
212
|
+
|
|
213
|
+
- Local `retry.ts` and `rate-limiter.ts` delegate to `@hazeljs/resilience`
|
|
214
|
+
- Removed deprecated `src/utils/circuit-breaker.js` shim
|
|
215
|
+
- Circuit breaker integration tests through `AgentRuntime.execute()`
|
|
216
|
+
|
|
217
|
+
### Observability
|
|
218
|
+
|
|
219
|
+
- Optional peer: `@hazeljs/observability` and `@opentelemetry/api`
|
|
220
|
+
- OTel spans: `agent.execute`, `agent.tool.execute`, `agent.llm`
|
|
221
|
+
- `trackLlmCost()` bridge when observability provider is configured
|
|
222
|
+
|
|
223
|
+
### Error handling
|
|
224
|
+
|
|
225
|
+
- RAG failures emit `agent.rag.failed` instead of silent empty context
|
|
226
|
+
- `strictEventHandlers` on `AgentEventEmitter` surfaces handler errors in production
|
|
227
|
+
- LLM provider resolution logs error after 500ms timeout if `@hazeljs/ai` is not loaded
|
|
228
|
+
|
|
229
|
+
### Integration tests
|
|
230
|
+
|
|
231
|
+
- `tests/integration/production-hardening.test.ts` — Redis state, approvals, circuit breaker, RAG errors
|
|
232
|
+
|
|
206
233
|
## 🎯 Coverage Goals
|
|
207
234
|
|
|
208
235
|
- **Unit Test Coverage**: 80%+ (configured in jest.config.js)
|
package/QUICKSTART.md
CHANGED
|
@@ -132,6 +132,26 @@ if (result.state === 'waiting_for_input') {
|
|
|
132
132
|
}
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
+
## Production setup
|
|
136
|
+
|
|
137
|
+
For multi-instance deployments, use Redis-backed state and approvals:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { AgentModule } from '@hazeljs/agent';
|
|
141
|
+
import { createClient } from 'redis';
|
|
142
|
+
|
|
143
|
+
const redisClient = createClient({ url: process.env.REDIS_URL });
|
|
144
|
+
await redisClient.connect();
|
|
145
|
+
|
|
146
|
+
await AgentModule.forRootAsync({
|
|
147
|
+
redis: { client: redisClient },
|
|
148
|
+
useRedisApprovals: true,
|
|
149
|
+
runtime: { strictEventHandlers: process.env.NODE_ENV === 'production' },
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
See [PERSISTENCE.md](./PERSISTENCE.md) for `AGENT_STATE_BACKEND` and factory helpers.
|
|
154
|
+
|
|
135
155
|
## Support
|
|
136
156
|
|
|
137
157
|
- GitHub Issues: [Report bugs](https://github.com/hazeljs/hazeljs/issues)
|
package/README.md
CHANGED
|
@@ -83,15 +83,15 @@ export class SupportAgent {
|
|
|
83
83
|
### 2. Set up the runtime
|
|
84
84
|
|
|
85
85
|
```typescript
|
|
86
|
-
import { AgentRuntime } from '@hazeljs/agent';
|
|
86
|
+
import { AgentRuntime, AgentService } from '@hazeljs/agent';
|
|
87
87
|
import { MemoryManager } from '@hazeljs/rag';
|
|
88
|
-
import {
|
|
88
|
+
import { AIEnhancedService } from '@hazeljs/ai';
|
|
89
89
|
|
|
90
90
|
const runtime = new AgentRuntime({
|
|
91
91
|
memoryManager: new MemoryManager(/* ... */),
|
|
92
|
-
llmProvider: new
|
|
92
|
+
llmProvider: AgentService.createLLMProviderFromAI(new AIEnhancedService()),
|
|
93
93
|
defaultMaxSteps: 10,
|
|
94
|
-
|
|
94
|
+
// Optional: pass observabilityProvider from @hazeljs/observability for OTel spans
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
const agent = new SupportAgent();
|
|
@@ -436,6 +436,41 @@ runtime.onAny((e) => console.log(e.type, e.data));
|
|
|
436
436
|
|
|
437
437
|
---
|
|
438
438
|
|
|
439
|
+
## Production deployment (1.0.1+)
|
|
440
|
+
|
|
441
|
+
For multi-instance deployments, use Redis-backed state and durable approvals:
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
import { AgentModule } from '@hazeljs/agent';
|
|
445
|
+
import { createClient } from 'redis';
|
|
446
|
+
|
|
447
|
+
const redis = createClient({ url: process.env.REDIS_URL });
|
|
448
|
+
await redis.connect();
|
|
449
|
+
|
|
450
|
+
await AgentModule.forRootAsync({
|
|
451
|
+
redis: { client: redis },
|
|
452
|
+
useRedisApprovals: true,
|
|
453
|
+
runtime: {
|
|
454
|
+
strictEventHandlers: process.env.NODE_ENV === 'production',
|
|
455
|
+
observabilityProvider: myObservabilityProvider, // optional, from @hazeljs/observability
|
|
456
|
+
enableMetrics: true,
|
|
457
|
+
enableCircuitBreaker: true,
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
**Environment variables:** `REDIS_URL`, `AGENT_STATE_BACKEND` (`memory` | `redis` | `database`)
|
|
463
|
+
|
|
464
|
+
**Factories:** `createStateManager`, `createStateManagerFromEnv`, `createApprovalStore`
|
|
465
|
+
|
|
466
|
+
**Observability:** Pass `observabilityProvider` for OpenTelemetry spans (`agent.execute`, `agent.tool.execute`, `agent.llm`). The `enableObservability` flag is reserved; spans require an injected provider.
|
|
467
|
+
|
|
468
|
+
**Resilience:** Circuit breaker and retry use `@hazeljs/resilience` internally.
|
|
469
|
+
|
|
470
|
+
See [PERSISTENCE.md](./PERSISTENCE.md), [PRODUCTION_READINESS.md](./PRODUCTION_READINESS.md), and [QUICKSTART.md](./QUICKSTART.md).
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
439
474
|
## HazelJS Module Integration
|
|
440
475
|
|
|
441
476
|
```typescript
|
|
@@ -449,7 +484,11 @@ import { RagModule } from '@hazeljs/rag';
|
|
|
449
484
|
/* ... */
|
|
450
485
|
}),
|
|
451
486
|
AgentModule.forRoot({
|
|
452
|
-
runtime: {
|
|
487
|
+
runtime: {
|
|
488
|
+
defaultMaxSteps: 10,
|
|
489
|
+
enableMetrics: true,
|
|
490
|
+
strictEventHandlers: process.env.NODE_ENV === 'production',
|
|
491
|
+
},
|
|
453
492
|
agents: [SupportAgent, ResearchAgent, WriterAgent, OrchestratorAgent],
|
|
454
493
|
}),
|
|
455
494
|
],
|
package/STATE_VS_MEMORY.md
CHANGED
|
@@ -235,12 +235,29 @@ const runtime = new AgentRuntime({
|
|
|
235
235
|
### Production
|
|
236
236
|
|
|
237
237
|
```typescript
|
|
238
|
-
// Redis for agent state (
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
// Redis for agent state + durable approvals (multi-instance)
|
|
239
|
+
import { AgentModule } from '@hazeljs/agent';
|
|
240
|
+
import { createClient } from 'redis';
|
|
241
|
+
|
|
242
|
+
const redisClient = createClient({ url: process.env.REDIS_URL });
|
|
243
|
+
await redisClient.connect();
|
|
244
|
+
|
|
245
|
+
await AgentModule.forRootAsync({
|
|
246
|
+
redis: { client: redisClient },
|
|
247
|
+
useRedisApprovals: true,
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Vector store (Pinecone) for long-term memory (semantic search)
|
|
241
251
|
const memoryStore = new VectorMemory(pineconeStore, embeddings);
|
|
242
252
|
const memoryManager = new MemoryManager(memoryStore);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Or wire managers manually:
|
|
243
256
|
|
|
257
|
+
```typescript
|
|
258
|
+
import { RedisStateManager } from '@hazeljs/agent';
|
|
259
|
+
|
|
260
|
+
const stateManager = new RedisStateManager({ client: redisClient });
|
|
244
261
|
const runtime = new AgentRuntime({
|
|
245
262
|
stateManager, // ← Agent execution state
|
|
246
263
|
memoryManager, // ← Long-term memory
|
package/dist/agent.module.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ import { SupervisorAgent } from './supervisor/supervisor';
|
|
|
5
5
|
import { AgentEventType } from './types/event.types';
|
|
6
6
|
import type { AgentContext, AgentExecutionResult, AgentStreamChunk } from './types/agent.types';
|
|
7
7
|
import type { LLMStreamChunk } from './types/llm.types';
|
|
8
|
+
import { type AgentStateBackend, type CreateStateManagerOptions } from './state/create-state-manager';
|
|
9
|
+
import type { RedisClientLike, PrismaClientLike } from './state/redis-client.types';
|
|
10
|
+
import type { ObservabilityProvider } from './types/observability.types';
|
|
8
11
|
type NewableFunction = new (...args: unknown[]) => unknown;
|
|
9
12
|
/** Token for optional GuardrailsService injection (from @hazeljs/guardrails) */
|
|
10
13
|
export declare const GUARDRAILS_SERVICE_TOKEN = "GuardrailsService";
|
|
@@ -15,6 +18,21 @@ export interface AgentModuleOptions {
|
|
|
15
18
|
runtime?: AgentRuntimeConfig;
|
|
16
19
|
agents?: NewableFunction[];
|
|
17
20
|
autoDiscover?: boolean;
|
|
21
|
+
/** Pre-connected Redis client or URL (use forRootAsync when only url is available) */
|
|
22
|
+
redis?: {
|
|
23
|
+
client?: RedisClientLike;
|
|
24
|
+
url?: string;
|
|
25
|
+
};
|
|
26
|
+
/** Prisma client for database-backed state */
|
|
27
|
+
database?: {
|
|
28
|
+
prismaClient?: PrismaClientLike;
|
|
29
|
+
};
|
|
30
|
+
/** Override AGENT_STATE_BACKEND (memory | redis | database) */
|
|
31
|
+
stateBackend?: AgentStateBackend;
|
|
32
|
+
/** Use Redis-backed approval store when redis client is configured */
|
|
33
|
+
useRedisApprovals?: boolean;
|
|
34
|
+
/** Optional observability provider from @hazeljs/observability */
|
|
35
|
+
observabilityProvider?: ObservabilityProvider;
|
|
18
36
|
}
|
|
19
37
|
/**
|
|
20
38
|
* Agent Service
|
|
@@ -100,6 +118,11 @@ export declare class AgentService {
|
|
|
100
118
|
export declare class AgentModule {
|
|
101
119
|
private static options;
|
|
102
120
|
static forRoot(config?: AgentModuleOptions): typeof AgentModule;
|
|
121
|
+
/**
|
|
122
|
+
* Async module setup — connects Redis from REDIS_URL or redis.url before boot.
|
|
123
|
+
*/
|
|
124
|
+
static forRootAsync(config?: AgentModuleOptions): Promise<typeof AgentModule>;
|
|
125
|
+
static buildStateManagerOptions(config: AgentModuleOptions): CreateStateManagerOptions;
|
|
103
126
|
static getOptions(): AgentModuleOptions;
|
|
104
127
|
/**
|
|
105
128
|
* Create an LLM provider from AIEnhancedService
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.module.d.ts","sourceRoot":"","sources":["../src/agent.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.module.d.ts","sourceRoot":"","sources":["../src/agent.module.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.module.js
CHANGED
|
@@ -17,6 +17,7 @@ exports.AgentModule = exports.AgentService = exports.GUARDRAILS_SERVICE_TOKEN =
|
|
|
17
17
|
const core_1 = require("@hazeljs/core");
|
|
18
18
|
const agent_runtime_1 = require("./runtime/agent.runtime");
|
|
19
19
|
const agent_decorator_1 = require("./decorators/agent.decorator");
|
|
20
|
+
const create_state_manager_1 = require("./state/create-state-manager");
|
|
20
21
|
/** Token for optional GuardrailsService injection (from @hazeljs/guardrails) */
|
|
21
22
|
exports.GUARDRAILS_SERVICE_TOKEN = 'GuardrailsService';
|
|
22
23
|
/**
|
|
@@ -32,6 +33,15 @@ let AgentService = AgentService_1 = class AgentService {
|
|
|
32
33
|
...(moduleOpts.runtime || config),
|
|
33
34
|
guardrailsService: guardrailsService ?? moduleOpts.runtime?.guardrailsService ?? config.guardrailsService,
|
|
34
35
|
llmProvider: moduleOpts.runtime?.llmProvider ?? config.llmProvider,
|
|
36
|
+
observabilityProvider: moduleOpts.runtime?.observabilityProvider ??
|
|
37
|
+
moduleOpts.observabilityProvider ??
|
|
38
|
+
config.observabilityProvider,
|
|
39
|
+
stateManagerOptions: moduleOpts.runtime?.stateManagerOptions ??
|
|
40
|
+
config.stateManagerOptions ??
|
|
41
|
+
AgentModule.buildStateManagerOptions(moduleOpts),
|
|
42
|
+
useRedisApprovals: moduleOpts.runtime?.useRedisApprovals ??
|
|
43
|
+
moduleOpts.useRedisApprovals ??
|
|
44
|
+
config.useRedisApprovals,
|
|
35
45
|
};
|
|
36
46
|
this.runtime = new agent_runtime_1.AgentRuntime(runtimeConfig);
|
|
37
47
|
// Defer agent discovery and LLM provider resolution until after all modules are loaded
|
|
@@ -55,6 +65,9 @@ let AgentService = AgentService_1 = class AgentService {
|
|
|
55
65
|
else if (retryCount < 10) {
|
|
56
66
|
setTimeout(() => this.resolveLLMProvider(retryCount + 1), 50);
|
|
57
67
|
}
|
|
68
|
+
else {
|
|
69
|
+
core_1.logger.error('AgentService: LLM provider not available after 500ms. Load @hazeljs/ai or set runtime.llmProvider in AgentModule.forRoot().');
|
|
70
|
+
}
|
|
58
71
|
}
|
|
59
72
|
/**
|
|
60
73
|
* Create an LLM provider adapter from AIEnhancedService
|
|
@@ -265,9 +278,49 @@ exports.AgentService = AgentService = AgentService_1 = __decorate([
|
|
|
265
278
|
*/
|
|
266
279
|
let AgentModule = AgentModule_1 = class AgentModule {
|
|
267
280
|
static forRoot(config = {}) {
|
|
268
|
-
|
|
281
|
+
const runtime = { ...(config.runtime ?? {}) };
|
|
282
|
+
if (!runtime.stateManager) {
|
|
283
|
+
try {
|
|
284
|
+
runtime.stateManager = (0, create_state_manager_1.createStateManager)(AgentModule_1.buildStateManagerOptions(config));
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// resolveStateManager in AgentRuntime falls back to in-memory
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
runtime.stateManagerOptions =
|
|
291
|
+
runtime.stateManagerOptions ?? AgentModule_1.buildStateManagerOptions(config);
|
|
292
|
+
runtime.useRedisApprovals = runtime.useRedisApprovals ?? config.useRedisApprovals;
|
|
293
|
+
runtime.observabilityProvider = runtime.observabilityProvider ?? config.observabilityProvider;
|
|
294
|
+
AgentModule_1.options = { ...config, runtime };
|
|
269
295
|
return AgentModule_1;
|
|
270
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Async module setup — connects Redis from REDIS_URL or redis.url before boot.
|
|
299
|
+
*/
|
|
300
|
+
static async forRootAsync(config = {}) {
|
|
301
|
+
const runtime = { ...(config.runtime ?? {}) };
|
|
302
|
+
const baseOptions = AgentModule_1.buildStateManagerOptions(config);
|
|
303
|
+
if (!runtime.stateManager) {
|
|
304
|
+
const { stateManager, stateManagerOptions } = await (0, create_state_manager_1.resolveStateManagerFromEnv)(baseOptions);
|
|
305
|
+
runtime.stateManager = stateManager;
|
|
306
|
+
runtime.stateManagerOptions = stateManagerOptions;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
runtime.stateManagerOptions = baseOptions;
|
|
310
|
+
}
|
|
311
|
+
runtime.useRedisApprovals = runtime.useRedisApprovals ?? config.useRedisApprovals;
|
|
312
|
+
runtime.observabilityProvider = runtime.observabilityProvider ?? config.observabilityProvider;
|
|
313
|
+
AgentModule_1.options = { ...config, runtime };
|
|
314
|
+
return AgentModule_1;
|
|
315
|
+
}
|
|
316
|
+
static buildStateManagerOptions(config) {
|
|
317
|
+
return {
|
|
318
|
+
backend: config.stateBackend,
|
|
319
|
+
redisClient: config.redis?.client,
|
|
320
|
+
redisUrl: config.redis?.url,
|
|
321
|
+
prismaClient: config.database?.prismaClient,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
271
324
|
static getOptions() {
|
|
272
325
|
return AgentModule_1.options;
|
|
273
326
|
}
|
package/dist/agent.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.module.js","sourceRoot":"","sources":["../src/agent.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAqE;AACrE,2DAA2E;AAK3E,kEAAqF;
|
|
1
|
+
{"version":3,"file":"agent.module.js","sourceRoot":"","sources":["../src/agent.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable store for tool approval requests (supports multi-instance deployments).
|
|
3
|
+
*/
|
|
4
|
+
import { ToolApprovalRequest } from '../types/tool.types';
|
|
5
|
+
export interface IApprovalStore {
|
|
6
|
+
create(request: ToolApprovalRequest): Promise<void> | void;
|
|
7
|
+
get(requestId: string): Promise<ToolApprovalRequest | undefined> | ToolApprovalRequest | undefined;
|
|
8
|
+
listPending(): Promise<ToolApprovalRequest[]> | ToolApprovalRequest[];
|
|
9
|
+
approve(requestId: string, approvedBy: string): Promise<boolean> | boolean;
|
|
10
|
+
reject(requestId: string): Promise<boolean> | boolean;
|
|
11
|
+
delete(requestId: string): Promise<void> | void;
|
|
12
|
+
}
|
|
13
|
+
export interface ApprovalWaitOptions {
|
|
14
|
+
requestId: string;
|
|
15
|
+
expiresAt: Date;
|
|
16
|
+
pollIntervalMs?: number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=approval-store.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-store.interface.d.ts","sourceRoot":"","sources":["../../src/approval/approval-store.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,GAAG,CACD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAC9E,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC;IACtE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC3E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-store.interface.js","sourceRoot":"","sources":["../../src/approval/approval-store.interface.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IApprovalStore } from './approval-store.interface';
|
|
2
|
+
import type { RedisClientLike } from '../state/redis-client.types';
|
|
3
|
+
export interface CreateApprovalStoreOptions {
|
|
4
|
+
redisClient?: RedisClientLike;
|
|
5
|
+
useRedis?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function createApprovalStore(options?: CreateApprovalStoreOptions): IApprovalStore;
|
|
8
|
+
//# sourceMappingURL=create-approval-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-approval-store.d.ts","sourceRoot":"","sources":["../../src/approval/create-approval-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,cAAc,CAQ5F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createApprovalStore = createApprovalStore;
|
|
4
|
+
const in_memory_approval_store_1 = require("./in-memory-approval.store");
|
|
5
|
+
const redis_approval_store_1 = require("./redis-approval.store");
|
|
6
|
+
function createApprovalStore(options = {}) {
|
|
7
|
+
if (options.useRedis || options.redisClient) {
|
|
8
|
+
if (!options.redisClient) {
|
|
9
|
+
throw new Error('redisClient is required when useRedis is enabled for approval store.');
|
|
10
|
+
}
|
|
11
|
+
return new redis_approval_store_1.RedisApprovalStore({ client: options.redisClient });
|
|
12
|
+
}
|
|
13
|
+
return new in_memory_approval_store_1.InMemoryApprovalStore();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=create-approval-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-approval-store.js","sourceRoot":"","sources":["../../src/approval/create-approval-store.ts"],"names":[],"mappings":";;AAUA,kDAQC;AAjBD,yEAAmE;AACnE,iEAA4D;AAQ5D,SAAgB,mBAAmB,CAAC,UAAsC,EAAE;IAC1E,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,yCAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,gDAAqB,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ToolApprovalRequest } from '../types/tool.types';
|
|
2
|
+
import { IApprovalStore } from './approval-store.interface';
|
|
3
|
+
/** In-process resolver for a pending approval wait. */
|
|
4
|
+
export interface ApprovalResolver {
|
|
5
|
+
resolve: (approved: boolean) => void;
|
|
6
|
+
timeoutId?: NodeJS.Timeout;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* In-memory approval store (default for development and single-instance deployments).
|
|
10
|
+
*/
|
|
11
|
+
export declare class InMemoryApprovalStore implements IApprovalStore {
|
|
12
|
+
private readonly requests;
|
|
13
|
+
readonly resolvers: Map<string, ApprovalResolver>;
|
|
14
|
+
create(request: ToolApprovalRequest): void;
|
|
15
|
+
get(requestId: string): ToolApprovalRequest | undefined;
|
|
16
|
+
listPending(): ToolApprovalRequest[];
|
|
17
|
+
approve(requestId: string, approvedBy: string): boolean;
|
|
18
|
+
reject(requestId: string): boolean;
|
|
19
|
+
delete(requestId: string): void;
|
|
20
|
+
registerResolver(requestId: string, resolver: ApprovalResolver): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=in-memory-approval.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-approval.store.d.ts","sourceRoot":"","sources":["../../src/approval/in-memory-approval.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,uDAAuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,QAAQ,CAAC,SAAS,gCAAuC;IAEzD,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI1C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIvD,WAAW,IAAI,mBAAmB,EAAE;IAIpC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAgBvD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAelC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI;CAGtE"}
|