universal-memory-mcp 0.2.3 → 0.3.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.
Files changed (36) hide show
  1. package/dist/consolidate.d.ts +6 -0
  2. package/dist/consolidate.d.ts.map +1 -0
  3. package/dist/consolidate.js +291 -0
  4. package/dist/consolidate.js.map +1 -0
  5. package/dist/consolidation/deduplicator.d.ts +17 -0
  6. package/dist/consolidation/deduplicator.d.ts.map +1 -0
  7. package/dist/consolidation/deduplicator.js +158 -0
  8. package/dist/consolidation/deduplicator.js.map +1 -0
  9. package/dist/consolidation/extractor.d.ts +36 -0
  10. package/dist/consolidation/extractor.d.ts.map +1 -0
  11. package/dist/consolidation/extractor.js +310 -0
  12. package/dist/consolidation/extractor.js.map +1 -0
  13. package/dist/consolidation/index.d.ts +14 -0
  14. package/dist/consolidation/index.d.ts.map +1 -0
  15. package/dist/consolidation/index.js +14 -0
  16. package/dist/consolidation/index.js.map +1 -0
  17. package/dist/consolidation/scanner.d.ts +27 -0
  18. package/dist/consolidation/scanner.d.ts.map +1 -0
  19. package/dist/consolidation/scanner.js +122 -0
  20. package/dist/consolidation/scanner.js.map +1 -0
  21. package/dist/consolidation/summary-consolidator.d.ts +40 -0
  22. package/dist/consolidation/summary-consolidator.d.ts.map +1 -0
  23. package/dist/consolidation/summary-consolidator.js +342 -0
  24. package/dist/consolidation/summary-consolidator.js.map +1 -0
  25. package/dist/consolidation/updater.d.ts +9 -0
  26. package/dist/consolidation/updater.d.ts.map +1 -0
  27. package/dist/consolidation/updater.js +179 -0
  28. package/dist/consolidation/updater.js.map +1 -0
  29. package/dist/cron.d.ts +6 -0
  30. package/dist/cron.d.ts.map +1 -0
  31. package/dist/cron.js +200 -0
  32. package/dist/cron.js.map +1 -0
  33. package/package.json +5 -3
  34. package/scripts/postinstall.js +231 -6
  35. package/scripts/universal-memory-start-hook.mjs +136 -0
  36. package/scripts/universal-memory-stop-hook.mjs +261 -0
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Extractor - 调用 Claude Code CLI 提取关键信息
3
+ */
4
+ import { spawn } from 'node:child_process';
5
+ /**
6
+ * 构建提取 prompt
7
+ */
8
+ function buildExtractionPrompt(conversations) {
9
+ const conversationText = conversations
10
+ .map((c, i) => `
11
+ ### 对话 ${i + 1} [ID: ${c.id}]
12
+ **时间**: ${c.timestamp.toISOString()}
13
+ **项目**: ${c.project || '未知'}
14
+
15
+ **用户**: ${c.userMessage.substring(0, 1500)}
16
+
17
+ **AI**: ${c.aiResponse.substring(0, 2000)}
18
+ `)
19
+ .join('\n---\n');
20
+ return `你是一个记忆整理助手。分析以下对话记录,提取重要信息。
21
+
22
+ ## 对话记录
23
+
24
+ ${conversationText}
25
+
26
+ ## 提取规则
27
+
28
+ ### 1. Decisions(重要决策)
29
+ - 技术选型、架构决策、版本发布、方案选择、Bug修复决策
30
+
31
+ ### 2. Preferences(用户偏好)
32
+ - 编程偏好、工具偏好、工作风格偏好
33
+
34
+ ### 3. Facts(关键事实)
35
+ - 项目信息、技术细节、版本信息
36
+
37
+ ### 4. Contacts(联系人)
38
+ - 提到的人、团队或组织
39
+
40
+ ### 5. Profile(用户画像)⭐ 重要
41
+ - **职业/角色**:如"全栈开发者"、"技术负责人"
42
+ - **技术栈**:如"TypeScript + React + Node.js"
43
+ - **专业领域**:如"AI/ML"、"前端开发"
44
+ - **沟通风格**:如"偏好简洁直接"、"中英文混用"
45
+ - **工作习惯**:如"喜欢先规划再实施"
46
+
47
+ ## 输出格式
48
+
49
+ 只输出 JSON,不要其他文字:
50
+
51
+ {
52
+ "decisions": [{"content": "...", "confidence": 0.9, "sourceConversationId": "...", "timestamp": "..."}],
53
+ "preferences": [],
54
+ "facts": [],
55
+ "contacts": [],
56
+ "profile": []
57
+ }
58
+
59
+ ## 注意
60
+ 1. 只提取明确的信息,不要推测
61
+ 2. 简洁表达,每条 1-2 句话
62
+ 3. Profile 类别特别重要,用于建立用户画像
63
+
64
+ 直接输出 JSON:`;
65
+ }
66
+ /**
67
+ * 调用 Claude Code CLI 提取信息
68
+ */
69
+ export async function extractWithClaudeCLI(conversations, options = {}) {
70
+ if (conversations.length === 0) {
71
+ return { decisions: [], preferences: [], facts: [], contacts: [], profile: [] };
72
+ }
73
+ // 分批处理,默认每批 5 条对话(减小批次提高速度)
74
+ const batchSize = options.batchSize || 5;
75
+ const batches = [];
76
+ for (let i = 0; i < conversations.length; i += batchSize) {
77
+ batches.push(conversations.slice(i, i + batchSize));
78
+ }
79
+ const allResults = {
80
+ decisions: [],
81
+ preferences: [],
82
+ facts: [],
83
+ contacts: [],
84
+ profile: [],
85
+ };
86
+ console.log(` 总共 ${conversations.length} 条对话,分 ${batches.length} 批处理`);
87
+ console.log(` 使用模型: ${options.model || 'default'}`);
88
+ for (let i = 0; i < batches.length; i++) {
89
+ const batch = batches[i];
90
+ const startTime = Date.now();
91
+ console.log(` [${i + 1}/${batches.length}] 开始处理 ${batch.length} 条对话...`);
92
+ try {
93
+ const result = await extractBatch(batch, options);
94
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
95
+ console.log(` [${i + 1}/${batches.length}] 完成 (${elapsed}s) - 提取: ${result.decisions.length}决策, ${result.preferences.length}偏好, ${result.facts.length}事实, ${result.profile.length}画像`);
96
+ allResults.decisions.push(...result.decisions);
97
+ allResults.preferences.push(...result.preferences);
98
+ allResults.facts.push(...result.facts);
99
+ allResults.contacts.push(...result.contacts);
100
+ allResults.profile.push(...result.profile);
101
+ }
102
+ catch (error) {
103
+ console.error(` [${i + 1}/${batches.length}] 失败: ${error.message}`);
104
+ // 继续处理下一批
105
+ }
106
+ }
107
+ return allResults;
108
+ }
109
+ /**
110
+ * 提取单个批次
111
+ */
112
+ async function extractBatch(conversations, options = {}) {
113
+ const prompt = buildExtractionPrompt(conversations);
114
+ if (options.verbose) {
115
+ console.log(` [DEBUG] Prompt 长度: ${prompt.length} 字符`);
116
+ }
117
+ return new Promise((resolve, reject) => {
118
+ const args = [
119
+ '-p', prompt,
120
+ '--output-format', 'json', // 使用 json 而不是 stream-json(stream-json 在管道中有问题)
121
+ ];
122
+ // 添加模型参数
123
+ if (options.model) {
124
+ args.push('--model', options.model);
125
+ if (options.verbose) {
126
+ console.log(` [DEBUG] 使用模型: ${options.model}`);
127
+ }
128
+ }
129
+ if (options.verbose) {
130
+ console.log(` [DEBUG] 启动 Claude CLI...`);
131
+ }
132
+ // 复制环境变量但移除 Claude 相关的(避免嵌套 Claude 实例冲突)
133
+ const cleanEnv = { ...process.env };
134
+ delete cleanEnv.CLAUDECODE;
135
+ delete cleanEnv.CLAUDE_CODE_ENTRYPOINT;
136
+ const startTime = Date.now();
137
+ const childProcess = spawn('claude', args, {
138
+ stdio: ['pipe', 'pipe', 'pipe'],
139
+ env: cleanEnv,
140
+ });
141
+ // 立即关闭 stdin
142
+ childProcess.stdin.end();
143
+ let stdout = '';
144
+ let stderr = '';
145
+ let lastDataTime = Date.now();
146
+ // 定期检查进度
147
+ const progressInterval = setInterval(() => {
148
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(0);
149
+ const sinceLastData = ((Date.now() - lastDataTime) / 1000).toFixed(0);
150
+ if (options.verbose) {
151
+ console.log(` [DEBUG] 运行中... ${elapsed}s (最后数据: ${sinceLastData}s前, stdout: ${stdout.length}字节)`);
152
+ }
153
+ }, 10000); // 每10秒报告一次
154
+ childProcess.stdout.on('data', (data) => {
155
+ stdout += data.toString();
156
+ lastDataTime = Date.now();
157
+ });
158
+ childProcess.stderr.on('data', (data) => {
159
+ stderr += data.toString();
160
+ lastDataTime = Date.now();
161
+ });
162
+ childProcess.on('close', (code) => {
163
+ clearInterval(progressInterval);
164
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
165
+ if (options.verbose) {
166
+ console.log(` [DEBUG] Claude CLI 退出 (code=${code}, ${elapsed}s, stdout=${stdout.length}字节)`);
167
+ }
168
+ if (code !== 0) {
169
+ if (stderr.includes('command not found') || stderr.includes('ENOENT')) {
170
+ reject(new Error('Claude Code CLI 未安装或未登录。请先安装并登录 Claude Code。'));
171
+ return;
172
+ }
173
+ reject(new Error(`Claude CLI 退出码 ${code}: ${stderr}`));
174
+ return;
175
+ }
176
+ try {
177
+ const result = parseExtractionResult(stdout, conversations);
178
+ resolve(result);
179
+ }
180
+ catch (error) {
181
+ if (options.verbose) {
182
+ console.log(' [DEBUG] Raw output:', stdout.substring(0, 500));
183
+ }
184
+ reject(new Error(`解析提取结果失败: ${error}`));
185
+ }
186
+ });
187
+ childProcess.on('error', (error) => {
188
+ clearInterval(progressInterval);
189
+ if (error.code === 'ENOENT') {
190
+ reject(new Error('Claude Code CLI 未安装。请先运行: curl -fsSL https://claude.ai/install.sh | bash'));
191
+ }
192
+ else {
193
+ reject(new Error(`启动 Claude CLI 失败: ${error.message}`));
194
+ }
195
+ });
196
+ });
197
+ }
198
+ /**
199
+ * 解析提取结果
200
+ */
201
+ function parseExtractionResult(output, conversations) {
202
+ const lines = output.trim().split('\n');
203
+ // 尝试从 stream-json 格式解析
204
+ for (const line of lines) {
205
+ if (!line.trim())
206
+ continue;
207
+ try {
208
+ const data = JSON.parse(line);
209
+ // 如果是 result 类型
210
+ if (data.type === 'result' && data.result) {
211
+ const jsonMatch = data.result.match(/\{[\s\S]*\}/);
212
+ if (jsonMatch) {
213
+ return parseJsonResult(jsonMatch[0], conversations);
214
+ }
215
+ }
216
+ // 如果是 assistant 消息
217
+ if (data.type === 'assistant' && data.message?.content) {
218
+ const content = data.message.content;
219
+ if (Array.isArray(content)) {
220
+ for (const block of content) {
221
+ if (block.type === 'text' && block.text) {
222
+ // 尝试提取 JSON
223
+ const jsonMatch = block.text.match(/\{[\s\S]*\}/);
224
+ if (jsonMatch) {
225
+ try {
226
+ return parseJsonResult(jsonMatch[0], conversations);
227
+ }
228
+ catch {
229
+ continue;
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ catch {
238
+ continue;
239
+ }
240
+ }
241
+ // 尝试从整个输出中提取 JSON
242
+ const jsonMatch = output.match(/\{[\s\S]*"decisions"[\s\S]*\}/);
243
+ if (jsonMatch) {
244
+ return parseJsonResult(jsonMatch[0], conversations);
245
+ }
246
+ // 返回空结果
247
+ return { decisions: [], preferences: [], facts: [], contacts: [], profile: [] };
248
+ }
249
+ /**
250
+ * 解析 JSON 结果
251
+ */
252
+ function parseJsonResult(jsonStr, conversations) {
253
+ // 清理可能的 markdown 代码块
254
+ let cleaned = jsonStr
255
+ .replace(/```json\s*/g, '')
256
+ .replace(/```\s*/g, '')
257
+ .trim();
258
+ const data = JSON.parse(cleaned);
259
+ const processItems = (items, category) => {
260
+ if (!Array.isArray(items))
261
+ return [];
262
+ return items
263
+ .filter(item => item && item.content)
264
+ .map((item) => {
265
+ // 查找对应的对话来获取时间戳
266
+ const conv = conversations.find(c => c.id === item.sourceConversationId);
267
+ return {
268
+ category: category,
269
+ content: String(item.content || '').trim(),
270
+ confidence: Number(item.confidence) || 0.8,
271
+ sourceConversationId: String(item.sourceConversationId || ''),
272
+ timestamp: conv?.timestamp || new Date(item.timestamp || Date.now()),
273
+ };
274
+ });
275
+ };
276
+ return {
277
+ decisions: processItems(data.decisions || [], 'decisions'),
278
+ preferences: processItems(data.preferences || [], 'preferences'),
279
+ facts: processItems(data.facts || [], 'facts'),
280
+ contacts: processItems(data.contacts || [], 'contacts'),
281
+ profile: processItems(data.profile || [], 'profile'),
282
+ raw: jsonStr,
283
+ };
284
+ }
285
+ /**
286
+ * 检查 Claude Code CLI 是否可用
287
+ */
288
+ export async function checkClaudeCLI() {
289
+ return new Promise((resolve) => {
290
+ const process = spawn('claude', ['--version'], {
291
+ stdio: ['pipe', 'pipe', 'pipe'],
292
+ });
293
+ let stdout = '';
294
+ process.stdout.on('data', (data) => {
295
+ stdout += data.toString();
296
+ });
297
+ process.on('close', (code) => {
298
+ if (code === 0) {
299
+ resolve({ available: true });
300
+ }
301
+ else {
302
+ resolve({ available: false, error: 'Claude Code CLI 未正确安装或未登录' });
303
+ }
304
+ });
305
+ process.on('error', () => {
306
+ resolve({ available: false, error: 'Claude Code CLI 未安装' });
307
+ });
308
+ });
309
+ }
310
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/consolidation/extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Consolidation module - 长期记忆自动整理
3
+ *
4
+ * 基于脑科学的三层记忆架构:
5
+ * - Level 0: 感觉记忆 (daily/*.md) - 原始对话流水
6
+ * - Level 1: 短期记忆 (long_term/*.md) - 提取的条目
7
+ * - Level 2: 长期记忆 (long_term/*-summary.md) - 整合的摘要
8
+ */
9
+ export { scanDailyLogs, type Conversation, type ScanOptions, type ScanResult } from './scanner.js';
10
+ export { extractWithClaudeCLI, checkClaudeCLI, type ExtractedInfo, type ExtractionResult } from './extractor.js';
11
+ export { deduplicateResults, type DeduplicationResult } from './deduplicator.js';
12
+ export { updateLongTermMemory } from './updater.js';
13
+ export { consolidateSummaries, shouldConsolidate, type ConsolidationOptions, type ConsolidationResult, } from './summary-consolidator.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/consolidation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Consolidation module - 长期记忆自动整理
3
+ *
4
+ * 基于脑科学的三层记忆架构:
5
+ * - Level 0: 感觉记忆 (daily/*.md) - 原始对话流水
6
+ * - Level 1: 短期记忆 (long_term/*.md) - 提取的条目
7
+ * - Level 2: 长期记忆 (long_term/*-summary.md) - 整合的摘要
8
+ */
9
+ export { scanDailyLogs } from './scanner.js';
10
+ export { extractWithClaudeCLI, checkClaudeCLI } from './extractor.js';
11
+ export { deduplicateResults } from './deduplicator.js';
12
+ export { updateLongTermMemory } from './updater.js';
13
+ export { consolidateSummaries, shouldConsolidate, } from './summary-consolidator.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/consolidation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAwD,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAA6C,MAAM,gBAAgB,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAA4B,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Scanner - 扫描 daily 日志,提取未整理的对话
3
+ */
4
+ export interface Conversation {
5
+ id: string;
6
+ timestamp: Date;
7
+ project?: string;
8
+ client?: string;
9
+ sessionId: string;
10
+ userMessage: string;
11
+ aiResponse: string;
12
+ consolidated: boolean;
13
+ }
14
+ export interface ScanOptions {
15
+ days: number;
16
+ force?: boolean;
17
+ }
18
+ export interface ScanResult {
19
+ conversations: Conversation[];
20
+ totalScanned: number;
21
+ skipped: number;
22
+ }
23
+ /**
24
+ * 扫描 daily 日志,提取未整理的对话
25
+ */
26
+ export declare function scanDailyLogs(storagePath: string, options: ScanOptions): Promise<ScanResult>;
27
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/consolidation/scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA2DrB"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Scanner - 扫描 daily 日志,提取未整理的对话
3
+ */
4
+ import { readFile, readdir } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ /**
7
+ * 扫描 daily 日志,提取未整理的对话
8
+ */
9
+ export async function scanDailyLogs(storagePath, options) {
10
+ const dailyDir = join(storagePath, 'daily');
11
+ const consolidatedPath = join(storagePath, '.consolidated.json');
12
+ // 1. 获取已整理的对话 ID
13
+ const consolidated = await loadConsolidatedIds(consolidatedPath);
14
+ // 2. 计算日期范围
15
+ const endDate = new Date();
16
+ const startDate = new Date();
17
+ startDate.setDate(startDate.getDate() - options.days);
18
+ // 3. 扫描日志文件
19
+ let files;
20
+ try {
21
+ files = await readdir(dailyDir);
22
+ }
23
+ catch {
24
+ return { conversations: [], totalScanned: 0, skipped: 0 };
25
+ }
26
+ const conversations = [];
27
+ let totalScanned = 0;
28
+ let skipped = 0;
29
+ for (const file of files) {
30
+ if (!file.endsWith('.md'))
31
+ continue;
32
+ // 检查日期范围
33
+ const dateMatch = file.match(/^(\d{4}-\d{2}-\d{2})\.md$/);
34
+ if (!dateMatch)
35
+ continue;
36
+ const fileDate = new Date(dateMatch[1]);
37
+ if (fileDate < startDate || fileDate > endDate)
38
+ continue;
39
+ // 解析文件内容
40
+ const filePath = join(dailyDir, file);
41
+ try {
42
+ const content = await readFile(filePath, 'utf-8');
43
+ const parsed = parseConversations(content, file);
44
+ for (const conv of parsed) {
45
+ totalScanned++;
46
+ // 检查是否已整理
47
+ if (!options.force && consolidated.has(conv.id)) {
48
+ skipped++;
49
+ conv.consolidated = true;
50
+ }
51
+ else {
52
+ conv.consolidated = false;
53
+ conversations.push(conv);
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // 跳过无法读取的文件
59
+ continue;
60
+ }
61
+ }
62
+ return { conversations, totalScanned, skipped };
63
+ }
64
+ /**
65
+ * 解析 markdown 文件中的对话
66
+ */
67
+ function parseConversations(content, fileName) {
68
+ const conversations = [];
69
+ const blocks = content.split(/^---$/m);
70
+ for (const block of blocks) {
71
+ if (!block.trim())
72
+ continue;
73
+ // 提取时间戳
74
+ const timestampMatch = block.match(/## (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/);
75
+ if (!timestampMatch)
76
+ continue;
77
+ const timestamp = new Date(timestampMatch[1].replace(' ', 'T'));
78
+ // 提取项目
79
+ const projectMatch = block.match(/\*\*Project:\*\* (.+)/);
80
+ const project = projectMatch ? projectMatch[1].trim() : undefined;
81
+ // 提取客户端
82
+ const clientMatch = block.match(/\*\*Client:\*\* (.+)/);
83
+ const client = clientMatch ? clientMatch[1].trim() : undefined;
84
+ // 提取会话 ID
85
+ const sessionMatch = block.match(/\*\*Session:\*\* (.+)/);
86
+ const sessionId = sessionMatch ? sessionMatch[1].trim() : '';
87
+ // 提取用户消息和 AI 回复
88
+ const userMatch = block.match(/\*\*User:\*\* ([\s\S]*?)(?=\n\n\*\*AI:\*\*|$)/);
89
+ const aiMatch = block.match(/\*\*AI:\*\* ([\s\S]*?)$/);
90
+ const userMessage = userMatch ? userMatch[1].trim() : '';
91
+ const aiResponse = aiMatch ? aiMatch[1].trim() : '';
92
+ if (!userMessage || !aiResponse)
93
+ continue;
94
+ // 生成唯一 ID
95
+ const id = `${fileName}-${timestamp.getTime()}-${sessionId.substring(0, 8)}`;
96
+ conversations.push({
97
+ id,
98
+ timestamp,
99
+ project,
100
+ client,
101
+ sessionId,
102
+ userMessage,
103
+ aiResponse,
104
+ consolidated: false,
105
+ });
106
+ }
107
+ return conversations;
108
+ }
109
+ /**
110
+ * 加载已整理的对话 ID
111
+ */
112
+ async function loadConsolidatedIds(path) {
113
+ try {
114
+ const content = await readFile(path, 'utf-8');
115
+ const data = JSON.parse(content);
116
+ return new Set(data.processedIds || []);
117
+ }
118
+ catch {
119
+ return new Set();
120
+ }
121
+ }
122
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/consolidation/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Summary Consolidator - 二次整合器
3
+ *
4
+ * 基于脑科学的记忆整合机制,将 Level 1 的原始条目整合为 Level 2 的结构化摘要。
5
+ *
6
+ * 参考:
7
+ * - Systems Consolidation: 记忆从海马体迁移到新皮层
8
+ * - Sleep Replay: 睡眠期间神经元重放并压缩记忆
9
+ * - Abstraction: 记忆被重组、抽象、与现有知识整合
10
+ */
11
+ export interface ConsolidationOptions {
12
+ verbose?: boolean;
13
+ model?: 'haiku' | 'sonnet' | 'opus';
14
+ dryRun?: boolean;
15
+ }
16
+ export interface ConsolidationResult {
17
+ profileSummary?: string;
18
+ knowledgeSummary?: string;
19
+ stats: {
20
+ profileEntriesProcessed: number;
21
+ preferencesEntriesProcessed: number;
22
+ factsEntriesProcessed: number;
23
+ decisionsEntriesProcessed: number;
24
+ };
25
+ }
26
+ /**
27
+ * 执行二次整合
28
+ */
29
+ export declare function consolidateSummaries(storagePath: string, options?: ConsolidationOptions): Promise<ConsolidationResult>;
30
+ /**
31
+ * 检查是否需要整合(基于阈值)
32
+ */
33
+ export declare function shouldConsolidate(storagePath: string, thresholds?: {
34
+ profile: number;
35
+ facts: number;
36
+ }): Promise<{
37
+ needed: boolean;
38
+ reason?: string;
39
+ }>;
40
+ //# sourceMappingURL=summary-consolidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-consolidator.d.ts","sourceRoot":"","sources":["../../src/consolidation/summary-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE;QACL,uBAAuB,EAAE,MAAM,CAAC;QAChC,2BAA2B,EAAE,MAAM,CAAC;QACpC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAmE9B;AAgUD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,UAAU;;;CAA8B,GACvC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/C"}