kimi-code-memory-mcp-server 0.1.0
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/AGENTS.md +144 -0
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/README.zh-CN.md +227 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/context/wire-context.d.ts +171 -0
- package/dist/context/wire-context.js +586 -0
- package/dist/context/wire-context.js.map +1 -0
- package/dist/dao/index.d.ts +76 -0
- package/dist/dao/index.js +490 -0
- package/dist/dao/index.js.map +1 -0
- package/dist/dao/memory-store.d.ts +24 -0
- package/dist/dao/memory-store.js +112 -0
- package/dist/dao/memory-store.js.map +1 -0
- package/dist/refined-manager.d.ts +70 -0
- package/dist/refined-manager.js +369 -0
- package/dist/refined-manager.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +71 -0
- package/dist/server.js.map +1 -0
- package/dist/theme-manager.d.ts +40 -0
- package/dist/theme-manager.js +88 -0
- package/dist/theme-manager.js.map +1 -0
- package/dist/tools/context-tools.d.ts +56 -0
- package/dist/tools/context-tools.js +332 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/index.d.ts +835 -0
- package/dist/tools/index.js +370 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.js +292 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/system-tools.d.ts +37 -0
- package/dist/tools/system-tools.js +195 -0
- package/dist/tools/system-tools.js.map +1 -0
- package/dist/tools/theme-tools.d.ts +34 -0
- package/dist/tools/theme-tools.js +186 -0
- package/dist/tools/theme-tools.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +10 -0
- package/dist/utils/frontmatter.js +61 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/mutex.d.ts +11 -0
- package/dist/utils/mutex.js +17 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/paths.d.ts +19 -0
- package/dist/utils/paths.js +54 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/validation.d.ts +15 -0
- package/dist/utils/validation.js +40 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +144 -0
- package/docs/CONTRIBUTING.md +83 -0
- package/docs/CONTRIBUTING.zh-CN.md +83 -0
- package/docs/search-logic.md +157 -0
- package/docs/search-logic.zh-CN.md +157 -0
- package/examples/README.md +34 -0
- package/examples/sample-workspace/essence/essence.md +26 -0
- package/examples/sample-workspace/index.json +36 -0
- package/examples/sample-workspace/memory/decisions/sample-decision.md +30 -0
- package/examples/sample-workspace/memory/knowledge/sample-knowledge.md +24 -0
- package/examples/sample-workspace/memory/reference/sample-reference.md +20 -0
- package/examples/sample-workspace/memory/rules/sample-rule.md +31 -0
- package/examples/sample-workspace/themes/cache-design.json +15 -0
- package/package.json +72 -0
- package/skills/memory-manage/SKILL.md +43 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory CRUD tools: remember, recall, recall_recent, search, list, list_tags, delete, move.
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { sanitizeFolder, sanitizeKey, toTitle } from '../utils/validation.js';
|
|
7
|
+
import { parseFrontmatter } from '../utils/frontmatter.js';
|
|
8
|
+
function toolResult(data, isError = false) {
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
11
|
+
isError,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function safeParseFile(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const text = fs.readFileSync(filePath, 'utf8');
|
|
17
|
+
return parseFrontmatter(text) || { frontmatter: {}, body: text };
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function fileStats(filePath) {
|
|
24
|
+
try {
|
|
25
|
+
return fs.statSync(filePath);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function createMemoryTools(ctx) {
|
|
32
|
+
const { storeRoot, indexDao, themeManager, memoryStore } = ctx;
|
|
33
|
+
function resolveFilePath(folder, key) {
|
|
34
|
+
return path.join(storeRoot, folder, `${sanitizeKey(key)}.md`);
|
|
35
|
+
}
|
|
36
|
+
async function handleRemember(args) {
|
|
37
|
+
const key = args.key;
|
|
38
|
+
if (!key || typeof key !== 'string') {
|
|
39
|
+
return toolResult({ success: false, error: 'Missing or invalid "key"' }, true);
|
|
40
|
+
}
|
|
41
|
+
const folderRaw = typeof args.folder === 'string' ? args.folder : 'memory';
|
|
42
|
+
const folder = sanitizeFolder(folderRaw);
|
|
43
|
+
if (!folder) {
|
|
44
|
+
return toolResult({ success: false, error: 'Invalid folder path' }, true);
|
|
45
|
+
}
|
|
46
|
+
const content = typeof args.content === 'string' ? args.content : '';
|
|
47
|
+
const tags = Array.isArray(args.tags) ? args.tags.filter((t) => typeof t === 'string') : [];
|
|
48
|
+
const themes = Array.isArray(args.themes)
|
|
49
|
+
? args.themes.filter((t) => typeof t === 'string')
|
|
50
|
+
: [];
|
|
51
|
+
const filePath = memoryStore.write(folder, key, content, tags);
|
|
52
|
+
await indexDao.upsertEntry(filePath);
|
|
53
|
+
const sanitizedKey = sanitizeKey(key);
|
|
54
|
+
const readBack = memoryStore.read(folder, key);
|
|
55
|
+
const title = typeof readBack?.title === 'string' ? readBack.title : toTitle(key);
|
|
56
|
+
for (const theme of themes) {
|
|
57
|
+
await themeManager.addThemeAssociation(theme, {
|
|
58
|
+
memoryKey: sanitizedKey,
|
|
59
|
+
folder,
|
|
60
|
+
title,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return toolResult({ success: true, filePath, folder, key, themes });
|
|
64
|
+
}
|
|
65
|
+
async function handleRecall(args) {
|
|
66
|
+
const key = args.key;
|
|
67
|
+
if (!key || typeof key !== 'string') {
|
|
68
|
+
return toolResult({ found: false, error: 'Missing or invalid "key"' }, true);
|
|
69
|
+
}
|
|
70
|
+
const folderRaw = typeof args.folder === 'string' ? args.folder : 'memory';
|
|
71
|
+
const folder = sanitizeFolder(folderRaw);
|
|
72
|
+
if (!folder) {
|
|
73
|
+
return toolResult({ found: false, error: 'Invalid folder path', key }, true);
|
|
74
|
+
}
|
|
75
|
+
const readResult = memoryStore.read(folder, key);
|
|
76
|
+
if (!readResult) {
|
|
77
|
+
return toolResult({ found: false, key, folder });
|
|
78
|
+
}
|
|
79
|
+
await indexDao.upsertEntry(readResult.filePath);
|
|
80
|
+
return toolResult({
|
|
81
|
+
found: true,
|
|
82
|
+
key,
|
|
83
|
+
folder,
|
|
84
|
+
content: readResult.content,
|
|
85
|
+
tags: Array.isArray(readResult.tags) ? readResult.tags : [],
|
|
86
|
+
createdAt: readResult.createdAt || null,
|
|
87
|
+
updatedAt: readResult.updatedAt || null,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function handleRecallRecent(args) {
|
|
91
|
+
const n = typeof args.n === 'number' ? Math.max(1, Math.floor(args.n)) : 10;
|
|
92
|
+
const folderFilterRaw = typeof args.folder === 'string' ? args.folder : null;
|
|
93
|
+
const folderFilter = folderFilterRaw ? sanitizeFolder(folderFilterRaw) : null;
|
|
94
|
+
if (folderFilterRaw && !folderFilter) {
|
|
95
|
+
return toolResult({ items: [], error: 'Invalid folder path' }, true);
|
|
96
|
+
}
|
|
97
|
+
const tagFilter = typeof args.tag === 'string' ? args.tag : null;
|
|
98
|
+
const index = indexDao.getIndex();
|
|
99
|
+
const items = [];
|
|
100
|
+
for (const key of Object.keys(index.index)) {
|
|
101
|
+
if (!key.endsWith('.md'))
|
|
102
|
+
continue;
|
|
103
|
+
const value = index.index[key];
|
|
104
|
+
const folder = path.dirname(key);
|
|
105
|
+
const entryKey = path.basename(key, '.md');
|
|
106
|
+
if (folderFilter && folder !== folderFilter)
|
|
107
|
+
continue;
|
|
108
|
+
if (tagFilter && (!Array.isArray(value.tags) || !value.tags.includes(tagFilter)))
|
|
109
|
+
continue;
|
|
110
|
+
const filePath = path.join(storeRoot, key);
|
|
111
|
+
const stats = fileStats(filePath);
|
|
112
|
+
items.push({
|
|
113
|
+
key: entryKey,
|
|
114
|
+
folder,
|
|
115
|
+
title: value.title || toTitle(entryKey),
|
|
116
|
+
tags: Array.isArray(value.tags) ? value.tags : [],
|
|
117
|
+
updatedAt: stats ? stats.mtime.toISOString() : new Date().toISOString(),
|
|
118
|
+
preview: '',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
items.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
122
|
+
return toolResult({
|
|
123
|
+
items: items.slice(0, n).map((item) => {
|
|
124
|
+
const filePath = resolveFilePath(item.folder, item.key);
|
|
125
|
+
const parsed = safeParseFile(filePath);
|
|
126
|
+
return {
|
|
127
|
+
...item,
|
|
128
|
+
preview: (parsed?.body || '').slice(0, 400),
|
|
129
|
+
};
|
|
130
|
+
}),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function handleSearch(args) {
|
|
134
|
+
const query = args.query;
|
|
135
|
+
if (!query || typeof query !== 'string') {
|
|
136
|
+
return toolResult({ items: [], error: 'Missing or invalid "query"' }, true);
|
|
137
|
+
}
|
|
138
|
+
const needle = query.toLowerCase();
|
|
139
|
+
const folderFilterRaw = typeof args.folder === 'string' ? args.folder : null;
|
|
140
|
+
const folderFilter = folderFilterRaw ? sanitizeFolder(folderFilterRaw) : null;
|
|
141
|
+
if (folderFilterRaw && !folderFilter) {
|
|
142
|
+
return toolResult({ items: [], error: 'Invalid folder path' }, true);
|
|
143
|
+
}
|
|
144
|
+
const index = indexDao.getIndex();
|
|
145
|
+
const items = [];
|
|
146
|
+
for (const key of Object.keys(index.index)) {
|
|
147
|
+
if (!key.endsWith('.md'))
|
|
148
|
+
continue;
|
|
149
|
+
const value = index.index[key];
|
|
150
|
+
const folder = path.dirname(key);
|
|
151
|
+
const entryKey = path.basename(key, '.md');
|
|
152
|
+
if (folderFilter && folder !== folderFilter)
|
|
153
|
+
continue;
|
|
154
|
+
const title = value.title || toTitle(entryKey);
|
|
155
|
+
const haystack = `${title}\n${entryKey}`.toLowerCase();
|
|
156
|
+
if (!haystack.includes(needle)) {
|
|
157
|
+
const filePath = path.join(storeRoot, key);
|
|
158
|
+
const parsed = safeParseFile(filePath);
|
|
159
|
+
const body = parsed?.body || '';
|
|
160
|
+
if (!body.toLowerCase().includes(needle))
|
|
161
|
+
continue;
|
|
162
|
+
const matches = [];
|
|
163
|
+
const lines = body.split(/\r?\n/);
|
|
164
|
+
for (const line of lines) {
|
|
165
|
+
if (line.toLowerCase().includes(needle)) {
|
|
166
|
+
matches.push(line.trim().slice(0, 200));
|
|
167
|
+
if (matches.length >= 3)
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
items.push({ key: entryKey, folder, title, matches });
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
items.push({ key: entryKey, folder, title, matches: [`title: ${title}`] });
|
|
175
|
+
}
|
|
176
|
+
return toolResult({ items });
|
|
177
|
+
}
|
|
178
|
+
function handleListTags() {
|
|
179
|
+
const index = indexDao.getIndex();
|
|
180
|
+
const tagSet = new Set();
|
|
181
|
+
for (const key of Object.keys(index.index)) {
|
|
182
|
+
if (!key.endsWith('.md'))
|
|
183
|
+
continue;
|
|
184
|
+
const value = index.index[key];
|
|
185
|
+
if (Array.isArray(value.tags)) {
|
|
186
|
+
for (const tag of value.tags)
|
|
187
|
+
tagSet.add(tag);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return toolResult({ tags: Array.from(tagSet).sort() });
|
|
191
|
+
}
|
|
192
|
+
function handleList(args) {
|
|
193
|
+
const folderFilterRaw = typeof args.folder === 'string' ? args.folder : null;
|
|
194
|
+
const folderFilter = folderFilterRaw ? sanitizeFolder(folderFilterRaw) : null;
|
|
195
|
+
if (folderFilterRaw && !folderFilter) {
|
|
196
|
+
return toolResult({ items: [], error: 'Invalid folder path' }, true);
|
|
197
|
+
}
|
|
198
|
+
const index = indexDao.getIndex();
|
|
199
|
+
const items = [];
|
|
200
|
+
for (const key of Object.keys(index.index)) {
|
|
201
|
+
if (!key.endsWith('.md'))
|
|
202
|
+
continue;
|
|
203
|
+
const value = index.index[key];
|
|
204
|
+
const folder = path.dirname(key);
|
|
205
|
+
if (folderFilter && folder !== folderFilter)
|
|
206
|
+
continue;
|
|
207
|
+
const filePath = path.join(storeRoot, key);
|
|
208
|
+
const stats = fileStats(filePath);
|
|
209
|
+
items.push({
|
|
210
|
+
key: path.basename(key, '.md'),
|
|
211
|
+
folder,
|
|
212
|
+
title: value.title || toTitle(path.basename(key, '.md')),
|
|
213
|
+
tags: Array.isArray(value.tags) ? value.tags : [],
|
|
214
|
+
updatedAt: stats ? stats.mtime.toISOString() : new Date().toISOString(),
|
|
215
|
+
size: stats ? stats.size : 0,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
items.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
219
|
+
return toolResult({ items });
|
|
220
|
+
}
|
|
221
|
+
async function handleDelete(args) {
|
|
222
|
+
const key = args.key;
|
|
223
|
+
if (!key || typeof key !== 'string') {
|
|
224
|
+
return toolResult({ success: false, error: 'Missing or invalid "key"' }, true);
|
|
225
|
+
}
|
|
226
|
+
const folderRaw = typeof args.folder === 'string' ? args.folder : 'memory';
|
|
227
|
+
const folder = sanitizeFolder(folderRaw);
|
|
228
|
+
if (!folder) {
|
|
229
|
+
return toolResult({ success: false, error: 'Invalid folder path', key }, true);
|
|
230
|
+
}
|
|
231
|
+
const filePath = memoryStore.resolveFilePath(folder, key);
|
|
232
|
+
const relativePath = path.relative(storeRoot, filePath).replace(/\\/g, '/');
|
|
233
|
+
const deleted = memoryStore.delete(folder, key);
|
|
234
|
+
if (!deleted) {
|
|
235
|
+
return toolResult({ success: false, key, folder, error: 'Memory not found' }, true);
|
|
236
|
+
}
|
|
237
|
+
await indexDao.deleteEntryByPath(relativePath);
|
|
238
|
+
return toolResult({ success: true, key, folder });
|
|
239
|
+
}
|
|
240
|
+
async function handleMove(args) {
|
|
241
|
+
const key = args.key;
|
|
242
|
+
if (!key || typeof key !== 'string') {
|
|
243
|
+
return toolResult({ success: false, error: 'Missing or invalid "key"' }, true);
|
|
244
|
+
}
|
|
245
|
+
const folderRaw = typeof args.folder === 'string' ? args.folder : 'memory';
|
|
246
|
+
const folder = sanitizeFolder(folderRaw);
|
|
247
|
+
if (!folder) {
|
|
248
|
+
return toolResult({ success: false, error: 'Invalid folder path', key }, true);
|
|
249
|
+
}
|
|
250
|
+
const toFolderRaw = typeof args.toFolder === 'string' ? args.toFolder : null;
|
|
251
|
+
if (!toFolderRaw) {
|
|
252
|
+
return toolResult({ success: false, error: 'Missing "toFolder"' }, true);
|
|
253
|
+
}
|
|
254
|
+
const toFolder = sanitizeFolder(toFolderRaw);
|
|
255
|
+
if (!toFolder) {
|
|
256
|
+
return toolResult({ success: false, error: 'Invalid toFolder path', key }, true);
|
|
257
|
+
}
|
|
258
|
+
const newKeyRaw = typeof args.newKey === 'string' ? args.newKey : key;
|
|
259
|
+
const newKey = sanitizeKey(newKeyRaw);
|
|
260
|
+
const srcPath = memoryStore.resolveFilePath(folder, key);
|
|
261
|
+
const destPath = memoryStore.resolveFilePath(toFolder, newKey);
|
|
262
|
+
if (!fs.existsSync(srcPath)) {
|
|
263
|
+
return toolResult({ success: false, key, folder, error: 'Memory not found' }, true);
|
|
264
|
+
}
|
|
265
|
+
if (fs.existsSync(destPath)) {
|
|
266
|
+
return toolResult({
|
|
267
|
+
success: false,
|
|
268
|
+
key,
|
|
269
|
+
folder,
|
|
270
|
+
toFolder,
|
|
271
|
+
newKey,
|
|
272
|
+
error: 'Destination already exists',
|
|
273
|
+
}, true);
|
|
274
|
+
}
|
|
275
|
+
const oldRelativePath = path.relative(storeRoot, srcPath).replace(/\\/g, '/');
|
|
276
|
+
const newRelativePath = path.relative(storeRoot, destPath).replace(/\\/g, '/');
|
|
277
|
+
memoryStore.move(folder, key, toFolder, newKeyRaw);
|
|
278
|
+
await indexDao.moveEntry(oldRelativePath, newRelativePath);
|
|
279
|
+
return toolResult({ success: true, key, newKey, fromFolder: folder, toFolder });
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
handleRemember,
|
|
283
|
+
handleRecall,
|
|
284
|
+
handleRecallRecent,
|
|
285
|
+
handleSearch,
|
|
286
|
+
handleListTags,
|
|
287
|
+
handleList,
|
|
288
|
+
handleDelete,
|
|
289
|
+
handleMove,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=memory-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,SAAS,UAAU,CAAC,IAAa,EAAE,OAAO,GAAG,KAAK;IAChD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAE/D,SAAS,eAAe,CAAC,MAAc,EAAE,GAAW;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,IAAkB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YAClD,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,YAAY,CAAC,mBAAmB,CAAC,KAAK,EAAE;gBAC5C,SAAS,EAAE,YAAY;gBACvB,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,IAAgB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,OAAO,UAAU,CAAC;YAChB,KAAK,EAAE,IAAI;YACX,GAAG;YACH,MAAM;YACN,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAC3D,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI;YACvC,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI;SACxC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,kBAAkB,CAAC,IAAsB;QAChD,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,eAAe,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE3C,IAAI,YAAY,IAAI,MAAM,KAAK,YAAY;gBAAE,SAAS;YACtD,IAAI,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAAE,SAAS;YAE3F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,QAAQ;gBACb,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;gBACvC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACjD,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACvE,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAExF,OAAO,UAAU,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACvC,OAAO;oBACL,GAAG,IAAI;oBACP,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC5C,CAAC;YACJ,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,SAAS,YAAY,CAAC,IAAgB;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE3C,IAAI,YAAY,IAAI,MAAM,KAAK,YAAY;gBAAE,SAAS;YAEtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,KAAK,KAAK,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;YAEvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAEnD,MAAM,OAAO,GAAG,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;wBACxC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;4BAAE,MAAM;oBACjC,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtD,SAAS;YACX,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS,cAAc;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,SAAS,UAAU,CAAC,IAAsB;QACxC,MAAM,eAAe,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,eAAe,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAElC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,YAAY,IAAI,MAAM,KAAK,YAAY;gBAAE,SAAS;YAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;gBAC9B,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACjD,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACvE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,IAAgB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAE/C,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,IAAc;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACtE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,UAAU,CACf;gBACE,OAAO,EAAE,KAAK;gBACd,GAAG;gBACH,MAAM;gBACN,QAAQ;gBACR,MAAM;gBACN,KAAK,EAAE,4BAA4B;aACpC,EACD,IAAI,CACL,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE/E,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QAE3D,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO;QACL,cAAc;QACd,YAAY;QACZ,kBAAkB;QAClB,YAAY;QACZ,cAAc;QACd,UAAU;QACV,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System tools: get_current_workspace, organize_memories, sync_workspace_index, bootstrap_workspace.
|
|
3
|
+
*/
|
|
4
|
+
import type { Ctx, OrganizeArgs, SyncWorkspaceIndexArgs } from '../types.js';
|
|
5
|
+
export declare function createSystemTools(ctx: Ctx): {
|
|
6
|
+
handleGetCurrentWorkspace: () => {
|
|
7
|
+
content: {
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError: boolean;
|
|
12
|
+
};
|
|
13
|
+
handleOrganize: (args: OrganizeArgs) => Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
handleSyncWorkspaceIndex: (args: SyncWorkspaceIndexArgs) => Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
handleBootstrapWorkspace: (args: {
|
|
28
|
+
detailed_rounds?: number;
|
|
29
|
+
summary_rounds?: number;
|
|
30
|
+
}) => Promise<{
|
|
31
|
+
content: {
|
|
32
|
+
type: string;
|
|
33
|
+
text: string;
|
|
34
|
+
}[];
|
|
35
|
+
isError: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System tools: get_current_workspace, organize_memories, sync_workspace_index, bootstrap_workspace.
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { ESSENCE_SIZE_LIMIT } from '../config.js';
|
|
7
|
+
import { loadMcpConfig } from '../context/wire-context.js';
|
|
8
|
+
import { parseFrontmatter, stringifyFrontmatter } from '../utils/frontmatter.js';
|
|
9
|
+
import { atomicWriteFile } from '../utils/paths.js';
|
|
10
|
+
import { toTitle } from '../utils/validation.js';
|
|
11
|
+
function toolResult(data, isError = false) {
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
isError,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function safeParseFile(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
const text = fs.readFileSync(filePath, 'utf8');
|
|
20
|
+
return parseFrontmatter(text) || { frontmatter: {}, body: text };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function fileStats(filePath) {
|
|
27
|
+
try {
|
|
28
|
+
return fs.statSync(filePath);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const ESSENCE = {
|
|
35
|
+
folder: 'essence',
|
|
36
|
+
key: 'essence',
|
|
37
|
+
maxRecommendedBytes: ESSENCE_SIZE_LIMIT,
|
|
38
|
+
rules: [
|
|
39
|
+
'输入源:现有 essence/essence.md + memory/ 下所有条目;notes/ 不参与。',
|
|
40
|
+
'输出目标:固定单个文件 essence/essence.md,覆盖写入。',
|
|
41
|
+
'核心任务:重新结构化内容——归类、按重要度排序、去重合并。',
|
|
42
|
+
'语言要求:精炼、无歧义、不改变语义;可适当压缩格式,不必考虑人类可读性。',
|
|
43
|
+
'信息保留:尽量不丢失信息;如需舍弃某 memory 源内容,Agent 自行决定并处理。',
|
|
44
|
+
'来源标注:关键章节/结论在正文内用 `> 来源:memory/<folder>/key` 标注;不写入 frontmatter sources。',
|
|
45
|
+
'不强制模板:Agent 自行决定最终结构和章节。',
|
|
46
|
+
'大小提示:工具校验并提示是否超过 15KB,但不阻止保存。',
|
|
47
|
+
'工具不碰 memory/ 源文件:Agent 整理后如需清理或重写源记忆,自行调用 delete / remember。',
|
|
48
|
+
].join('\n'),
|
|
49
|
+
};
|
|
50
|
+
export function createSystemTools(ctx) {
|
|
51
|
+
const { cwd, workspaceId, storeRoot, indexDao } = ctx;
|
|
52
|
+
function loadEssenceFile() {
|
|
53
|
+
const essencePath = path.join(storeRoot, 'essence', 'essence.md');
|
|
54
|
+
if (!fs.existsSync(essencePath))
|
|
55
|
+
return null;
|
|
56
|
+
const parsed = safeParseFile(essencePath);
|
|
57
|
+
if (!parsed)
|
|
58
|
+
return null;
|
|
59
|
+
const stats = fileStats(essencePath);
|
|
60
|
+
return {
|
|
61
|
+
key: 'essence',
|
|
62
|
+
folder: 'essence',
|
|
63
|
+
filePath: essencePath,
|
|
64
|
+
frontmatter: parsed.frontmatter || {},
|
|
65
|
+
content: parsed.body || '',
|
|
66
|
+
size: stats ? stats.size : 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function handleGetCurrentWorkspace() {
|
|
70
|
+
return toolResult({
|
|
71
|
+
cwd,
|
|
72
|
+
workspaceId,
|
|
73
|
+
storePath: storeRoot,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function handleOrganize(args) {
|
|
77
|
+
if (typeof args.content !== 'string') {
|
|
78
|
+
const existingEssence = loadEssenceFile();
|
|
79
|
+
const pendingMemories = [];
|
|
80
|
+
const index = indexDao.getIndex();
|
|
81
|
+
for (const key of Object.keys(index.index)) {
|
|
82
|
+
if (!key.endsWith('.md'))
|
|
83
|
+
continue;
|
|
84
|
+
if (!key.startsWith('memory/'))
|
|
85
|
+
continue;
|
|
86
|
+
const value = index.index[key];
|
|
87
|
+
const filePath = path.join(storeRoot, key);
|
|
88
|
+
const parsed = safeParseFile(filePath);
|
|
89
|
+
pendingMemories.push({
|
|
90
|
+
key: path.basename(key, '.md'),
|
|
91
|
+
folder: path.dirname(key),
|
|
92
|
+
title: value.title || toTitle(path.basename(key, '.md')),
|
|
93
|
+
tags: Array.isArray(value.tags) ? value.tags : [],
|
|
94
|
+
size: fileStats(filePath)?.size || 0,
|
|
95
|
+
content: parsed?.body || '',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return toolResult({
|
|
99
|
+
stage: 'prepare',
|
|
100
|
+
existingEssence: existingEssence
|
|
101
|
+
? {
|
|
102
|
+
found: true,
|
|
103
|
+
key: existingEssence.key,
|
|
104
|
+
folder: existingEssence.folder,
|
|
105
|
+
size: existingEssence.size,
|
|
106
|
+
content: existingEssence.content,
|
|
107
|
+
}
|
|
108
|
+
: { found: false },
|
|
109
|
+
pendingMemories,
|
|
110
|
+
rules: ESSENCE.rules,
|
|
111
|
+
outputPath: `${ESSENCE.folder}/${ESSENCE.key}.md`,
|
|
112
|
+
maxRecommendedBytes: ESSENCE.maxRecommendedBytes,
|
|
113
|
+
message: 'Prepare ready. Generate the organized essence content and call organize_memories with content to store.',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const content = args.content;
|
|
117
|
+
const sources = Array.isArray(args.sources)
|
|
118
|
+
? args.sources.filter((s) => typeof s === 'string')
|
|
119
|
+
: [];
|
|
120
|
+
const contentBytes = Buffer.byteLength(content, 'utf8');
|
|
121
|
+
const withinLimit = contentBytes <= ESSENCE.maxRecommendedBytes;
|
|
122
|
+
const essenceDir = path.join(storeRoot, ESSENCE.folder);
|
|
123
|
+
fs.mkdirSync(essenceDir, { recursive: true });
|
|
124
|
+
const essencePath = path.join(essenceDir, `${ESSENCE.key}.md`);
|
|
125
|
+
const nowIso = new Date().toISOString();
|
|
126
|
+
const frontmatter = {
|
|
127
|
+
key: ESSENCE.key,
|
|
128
|
+
title: 'Workspace Essence',
|
|
129
|
+
tags: ['essence', 'workspace-memory'],
|
|
130
|
+
updatedAt: nowIso,
|
|
131
|
+
};
|
|
132
|
+
const fileContent = stringifyFrontmatter(frontmatter) + content;
|
|
133
|
+
atomicWriteFile(essencePath, fileContent, 'utf8');
|
|
134
|
+
await indexDao.upsertEntry(essencePath);
|
|
135
|
+
return toolResult({
|
|
136
|
+
success: true,
|
|
137
|
+
stage: 'store',
|
|
138
|
+
filePath: essencePath,
|
|
139
|
+
contentSize: contentBytes,
|
|
140
|
+
recommendedMax: ESSENCE.maxRecommendedBytes,
|
|
141
|
+
sizeHint: withinLimit
|
|
142
|
+
? 'within recommended limit'
|
|
143
|
+
: `exceeds ${ESSENCE.maxRecommendedBytes} bytes, consider compressing next time`,
|
|
144
|
+
sources,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async function handleSyncWorkspaceIndex(args) {
|
|
148
|
+
const result = await indexDao.reconcileIndex({
|
|
149
|
+
folderComments: args.folderComments,
|
|
150
|
+
});
|
|
151
|
+
const index = indexDao.getIndex();
|
|
152
|
+
const foldersNeedingComment = [];
|
|
153
|
+
for (const key of Object.keys(index.index)) {
|
|
154
|
+
if (!key.endsWith('/'))
|
|
155
|
+
continue;
|
|
156
|
+
const value = index.index[key];
|
|
157
|
+
if (!value.comment) {
|
|
158
|
+
foldersNeedingComment.push(key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return toolResult({
|
|
162
|
+
...result,
|
|
163
|
+
foldersNeedingComment,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function handleBootstrapWorkspace(args) {
|
|
167
|
+
await indexDao.reconcileIndex();
|
|
168
|
+
const { buildWorkspaceContext } = await import('./context-tools.js').then((m) => m.createContextTools(ctx));
|
|
169
|
+
const contextData = await buildWorkspaceContext(args);
|
|
170
|
+
const existingEssence = loadEssenceFile();
|
|
171
|
+
const config = loadMcpConfig();
|
|
172
|
+
return toolResult({
|
|
173
|
+
workspace: contextData.workspace,
|
|
174
|
+
recentContext: contextData.recentContext,
|
|
175
|
+
essence: existingEssence
|
|
176
|
+
? {
|
|
177
|
+
found: true,
|
|
178
|
+
key: existingEssence.key,
|
|
179
|
+
folder: existingEssence.folder,
|
|
180
|
+
size: existingEssence.size,
|
|
181
|
+
content: existingEssence.content,
|
|
182
|
+
}
|
|
183
|
+
: { found: false },
|
|
184
|
+
memoryIndexTree: indexDao.buildMemoryIndexTree(config.recentChangeLimit),
|
|
185
|
+
notesRefs: indexDao.listRefs('notes'),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
handleGetCurrentWorkspace,
|
|
190
|
+
handleOrganize,
|
|
191
|
+
handleSyncWorkspaceIndex,
|
|
192
|
+
handleBootstrapWorkspace,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=system-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-tools.js","sourceRoot":"","sources":["../../src/tools/system-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme tracing tools: tag_theme, trace_theme, list_themes, refine_session_turns.
|
|
3
|
+
*/
|
|
4
|
+
import type { Ctx, RefineSessionTurnsArgs, TagThemeArgs, TraceThemeArgs } from '../types.js';
|
|
5
|
+
export declare function createThemeTools(ctx: Ctx): {
|
|
6
|
+
handleTagTheme: (args: TagThemeArgs) => Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
isError: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
handleTraceTheme: (args: TraceThemeArgs) => Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
handleListThemes: () => {
|
|
21
|
+
content: {
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError: boolean;
|
|
26
|
+
};
|
|
27
|
+
handleRefineSessionTurns: (args: RefineSessionTurnsArgs) => Promise<{
|
|
28
|
+
content: {
|
|
29
|
+
type: string;
|
|
30
|
+
text: string;
|
|
31
|
+
}[];
|
|
32
|
+
isError: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
};
|