@hazeljs/agent 0.2.0-beta.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/IMPLEMENTATION_SUMMARY.md +400 -0
- package/PERSISTENCE.md +201 -0
- package/PRISMA_INTEGRATION.md +499 -0
- package/PRODUCTION_READINESS.md +264 -0
- package/QUICKSTART.md +135 -0
- package/README.md +427 -0
- package/STATE_VS_MEMORY.md +243 -0
- package/dist/agent.module.d.ts +42 -0
- package/dist/agent.module.d.ts.map +1 -0
- package/dist/agent.module.js +90 -0
- package/dist/agent.module.js.map +1 -0
- package/dist/context/agent.context.d.ts +27 -0
- package/dist/context/agent.context.d.ts.map +1 -0
- package/dist/context/agent.context.js +98 -0
- package/dist/context/agent.context.js.map +1 -0
- package/dist/decorators/agent.decorator.d.ts +21 -0
- package/dist/decorators/agent.decorator.d.ts.map +1 -0
- package/dist/decorators/agent.decorator.js +38 -0
- package/dist/decorators/agent.decorator.js.map +1 -0
- package/dist/decorators/tool.decorator.d.ts +23 -0
- package/dist/decorators/tool.decorator.d.ts.map +1 -0
- package/dist/decorators/tool.decorator.js +61 -0
- package/dist/decorators/tool.decorator.js.map +1 -0
- package/dist/events/event.emitter.d.ts +45 -0
- package/dist/events/event.emitter.d.ts.map +1 -0
- package/dist/events/event.emitter.js +96 -0
- package/dist/events/event.emitter.js.map +1 -0
- package/dist/executor/agent.executor.d.ts +57 -0
- package/dist/executor/agent.executor.d.ts.map +1 -0
- package/dist/executor/agent.executor.js +303 -0
- package/dist/executor/agent.executor.js.map +1 -0
- package/dist/executor/tool.executor.d.ts +53 -0
- package/dist/executor/tool.executor.d.ts.map +1 -0
- package/dist/executor/tool.executor.js +234 -0
- package/dist/executor/tool.executor.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/agent.registry.d.ts +49 -0
- package/dist/registry/agent.registry.d.ts.map +1 -0
- package/dist/registry/agent.registry.js +90 -0
- package/dist/registry/agent.registry.js.map +1 -0
- package/dist/registry/tool.registry.d.ts +54 -0
- package/dist/registry/tool.registry.d.ts.map +1 -0
- package/dist/registry/tool.registry.js +153 -0
- package/dist/registry/tool.registry.js.map +1 -0
- package/dist/runtime/agent.runtime.d.ts +155 -0
- package/dist/runtime/agent.runtime.d.ts.map +1 -0
- package/dist/runtime/agent.runtime.extensions.d.ts +49 -0
- package/dist/runtime/agent.runtime.extensions.d.ts.map +1 -0
- package/dist/runtime/agent.runtime.extensions.js +93 -0
- package/dist/runtime/agent.runtime.extensions.js.map +1 -0
- package/dist/runtime/agent.runtime.js +347 -0
- package/dist/runtime/agent.runtime.js.map +1 -0
- package/dist/state/agent-state.interface.d.ts +63 -0
- package/dist/state/agent-state.interface.d.ts.map +1 -0
- package/dist/state/agent-state.interface.js +7 -0
- package/dist/state/agent-state.interface.js.map +1 -0
- package/dist/state/agent.state.d.ts +67 -0
- package/dist/state/agent.state.d.ts.map +1 -0
- package/dist/state/agent.state.js +172 -0
- package/dist/state/agent.state.js.map +1 -0
- package/dist/state/database-state.manager.d.ts +63 -0
- package/dist/state/database-state.manager.d.ts.map +1 -0
- package/dist/state/database-state.manager.js +282 -0
- package/dist/state/database-state.manager.js.map +1 -0
- package/dist/state/redis-state.manager.d.ts +81 -0
- package/dist/state/redis-state.manager.d.ts.map +1 -0
- package/dist/state/redis-state.manager.js +253 -0
- package/dist/state/redis-state.manager.js.map +1 -0
- package/dist/types/agent.types.d.ts +151 -0
- package/dist/types/agent.types.d.ts.map +1 -0
- package/dist/types/agent.types.js +32 -0
- package/dist/types/agent.types.js.map +1 -0
- package/dist/types/event.types.d.ts +123 -0
- package/dist/types/event.types.d.ts.map +1 -0
- package/dist/types/event.types.js +30 -0
- package/dist/types/event.types.js.map +1 -0
- package/dist/types/llm.types.d.ts +66 -0
- package/dist/types/llm.types.d.ts.map +1 -0
- package/dist/types/llm.types.js +7 -0
- package/dist/types/llm.types.js.map +1 -0
- package/dist/types/rag.types.d.ts +40 -0
- package/dist/types/rag.types.d.ts.map +1 -0
- package/dist/types/rag.types.js +7 -0
- package/dist/types/rag.types.js.map +1 -0
- package/dist/types/tool.types.d.ts +118 -0
- package/dist/types/tool.types.d.ts.map +1 -0
- package/dist/types/tool.types.js +19 -0
- package/dist/types/tool.types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +69 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +156 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/health-check.d.ts +71 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +156 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/logger.d.ts +53 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +133 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +90 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +186 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +44 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +82 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +42 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +103 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +58 -0
- package/prisma-schema.example.prisma +76 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent State Management
|
|
4
|
+
* Manages agent execution state and persistence
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AgentStateManager = void 0;
|
|
8
|
+
const agent_types_1 = require("../types/agent.types");
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
/**
|
|
11
|
+
* Agent State Manager
|
|
12
|
+
* In-memory implementation - default state manager
|
|
13
|
+
* Handles state transitions and persistence
|
|
14
|
+
*/
|
|
15
|
+
class AgentStateManager {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.contexts = new Map();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a new agent execution context
|
|
21
|
+
*/
|
|
22
|
+
createContext(agentId, sessionId, input, userId, metadata) {
|
|
23
|
+
const executionId = (0, crypto_1.randomUUID)();
|
|
24
|
+
const now = new Date();
|
|
25
|
+
const context = {
|
|
26
|
+
executionId,
|
|
27
|
+
agentId,
|
|
28
|
+
sessionId,
|
|
29
|
+
userId,
|
|
30
|
+
input,
|
|
31
|
+
state: agent_types_1.AgentState.IDLE,
|
|
32
|
+
steps: [],
|
|
33
|
+
memory: {
|
|
34
|
+
conversationHistory: [],
|
|
35
|
+
workingMemory: {},
|
|
36
|
+
facts: [],
|
|
37
|
+
entities: [],
|
|
38
|
+
},
|
|
39
|
+
metadata: metadata || {},
|
|
40
|
+
createdAt: now,
|
|
41
|
+
updatedAt: now,
|
|
42
|
+
};
|
|
43
|
+
this.contexts.set(executionId, context);
|
|
44
|
+
return context;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get execution context
|
|
48
|
+
*/
|
|
49
|
+
getContext(executionId) {
|
|
50
|
+
return this.contexts.get(executionId);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Update agent state
|
|
54
|
+
*/
|
|
55
|
+
updateState(executionId, newState) {
|
|
56
|
+
const context = this.contexts.get(executionId);
|
|
57
|
+
if (!context) {
|
|
58
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
59
|
+
}
|
|
60
|
+
context.state = newState;
|
|
61
|
+
context.updatedAt = new Date();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add a step to the execution
|
|
65
|
+
*/
|
|
66
|
+
addStep(executionId, step) {
|
|
67
|
+
const context = this.contexts.get(executionId);
|
|
68
|
+
if (!context) {
|
|
69
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
70
|
+
}
|
|
71
|
+
context.steps.push(step);
|
|
72
|
+
context.updatedAt = new Date();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Update the last step
|
|
76
|
+
*/
|
|
77
|
+
updateLastStep(executionId, updates) {
|
|
78
|
+
const context = this.contexts.get(executionId);
|
|
79
|
+
if (!context) {
|
|
80
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
81
|
+
}
|
|
82
|
+
if (context.steps.length === 0) {
|
|
83
|
+
throw new Error('No steps to update');
|
|
84
|
+
}
|
|
85
|
+
const lastStep = context.steps[context.steps.length - 1];
|
|
86
|
+
Object.assign(lastStep, updates);
|
|
87
|
+
context.updatedAt = new Date();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Add message to conversation history
|
|
91
|
+
*/
|
|
92
|
+
addMessage(executionId, role, content) {
|
|
93
|
+
const context = this.contexts.get(executionId);
|
|
94
|
+
if (!context) {
|
|
95
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
96
|
+
}
|
|
97
|
+
context.memory.conversationHistory.push({
|
|
98
|
+
role,
|
|
99
|
+
content,
|
|
100
|
+
timestamp: new Date(),
|
|
101
|
+
});
|
|
102
|
+
context.updatedAt = new Date();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Set working memory value
|
|
106
|
+
*/
|
|
107
|
+
setWorkingMemory(executionId, key, value) {
|
|
108
|
+
const context = this.contexts.get(executionId);
|
|
109
|
+
if (!context) {
|
|
110
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
111
|
+
}
|
|
112
|
+
context.memory.workingMemory[key] = value;
|
|
113
|
+
context.updatedAt = new Date();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get working memory value
|
|
117
|
+
*/
|
|
118
|
+
getWorkingMemory(executionId, key) {
|
|
119
|
+
const context = this.contexts.get(executionId);
|
|
120
|
+
if (!context) {
|
|
121
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
122
|
+
}
|
|
123
|
+
return context.memory.workingMemory[key];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Add RAG context
|
|
127
|
+
*/
|
|
128
|
+
addRAGContext(executionId, contexts) {
|
|
129
|
+
const context = this.contexts.get(executionId);
|
|
130
|
+
if (!context) {
|
|
131
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
132
|
+
}
|
|
133
|
+
context.ragContext = contexts;
|
|
134
|
+
context.updatedAt = new Date();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if execution can continue
|
|
138
|
+
*/
|
|
139
|
+
canContinue(executionId, maxSteps) {
|
|
140
|
+
const context = this.contexts.get(executionId);
|
|
141
|
+
if (!context) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (context.state === agent_types_1.AgentState.COMPLETED || context.state === agent_types_1.AgentState.FAILED) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (context.steps.length >= maxSteps) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Delete execution context
|
|
154
|
+
*/
|
|
155
|
+
deleteContext(executionId) {
|
|
156
|
+
this.contexts.delete(executionId);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Clear all contexts
|
|
160
|
+
*/
|
|
161
|
+
clear() {
|
|
162
|
+
this.contexts.clear();
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get all contexts for a session
|
|
166
|
+
*/
|
|
167
|
+
getSessionContexts(sessionId) {
|
|
168
|
+
return Array.from(this.contexts.values()).filter((ctx) => ctx.sessionId === sessionId);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.AgentStateManager = AgentStateManager;
|
|
172
|
+
//# sourceMappingURL=agent.state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.state.js","sourceRoot":"","sources":["../../src/state/agent.state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database State Manager
|
|
3
|
+
* Prisma-backed persistence for agent execution state
|
|
4
|
+
* Provides durable, queryable state management with full audit trail
|
|
5
|
+
*/
|
|
6
|
+
import { AgentContext, AgentState, AgentStep } from '../types/agent.types';
|
|
7
|
+
import { IAgentStateManager } from './agent-state.interface';
|
|
8
|
+
type PrismaClient = any;
|
|
9
|
+
export interface DatabaseStateManagerConfig {
|
|
10
|
+
/**
|
|
11
|
+
* Prisma client instance
|
|
12
|
+
*/
|
|
13
|
+
client: PrismaClient;
|
|
14
|
+
/**
|
|
15
|
+
* Whether to enable soft deletes (keep deleted contexts for audit)
|
|
16
|
+
* @default true
|
|
17
|
+
*/
|
|
18
|
+
softDelete?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether to automatically archive completed contexts
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
autoArchive?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Archive threshold in days (contexts older than this are archived)
|
|
26
|
+
* @default 30
|
|
27
|
+
*/
|
|
28
|
+
archiveThresholdDays?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Database-backed state manager for agent execution state
|
|
32
|
+
* Provides durable persistence with full query capabilities and audit trail
|
|
33
|
+
*/
|
|
34
|
+
export declare class DatabaseStateManager implements IAgentStateManager {
|
|
35
|
+
private client;
|
|
36
|
+
private softDelete;
|
|
37
|
+
private autoArchive;
|
|
38
|
+
private archiveThresholdDays;
|
|
39
|
+
constructor(config: DatabaseStateManagerConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Convert database record to AgentContext
|
|
42
|
+
*/
|
|
43
|
+
private toContext;
|
|
44
|
+
/**
|
|
45
|
+
* Convert AgentContext to database record
|
|
46
|
+
*/
|
|
47
|
+
private toRecord;
|
|
48
|
+
createContext(agentId: string, sessionId: string, input: string, userId?: string, metadata?: Record<string, unknown>): Promise<AgentContext>;
|
|
49
|
+
getContext(executionId: string): Promise<AgentContext | undefined>;
|
|
50
|
+
updateState(executionId: string, newState: AgentState): Promise<void>;
|
|
51
|
+
addStep(executionId: string, step: AgentStep): Promise<void>;
|
|
52
|
+
updateLastStep(executionId: string, updates: Partial<AgentStep>): Promise<void>;
|
|
53
|
+
addMessage(executionId: string, role: 'user' | 'assistant' | 'system' | 'tool', content: string): Promise<void>;
|
|
54
|
+
setWorkingMemory(executionId: string, key: string, value: unknown): Promise<void>;
|
|
55
|
+
getWorkingMemory(executionId: string, key: string): Promise<unknown>;
|
|
56
|
+
addRAGContext(executionId: string, contexts: string[]): Promise<void>;
|
|
57
|
+
canContinue(executionId: string, maxSteps: number): Promise<boolean>;
|
|
58
|
+
deleteContext(executionId: string): Promise<void>;
|
|
59
|
+
clear(): Promise<void>;
|
|
60
|
+
getSessionContexts(sessionId: string): Promise<AgentContext[]>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=database-state.manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-state.manager.d.ts","sourceRoot":"","sources":["../../src/state/database-state.manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,KAAK,YAAY,GAAG,GAAG,CAAC;AA8CxB,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,MAAM,EAAE,0BAA0B;IAU9C;;OAEG;IACH,OAAO,CAAC,SAAS;IAuCjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAoBV,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAgClB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAYlE,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/E,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,EAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAsBV,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrE,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAarE"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database State Manager
|
|
4
|
+
* Prisma-backed persistence for agent execution state
|
|
5
|
+
* Provides durable, queryable state management with full audit trail
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DatabaseStateManager = void 0;
|
|
9
|
+
const agent_types_1 = require("../types/agent.types");
|
|
10
|
+
const crypto_1 = require("crypto");
|
|
11
|
+
/**
|
|
12
|
+
* Database-backed state manager for agent execution state
|
|
13
|
+
* Provides durable persistence with full query capabilities and audit trail
|
|
14
|
+
*/
|
|
15
|
+
class DatabaseStateManager {
|
|
16
|
+
constructor(config) {
|
|
17
|
+
if (!config.client) {
|
|
18
|
+
throw new Error('Prisma client is required');
|
|
19
|
+
}
|
|
20
|
+
this.client = config.client;
|
|
21
|
+
this.softDelete = config.softDelete !== false;
|
|
22
|
+
this.autoArchive = config.autoArchive || false;
|
|
23
|
+
this.archiveThresholdDays = config.archiveThresholdDays || 30;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Convert database record to AgentContext
|
|
27
|
+
*/
|
|
28
|
+
toContext(record) {
|
|
29
|
+
return {
|
|
30
|
+
executionId: record.executionId,
|
|
31
|
+
agentId: record.agentId,
|
|
32
|
+
sessionId: record.sessionId,
|
|
33
|
+
userId: record.userId || undefined,
|
|
34
|
+
input: record.input,
|
|
35
|
+
state: record.state,
|
|
36
|
+
steps: (record.steps || []).map((step) => ({
|
|
37
|
+
id: step.id,
|
|
38
|
+
agentId: step.agentId,
|
|
39
|
+
executionId: step.executionId,
|
|
40
|
+
stepNumber: step.stepNumber,
|
|
41
|
+
state: step.state,
|
|
42
|
+
action: step.action,
|
|
43
|
+
result: step.result,
|
|
44
|
+
error: step.error,
|
|
45
|
+
timestamp: new Date(step.timestamp),
|
|
46
|
+
duration: step.duration,
|
|
47
|
+
})),
|
|
48
|
+
memory: {
|
|
49
|
+
conversationHistory: (record.conversationHistory || []).map((msg) => ({
|
|
50
|
+
role: msg.role,
|
|
51
|
+
content: msg.content,
|
|
52
|
+
timestamp: new Date(msg.timestamp),
|
|
53
|
+
})),
|
|
54
|
+
workingMemory: record.workingMemory || {},
|
|
55
|
+
facts: record.facts || [],
|
|
56
|
+
entities: record.entities || [],
|
|
57
|
+
},
|
|
58
|
+
ragContext: record.ragContext || undefined,
|
|
59
|
+
metadata: record.metadata || {},
|
|
60
|
+
createdAt: new Date(record.createdAt),
|
|
61
|
+
updatedAt: new Date(record.updatedAt),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert AgentContext to database record
|
|
66
|
+
*/
|
|
67
|
+
toRecord(context) {
|
|
68
|
+
return {
|
|
69
|
+
executionId: context.executionId,
|
|
70
|
+
agentId: context.agentId,
|
|
71
|
+
sessionId: context.sessionId,
|
|
72
|
+
userId: context.userId || null,
|
|
73
|
+
input: context.input,
|
|
74
|
+
state: context.state,
|
|
75
|
+
steps: context.steps,
|
|
76
|
+
conversationHistory: context.memory.conversationHistory,
|
|
77
|
+
workingMemory: context.memory.workingMemory,
|
|
78
|
+
facts: context.memory.facts,
|
|
79
|
+
entities: context.memory.entities,
|
|
80
|
+
ragContext: context.ragContext || null,
|
|
81
|
+
metadata: context.metadata,
|
|
82
|
+
createdAt: context.createdAt,
|
|
83
|
+
updatedAt: context.updatedAt,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async createContext(agentId, sessionId, input, userId, metadata) {
|
|
87
|
+
const executionId = (0, crypto_1.randomUUID)();
|
|
88
|
+
const now = new Date();
|
|
89
|
+
const context = {
|
|
90
|
+
executionId,
|
|
91
|
+
agentId,
|
|
92
|
+
sessionId,
|
|
93
|
+
userId,
|
|
94
|
+
input,
|
|
95
|
+
state: agent_types_1.AgentState.IDLE,
|
|
96
|
+
steps: [],
|
|
97
|
+
memory: {
|
|
98
|
+
conversationHistory: [],
|
|
99
|
+
workingMemory: {},
|
|
100
|
+
facts: [],
|
|
101
|
+
entities: [],
|
|
102
|
+
},
|
|
103
|
+
metadata: metadata || {},
|
|
104
|
+
createdAt: now,
|
|
105
|
+
updatedAt: now,
|
|
106
|
+
};
|
|
107
|
+
const record = this.toRecord(context);
|
|
108
|
+
await this.client.agentContext.create({
|
|
109
|
+
data: record,
|
|
110
|
+
});
|
|
111
|
+
return context;
|
|
112
|
+
}
|
|
113
|
+
async getContext(executionId) {
|
|
114
|
+
const record = await this.client.agentContext.findUnique({
|
|
115
|
+
where: { executionId },
|
|
116
|
+
});
|
|
117
|
+
if (!record) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return this.toContext(record);
|
|
121
|
+
}
|
|
122
|
+
async updateState(executionId, newState) {
|
|
123
|
+
const context = await this.getContext(executionId);
|
|
124
|
+
if (!context) {
|
|
125
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
126
|
+
}
|
|
127
|
+
context.state = newState;
|
|
128
|
+
context.updatedAt = new Date();
|
|
129
|
+
await this.client.agentContext.update({
|
|
130
|
+
where: { executionId },
|
|
131
|
+
data: {
|
|
132
|
+
state: newState,
|
|
133
|
+
updatedAt: context.updatedAt,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async addStep(executionId, step) {
|
|
138
|
+
const context = await this.getContext(executionId);
|
|
139
|
+
if (!context) {
|
|
140
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
141
|
+
}
|
|
142
|
+
context.steps.push(step);
|
|
143
|
+
context.updatedAt = new Date();
|
|
144
|
+
await this.client.agentContext.update({
|
|
145
|
+
where: { executionId },
|
|
146
|
+
data: {
|
|
147
|
+
steps: context.steps,
|
|
148
|
+
updatedAt: context.updatedAt,
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async updateLastStep(executionId, updates) {
|
|
153
|
+
const context = await this.getContext(executionId);
|
|
154
|
+
if (!context) {
|
|
155
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
156
|
+
}
|
|
157
|
+
if (context.steps.length === 0) {
|
|
158
|
+
throw new Error('No steps to update');
|
|
159
|
+
}
|
|
160
|
+
const lastStep = context.steps[context.steps.length - 1];
|
|
161
|
+
Object.assign(lastStep, updates);
|
|
162
|
+
context.updatedAt = new Date();
|
|
163
|
+
await this.client.agentContext.update({
|
|
164
|
+
where: { executionId },
|
|
165
|
+
data: {
|
|
166
|
+
steps: context.steps,
|
|
167
|
+
updatedAt: context.updatedAt,
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async addMessage(executionId, role, content) {
|
|
172
|
+
const context = await this.getContext(executionId);
|
|
173
|
+
if (!context) {
|
|
174
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
175
|
+
}
|
|
176
|
+
context.memory.conversationHistory.push({
|
|
177
|
+
role,
|
|
178
|
+
content,
|
|
179
|
+
timestamp: new Date(),
|
|
180
|
+
});
|
|
181
|
+
context.updatedAt = new Date();
|
|
182
|
+
await this.client.agentContext.update({
|
|
183
|
+
where: { executionId },
|
|
184
|
+
data: {
|
|
185
|
+
conversationHistory: context.memory.conversationHistory,
|
|
186
|
+
updatedAt: context.updatedAt,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
async setWorkingMemory(executionId, key, value) {
|
|
191
|
+
const context = await this.getContext(executionId);
|
|
192
|
+
if (!context) {
|
|
193
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
194
|
+
}
|
|
195
|
+
context.memory.workingMemory[key] = value;
|
|
196
|
+
context.updatedAt = new Date();
|
|
197
|
+
await this.client.agentContext.update({
|
|
198
|
+
where: { executionId },
|
|
199
|
+
data: {
|
|
200
|
+
workingMemory: context.memory.workingMemory,
|
|
201
|
+
updatedAt: context.updatedAt,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
async getWorkingMemory(executionId, key) {
|
|
206
|
+
const context = await this.getContext(executionId);
|
|
207
|
+
if (!context) {
|
|
208
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
209
|
+
}
|
|
210
|
+
return context.memory.workingMemory[key];
|
|
211
|
+
}
|
|
212
|
+
async addRAGContext(executionId, contexts) {
|
|
213
|
+
const context = await this.getContext(executionId);
|
|
214
|
+
if (!context) {
|
|
215
|
+
throw new Error(`Execution context ${executionId} not found`);
|
|
216
|
+
}
|
|
217
|
+
context.ragContext = contexts;
|
|
218
|
+
context.updatedAt = new Date();
|
|
219
|
+
await this.client.agentContext.update({
|
|
220
|
+
where: { executionId },
|
|
221
|
+
data: {
|
|
222
|
+
ragContext: contexts,
|
|
223
|
+
updatedAt: context.updatedAt,
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
async canContinue(executionId, maxSteps) {
|
|
228
|
+
const context = await this.getContext(executionId);
|
|
229
|
+
if (!context) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
if (context.state === agent_types_1.AgentState.COMPLETED || context.state === agent_types_1.AgentState.FAILED) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
if (context.steps.length >= maxSteps) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
async deleteContext(executionId) {
|
|
241
|
+
if (this.softDelete) {
|
|
242
|
+
await this.client.agentContext.update({
|
|
243
|
+
where: { executionId },
|
|
244
|
+
data: {
|
|
245
|
+
deletedAt: new Date(),
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
await this.client.agentContext.delete({
|
|
251
|
+
where: { executionId },
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async clear() {
|
|
256
|
+
if (this.softDelete) {
|
|
257
|
+
await this.client.agentContext.updateMany({
|
|
258
|
+
where: { deletedAt: null },
|
|
259
|
+
data: {
|
|
260
|
+
deletedAt: new Date(),
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
await this.client.agentContext.deleteMany({});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async getSessionContexts(sessionId) {
|
|
269
|
+
const records = await this.client.agentContext.findMany({
|
|
270
|
+
where: {
|
|
271
|
+
sessionId,
|
|
272
|
+
deletedAt: this.softDelete ? null : undefined,
|
|
273
|
+
},
|
|
274
|
+
orderBy: {
|
|
275
|
+
createdAt: 'desc',
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
return records.map((record) => this.toContext(record));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
exports.DatabaseStateManager = DatabaseStateManager;
|
|
282
|
+
//# sourceMappingURL=database-state.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-state.manager.js","sourceRoot":"","sources":["../../src/state/database-state.manager.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,sDAA2E;AAE3E,mCAAoC;AAwEpC;;;GAGG;AACH,MAAa,oBAAoB;IAM/B,YAAY,MAAkC;QAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;QAC/C,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,MAAsB;QACtC,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAmB;YACjC,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAC7B,CAAC,IAAkB,EAAa,EAAE,CAAC,CAAC;gBAClC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAmB;gBAC/B,MAAM,EAAE,IAAI,CAAC,MAA6B;gBAC1C,MAAM,EAAE,IAAI,CAAC,MAA6B;gBAC1C,KAAK,EAAE,IAAI,CAAC,KAA2B;gBACvC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CACH;YACD,MAAM,EAAE;gBACN,mBAAmB,EAAE,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAoB,EAAE,EAAE,CAAC,CAAC;oBACrF,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;iBACnC,CAAC,CAAC;gBACH,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;gBACzC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;aAChC;YACD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;YAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACrC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,QAAQ,CAAC,OAAqB;QACpC,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB;YACvD,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa;YAC3C,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK;YAC3B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;YACjC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,SAAiB,EACjB,KAAa,EACb,MAAe,EACf,QAAkC;QAElC,MAAM,WAAW,GAAG,IAAA,mBAAU,GAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAiB;YAC5B,WAAW;YACX,OAAO;YACP,SAAS;YACT,MAAM;YACN,KAAK;YACL,KAAK,EAAE,wBAAU,CAAC,IAAI;YACtB,KAAK,EAAE,EAAE;YACT,MAAM,EAAE;gBACN,mBAAmB,EAAE,EAAE;gBACvB,aAAa,EAAE,EAAE;gBACjB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;aACb;YACD,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,QAAoB;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;QACzB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,IAAe;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,OAA2B;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,IAA8C,EAC9C,OAAe;QAEf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACtC,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB;gBACvD,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,GAAW,EAAE,KAAc;QACrE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1C,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa;gBAC3C,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,GAAW;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,QAAkB;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC9B,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE/B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACpC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,IAAI,EAAE;gBACJ,UAAU,EAAE,QAAQ;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,QAAgB;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,KAAK,wBAAU,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,wBAAU,CAAC,MAAM,EAAE,CAAC;YAClF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;gBACpC,KAAK,EAAE,EAAE,WAAW,EAAE;gBACtB,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;gBACpC,KAAK,EAAE,EAAE,WAAW,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;gBACxC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;gBAC1B,IAAI,EAAE;oBACJ,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE;gBACL,SAAS;gBACT,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aAC9C;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,MAAM;aAClB;SACF,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AA/TD,oDA+TC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis State Manager
|
|
3
|
+
* Redis-backed persistence for agent execution state
|
|
4
|
+
* Provides fast, distributed state management with TTL support
|
|
5
|
+
*/
|
|
6
|
+
import { AgentContext, AgentState, AgentStep } from '../types/agent.types';
|
|
7
|
+
import { IAgentStateManager } from './agent-state.interface';
|
|
8
|
+
type RedisClient = any;
|
|
9
|
+
export interface RedisStateManagerConfig {
|
|
10
|
+
/**
|
|
11
|
+
* Redis client instance
|
|
12
|
+
*/
|
|
13
|
+
client: RedisClient;
|
|
14
|
+
/**
|
|
15
|
+
* Key prefix for all agent state keys
|
|
16
|
+
* @default "agent:state:"
|
|
17
|
+
*/
|
|
18
|
+
keyPrefix?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Default TTL for execution contexts in seconds
|
|
21
|
+
* @default 3600 (1 hour)
|
|
22
|
+
*/
|
|
23
|
+
defaultTTL?: number;
|
|
24
|
+
/**
|
|
25
|
+
* TTL for completed contexts in seconds
|
|
26
|
+
* @default 86400 (24 hours)
|
|
27
|
+
*/
|
|
28
|
+
completedTTL?: number;
|
|
29
|
+
/**
|
|
30
|
+
* TTL for failed contexts in seconds
|
|
31
|
+
* @default 604800 (7 days)
|
|
32
|
+
*/
|
|
33
|
+
failedTTL?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Redis-backed state manager for agent execution state
|
|
37
|
+
* Provides fast, distributed state management with automatic expiration
|
|
38
|
+
*/
|
|
39
|
+
export declare class RedisStateManager implements IAgentStateManager {
|
|
40
|
+
private client;
|
|
41
|
+
private keyPrefix;
|
|
42
|
+
private defaultTTL;
|
|
43
|
+
private completedTTL;
|
|
44
|
+
private failedTTL;
|
|
45
|
+
constructor(config: RedisStateManagerConfig);
|
|
46
|
+
/**
|
|
47
|
+
* Get the Redis key for an execution context
|
|
48
|
+
*/
|
|
49
|
+
private getKey;
|
|
50
|
+
/**
|
|
51
|
+
* Get the Redis key for session contexts
|
|
52
|
+
*/
|
|
53
|
+
private getSessionKey;
|
|
54
|
+
/**
|
|
55
|
+
* Serialize context to JSON
|
|
56
|
+
*/
|
|
57
|
+
private serialize;
|
|
58
|
+
/**
|
|
59
|
+
* Deserialize context from JSON
|
|
60
|
+
*/
|
|
61
|
+
private deserialize;
|
|
62
|
+
/**
|
|
63
|
+
* Get TTL based on state
|
|
64
|
+
*/
|
|
65
|
+
private getTTL;
|
|
66
|
+
createContext(agentId: string, sessionId: string, input: string, userId?: string, metadata?: Record<string, unknown>): Promise<AgentContext>;
|
|
67
|
+
getContext(executionId: string): Promise<AgentContext | undefined>;
|
|
68
|
+
updateState(executionId: string, newState: AgentState): Promise<void>;
|
|
69
|
+
addStep(executionId: string, step: AgentStep): Promise<void>;
|
|
70
|
+
updateLastStep(executionId: string, updates: Partial<AgentStep>): Promise<void>;
|
|
71
|
+
addMessage(executionId: string, role: 'user' | 'assistant' | 'system' | 'tool', content: string): Promise<void>;
|
|
72
|
+
setWorkingMemory(executionId: string, key: string, value: unknown): Promise<void>;
|
|
73
|
+
getWorkingMemory(executionId: string, key: string): Promise<unknown>;
|
|
74
|
+
addRAGContext(executionId: string, contexts: string[]): Promise<void>;
|
|
75
|
+
canContinue(executionId: string, maxSteps: number): Promise<boolean>;
|
|
76
|
+
deleteContext(executionId: string): Promise<void>;
|
|
77
|
+
clear(): Promise<void>;
|
|
78
|
+
getSessionContexts(sessionId: string): Promise<AgentContext[]>;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=redis-state.manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-state.manager.d.ts","sourceRoot":"","sources":["../../src/state/redis-state.manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,KAAK,WAAW,GAAG,GAAG,CAAC;AAEvB,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,uBAAuB;IAW3C;;OAEG;IACH,OAAO,CAAC,MAAM;IAId;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,OAAO,CAAC,MAAM;IAUR,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAqClB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAWlE,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/E,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,EAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAoBV,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASpE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrE,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAcrE"}
|