@hazeljs/agent 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PERSISTENCE.md +36 -0
- package/PRODUCTION_READINESS.md +31 -0
- package/QUICKSTART.md +20 -0
- package/dist/agent.module.d.ts +23 -0
- package/dist/agent.module.d.ts.map +1 -1
- package/dist/agent.module.js +44 -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 +11 -0
- package/dist/runtime/agent.runtime.d.ts.map +1 -1
- package/dist/runtime/agent.runtime.js +42 -9
- package/dist/runtime/agent.runtime.js.map +1 -1
- package/dist/state/create-state-manager.d.ts +30 -0
- package/dist/state/create-state-manager.d.ts.map +1 -0
- package/dist/state/create-state-manager.js +134 -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
package/PERSISTENCE.md
CHANGED
|
@@ -26,6 +26,42 @@ 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
|
+
|
|
29
65
|
## Usage
|
|
30
66
|
|
|
31
67
|
### In-Memory (Default)
|
package/PRODUCTION_READINESS.md
CHANGED
|
@@ -203,6 +203,37 @@ npm run test:watch
|
|
|
203
203
|
npm run build
|
|
204
204
|
```
|
|
205
205
|
|
|
206
|
+
## ✅ v1.0 Production Hardening (2026)
|
|
207
|
+
|
|
208
|
+
### Durable state & approvals
|
|
209
|
+
|
|
210
|
+
- `createStateManagerFromEnv()` / `createStateManager()` factory helpers
|
|
211
|
+
- `AgentModule.forRoot()` wires Redis when `redis.client` is provided; `forRootAsync()` connects via `REDIS_URL`
|
|
212
|
+
- `IApprovalStore` with `InMemoryApprovalStore` (dev) and `RedisApprovalStore` (multi-instance)
|
|
213
|
+
- Typed `RedisClientLike` / `PrismaClientLike` minimal interfaces for state managers
|
|
214
|
+
|
|
215
|
+
### Resilience consolidation
|
|
216
|
+
|
|
217
|
+
- Local `retry.ts` and `rate-limiter.ts` delegate to `@hazeljs/resilience`
|
|
218
|
+
- Removed deprecated `src/utils/circuit-breaker.js` shim
|
|
219
|
+
- Circuit breaker integration tests through `AgentRuntime.execute()`
|
|
220
|
+
|
|
221
|
+
### Observability
|
|
222
|
+
|
|
223
|
+
- Optional peer: `@hazeljs/observability` and `@opentelemetry/api`
|
|
224
|
+
- OTel spans: `agent.execute`, `agent.tool.execute`, `agent.llm`
|
|
225
|
+
- `trackLlmCost()` bridge when observability provider is configured
|
|
226
|
+
|
|
227
|
+
### Error handling
|
|
228
|
+
|
|
229
|
+
- RAG failures emit `agent.rag.failed` instead of silent empty context
|
|
230
|
+
- `strictEventHandlers` on `AgentEventEmitter` surfaces handler errors in production
|
|
231
|
+
- LLM provider resolution logs error after 500ms timeout if `@hazeljs/ai` is not loaded
|
|
232
|
+
|
|
233
|
+
### Integration tests
|
|
234
|
+
|
|
235
|
+
- `tests/integration/production-hardening.test.ts` — Redis state, approvals, circuit breaker, RAG errors
|
|
236
|
+
|
|
206
237
|
## 🎯 Coverage Goals
|
|
207
238
|
|
|
208
239
|
- **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/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,12 @@ 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),
|
|
35
42
|
};
|
|
36
43
|
this.runtime = new agent_runtime_1.AgentRuntime(runtimeConfig);
|
|
37
44
|
// Defer agent discovery and LLM provider resolution until after all modules are loaded
|
|
@@ -55,6 +62,9 @@ let AgentService = AgentService_1 = class AgentService {
|
|
|
55
62
|
else if (retryCount < 10) {
|
|
56
63
|
setTimeout(() => this.resolveLLMProvider(retryCount + 1), 50);
|
|
57
64
|
}
|
|
65
|
+
else {
|
|
66
|
+
core_1.logger.error('AgentService: LLM provider not available after 500ms. Load @hazeljs/ai or set runtime.llmProvider in AgentModule.forRoot().');
|
|
67
|
+
}
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
70
|
* Create an LLM provider adapter from AIEnhancedService
|
|
@@ -265,9 +275,42 @@ exports.AgentService = AgentService = AgentService_1 = __decorate([
|
|
|
265
275
|
*/
|
|
266
276
|
let AgentModule = AgentModule_1 = class AgentModule {
|
|
267
277
|
static forRoot(config = {}) {
|
|
268
|
-
|
|
278
|
+
const runtime = { ...(config.runtime ?? {}) };
|
|
279
|
+
if (!runtime.stateManager) {
|
|
280
|
+
try {
|
|
281
|
+
runtime.stateManager = (0, create_state_manager_1.createStateManager)(AgentModule_1.buildStateManagerOptions(config));
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// resolveStateManager in AgentRuntime falls back to in-memory
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
runtime.stateManagerOptions =
|
|
288
|
+
runtime.stateManagerOptions ?? AgentModule_1.buildStateManagerOptions(config);
|
|
289
|
+
runtime.observabilityProvider = runtime.observabilityProvider ?? config.observabilityProvider;
|
|
290
|
+
AgentModule_1.options = { ...config, runtime };
|
|
291
|
+
return AgentModule_1;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Async module setup — connects Redis from REDIS_URL or redis.url before boot.
|
|
295
|
+
*/
|
|
296
|
+
static async forRootAsync(config = {}) {
|
|
297
|
+
const runtime = { ...(config.runtime ?? {}) };
|
|
298
|
+
if (!runtime.stateManager) {
|
|
299
|
+
runtime.stateManager = await (0, create_state_manager_1.createStateManagerFromEnv)(AgentModule_1.buildStateManagerOptions(config));
|
|
300
|
+
}
|
|
301
|
+
runtime.stateManagerOptions = AgentModule_1.buildStateManagerOptions(config);
|
|
302
|
+
runtime.observabilityProvider = runtime.observabilityProvider ?? config.observabilityProvider;
|
|
303
|
+
AgentModule_1.options = { ...config, runtime };
|
|
269
304
|
return AgentModule_1;
|
|
270
305
|
}
|
|
306
|
+
static buildStateManagerOptions(config) {
|
|
307
|
+
return {
|
|
308
|
+
backend: config.stateBackend,
|
|
309
|
+
redisClient: config.redis?.client,
|
|
310
|
+
redisUrl: config.redis?.url,
|
|
311
|
+
prismaClient: config.database?.prismaClient,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
271
314
|
static getOptions() {
|
|
272
315
|
return AgentModule_1.options;
|
|
273
316
|
}
|
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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryApprovalStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory approval store (default for development and single-instance deployments).
|
|
6
|
+
*/
|
|
7
|
+
class InMemoryApprovalStore {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.requests = new Map();
|
|
10
|
+
this.resolvers = new Map();
|
|
11
|
+
}
|
|
12
|
+
create(request) {
|
|
13
|
+
this.requests.set(request.requestId, request);
|
|
14
|
+
}
|
|
15
|
+
get(requestId) {
|
|
16
|
+
return this.requests.get(requestId);
|
|
17
|
+
}
|
|
18
|
+
listPending() {
|
|
19
|
+
return Array.from(this.requests.values()).filter((r) => r.status === 'pending');
|
|
20
|
+
}
|
|
21
|
+
approve(requestId, approvedBy) {
|
|
22
|
+
const request = this.requests.get(requestId);
|
|
23
|
+
const resolver = this.resolvers.get(requestId);
|
|
24
|
+
if (!request || request.status !== 'pending' || !resolver) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
request.status = 'approved';
|
|
28
|
+
request.approvedBy = approvedBy;
|
|
29
|
+
request.approvedAt = new Date();
|
|
30
|
+
if (resolver.timeoutId)
|
|
31
|
+
clearTimeout(resolver.timeoutId);
|
|
32
|
+
this.resolvers.delete(requestId);
|
|
33
|
+
this.requests.delete(requestId);
|
|
34
|
+
resolver.resolve(true);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
reject(requestId) {
|
|
38
|
+
const request = this.requests.get(requestId);
|
|
39
|
+
const resolver = this.resolvers.get(requestId);
|
|
40
|
+
if (!request || request.status !== 'pending' || !resolver) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
request.status = 'rejected';
|
|
44
|
+
request.rejectedAt = new Date();
|
|
45
|
+
if (resolver.timeoutId)
|
|
46
|
+
clearTimeout(resolver.timeoutId);
|
|
47
|
+
this.resolvers.delete(requestId);
|
|
48
|
+
this.requests.delete(requestId);
|
|
49
|
+
resolver.resolve(false);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
delete(requestId) {
|
|
53
|
+
const resolver = this.resolvers.get(requestId);
|
|
54
|
+
if (resolver?.timeoutId)
|
|
55
|
+
clearTimeout(resolver.timeoutId);
|
|
56
|
+
this.resolvers.delete(requestId);
|
|
57
|
+
this.requests.delete(requestId);
|
|
58
|
+
}
|
|
59
|
+
registerResolver(requestId, resolver) {
|
|
60
|
+
this.resolvers.set(requestId, resolver);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.InMemoryApprovalStore = InMemoryApprovalStore;
|
|
64
|
+
//# sourceMappingURL=in-memory-approval.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-approval.store.js","sourceRoot":"","sources":["../../src/approval/in-memory-approval.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ToolApprovalRequest } from '../types/tool.types';
|
|
2
|
+
import type { RedisClientLike } from '../state/redis-client.types';
|
|
3
|
+
import { IApprovalStore } from './approval-store.interface';
|
|
4
|
+
export interface RedisApprovalStoreConfig {
|
|
5
|
+
client: RedisClientLike;
|
|
6
|
+
keyPrefix?: string;
|
|
7
|
+
defaultTtlSeconds?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Redis-backed approval store for multi-instance deployments.
|
|
11
|
+
* Local resolvers handle in-process waits; Redis holds durable request state.
|
|
12
|
+
*/
|
|
13
|
+
export declare class RedisApprovalStore implements IApprovalStore {
|
|
14
|
+
private readonly client;
|
|
15
|
+
private readonly keyPrefix;
|
|
16
|
+
private readonly defaultTtlSeconds;
|
|
17
|
+
private readonly local;
|
|
18
|
+
constructor(config: RedisApprovalStoreConfig);
|
|
19
|
+
private key;
|
|
20
|
+
create(request: ToolApprovalRequest): Promise<void>;
|
|
21
|
+
get(requestId: string): Promise<ToolApprovalRequest | undefined>;
|
|
22
|
+
listPending(): Promise<ToolApprovalRequest[]>;
|
|
23
|
+
approve(requestId: string, approvedBy: string): Promise<boolean>;
|
|
24
|
+
reject(requestId: string): Promise<boolean>;
|
|
25
|
+
delete(requestId: string): Promise<void>;
|
|
26
|
+
/** Register local resolver for waiting execution on this instance. */
|
|
27
|
+
registerResolver(requestId: string, resolver: {
|
|
28
|
+
resolve: (approved: boolean) => void;
|
|
29
|
+
timeoutId?: NodeJS.Timeout;
|
|
30
|
+
}): void;
|
|
31
|
+
/** Poll Redis when approval happens on another instance. */
|
|
32
|
+
waitForResolution(requestId: string, expiresAt: Date, pollIntervalMs?: number): Promise<boolean>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=redis-approval.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-approval.store.d.ts","sourceRoot":"","sources":["../../src/approval/redis-approval.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,MAAM,EAAE,wBAAwB;IAS5C,OAAO,CAAC,GAAG;IAIL,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAiBhE,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAoB7C,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAchE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc3C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,sEAAsE;IACtE,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE;QAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAA;KAAE,GAC7E,IAAI;IAIP,4DAA4D;IACtD,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,cAAc,SAAM,GACnB,OAAO,CAAC,OAAO,CAAC;CAWpB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisApprovalStore = void 0;
|
|
4
|
+
const in_memory_approval_store_1 = require("./in-memory-approval.store");
|
|
5
|
+
/**
|
|
6
|
+
* Redis-backed approval store for multi-instance deployments.
|
|
7
|
+
* Local resolvers handle in-process waits; Redis holds durable request state.
|
|
8
|
+
*/
|
|
9
|
+
class RedisApprovalStore {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.local = new in_memory_approval_store_1.InMemoryApprovalStore();
|
|
12
|
+
if (!config.client) {
|
|
13
|
+
throw new Error('Redis client is required for RedisApprovalStore');
|
|
14
|
+
}
|
|
15
|
+
this.client = config.client;
|
|
16
|
+
this.keyPrefix = config.keyPrefix ?? 'agent:approval:';
|
|
17
|
+
this.defaultTtlSeconds = config.defaultTtlSeconds ?? 300;
|
|
18
|
+
}
|
|
19
|
+
key(requestId) {
|
|
20
|
+
return `${this.keyPrefix}${requestId}`;
|
|
21
|
+
}
|
|
22
|
+
async create(request) {
|
|
23
|
+
const expiresAt = request.expiresAt ?? new Date(Date.now() + this.defaultTtlSeconds * 1000);
|
|
24
|
+
const ttl = Math.max(1, Math.ceil((expiresAt.getTime() - Date.now()) / 1000) || this.defaultTtlSeconds);
|
|
25
|
+
await this.client.setEx(this.key(request.requestId), ttl, JSON.stringify(request));
|
|
26
|
+
this.local.create(request);
|
|
27
|
+
}
|
|
28
|
+
async get(requestId) {
|
|
29
|
+
const local = this.local.get(requestId);
|
|
30
|
+
if (local)
|
|
31
|
+
return local;
|
|
32
|
+
const raw = await this.client.get(this.key(requestId));
|
|
33
|
+
if (!raw)
|
|
34
|
+
return undefined;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(raw);
|
|
37
|
+
parsed.requestedAt = new Date(parsed.requestedAt);
|
|
38
|
+
if (parsed.expiresAt)
|
|
39
|
+
parsed.expiresAt = new Date(parsed.expiresAt);
|
|
40
|
+
if (parsed.approvedAt)
|
|
41
|
+
parsed.approvedAt = new Date(parsed.approvedAt);
|
|
42
|
+
if (parsed.rejectedAt)
|
|
43
|
+
parsed.rejectedAt = new Date(parsed.rejectedAt);
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async listPending() {
|
|
51
|
+
const keys = await this.client.keys(`${this.keyPrefix}*`);
|
|
52
|
+
const pending = [];
|
|
53
|
+
for (const redisKey of keys) {
|
|
54
|
+
const raw = await this.client.get(redisKey);
|
|
55
|
+
if (!raw)
|
|
56
|
+
continue;
|
|
57
|
+
try {
|
|
58
|
+
const req = JSON.parse(raw);
|
|
59
|
+
if (req.status === 'pending') {
|
|
60
|
+
req.requestedAt = new Date(req.requestedAt);
|
|
61
|
+
if (req.expiresAt)
|
|
62
|
+
req.expiresAt = new Date(req.expiresAt);
|
|
63
|
+
pending.push(req);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// skip corrupt entries
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return pending;
|
|
71
|
+
}
|
|
72
|
+
async approve(requestId, approvedBy) {
|
|
73
|
+
const request = await this.get(requestId);
|
|
74
|
+
if (!request || request.status !== 'pending') {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
request.status = 'approved';
|
|
78
|
+
request.approvedBy = approvedBy;
|
|
79
|
+
request.approvedAt = new Date();
|
|
80
|
+
const expiresAt = request.expiresAt ?? new Date(Date.now() + this.defaultTtlSeconds * 1000);
|
|
81
|
+
const ttl = Math.max(1, Math.ceil((expiresAt.getTime() - Date.now()) / 1000));
|
|
82
|
+
await this.client.setEx(this.key(requestId), ttl, JSON.stringify(request));
|
|
83
|
+
return this.local.approve(requestId, approvedBy);
|
|
84
|
+
}
|
|
85
|
+
async reject(requestId) {
|
|
86
|
+
const request = await this.get(requestId);
|
|
87
|
+
if (!request || request.status !== 'pending') {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
request.status = 'rejected';
|
|
91
|
+
request.rejectedAt = new Date();
|
|
92
|
+
const rejectExpiresAt = request.expiresAt ?? new Date(Date.now() + this.defaultTtlSeconds * 1000);
|
|
93
|
+
const rejectTtl = Math.max(1, Math.ceil((rejectExpiresAt.getTime() - Date.now()) / 1000));
|
|
94
|
+
await this.client.setEx(this.key(requestId), rejectTtl, JSON.stringify(request));
|
|
95
|
+
return this.local.reject(requestId);
|
|
96
|
+
}
|
|
97
|
+
async delete(requestId) {
|
|
98
|
+
this.local.delete(requestId);
|
|
99
|
+
await this.client.del(this.key(requestId));
|
|
100
|
+
}
|
|
101
|
+
/** Register local resolver for waiting execution on this instance. */
|
|
102
|
+
registerResolver(requestId, resolver) {
|
|
103
|
+
this.local.registerResolver(requestId, resolver);
|
|
104
|
+
}
|
|
105
|
+
/** Poll Redis when approval happens on another instance. */
|
|
106
|
+
async waitForResolution(requestId, expiresAt, pollIntervalMs = 200) {
|
|
107
|
+
const deadline = expiresAt.getTime();
|
|
108
|
+
while (Date.now() < deadline) {
|
|
109
|
+
const req = await this.get(requestId);
|
|
110
|
+
if (!req)
|
|
111
|
+
return false;
|
|
112
|
+
if (req.status === 'approved')
|
|
113
|
+
return true;
|
|
114
|
+
if (req.status === 'rejected' || req.status === 'expired')
|
|
115
|
+
return false;
|
|
116
|
+
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.RedisApprovalStore = RedisApprovalStore;
|
|
122
|
+
//# sourceMappingURL=redis-approval.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-approval.store.js","sourceRoot":"","sources":["../../src/approval/redis-approval.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export declare class AgentContextBuilder {
|
|
|
18
18
|
/**
|
|
19
19
|
* Build context with RAG
|
|
20
20
|
*/
|
|
21
|
-
buildWithRAG(context: AgentContext, ragService: any, topK?: number): Promise<void>;
|
|
21
|
+
buildWithRAG(context: AgentContext, ragService: any, topK?: number, onError?: (error: Error) => void): Promise<void>;
|
|
22
22
|
/**
|
|
23
23
|
* Persist context to memory
|
|
24
24
|
*/
|