aws-runtime-bridge 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +166 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js +602 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts +22 -0
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.js +106 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
- package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/constants.js +19 -0
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +28 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +96 -0
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/index.js +30 -0
- package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/logger.js +19 -0
- package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js +438 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +87 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js +185 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +3 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +50 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +90 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js +237 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +19 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts +309 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/types.js +9 -0
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
const ALL_MEMORY_TYPES = ['task_list', 'recently_memory', 'memory'];
|
|
2
|
+
const LISTABLE_MEMORY_TYPES = ['task_list', 'recently_memory'];
|
|
3
|
+
const URI_PATTERN = /^([a-zA-Z_][a-zA-Z0-9_]*):\/\/(.*)$/;
|
|
4
|
+
export class MemoryStore {
|
|
5
|
+
filePath;
|
|
6
|
+
constructor(filePath) {
|
|
7
|
+
this.filePath = filePath;
|
|
8
|
+
}
|
|
9
|
+
nowIso() {
|
|
10
|
+
return new Date().toISOString();
|
|
11
|
+
}
|
|
12
|
+
normalizeUri(input) {
|
|
13
|
+
const value = String(input || '').trim();
|
|
14
|
+
const matched = URI_PATTERN.exec(value);
|
|
15
|
+
if (!matched) {
|
|
16
|
+
throw new Error(`Invalid memory uri: ${input}`);
|
|
17
|
+
}
|
|
18
|
+
const domainPart = matched[1];
|
|
19
|
+
const pathPart = matched[2];
|
|
20
|
+
if (!domainPart || !pathPart) {
|
|
21
|
+
throw new Error(`Invalid memory uri: ${input}`);
|
|
22
|
+
}
|
|
23
|
+
const domain = domainPart.toLowerCase();
|
|
24
|
+
const path = pathPart.replace(/^\/+|\/+$/g, '');
|
|
25
|
+
if (!path) {
|
|
26
|
+
throw new Error(`Invalid memory uri path: ${input}`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
uri: `${domain}://${path}`,
|
|
30
|
+
domain,
|
|
31
|
+
path
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
normalizeMemoryType(input, allowedTypes = ALL_MEMORY_TYPES) {
|
|
35
|
+
const value = String(input || '').trim();
|
|
36
|
+
if (!allowedTypes.includes(value)) {
|
|
37
|
+
throw new Error(`Invalid memory_type: ${input}`);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
ensureTypeMatch(record, expectedType) {
|
|
42
|
+
if (expectedType && record.memory_type !== expectedType) {
|
|
43
|
+
throw new Error(`Memory type mismatch: expected ${expectedType}, actual ${record.memory_type}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async ensureParentDir() {
|
|
47
|
+
const { mkdir } = await import('node:fs/promises');
|
|
48
|
+
const path = await import('node:path');
|
|
49
|
+
const parent = path.dirname(this.filePath);
|
|
50
|
+
await mkdir(parent, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
async loadData() {
|
|
53
|
+
const { readFile } = await import('node:fs/promises');
|
|
54
|
+
try {
|
|
55
|
+
const raw = await readFile(this.filePath, 'utf-8');
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
const original = parsed.by_uri && typeof parsed.by_uri === 'object'
|
|
58
|
+
? parsed.by_uri
|
|
59
|
+
: parsed.byUri && typeof parsed.byUri === 'object'
|
|
60
|
+
? parsed.byUri
|
|
61
|
+
: {};
|
|
62
|
+
const normalizedByUri = {};
|
|
63
|
+
for (const [uri, record] of Object.entries(original)) {
|
|
64
|
+
const legacyType = record.memoryType;
|
|
65
|
+
const memory_type = this.normalizeMemoryType(record.memory_type || legacyType || 'memory');
|
|
66
|
+
normalizedByUri[uri] = {
|
|
67
|
+
...record,
|
|
68
|
+
memory_type
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return { by_uri: normalizedByUri };
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { by_uri: {} };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async saveData(data) {
|
|
78
|
+
const { writeFile } = await import('node:fs/promises');
|
|
79
|
+
await this.ensureParentDir();
|
|
80
|
+
await writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
generateId(uri) {
|
|
83
|
+
const cleaned = uri.replace(/[^a-zA-Z0-9]+/g, '_').replace(/^_+|_+$/g, '');
|
|
84
|
+
return `${cleaned}_${Date.now().toString(36)}`;
|
|
85
|
+
}
|
|
86
|
+
async createMemory(input) {
|
|
87
|
+
const normalizedType = this.normalizeMemoryType(input.memory_type);
|
|
88
|
+
const normalized = this.normalizeUri(input.uri);
|
|
89
|
+
const data = await this.loadData();
|
|
90
|
+
if (data.by_uri[normalized.uri]) {
|
|
91
|
+
throw new Error(`Memory already exists: ${normalized.uri}`);
|
|
92
|
+
}
|
|
93
|
+
const now = this.nowIso();
|
|
94
|
+
const record = {
|
|
95
|
+
id: this.generateId(normalized.uri),
|
|
96
|
+
uri: normalized.uri,
|
|
97
|
+
domain: normalized.domain,
|
|
98
|
+
path: normalized.path,
|
|
99
|
+
content: String(input.content || ''),
|
|
100
|
+
memory_type: normalizedType,
|
|
101
|
+
createdAt: now,
|
|
102
|
+
updatedAt: now,
|
|
103
|
+
version: 1
|
|
104
|
+
};
|
|
105
|
+
data.by_uri[normalized.uri] = record;
|
|
106
|
+
await this.saveData(data);
|
|
107
|
+
return record;
|
|
108
|
+
}
|
|
109
|
+
async readMemory(input) {
|
|
110
|
+
const normalized = this.normalizeUri(input.uri);
|
|
111
|
+
const expectedType = typeof input.memory_type === 'string'
|
|
112
|
+
? this.normalizeMemoryType(input.memory_type)
|
|
113
|
+
: undefined;
|
|
114
|
+
const data = await this.loadData();
|
|
115
|
+
const record = data.by_uri[normalized.uri] ?? null;
|
|
116
|
+
if (!record) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
this.ensureTypeMatch(record, expectedType);
|
|
120
|
+
return record;
|
|
121
|
+
}
|
|
122
|
+
async updateMemory(input) {
|
|
123
|
+
const normalized = this.normalizeUri(input.uri);
|
|
124
|
+
const expectedType = typeof input.memory_type === 'string'
|
|
125
|
+
? this.normalizeMemoryType(input.memory_type)
|
|
126
|
+
: undefined;
|
|
127
|
+
const data = await this.loadData();
|
|
128
|
+
const existing = data.by_uri[normalized.uri];
|
|
129
|
+
if (!existing) {
|
|
130
|
+
throw new Error(`Memory not found: ${normalized.uri}`);
|
|
131
|
+
}
|
|
132
|
+
this.ensureTypeMatch(existing, expectedType);
|
|
133
|
+
let nextContent = existing.content;
|
|
134
|
+
if (typeof input.old_string === 'string' && typeof input.new_string === 'string') {
|
|
135
|
+
const oldString = input.old_string;
|
|
136
|
+
if (!oldString) {
|
|
137
|
+
throw new Error('old_string cannot be empty when replacing');
|
|
138
|
+
}
|
|
139
|
+
const occurrenceCount = nextContent.split(oldString).length - 1;
|
|
140
|
+
if (occurrenceCount === 0) {
|
|
141
|
+
throw new Error('old_string not found in memory content');
|
|
142
|
+
}
|
|
143
|
+
if (occurrenceCount > 1) {
|
|
144
|
+
throw new Error('old_string appears multiple times; replace is ambiguous');
|
|
145
|
+
}
|
|
146
|
+
nextContent = nextContent.replace(oldString, input.new_string);
|
|
147
|
+
}
|
|
148
|
+
if (typeof input.append === 'string' && input.append.length > 0) {
|
|
149
|
+
nextContent = `${nextContent}${input.append}`;
|
|
150
|
+
}
|
|
151
|
+
const updated = {
|
|
152
|
+
...existing,
|
|
153
|
+
content: nextContent,
|
|
154
|
+
updatedAt: this.nowIso(),
|
|
155
|
+
version: existing.version + 1
|
|
156
|
+
};
|
|
157
|
+
data.by_uri[normalized.uri] = updated;
|
|
158
|
+
await this.saveData(data);
|
|
159
|
+
return updated;
|
|
160
|
+
}
|
|
161
|
+
async deleteMemory(input) {
|
|
162
|
+
const normalized = this.normalizeUri(input.uri);
|
|
163
|
+
const expectedType = typeof input.memory_type === 'string'
|
|
164
|
+
? this.normalizeMemoryType(input.memory_type)
|
|
165
|
+
: undefined;
|
|
166
|
+
const data = await this.loadData();
|
|
167
|
+
const existing = data.by_uri[normalized.uri];
|
|
168
|
+
if (!existing) {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
this.ensureTypeMatch(existing, expectedType);
|
|
172
|
+
delete data.by_uri[normalized.uri];
|
|
173
|
+
await this.saveData(data);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
async searchMemory(input) {
|
|
177
|
+
const data = await this.loadData();
|
|
178
|
+
const query = String(input.query || '').trim().toLowerCase();
|
|
179
|
+
const memoryTypeFilter = input.memory_type
|
|
180
|
+
? this.normalizeMemoryType(input.memory_type)
|
|
181
|
+
: undefined;
|
|
182
|
+
const limit = typeof input.limit === 'number' && input.limit > 0 ? input.limit : 10;
|
|
183
|
+
if (!query) {
|
|
184
|
+
return { query, results: [] };
|
|
185
|
+
}
|
|
186
|
+
const seenById = new Set();
|
|
187
|
+
const ranked = [];
|
|
188
|
+
for (const record of Object.values(data.by_uri)) {
|
|
189
|
+
if (memoryTypeFilter && record.memory_type !== memoryTypeFilter) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (seenById.has(record.id)) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const haystack = `${record.uri}\n${record.content}`.toLowerCase();
|
|
196
|
+
if (!haystack.includes(query)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const inUri = record.uri.toLowerCase().includes(query) ? 2 : 0;
|
|
200
|
+
const inContent = record.content.toLowerCase().includes(query) ? 1 : 0;
|
|
201
|
+
const score = inUri + inContent;
|
|
202
|
+
seenById.add(record.id);
|
|
203
|
+
ranked.push({ score, record });
|
|
204
|
+
}
|
|
205
|
+
ranked.sort((a, b) => {
|
|
206
|
+
if (b.score !== a.score) {
|
|
207
|
+
return b.score - a.score;
|
|
208
|
+
}
|
|
209
|
+
return b.record.updatedAt.localeCompare(a.record.updatedAt);
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
query,
|
|
213
|
+
results: ranked.slice(0, limit).map((item) => item.record)
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
async listByType(memory_type) {
|
|
217
|
+
const listType = this.normalizeMemoryType(memory_type, LISTABLE_MEMORY_TYPES);
|
|
218
|
+
const data = await this.loadData();
|
|
219
|
+
const seenById = new Set();
|
|
220
|
+
const list = [];
|
|
221
|
+
for (const record of Object.values(data.by_uri)) {
|
|
222
|
+
if (record.memory_type !== listType) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (seenById.has(record.id)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
seenById.add(record.id);
|
|
229
|
+
list.push(record);
|
|
230
|
+
}
|
|
231
|
+
list.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
232
|
+
return list;
|
|
233
|
+
}
|
|
234
|
+
async removeTaskListMemory(uri) {
|
|
235
|
+
const record = await this.readMemory({ uri });
|
|
236
|
+
if (!record) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
if (record.memory_type !== 'task_list') {
|
|
240
|
+
throw new Error('task_list_remove only supports task_list type');
|
|
241
|
+
}
|
|
242
|
+
return this.deleteMemory({ uri: record.uri, memory_type: 'task_list' });
|
|
243
|
+
}
|
|
244
|
+
async archiveRecentlyMemory(uri) {
|
|
245
|
+
const record = await this.readMemory({ uri });
|
|
246
|
+
if (!record) {
|
|
247
|
+
throw new Error(`Memory not found: ${uri}`);
|
|
248
|
+
}
|
|
249
|
+
if (record.memory_type !== 'recently_memory') {
|
|
250
|
+
throw new Error('recently_memory_archive only supports recently_memory type');
|
|
251
|
+
}
|
|
252
|
+
const data = await this.loadData();
|
|
253
|
+
const existing = data.by_uri[record.uri];
|
|
254
|
+
if (!existing) {
|
|
255
|
+
throw new Error(`Memory not found: ${uri}`);
|
|
256
|
+
}
|
|
257
|
+
const archived = {
|
|
258
|
+
...existing,
|
|
259
|
+
memory_type: 'memory',
|
|
260
|
+
updatedAt: this.nowIso(),
|
|
261
|
+
version: existing.version + 1
|
|
262
|
+
};
|
|
263
|
+
data.by_uri[record.uri] = archived;
|
|
264
|
+
await this.saveData(data);
|
|
265
|
+
return archived;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.test.d.ts","sourceRoot":"","sources":["../src/memory-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import { MemoryStore } from './memory-store.js';
|
|
7
|
+
describe('MemoryStore', () => {
|
|
8
|
+
it('creates and reads memory by uri', async () => {
|
|
9
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
10
|
+
const storePath = path.join(dir, 'memory.json');
|
|
11
|
+
const store = new MemoryStore(storePath);
|
|
12
|
+
try {
|
|
13
|
+
const created = await store.createMemory({
|
|
14
|
+
memory_type: 'memory',
|
|
15
|
+
uri: 'core://agent/profile',
|
|
16
|
+
content: 'I am a backend expert.'
|
|
17
|
+
});
|
|
18
|
+
assert.equal(created.uri, 'core://agent/profile');
|
|
19
|
+
const loaded = await store.readMemory({ uri: 'core://agent/profile', memory_type: 'memory' });
|
|
20
|
+
assert.ok(loaded);
|
|
21
|
+
assert.equal(loaded?.content, 'I am a backend expert.');
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
await rm(dir, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('updates memory with exact replace and append', async () => {
|
|
28
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
29
|
+
const storePath = path.join(dir, 'memory.json');
|
|
30
|
+
const store = new MemoryStore(storePath);
|
|
31
|
+
try {
|
|
32
|
+
await store.createMemory({
|
|
33
|
+
memory_type: 'memory',
|
|
34
|
+
uri: 'notes://project/todo',
|
|
35
|
+
content: 'finish api docs'
|
|
36
|
+
});
|
|
37
|
+
const replaced = await store.updateMemory({
|
|
38
|
+
memory_type: 'memory',
|
|
39
|
+
uri: 'notes://project/todo',
|
|
40
|
+
old_string: 'api docs',
|
|
41
|
+
new_string: 'API docs v2'
|
|
42
|
+
});
|
|
43
|
+
assert.equal(replaced.content, 'finish API docs v2');
|
|
44
|
+
const appended = await store.updateMemory({
|
|
45
|
+
memory_type: 'memory',
|
|
46
|
+
uri: 'notes://project/todo',
|
|
47
|
+
append: '\n- add memory tests'
|
|
48
|
+
});
|
|
49
|
+
assert.match(appended.content, /add memory tests/);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
await rm(dir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
it('searches memories by query and supports limit', async () => {
|
|
56
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
57
|
+
const storePath = path.join(dir, 'memory.json');
|
|
58
|
+
const store = new MemoryStore(storePath);
|
|
59
|
+
try {
|
|
60
|
+
await store.createMemory({
|
|
61
|
+
memory_type: 'memory',
|
|
62
|
+
uri: 'core://agent/skills',
|
|
63
|
+
content: 'java spring boot mysql'
|
|
64
|
+
});
|
|
65
|
+
await store.createMemory({
|
|
66
|
+
memory_type: 'memory',
|
|
67
|
+
uri: 'notes://project/readme',
|
|
68
|
+
content: 'project setup and architecture'
|
|
69
|
+
});
|
|
70
|
+
const result = await store.searchMemory({ query: 'project', limit: 1, memory_type: 'memory' });
|
|
71
|
+
assert.equal(result.results.length, 1);
|
|
72
|
+
assert.equal(result.results[0]?.uri, 'notes://project/readme');
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await rm(dir, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
it('deletes memory and no longer reads it', async () => {
|
|
79
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
80
|
+
const storePath = path.join(dir, 'memory.json');
|
|
81
|
+
const store = new MemoryStore(storePath);
|
|
82
|
+
try {
|
|
83
|
+
await store.createMemory({
|
|
84
|
+
memory_type: 'memory',
|
|
85
|
+
uri: 'core://agent/temp',
|
|
86
|
+
content: 'temporary memory'
|
|
87
|
+
});
|
|
88
|
+
const deleted = await store.deleteMemory({ uri: 'core://agent/temp', memory_type: 'memory' });
|
|
89
|
+
assert.equal(deleted, true);
|
|
90
|
+
const loaded = await store.readMemory({ uri: 'core://agent/temp', memory_type: 'memory' });
|
|
91
|
+
assert.equal(loaded, null);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
await rm(dir, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
it('supports memory_type classification and list/filter', async () => {
|
|
98
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
99
|
+
const storePath = path.join(dir, 'memory.json');
|
|
100
|
+
const store = new MemoryStore(storePath);
|
|
101
|
+
try {
|
|
102
|
+
const types = ['task_list', 'recently_memory', 'memory'];
|
|
103
|
+
await store.createMemory({ memory_type: types[0], uri: 'task://todo/1', content: 'fix tests' });
|
|
104
|
+
await store.createMemory({ memory_type: types[1], uri: 'recent://ctx/1', content: 'just discussed API design' });
|
|
105
|
+
await store.createMemory({ memory_type: types[2], uri: 'core://archive/1', content: 'long-term architecture decision' });
|
|
106
|
+
const taskList = await store.listByType('task_list');
|
|
107
|
+
assert.equal(taskList.length, 1);
|
|
108
|
+
assert.equal(taskList[0]?.memory_type, 'task_list');
|
|
109
|
+
const recentList = await store.listByType('recently_memory');
|
|
110
|
+
assert.equal(recentList.length, 1);
|
|
111
|
+
assert.equal(recentList[0]?.memory_type, 'recently_memory');
|
|
112
|
+
await assert.rejects(() => store.listByType('memory'), /Invalid memory_type/);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
await rm(dir, { recursive: true, force: true });
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
it('removes task_list memory only via task_list_remove semantic', async () => {
|
|
119
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
120
|
+
const storePath = path.join(dir, 'memory.json');
|
|
121
|
+
const store = new MemoryStore(storePath);
|
|
122
|
+
try {
|
|
123
|
+
await store.createMemory({ memory_type: 'task_list', uri: 'task://todo/remove-1', content: 'to be removed' });
|
|
124
|
+
await store.createMemory({ memory_type: 'memory', uri: 'core://kept/1', content: 'should stay' });
|
|
125
|
+
const removed = await store.removeTaskListMemory('task://todo/remove-1');
|
|
126
|
+
assert.equal(removed, true);
|
|
127
|
+
assert.equal(await store.readMemory({ uri: 'task://todo/remove-1' }), null);
|
|
128
|
+
await assert.rejects(() => store.removeTaskListMemory('core://kept/1'), /task_list_remove/);
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await rm(dir, { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
it('archives recently_memory into memory', async () => {
|
|
135
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
136
|
+
const storePath = path.join(dir, 'memory.json');
|
|
137
|
+
const store = new MemoryStore(storePath);
|
|
138
|
+
try {
|
|
139
|
+
await store.createMemory({ memory_type: 'recently_memory', uri: 'recent://note/1', content: 'hot memory' });
|
|
140
|
+
const archived = await store.archiveRecentlyMemory('recent://note/1');
|
|
141
|
+
assert.equal(archived.memory_type, 'memory');
|
|
142
|
+
const loaded = await store.readMemory({ uri: 'recent://note/1', memory_type: 'memory' });
|
|
143
|
+
assert.ok(loaded);
|
|
144
|
+
assert.equal(loaded?.memory_type, 'memory');
|
|
145
|
+
await store.createMemory({ memory_type: 'memory', uri: 'core://cold/2', content: 'cold memory' });
|
|
146
|
+
await assert.rejects(() => store.archiveRecentlyMemory('core://cold/2'), /recently_memory_archive/);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
await rm(dir, { recursive: true, force: true });
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
it('rejects invalid memory_type on create', async () => {
|
|
153
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'aws-memory-store-'));
|
|
154
|
+
const storePath = path.join(dir, 'memory.json');
|
|
155
|
+
const store = new MemoryStore(storePath);
|
|
156
|
+
try {
|
|
157
|
+
await assert.rejects(() => store.createMemory({ memory_type: 'invalid_type', uri: 'x://1', content: 'x' }), /Invalid memory_type/);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
await rm(dir, { recursive: true, force: true });
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=memory-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.test.js","sourceRoot":"","sources":["../src/memory-store.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAEjE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;gBACvC,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,sBAAsB;gBAC3B,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9F,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC;gBACvB,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,sBAAsB;gBAC3B,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;gBACxC,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,sBAAsB;gBAC3B,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,aAAa;aAC1B,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;gBACxC,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,sBAAsB;gBAC3B,MAAM,EAAE,sBAAsB;aAC/B,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC;gBACvB,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,qBAAqB;gBAC1B,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC;gBACvB,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,wBAAwB;gBAC7B,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAED,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC;gBACvB,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,mBAAmB;gBACxB,OAAO,EAAE,kBAAkB;aAC5B,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9F,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAE5B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3F,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,GAAiB,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAChG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACjH,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;YAEzH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAEpD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAE5D,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAChF,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YAC9G,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YAElG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAE5E,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC9F,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAE5C,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YAClG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACtG,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,cAA4B,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EACnG,qBAAqB,CACtB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 消息缓冲与派发模块
|
|
3
|
+
* 负责消息的缓冲、分类和派发
|
|
4
|
+
*/
|
|
5
|
+
import type { DirectMessage, GroupMessage, ProfileInfo } from './types.js';
|
|
6
|
+
/** 分类后的消息 */
|
|
7
|
+
export interface ClassifiedMessages {
|
|
8
|
+
directMessages: DirectMessage[];
|
|
9
|
+
groupMessages: GroupMessage[];
|
|
10
|
+
}
|
|
11
|
+
/** 消息到达回调类型 */
|
|
12
|
+
export type OnMessageArrivedCallback = () => void;
|
|
13
|
+
/**
|
|
14
|
+
* 消息缓冲区
|
|
15
|
+
* 管理消息的存储、分类和派发
|
|
16
|
+
*/
|
|
17
|
+
export declare class MessageBuffer {
|
|
18
|
+
private buffer;
|
|
19
|
+
private resolvers;
|
|
20
|
+
private onMessageArrived;
|
|
21
|
+
private isPolling;
|
|
22
|
+
/**
|
|
23
|
+
* 设置消息到达回调
|
|
24
|
+
* 当有新消息到达且正在 poll 等待时,会立即调用此回调
|
|
25
|
+
*/
|
|
26
|
+
setOnMessageArrived(callback: OnMessageArrivedCallback | null): void;
|
|
27
|
+
/**
|
|
28
|
+
* 设置是否正在 poll 等待
|
|
29
|
+
*/
|
|
30
|
+
setIsPolling(polling: boolean): void;
|
|
31
|
+
/**
|
|
32
|
+
* 添加消息到缓冲区
|
|
33
|
+
*/
|
|
34
|
+
push(message: DirectMessage | GroupMessage): void;
|
|
35
|
+
/**
|
|
36
|
+
* 接收 Profile 推送。
|
|
37
|
+
* 主流程:记录日志 -> 不进入未读缓冲区 -> 引导调用方通过 get_profile 获取身份详情。
|
|
38
|
+
*/
|
|
39
|
+
setProfileMessage(profile: ProfileInfo): void;
|
|
40
|
+
/**
|
|
41
|
+
* 移除 Profile 系统消息。
|
|
42
|
+
* 当前未再向未读消息注入 profile 信息,保留该方法仅为兼容既有调用链。
|
|
43
|
+
*/
|
|
44
|
+
removeProfileMessage(): void;
|
|
45
|
+
/**
|
|
46
|
+
* 检查是否有 Profile 消息。
|
|
47
|
+
* 当前身份信息不会进入未读消息,因此固定返回 false。
|
|
48
|
+
*/
|
|
49
|
+
hasProfileMessage(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 获取 Profile 消息。
|
|
52
|
+
* 当前身份信息不会进入未读消息,因此固定返回 null。
|
|
53
|
+
*/
|
|
54
|
+
getProfileMessage(): null;
|
|
55
|
+
/**
|
|
56
|
+
* 阻塞等待新消息
|
|
57
|
+
* 如果缓冲区有消息则立即返回,否则阻塞等待
|
|
58
|
+
* @param timeoutMs 可选超时时间(毫秒),超时后返回空消息而不继续阻塞
|
|
59
|
+
*/
|
|
60
|
+
poll(timeoutMs?: number): Promise<ClassifiedMessages>;
|
|
61
|
+
/**
|
|
62
|
+
* 非阻塞获取消息
|
|
63
|
+
*/
|
|
64
|
+
get(): ClassifiedMessages;
|
|
65
|
+
/**
|
|
66
|
+
* 获取缓冲区大小
|
|
67
|
+
*/
|
|
68
|
+
size(): number;
|
|
69
|
+
/**
|
|
70
|
+
* 清空缓冲区
|
|
71
|
+
*/
|
|
72
|
+
clear(): void;
|
|
73
|
+
/**
|
|
74
|
+
* 尝试派发缓冲区消息给等待的 resolver
|
|
75
|
+
*/
|
|
76
|
+
private tryDispatch;
|
|
77
|
+
/**
|
|
78
|
+
* 消费缓冲区所有消息并分类
|
|
79
|
+
*/
|
|
80
|
+
private consumeAll;
|
|
81
|
+
/**
|
|
82
|
+
* 判断消息类型
|
|
83
|
+
* DirectMessage 的 msgId 是 string,GroupMessage 的 msgId 是 number
|
|
84
|
+
*/
|
|
85
|
+
private isDirectMessage;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=message-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-buffer.d.ts","sourceRoot":"","sources":["../src/message-buffer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3E,aAAa;AACb,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAKD,eAAe;AACf,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAC;AAElD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,SAAS,CAAkB;IAEnC;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,GAAG,IAAI;IAIpE;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIpC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI;IAajD;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI7C;;;OAGG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;;OAGG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAI3B;;;;SAIK;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsDrD;;OAEG;IACH,GAAG,IAAI,kBAAkB;IASzB;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;IAKf;;SAEK;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAGxB"}
|