@falai/agent 0.3.21 → 0.3.22
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/README.md +18 -8
- package/dist/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/adapters/OpenSearchAdapter.js +457 -0
- package/dist/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts +169 -0
- package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js +461 -0
- package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +2 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -1
- package/dist/cjs/adapters/index.js +3 -1
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/docs/ADAPTERS.md +14 -2
- package/docs/API_REFERENCE.md +68 -0
- package/docs/PERSISTENCE.md +78 -7
- package/docs/README.md +27 -2
- package/examples/opensearch-persistence.ts +175 -0
- package/package.json +6 -2
- package/src/adapters/OpenSearchAdapter.ts +666 -0
- package/src/adapters/index.ts +6 -0
- package/src/index.ts +5 -0
package/README.md
CHANGED
|
@@ -921,6 +921,15 @@ Fast, in-memory persistence for high-throughput applications:
|
|
|
921
921
|
- 🔑 Custom key prefixes
|
|
922
922
|
- 💨 Perfect for real-time chat applications
|
|
923
923
|
|
|
924
|
+
### 🔍 [OpenSearch Persistence](./examples/opensearch-persistence.ts)
|
|
925
|
+
|
|
926
|
+
Full-text search and analytics-powered persistence:
|
|
927
|
+
|
|
928
|
+
- 🔍 Built-in full-text search across all messages
|
|
929
|
+
- 📊 Powerful aggregations and analytics
|
|
930
|
+
- 🌐 Compatible with Elasticsearch 7.x
|
|
931
|
+
- ☁️ AWS OpenSearch Service ready
|
|
932
|
+
|
|
924
933
|
---
|
|
925
934
|
|
|
926
935
|
## 💾 Database Adapters
|
|
@@ -929,14 +938,15 @@ Fast, in-memory persistence for high-throughput applications:
|
|
|
929
938
|
|
|
930
939
|
### 🎯 Available Adapters
|
|
931
940
|
|
|
932
|
-
| Adapter | Use Case | Install
|
|
933
|
-
| --------------------- | ---------------------------------- |
|
|
934
|
-
| **PrismaAdapter** | Type-safe ORM with migrations | `npm install @prisma/client`
|
|
935
|
-
| **RedisAdapter** | Fast in-memory for real-time apps | `npm install ioredis`
|
|
936
|
-
| **MongoAdapter** | Flexible document storage | `npm install mongodb`
|
|
937
|
-
| **PostgreSQLAdapter** | Raw SQL with auto table creation | `npm install pg`
|
|
938
|
-
| **SQLiteAdapter** | Lightweight local database | `npm install better-sqlite3`
|
|
939
|
-
| **
|
|
941
|
+
| Adapter | Use Case | Install |
|
|
942
|
+
| --------------------- | ---------------------------------- | -------------------------------------------- |
|
|
943
|
+
| **PrismaAdapter** | Type-safe ORM with migrations | `npm install @prisma/client` |
|
|
944
|
+
| **RedisAdapter** | Fast in-memory for real-time apps | `npm install ioredis` |
|
|
945
|
+
| **MongoAdapter** | Flexible document storage | `npm install mongodb` |
|
|
946
|
+
| **PostgreSQLAdapter** | Raw SQL with auto table creation | `npm install pg` |
|
|
947
|
+
| **SQLiteAdapter** | Lightweight local database | `npm install better-sqlite3` |
|
|
948
|
+
| **OpenSearchAdapter** | Full-text search & analytics | `npm install @opensearch-project/opensearch` |
|
|
949
|
+
| **MemoryAdapter** | Testing & development (no install) | Built-in (no dependencies) ✨ |
|
|
940
950
|
|
|
941
951
|
### ⚡ Quick Setup
|
|
942
952
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSearch Persistence Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides persistence for sessions and messages using OpenSearch.
|
|
5
|
+
* Also compatible with Elasticsearch 7.x (not tested with newer versions).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Client } from '@opensearch-project/opensearch';
|
|
10
|
+
* import { OpenSearchAdapter } from '@falai/agent';
|
|
11
|
+
*
|
|
12
|
+
* const client = new Client({
|
|
13
|
+
* node: 'https://localhost:9200',
|
|
14
|
+
* auth: {
|
|
15
|
+
* username: 'admin',
|
|
16
|
+
* password: 'admin'
|
|
17
|
+
* }
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const adapter = new OpenSearchAdapter(client, {
|
|
21
|
+
* indices: {
|
|
22
|
+
* sessions: 'agent_sessions',
|
|
23
|
+
* messages: 'agent_messages'
|
|
24
|
+
* },
|
|
25
|
+
* autoCreateIndices: true
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const agent = new Agent({
|
|
29
|
+
* model: provider,
|
|
30
|
+
* persistence: { adapter }
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import type { PersistenceAdapter, SessionRepository, MessageRepository } from "../types/persistence.js";
|
|
35
|
+
/**
|
|
36
|
+
* OpenSearch Client interface (minimal typing for the official client)
|
|
37
|
+
*/
|
|
38
|
+
export interface OpenSearchClient {
|
|
39
|
+
index(params: {
|
|
40
|
+
index: string;
|
|
41
|
+
id?: string;
|
|
42
|
+
body: Record<string, unknown>;
|
|
43
|
+
refresh?: boolean | "wait_for";
|
|
44
|
+
}): Promise<{
|
|
45
|
+
body: {
|
|
46
|
+
_id: string;
|
|
47
|
+
result: string;
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
get(params: {
|
|
51
|
+
index: string;
|
|
52
|
+
id: string;
|
|
53
|
+
}): Promise<{
|
|
54
|
+
body: {
|
|
55
|
+
_source: Record<string, unknown>;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
update(params: {
|
|
59
|
+
index: string;
|
|
60
|
+
id: string;
|
|
61
|
+
body: {
|
|
62
|
+
doc: Record<string, unknown>;
|
|
63
|
+
};
|
|
64
|
+
refresh?: boolean | "wait_for";
|
|
65
|
+
}): Promise<{
|
|
66
|
+
body: {
|
|
67
|
+
result: string;
|
|
68
|
+
};
|
|
69
|
+
}>;
|
|
70
|
+
delete(params: {
|
|
71
|
+
index: string;
|
|
72
|
+
id: string;
|
|
73
|
+
refresh?: boolean | "wait_for";
|
|
74
|
+
}): Promise<{
|
|
75
|
+
body: {
|
|
76
|
+
result: string;
|
|
77
|
+
};
|
|
78
|
+
}>;
|
|
79
|
+
deleteByQuery(params: {
|
|
80
|
+
index: string;
|
|
81
|
+
body: {
|
|
82
|
+
query: Record<string, unknown>;
|
|
83
|
+
};
|
|
84
|
+
refresh?: boolean | "wait_for";
|
|
85
|
+
}): Promise<{
|
|
86
|
+
body: {
|
|
87
|
+
deleted: number;
|
|
88
|
+
};
|
|
89
|
+
}>;
|
|
90
|
+
search(params: {
|
|
91
|
+
index: string;
|
|
92
|
+
body: {
|
|
93
|
+
query?: Record<string, unknown>;
|
|
94
|
+
sort?: Array<Record<string, unknown>>;
|
|
95
|
+
size?: number;
|
|
96
|
+
};
|
|
97
|
+
}): Promise<{
|
|
98
|
+
body: {
|
|
99
|
+
hits: {
|
|
100
|
+
hits: Array<{
|
|
101
|
+
_id: string;
|
|
102
|
+
_source: Record<string, unknown>;
|
|
103
|
+
}>;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
}>;
|
|
107
|
+
indices: {
|
|
108
|
+
exists(params: {
|
|
109
|
+
index: string;
|
|
110
|
+
}): Promise<{
|
|
111
|
+
body: boolean;
|
|
112
|
+
}>;
|
|
113
|
+
create(params: {
|
|
114
|
+
index: string;
|
|
115
|
+
body: {
|
|
116
|
+
mappings?: Record<string, unknown>;
|
|
117
|
+
};
|
|
118
|
+
}): Promise<{
|
|
119
|
+
body: {
|
|
120
|
+
acknowledged: boolean;
|
|
121
|
+
};
|
|
122
|
+
}>;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Configuration options for the OpenSearch adapter
|
|
127
|
+
*/
|
|
128
|
+
export interface OpenSearchAdapterOptions {
|
|
129
|
+
/**
|
|
130
|
+
* Index names for sessions and messages
|
|
131
|
+
* @default { sessions: 'agent_sessions', messages: 'agent_messages' }
|
|
132
|
+
*/
|
|
133
|
+
indices?: {
|
|
134
|
+
sessions?: string;
|
|
135
|
+
messages?: string;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Automatically create indices with mappings if they don't exist
|
|
139
|
+
* @default true
|
|
140
|
+
*/
|
|
141
|
+
autoCreateIndices?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Refresh strategy for write operations
|
|
144
|
+
* - true: Refresh immediately (slower, good for testing)
|
|
145
|
+
* - false: Refresh in background (faster, eventual consistency)
|
|
146
|
+
* - 'wait_for': Wait for refresh (balanced)
|
|
147
|
+
* @default false
|
|
148
|
+
*/
|
|
149
|
+
refresh?: boolean | "wait_for";
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* OpenSearch persistence adapter
|
|
153
|
+
*
|
|
154
|
+
* Stores sessions and messages as documents in OpenSearch indices.
|
|
155
|
+
* Compatible with OpenSearch 1.x, 2.x and Elasticsearch 7.x.
|
|
156
|
+
*/
|
|
157
|
+
export declare class OpenSearchAdapter implements PersistenceAdapter {
|
|
158
|
+
readonly sessionRepository: SessionRepository;
|
|
159
|
+
readonly messageRepository: MessageRepository;
|
|
160
|
+
private readonly client;
|
|
161
|
+
private readonly sessionIndex;
|
|
162
|
+
private readonly messageIndex;
|
|
163
|
+
private readonly autoCreateIndices;
|
|
164
|
+
private readonly refresh;
|
|
165
|
+
constructor(client: OpenSearchClient, options?: OpenSearchAdapterOptions);
|
|
166
|
+
initialize(): Promise<void>;
|
|
167
|
+
disconnect(): Promise<void>;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=OpenSearchAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenSearchAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/OpenSearchAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSearch Persistence Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides persistence for sessions and messages using OpenSearch.
|
|
5
|
+
* Also compatible with Elasticsearch 7.x (not tested with newer versions).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { Client } from '@opensearch-project/opensearch';
|
|
10
|
+
* import { OpenSearchAdapter } from '@falai/agent';
|
|
11
|
+
*
|
|
12
|
+
* const client = new Client({
|
|
13
|
+
* node: 'https://localhost:9200',
|
|
14
|
+
* auth: {
|
|
15
|
+
* username: 'admin',
|
|
16
|
+
* password: 'admin'
|
|
17
|
+
* }
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const adapter = new OpenSearchAdapter(client, {
|
|
21
|
+
* indices: {
|
|
22
|
+
* sessions: 'agent_sessions',
|
|
23
|
+
* messages: 'agent_messages'
|
|
24
|
+
* },
|
|
25
|
+
* autoCreateIndices: true
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const agent = new Agent({
|
|
29
|
+
* model: provider,
|
|
30
|
+
* persistence: { adapter }
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* OpenSearch persistence adapter
|
|
36
|
+
*
|
|
37
|
+
* Stores sessions and messages as documents in OpenSearch indices.
|
|
38
|
+
* Compatible with OpenSearch 1.x, 2.x and Elasticsearch 7.x.
|
|
39
|
+
*/
|
|
40
|
+
export class OpenSearchAdapter {
|
|
41
|
+
constructor(client, options = {}) {
|
|
42
|
+
this.client = client;
|
|
43
|
+
this.sessionIndex = options.indices?.sessions || "agent_sessions";
|
|
44
|
+
this.messageIndex = options.indices?.messages || "agent_messages";
|
|
45
|
+
this.autoCreateIndices = options.autoCreateIndices ?? true;
|
|
46
|
+
this.refresh = options.refresh ?? false;
|
|
47
|
+
this.sessionRepository = new OpenSearchSessionRepository(this.client, this.sessionIndex, this.refresh);
|
|
48
|
+
this.messageRepository = new OpenSearchMessageRepository(this.client, this.messageIndex, this.refresh);
|
|
49
|
+
}
|
|
50
|
+
async initialize() {
|
|
51
|
+
if (!this.autoCreateIndices) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Create sessions index with mappings
|
|
55
|
+
const sessionExists = await this.client.indices.exists({
|
|
56
|
+
index: this.sessionIndex,
|
|
57
|
+
});
|
|
58
|
+
if (!sessionExists.body) {
|
|
59
|
+
await this.client.indices.create({
|
|
60
|
+
index: this.sessionIndex,
|
|
61
|
+
body: {
|
|
62
|
+
mappings: {
|
|
63
|
+
properties: {
|
|
64
|
+
id: { type: "keyword" },
|
|
65
|
+
userId: { type: "keyword" },
|
|
66
|
+
agentName: { type: "keyword" },
|
|
67
|
+
status: { type: "keyword" },
|
|
68
|
+
currentRoute: { type: "keyword" },
|
|
69
|
+
currentState: { type: "keyword" },
|
|
70
|
+
collectedData: { type: "object", enabled: false },
|
|
71
|
+
messageCount: { type: "integer" },
|
|
72
|
+
createdAt: { type: "date" },
|
|
73
|
+
updatedAt: { type: "date" },
|
|
74
|
+
lastMessageAt: { type: "date" },
|
|
75
|
+
completedAt: { type: "date" },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Create messages index with mappings
|
|
82
|
+
const messageExists = await this.client.indices.exists({
|
|
83
|
+
index: this.messageIndex,
|
|
84
|
+
});
|
|
85
|
+
if (!messageExists.body) {
|
|
86
|
+
await this.client.indices.create({
|
|
87
|
+
index: this.messageIndex,
|
|
88
|
+
body: {
|
|
89
|
+
mappings: {
|
|
90
|
+
properties: {
|
|
91
|
+
id: { type: "keyword" },
|
|
92
|
+
sessionId: { type: "keyword" },
|
|
93
|
+
userId: { type: "keyword" },
|
|
94
|
+
role: { type: "keyword" },
|
|
95
|
+
content: { type: "text" },
|
|
96
|
+
route: { type: "keyword" },
|
|
97
|
+
state: { type: "keyword" },
|
|
98
|
+
toolCalls: { type: "object", enabled: false },
|
|
99
|
+
event: { type: "object", enabled: false },
|
|
100
|
+
createdAt: { type: "date" },
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async disconnect() {
|
|
108
|
+
// OpenSearch client doesn't have a close method like some other clients
|
|
109
|
+
// Connection pooling is managed automatically
|
|
110
|
+
await Promise.resolve();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* OpenSearch-based session repository implementation
|
|
115
|
+
*/
|
|
116
|
+
class OpenSearchSessionRepository {
|
|
117
|
+
constructor(client, index, refresh) {
|
|
118
|
+
this.client = client;
|
|
119
|
+
this.index = index;
|
|
120
|
+
this.refresh = refresh;
|
|
121
|
+
}
|
|
122
|
+
async create(data) {
|
|
123
|
+
const id = `sess_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
124
|
+
const now = new Date();
|
|
125
|
+
const session = {
|
|
126
|
+
id,
|
|
127
|
+
...data,
|
|
128
|
+
createdAt: now,
|
|
129
|
+
};
|
|
130
|
+
await this.client.index({
|
|
131
|
+
index: this.index,
|
|
132
|
+
id,
|
|
133
|
+
body: this.serializeSession(session),
|
|
134
|
+
refresh: this.refresh,
|
|
135
|
+
});
|
|
136
|
+
return session;
|
|
137
|
+
}
|
|
138
|
+
async findById(id) {
|
|
139
|
+
try {
|
|
140
|
+
const response = await this.client.get({
|
|
141
|
+
index: this.index,
|
|
142
|
+
id,
|
|
143
|
+
});
|
|
144
|
+
return this.deserializeSession(response.body._source);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (this.isNotFoundError(error)) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async findActiveByUserId(userId) {
|
|
154
|
+
const response = await this.client.search({
|
|
155
|
+
index: this.index,
|
|
156
|
+
body: {
|
|
157
|
+
query: {
|
|
158
|
+
bool: {
|
|
159
|
+
must: [{ term: { userId } }, { term: { status: "active" } }],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
sort: [{ createdAt: { order: "desc" } }],
|
|
163
|
+
size: 1,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
const hits = response.body.hits.hits;
|
|
167
|
+
if (hits.length === 0) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return this.deserializeSession(hits[0]._source);
|
|
171
|
+
}
|
|
172
|
+
async findByUserId(userId, limit = 100) {
|
|
173
|
+
const response = await this.client.search({
|
|
174
|
+
index: this.index,
|
|
175
|
+
body: {
|
|
176
|
+
query: {
|
|
177
|
+
term: { userId },
|
|
178
|
+
},
|
|
179
|
+
sort: [{ createdAt: { order: "desc" } }],
|
|
180
|
+
size: limit,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
return response.body.hits.hits.map((hit) => this.deserializeSession(hit._source));
|
|
184
|
+
}
|
|
185
|
+
async update(id, updates) {
|
|
186
|
+
const doc = {
|
|
187
|
+
...updates,
|
|
188
|
+
updatedAt: new Date().toISOString(),
|
|
189
|
+
};
|
|
190
|
+
// Serialize dates
|
|
191
|
+
if (updates.completedAt) {
|
|
192
|
+
doc.completedAt = updates.completedAt.toISOString();
|
|
193
|
+
}
|
|
194
|
+
if (updates.lastMessageAt) {
|
|
195
|
+
doc.lastMessageAt = updates.lastMessageAt.toISOString();
|
|
196
|
+
}
|
|
197
|
+
await this.client.update({
|
|
198
|
+
index: this.index,
|
|
199
|
+
id,
|
|
200
|
+
body: { doc },
|
|
201
|
+
refresh: this.refresh,
|
|
202
|
+
});
|
|
203
|
+
return await this.findById(id);
|
|
204
|
+
}
|
|
205
|
+
async updateStatus(id, status, completedAt) {
|
|
206
|
+
const doc = {
|
|
207
|
+
status,
|
|
208
|
+
updatedAt: new Date().toISOString(),
|
|
209
|
+
};
|
|
210
|
+
if (completedAt) {
|
|
211
|
+
doc.completedAt = completedAt.toISOString();
|
|
212
|
+
}
|
|
213
|
+
await this.client.update({
|
|
214
|
+
index: this.index,
|
|
215
|
+
id,
|
|
216
|
+
body: { doc },
|
|
217
|
+
refresh: this.refresh,
|
|
218
|
+
});
|
|
219
|
+
return await this.findById(id);
|
|
220
|
+
}
|
|
221
|
+
async updateCollectedData(id, collectedData) {
|
|
222
|
+
await this.client.update({
|
|
223
|
+
index: this.index,
|
|
224
|
+
id,
|
|
225
|
+
body: {
|
|
226
|
+
doc: {
|
|
227
|
+
collectedData,
|
|
228
|
+
updatedAt: new Date().toISOString(),
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
refresh: this.refresh,
|
|
232
|
+
});
|
|
233
|
+
return await this.findById(id);
|
|
234
|
+
}
|
|
235
|
+
async updateRouteState(id, route, state) {
|
|
236
|
+
const doc = {
|
|
237
|
+
updatedAt: new Date().toISOString(),
|
|
238
|
+
};
|
|
239
|
+
if (route !== undefined) {
|
|
240
|
+
doc.currentRoute = route;
|
|
241
|
+
}
|
|
242
|
+
if (state !== undefined) {
|
|
243
|
+
doc.currentState = state;
|
|
244
|
+
}
|
|
245
|
+
await this.client.update({
|
|
246
|
+
index: this.index,
|
|
247
|
+
id,
|
|
248
|
+
body: { doc },
|
|
249
|
+
refresh: this.refresh,
|
|
250
|
+
});
|
|
251
|
+
return await this.findById(id);
|
|
252
|
+
}
|
|
253
|
+
async incrementMessageCount(id) {
|
|
254
|
+
const session = await this.findById(id);
|
|
255
|
+
if (!session) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const newCount = (session.messageCount || 0) + 1;
|
|
259
|
+
await this.client.update({
|
|
260
|
+
index: this.index,
|
|
261
|
+
id,
|
|
262
|
+
body: {
|
|
263
|
+
doc: {
|
|
264
|
+
messageCount: newCount,
|
|
265
|
+
lastMessageAt: new Date().toISOString(),
|
|
266
|
+
updatedAt: new Date().toISOString(),
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
refresh: this.refresh,
|
|
270
|
+
});
|
|
271
|
+
return await this.findById(id);
|
|
272
|
+
}
|
|
273
|
+
async delete(id) {
|
|
274
|
+
try {
|
|
275
|
+
await this.client.delete({
|
|
276
|
+
index: this.index,
|
|
277
|
+
id,
|
|
278
|
+
refresh: this.refresh,
|
|
279
|
+
});
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
if (this.isNotFoundError(error)) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
serializeSession(session) {
|
|
290
|
+
return {
|
|
291
|
+
...session,
|
|
292
|
+
createdAt: session.createdAt.toISOString(),
|
|
293
|
+
updatedAt: session.updatedAt?.toISOString(),
|
|
294
|
+
completedAt: session.completedAt?.toISOString(),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
deserializeSession(doc) {
|
|
298
|
+
return {
|
|
299
|
+
id: doc.id,
|
|
300
|
+
userId: doc.userId,
|
|
301
|
+
agentName: doc.agentName,
|
|
302
|
+
status: doc.status,
|
|
303
|
+
currentRoute: doc.currentRoute,
|
|
304
|
+
currentState: doc.currentState,
|
|
305
|
+
collectedData: doc.collectedData,
|
|
306
|
+
messageCount: doc.messageCount,
|
|
307
|
+
createdAt: new Date(doc.createdAt),
|
|
308
|
+
updatedAt: new Date(doc.updatedAt),
|
|
309
|
+
lastMessageAt: doc.lastMessageAt
|
|
310
|
+
? new Date(doc.lastMessageAt)
|
|
311
|
+
: undefined,
|
|
312
|
+
completedAt: doc.completedAt
|
|
313
|
+
? new Date(doc.completedAt)
|
|
314
|
+
: undefined,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
isNotFoundError(error) {
|
|
318
|
+
return (typeof error === "object" &&
|
|
319
|
+
error !== null &&
|
|
320
|
+
"statusCode" in error &&
|
|
321
|
+
error.statusCode === 404);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* OpenSearch-based message repository implementation
|
|
326
|
+
*/
|
|
327
|
+
class OpenSearchMessageRepository {
|
|
328
|
+
constructor(client, index, refresh) {
|
|
329
|
+
this.client = client;
|
|
330
|
+
this.index = index;
|
|
331
|
+
this.refresh = refresh;
|
|
332
|
+
}
|
|
333
|
+
async create(data) {
|
|
334
|
+
const id = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
335
|
+
const now = new Date();
|
|
336
|
+
const message = {
|
|
337
|
+
id,
|
|
338
|
+
...data,
|
|
339
|
+
createdAt: now,
|
|
340
|
+
};
|
|
341
|
+
await this.client.index({
|
|
342
|
+
index: this.index,
|
|
343
|
+
id,
|
|
344
|
+
body: this.serializeMessage(message),
|
|
345
|
+
refresh: this.refresh,
|
|
346
|
+
});
|
|
347
|
+
return message;
|
|
348
|
+
}
|
|
349
|
+
async findById(id) {
|
|
350
|
+
try {
|
|
351
|
+
const response = await this.client.get({
|
|
352
|
+
index: this.index,
|
|
353
|
+
id,
|
|
354
|
+
});
|
|
355
|
+
return this.deserializeMessage(response.body._source);
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
if (this.isNotFoundError(error)) {
|
|
359
|
+
return null;
|
|
360
|
+
}
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
async findBySessionId(sessionId, limit = 1000) {
|
|
365
|
+
const response = await this.client.search({
|
|
366
|
+
index: this.index,
|
|
367
|
+
body: {
|
|
368
|
+
query: {
|
|
369
|
+
term: { sessionId },
|
|
370
|
+
},
|
|
371
|
+
sort: [{ createdAt: { order: "asc" } }],
|
|
372
|
+
size: limit,
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
return response.body.hits.hits.map((hit) => this.deserializeMessage(hit._source));
|
|
376
|
+
}
|
|
377
|
+
async findByUserId(userId, limit = 100) {
|
|
378
|
+
const response = await this.client.search({
|
|
379
|
+
index: this.index,
|
|
380
|
+
body: {
|
|
381
|
+
query: {
|
|
382
|
+
term: { userId },
|
|
383
|
+
},
|
|
384
|
+
sort: [{ createdAt: { order: "desc" } }],
|
|
385
|
+
size: limit,
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
return response.body.hits.hits.map((hit) => this.deserializeMessage(hit._source));
|
|
389
|
+
}
|
|
390
|
+
async delete(id) {
|
|
391
|
+
try {
|
|
392
|
+
await this.client.delete({
|
|
393
|
+
index: this.index,
|
|
394
|
+
id,
|
|
395
|
+
refresh: this.refresh,
|
|
396
|
+
});
|
|
397
|
+
return true;
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
if (this.isNotFoundError(error)) {
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
throw error;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async deleteBySessionId(sessionId) {
|
|
407
|
+
const response = await this.client.deleteByQuery({
|
|
408
|
+
index: this.index,
|
|
409
|
+
body: {
|
|
410
|
+
query: {
|
|
411
|
+
term: { sessionId },
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
refresh: this.refresh,
|
|
415
|
+
});
|
|
416
|
+
return response.body.deleted;
|
|
417
|
+
}
|
|
418
|
+
async deleteByUserId(userId) {
|
|
419
|
+
const response = await this.client.deleteByQuery({
|
|
420
|
+
index: this.index,
|
|
421
|
+
body: {
|
|
422
|
+
query: {
|
|
423
|
+
term: { userId },
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
refresh: this.refresh,
|
|
427
|
+
});
|
|
428
|
+
return response.body.deleted;
|
|
429
|
+
}
|
|
430
|
+
serializeMessage(message) {
|
|
431
|
+
return {
|
|
432
|
+
...message,
|
|
433
|
+
createdAt: message.createdAt.toISOString(),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
deserializeMessage(doc) {
|
|
437
|
+
return {
|
|
438
|
+
id: doc.id,
|
|
439
|
+
sessionId: doc.sessionId,
|
|
440
|
+
userId: doc.userId,
|
|
441
|
+
role: doc.role,
|
|
442
|
+
content: doc.content,
|
|
443
|
+
route: doc.route,
|
|
444
|
+
state: doc.state,
|
|
445
|
+
toolCalls: doc.toolCalls,
|
|
446
|
+
event: doc.event,
|
|
447
|
+
createdAt: new Date(doc.createdAt),
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
isNotFoundError(error) {
|
|
451
|
+
return (typeof error === "object" &&
|
|
452
|
+
error !== null &&
|
|
453
|
+
"statusCode" in error &&
|
|
454
|
+
error.statusCode === 404);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=OpenSearchAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenSearchAdapter.js","sourceRoot":"","sources":["../../src/adapters/OpenSearchAdapter.ts"],"names":[],"mappings":"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"}
|