@yun-zero/claw-memory 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/.claude/settings.local.json +68 -0
- package/README.md +323 -0
- package/dist/config/llm.d.ts +13 -0
- package/dist/config/llm.d.ts.map +1 -0
- package/dist/config/llm.js +96 -0
- package/dist/config/llm.js.map +1 -0
- package/dist/config/plugin.d.ts +15 -0
- package/dist/config/plugin.d.ts.map +1 -0
- package/dist/config/plugin.js +32 -0
- package/dist/config/plugin.js.map +1 -0
- package/dist/db/entityRepository.d.ts +21 -0
- package/dist/db/entityRepository.d.ts.map +1 -0
- package/dist/db/entityRepository.js +55 -0
- package/dist/db/entityRepository.js.map +1 -0
- package/dist/db/repository.d.ts +22 -0
- package/dist/db/repository.d.ts.map +1 -0
- package/dist/db/repository.js +77 -0
- package/dist/db/repository.js.map +1 -0
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +112 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/todoRepository.d.ts +26 -0
- package/dist/db/todoRepository.d.ts.map +1 -0
- package/dist/db/todoRepository.js +54 -0
- package/dist/db/todoRepository.js.map +1 -0
- package/dist/hooks/bootstrap.d.ts +3 -0
- package/dist/hooks/bootstrap.d.ts.map +1 -0
- package/dist/hooks/bootstrap.js +28 -0
- package/dist/hooks/bootstrap.js.map +1 -0
- package/dist/hooks/message.d.ts +18 -0
- package/dist/hooks/message.d.ts.map +1 -0
- package/dist/hooks/message.js +52 -0
- package/dist/hooks/message.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +360 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +62 -0
- package/dist/plugin.js.map +1 -0
- package/dist/services/entityGraphService.d.ts +87 -0
- package/dist/services/entityGraphService.d.ts.map +1 -0
- package/dist/services/entityGraphService.js +271 -0
- package/dist/services/entityGraphService.js.map +1 -0
- package/dist/services/memory.d.ts +26 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +281 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/memoryIndex.d.ts +34 -0
- package/dist/services/memoryIndex.d.ts.map +1 -0
- package/dist/services/memoryIndex.js +100 -0
- package/dist/services/memoryIndex.js.map +1 -0
- package/dist/services/metadataExtractor.d.ts +16 -0
- package/dist/services/metadataExtractor.d.ts.map +1 -0
- package/dist/services/metadataExtractor.js +75 -0
- package/dist/services/metadataExtractor.js.map +1 -0
- package/dist/services/retrieval.d.ts +24 -0
- package/dist/services/retrieval.d.ts.map +1 -0
- package/dist/services/retrieval.js +40 -0
- package/dist/services/retrieval.js.map +1 -0
- package/dist/services/scheduler.d.ts +122 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +434 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/summarizer.d.ts +43 -0
- package/dist/services/summarizer.d.ts.map +1 -0
- package/dist/services/summarizer.js +252 -0
- package/dist/services/summarizer.js.map +1 -0
- package/dist/services/tagService.d.ts +64 -0
- package/dist/services/tagService.d.ts.map +1 -0
- package/dist/services/tagService.js +281 -0
- package/dist/services/tagService.js.map +1 -0
- package/dist/tools/memory.d.ts +3 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +114 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/plans/2026-03-02-claw-memory-design.md +445 -0
- package/docs/plans/2026-03-02-incremental-summary-design.md +157 -0
- package/docs/plans/2026-03-02-incremental-summary-implementation.md +468 -0
- package/docs/plans/2026-03-02-memory-index-design.md +163 -0
- package/docs/plans/2026-03-02-memory-index-implementation.md +836 -0
- package/docs/plans/2026-03-02-mvp-implementation.md +1703 -0
- package/docs/plans/2026-03-02-testing-implementation.md +395 -0
- package/docs/plans/2026-03-02-testing-plan.md +93 -0
- package/docs/plans/2026-03-03-claw-memory-openclaw-plugin-design.md +285 -0
- package/docs/plans/2026-03-03-claw-memory-plugin-implementation.md +642 -0
- package/docs/plans/2026-03-03-entity-graph-design.md +121 -0
- package/docs/plans/2026-03-03-entity-graph-implementation.md +687 -0
- package/docs/plans/2026-03-03-llm-generic-config-design.md +43 -0
- package/docs/plans/2026-03-03-llm-generic-config-implementation.md +186 -0
- package/docs/plans/2026-03-03-memory-e2e-stress-test-design.md +110 -0
- package/docs/plans/2026-03-03-memory-e2e-stress-test-implementation.md +464 -0
- package/docs/plans/2026-03-03-minimax-llm-fix.md +156 -0
- package/docs/plans/2026-03-03-scheduler-design.md +165 -0
- package/docs/plans/2026-03-03-scheduler-implementation.md +777 -0
- package/docs/plans/2026-03-03-tags-visualization-design.md +73 -0
- package/docs/plans/2026-03-03-tags-visualization-implementation.md +539 -0
- package/openclaw.plugin.json +11 -0
- package/package.json +41 -0
- package/src/config/llm.ts +129 -0
- package/src/config/plugin.ts +47 -0
- package/src/db/entityRepository.ts +80 -0
- package/src/db/repository.ts +106 -0
- package/src/db/schema.ts +121 -0
- package/src/db/todoRepository.ts +76 -0
- package/src/hooks/bootstrap.ts +36 -0
- package/src/hooks/message.ts +84 -0
- package/src/index.ts +50 -0
- package/src/plugin.ts +85 -0
- package/src/services/entityGraphService.ts +367 -0
- package/src/services/memory.ts +338 -0
- package/src/services/memoryIndex.ts +140 -0
- package/src/services/metadataExtractor.ts +89 -0
- package/src/services/retrieval.ts +71 -0
- package/src/services/scheduler.ts +529 -0
- package/src/services/summarizer.ts +318 -0
- package/src/services/tagService.ts +335 -0
- package/src/tools/memory.ts +137 -0
- package/src/types.ts +139 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler Service
|
|
3
|
+
* Manages scheduled tasks for deduplication and summary generation
|
|
4
|
+
*/
|
|
5
|
+
import cron from 'node-cron';
|
|
6
|
+
import { generateSummaryWithLLM } from '../config/llm.js';
|
|
7
|
+
import { Summarizer } from './summarizer.js';
|
|
8
|
+
/**
|
|
9
|
+
* Default scheduler configuration
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_CONFIG = {
|
|
12
|
+
deduplicateTime: '01:00',
|
|
13
|
+
dailyTime: '02:00',
|
|
14
|
+
weeklyTime: '03:00',
|
|
15
|
+
monthlyTime: '04:00',
|
|
16
|
+
enabled: true
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Scheduler Service Class
|
|
20
|
+
* Manages scheduled tasks with execution locking and task queue
|
|
21
|
+
*/
|
|
22
|
+
export class Scheduler {
|
|
23
|
+
config;
|
|
24
|
+
isRunning;
|
|
25
|
+
taskQueue;
|
|
26
|
+
tasks;
|
|
27
|
+
db;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new Scheduler instance
|
|
30
|
+
* @param db - Database instance
|
|
31
|
+
* @param config - Optional configuration (uses DEFAULT_CONFIG if not provided)
|
|
32
|
+
*/
|
|
33
|
+
constructor(db, config) {
|
|
34
|
+
// 合并环境变量配置
|
|
35
|
+
const envConfig = {};
|
|
36
|
+
if (process.env.SCHEDULER_DEDUPE_TIME) {
|
|
37
|
+
envConfig.deduplicateTime = process.env.SCHEDULER_DEDUPE_TIME;
|
|
38
|
+
}
|
|
39
|
+
if (process.env.SCHEDULER_DAILY_TIME) {
|
|
40
|
+
envConfig.dailyTime = process.env.SCHEDULER_DAILY_TIME;
|
|
41
|
+
}
|
|
42
|
+
if (process.env.SCHEDULER_WEEKLY_TIME) {
|
|
43
|
+
envConfig.weeklyTime = process.env.SCHEDULER_WEEKLY_TIME;
|
|
44
|
+
}
|
|
45
|
+
if (process.env.SCHEDULER_MONTHLY_TIME) {
|
|
46
|
+
envConfig.monthlyTime = process.env.SCHEDULER_MONTHLY_TIME;
|
|
47
|
+
}
|
|
48
|
+
if (process.env.SCHEDULER_ENABLED !== undefined) {
|
|
49
|
+
envConfig.enabled = process.env.SCHEDULER_ENABLED !== 'false';
|
|
50
|
+
}
|
|
51
|
+
this.db = db;
|
|
52
|
+
this.config = { ...DEFAULT_CONFIG, ...envConfig, ...config };
|
|
53
|
+
this.isRunning = false;
|
|
54
|
+
this.taskQueue = [];
|
|
55
|
+
this.tasks = new Map();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Starts the scheduler and all scheduled tasks
|
|
59
|
+
*/
|
|
60
|
+
start() {
|
|
61
|
+
if (this.isRunning) {
|
|
62
|
+
console.log('[Scheduler] Already running');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!this.config.enabled) {
|
|
66
|
+
console.log('[Scheduler] Scheduler is disabled');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.log('[Scheduler] Starting scheduler...');
|
|
70
|
+
this.scheduleDeduplicate();
|
|
71
|
+
this.scheduleDailySummary();
|
|
72
|
+
this.scheduleWeeklySummary();
|
|
73
|
+
this.scheduleMonthlySummary();
|
|
74
|
+
this.isRunning = true;
|
|
75
|
+
console.log('[Scheduler] Scheduler started successfully');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Stops the scheduler and all scheduled tasks
|
|
79
|
+
*/
|
|
80
|
+
stop() {
|
|
81
|
+
if (!this.isRunning) {
|
|
82
|
+
console.log('[Scheduler] Not running');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
console.log('[Scheduler] Stopping scheduler...');
|
|
86
|
+
for (const [type, task] of this.tasks) {
|
|
87
|
+
task.stop();
|
|
88
|
+
console.log(`[Scheduler] Stopped ${type} task`);
|
|
89
|
+
}
|
|
90
|
+
this.tasks.clear();
|
|
91
|
+
this.taskQueue = [];
|
|
92
|
+
this.isRunning = false;
|
|
93
|
+
console.log('[Scheduler] Scheduler stopped');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Checks if the scheduler is enabled
|
|
97
|
+
* @returns true if enabled, false otherwise
|
|
98
|
+
*/
|
|
99
|
+
isEnabled() {
|
|
100
|
+
return this.config.enabled;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Checks if the scheduler is currently running
|
|
104
|
+
* @returns true if running, false otherwise
|
|
105
|
+
*/
|
|
106
|
+
getIsRunning() {
|
|
107
|
+
return this.isRunning;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Converts HH:mm time format to cron expression
|
|
111
|
+
* @param time - Time in HH:mm format
|
|
112
|
+
* @returns Cron expression
|
|
113
|
+
*/
|
|
114
|
+
timeToCron(time) {
|
|
115
|
+
const [hour, minute] = time.split(':');
|
|
116
|
+
return `${minute} ${hour} * * *`;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Schedules the deduplicate task
|
|
120
|
+
*/
|
|
121
|
+
scheduleDeduplicate() {
|
|
122
|
+
const cronExpression = this.timeToCron(this.config.deduplicateTime);
|
|
123
|
+
const task = cron.schedule(cronExpression, () => {
|
|
124
|
+
this.executeWithLock('deduplicate');
|
|
125
|
+
});
|
|
126
|
+
this.tasks.set('deduplicate', task);
|
|
127
|
+
console.log(`[Scheduler] Scheduled deduplicate task at ${this.config.deduplicateTime}`);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Schedules the daily summary task
|
|
131
|
+
*/
|
|
132
|
+
scheduleDailySummary() {
|
|
133
|
+
const cronExpression = this.timeToCron(this.config.dailyTime);
|
|
134
|
+
const task = cron.schedule(cronExpression, () => {
|
|
135
|
+
this.executeWithLock('daily');
|
|
136
|
+
});
|
|
137
|
+
this.tasks.set('daily', task);
|
|
138
|
+
console.log(`[Scheduler] Scheduled daily summary task at ${this.config.dailyTime}`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Schedules the weekly summary task
|
|
142
|
+
*/
|
|
143
|
+
scheduleWeeklySummary() {
|
|
144
|
+
const cronExpression = this.timeToCron(this.config.weeklyTime);
|
|
145
|
+
const task = cron.schedule(cronExpression, () => {
|
|
146
|
+
this.executeWithLock('weekly');
|
|
147
|
+
});
|
|
148
|
+
this.tasks.set('weekly', task);
|
|
149
|
+
console.log(`[Scheduler] Scheduled weekly summary task at ${this.config.weeklyTime}`);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Schedules the monthly summary task
|
|
153
|
+
*/
|
|
154
|
+
scheduleMonthlySummary() {
|
|
155
|
+
const cronExpression = this.timeToCron(this.config.monthlyTime);
|
|
156
|
+
const task = cron.schedule(cronExpression, () => {
|
|
157
|
+
this.executeWithLock('monthly');
|
|
158
|
+
});
|
|
159
|
+
this.tasks.set('monthly', task);
|
|
160
|
+
console.log(`[Scheduler] Scheduled monthly summary task at ${this.config.monthlyTime}`);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Executes a task with locking mechanism and queue support
|
|
164
|
+
* @param type - Task type
|
|
165
|
+
*/
|
|
166
|
+
executeWithLock(type) {
|
|
167
|
+
// Add to queue
|
|
168
|
+
const queuedTask = {
|
|
169
|
+
type,
|
|
170
|
+
scheduledTime: new Date()
|
|
171
|
+
};
|
|
172
|
+
this.taskQueue.push(queuedTask);
|
|
173
|
+
console.log(`[Scheduler] Queued ${type} task (queue size: ${this.taskQueue.length})`);
|
|
174
|
+
// Process queue
|
|
175
|
+
// Note: Not awaiting async processQueue to avoid blocking the cron scheduler
|
|
176
|
+
this.processQueue().catch(err => {
|
|
177
|
+
console.error(`[Scheduler] Error processing queue:`, err);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Processes the task queue
|
|
182
|
+
*/
|
|
183
|
+
async processQueue() {
|
|
184
|
+
if (this.taskQueue.length === 0) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const task = this.taskQueue.shift();
|
|
188
|
+
if (!task)
|
|
189
|
+
return;
|
|
190
|
+
console.log(`[Scheduler] Processing ${task.type} task...`);
|
|
191
|
+
switch (task.type) {
|
|
192
|
+
case 'deduplicate':
|
|
193
|
+
await this.deduplicate();
|
|
194
|
+
break;
|
|
195
|
+
case 'daily':
|
|
196
|
+
await this.dailySummary();
|
|
197
|
+
break;
|
|
198
|
+
case 'weekly':
|
|
199
|
+
await this.weeklySummary();
|
|
200
|
+
break;
|
|
201
|
+
case 'monthly':
|
|
202
|
+
await this.monthlySummary();
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
// Continue processing if more tasks in queue
|
|
206
|
+
if (this.taskQueue.length > 0) {
|
|
207
|
+
setTimeout(() => this.processQueue(), 1000);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Executes deduplication task - finds and marks duplicate memories
|
|
212
|
+
*/
|
|
213
|
+
async deduplicate() {
|
|
214
|
+
console.log('[Scheduler] Running deduplication...');
|
|
215
|
+
// Get all non-archived memories that are not already marked as duplicates
|
|
216
|
+
const memories = this.db.prepare(`
|
|
217
|
+
SELECT id, content_path, importance
|
|
218
|
+
FROM memories
|
|
219
|
+
WHERE is_archived = FALSE AND is_duplicate = FALSE
|
|
220
|
+
ORDER BY created_at DESC
|
|
221
|
+
`).all();
|
|
222
|
+
const processed = new Set();
|
|
223
|
+
for (const memory of memories) {
|
|
224
|
+
if (processed.has(memory.id))
|
|
225
|
+
continue;
|
|
226
|
+
// Find similar memories (via shared entities)
|
|
227
|
+
const similar = this.db.prepare(`
|
|
228
|
+
SELECT m2.id, m2.content_path, m2.importance
|
|
229
|
+
FROM memories m1
|
|
230
|
+
JOIN memory_entities me1 ON m1.id = me1.memory_id
|
|
231
|
+
JOIN memory_entities me2 ON me1.entity_id = me2.entity_id
|
|
232
|
+
JOIN memories m2 ON me2.memory_id = m2.id
|
|
233
|
+
WHERE m1.id = ? AND m2.id != m1.id
|
|
234
|
+
AND m2.is_archived = FALSE AND m2.is_duplicate = FALSE
|
|
235
|
+
`).all(memory.id);
|
|
236
|
+
for (const similarMem of similar) {
|
|
237
|
+
if (processed.has(similarMem.id))
|
|
238
|
+
continue;
|
|
239
|
+
// Mark as duplicate
|
|
240
|
+
this.db.prepare(`
|
|
241
|
+
UPDATE memories
|
|
242
|
+
SET is_duplicate = TRUE, duplicate_of = ?
|
|
243
|
+
WHERE id = ?
|
|
244
|
+
`).run(memory.id, similarMem.id);
|
|
245
|
+
// Merge importance
|
|
246
|
+
const newImportance = Math.min(1, memory.importance + similarMem.importance * 0.5);
|
|
247
|
+
this.db.prepare(`
|
|
248
|
+
UPDATE memories SET importance = ? WHERE id = ?
|
|
249
|
+
`).run(newImportance, memory.id);
|
|
250
|
+
processed.add(similarMem.id);
|
|
251
|
+
console.log(`[Scheduler] Marked ${similarMem.id} as duplicate of ${memory.id}`);
|
|
252
|
+
}
|
|
253
|
+
processed.add(memory.id);
|
|
254
|
+
}
|
|
255
|
+
console.log('[Scheduler] Deduplication completed');
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Executes daily summary task - generates summary for previous day's memories
|
|
259
|
+
*/
|
|
260
|
+
async dailySummary() {
|
|
261
|
+
console.log('[Scheduler] Running daily summary...');
|
|
262
|
+
const yesterday = new Date();
|
|
263
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
264
|
+
const dateStr = yesterday.toISOString().split('T')[0];
|
|
265
|
+
// 检查是否已有总结
|
|
266
|
+
const existing = this.db.prepare(`
|
|
267
|
+
SELECT summary FROM time_buckets WHERE date = ?
|
|
268
|
+
`).get(dateStr);
|
|
269
|
+
if (existing?.summary) {
|
|
270
|
+
console.log(`[Scheduler] Daily summary for ${dateStr} already exists`);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// 获取当天的记忆
|
|
274
|
+
const memories = this.db.prepare(`
|
|
275
|
+
SELECT id, content_path FROM memories
|
|
276
|
+
WHERE date(created_at) = date(?)
|
|
277
|
+
`).all(dateStr);
|
|
278
|
+
if (memories.length === 0) {
|
|
279
|
+
console.log(`[Scheduler] No memories for ${dateStr}, skipping`);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
// 读取记忆内容
|
|
283
|
+
const fs = await import('fs/promises');
|
|
284
|
+
const contents = [];
|
|
285
|
+
for (const mem of memories) {
|
|
286
|
+
try {
|
|
287
|
+
const content = await fs.readFile(mem.content_path, 'utf-8');
|
|
288
|
+
contents.push(content.slice(0, 1000));
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
console.error(`[Scheduler] Failed to read ${mem.content_path}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// 构建报告字符串并调用 LLM 生成总结
|
|
295
|
+
const reportString = `日期: ${dateStr}\n记忆数量: ${memories.length}\n\n记忆内容:\n${contents.join('\n---\n')}`;
|
|
296
|
+
try {
|
|
297
|
+
const summary = await generateSummaryWithLLM(reportString);
|
|
298
|
+
// 保存到 time_buckets
|
|
299
|
+
this.db.prepare(`
|
|
300
|
+
INSERT OR REPLACE INTO time_buckets (date, summary, summary_generated_at, memory_count)
|
|
301
|
+
VALUES (?, ?, datetime('now'), ?)
|
|
302
|
+
`).run(dateStr, summary, memories.length);
|
|
303
|
+
console.log(`[Scheduler] Daily summary generated for ${dateStr}`);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
console.error('[Scheduler] Failed to generate daily summary:', error);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Executes weekly summary task
|
|
311
|
+
*/
|
|
312
|
+
async weeklySummary() {
|
|
313
|
+
console.log('[Scheduler] Running weekly summary...');
|
|
314
|
+
const now = new Date();
|
|
315
|
+
const dayOfWeek = now.getDay();
|
|
316
|
+
const diff = now.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1);
|
|
317
|
+
const weekStart = new Date(now.getFullYear(), now.getMonth(), diff);
|
|
318
|
+
weekStart.setHours(0, 0, 0, 0);
|
|
319
|
+
const weekStartStr = weekStart.toISOString().split('T')[0];
|
|
320
|
+
// Check if summary already exists
|
|
321
|
+
const existing = this.db.prepare(`
|
|
322
|
+
SELECT summary FROM time_buckets WHERE date = ?
|
|
323
|
+
`).get(weekStartStr);
|
|
324
|
+
if (existing?.summary) {
|
|
325
|
+
console.log(`[Scheduler] Weekly summary for ${weekStartStr} already exists`);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// Get all memories for this week
|
|
329
|
+
const memories = this.db.prepare(`
|
|
330
|
+
SELECT id, content_path FROM memories
|
|
331
|
+
WHERE date(created_at) >= date(?) AND date(created_at) <= date('now')
|
|
332
|
+
`).all(weekStartStr);
|
|
333
|
+
if (memories.length === 0) {
|
|
334
|
+
console.log(`[Scheduler] No memories for week ${weekStartStr}, skipping`);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
// Read memory contents and generate weekly summary
|
|
338
|
+
const fs = await import('fs/promises');
|
|
339
|
+
const contents = [];
|
|
340
|
+
for (const mem of memories.slice(0, 10)) {
|
|
341
|
+
try {
|
|
342
|
+
const content = await fs.readFile(mem.content_path, 'utf-8');
|
|
343
|
+
contents.push(content.slice(0, 500));
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
// Skip files that can't be read
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const summarizer = new Summarizer(this.db);
|
|
350
|
+
const report = {
|
|
351
|
+
period: 'week',
|
|
352
|
+
startDate: weekStartStr,
|
|
353
|
+
endDate: now.toISOString().split('T')[0],
|
|
354
|
+
memoryCount: memories.length,
|
|
355
|
+
memories: contents
|
|
356
|
+
};
|
|
357
|
+
try {
|
|
358
|
+
const summary = await summarizer.generateWeeklySummary(report);
|
|
359
|
+
this.db.prepare(`
|
|
360
|
+
INSERT OR REPLACE INTO time_buckets (date, summary, summary_generated_at, memory_count)
|
|
361
|
+
VALUES (?, ?, datetime('now'), ?)
|
|
362
|
+
`).run(weekStartStr, summary, memories.length);
|
|
363
|
+
console.log(`[Scheduler] Weekly summary generated for ${weekStartStr}`);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.error('[Scheduler] Failed to generate weekly summary:', error);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Executes monthly summary task
|
|
371
|
+
*/
|
|
372
|
+
async monthlySummary() {
|
|
373
|
+
console.log('[Scheduler] Running monthly summary...');
|
|
374
|
+
const now = new Date();
|
|
375
|
+
const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
376
|
+
const monthStartStr = monthStart.toISOString().split('T')[0];
|
|
377
|
+
const existing = this.db.prepare(`
|
|
378
|
+
SELECT summary FROM time_buckets WHERE date = ?
|
|
379
|
+
`).get(monthStartStr);
|
|
380
|
+
if (existing?.summary) {
|
|
381
|
+
console.log(`[Scheduler] Monthly summary for ${monthStartStr} already exists`);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const memories = this.db.prepare(`
|
|
385
|
+
SELECT id FROM memories
|
|
386
|
+
WHERE date(created_at) >= date(?) AND date(created_at) <= date('now')
|
|
387
|
+
`).all(monthStartStr);
|
|
388
|
+
if (memories.length === 0) {
|
|
389
|
+
console.log(`[Scheduler] No memories for month ${monthStartStr}, skipping`);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const summarizer = new Summarizer(this.db);
|
|
393
|
+
const report = {
|
|
394
|
+
period: 'month',
|
|
395
|
+
startDate: monthStartStr,
|
|
396
|
+
endDate: now.toISOString().split('T')[0],
|
|
397
|
+
memoryCount: memories.length
|
|
398
|
+
};
|
|
399
|
+
try {
|
|
400
|
+
const summary = await summarizer.generateMonthlySummary(report);
|
|
401
|
+
this.db.prepare(`
|
|
402
|
+
INSERT OR REPLACE INTO time_buckets (date, summary, summary_generated_at, memory_count)
|
|
403
|
+
VALUES (?, ?, datetime('now'), ?)
|
|
404
|
+
`).run(monthStartStr, summary, memories.length);
|
|
405
|
+
console.log(`[Scheduler] Monthly summary generated for ${monthStartStr}`);
|
|
406
|
+
}
|
|
407
|
+
catch (error) {
|
|
408
|
+
console.error('[Scheduler] Failed to generate monthly summary:', error);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Updates the scheduler configuration
|
|
413
|
+
* @param config - New configuration (partial)
|
|
414
|
+
*/
|
|
415
|
+
updateConfig(config) {
|
|
416
|
+
this.config = { ...this.config, ...config };
|
|
417
|
+
console.log('[Scheduler] Configuration updated');
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Gets the current configuration
|
|
421
|
+
* @returns Current scheduler configuration
|
|
422
|
+
*/
|
|
423
|
+
getConfig() {
|
|
424
|
+
return { ...this.config };
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Gets the current queue size
|
|
428
|
+
* @returns Number of pending tasks in queue
|
|
429
|
+
*/
|
|
430
|
+
getQueueSize() {
|
|
431
|
+
return this.taskQueue.length;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/services/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Summarizer Service
|
|
3
|
+
* Aggregates memory data for weekly report generation
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import type { WeeklyReport } from '../types.js';
|
|
7
|
+
export declare class SummarizerService {
|
|
8
|
+
private db;
|
|
9
|
+
constructor(db: Database.Database);
|
|
10
|
+
aggregateMemories(startDate: string, endDate: string): Promise<WeeklyReport>;
|
|
11
|
+
private getBasicStats;
|
|
12
|
+
private getTagStats;
|
|
13
|
+
private getKeywordStats;
|
|
14
|
+
private getImportanceStats;
|
|
15
|
+
private getAccessStats;
|
|
16
|
+
private getEntityStats;
|
|
17
|
+
reportToString(report: WeeklyReport): string;
|
|
18
|
+
/**
|
|
19
|
+
* Generate weekly summary using LLM
|
|
20
|
+
*/
|
|
21
|
+
generateWeeklySummary(report: {
|
|
22
|
+
period: string;
|
|
23
|
+
startDate: string;
|
|
24
|
+
endDate: string;
|
|
25
|
+
memoryCount: number;
|
|
26
|
+
memories?: string[];
|
|
27
|
+
}): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Generate monthly summary using LLM
|
|
30
|
+
*/
|
|
31
|
+
generateMonthlySummary(report: {
|
|
32
|
+
period: string;
|
|
33
|
+
startDate: string;
|
|
34
|
+
endDate: string;
|
|
35
|
+
memoryCount: number;
|
|
36
|
+
memories?: string[];
|
|
37
|
+
}): Promise<string>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Alias for SummarizerService for backwards compatibility
|
|
41
|
+
*/
|
|
42
|
+
export { SummarizerService as Summarizer };
|
|
43
|
+
//# sourceMappingURL=summarizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/services/summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAI3B,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BlF,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,cAAc;IAsCtB,OAAO,CAAC,cAAc;IAwCtB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAoC5C;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE;QAClC,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;IAanB;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;CAYpB;AAED;;GAEG;AACH,OAAO,EAAE,iBAAiB,IAAI,UAAU,EAAE,CAAC"}
|