universal-agent-memory 0.1.5 → 0.2.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.
Files changed (67) hide show
  1. package/dist/bin/cli.js +207 -0
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/cli/agent.d.ts +20 -0
  4. package/dist/cli/agent.d.ts.map +1 -0
  5. package/dist/cli/agent.js +388 -0
  6. package/dist/cli/agent.js.map +1 -0
  7. package/dist/cli/coord.d.ts +7 -0
  8. package/dist/cli/coord.d.ts.map +1 -0
  9. package/dist/cli/coord.js +145 -0
  10. package/dist/cli/coord.js.map +1 -0
  11. package/dist/cli/deploy.d.ts +19 -0
  12. package/dist/cli/deploy.d.ts.map +1 -0
  13. package/dist/cli/deploy.js +267 -0
  14. package/dist/cli/deploy.js.map +1 -0
  15. package/dist/cli/task.d.ts +33 -0
  16. package/dist/cli/task.d.ts.map +1 -0
  17. package/dist/cli/task.js +570 -0
  18. package/dist/cli/task.js.map +1 -0
  19. package/dist/coordination/database.d.ts +13 -0
  20. package/dist/coordination/database.d.ts.map +1 -0
  21. package/dist/coordination/database.js +131 -0
  22. package/dist/coordination/database.js.map +1 -0
  23. package/dist/coordination/deploy-batcher.d.ts +38 -0
  24. package/dist/coordination/deploy-batcher.d.ts.map +1 -0
  25. package/dist/coordination/deploy-batcher.js +401 -0
  26. package/dist/coordination/deploy-batcher.js.map +1 -0
  27. package/dist/coordination/index.d.ts +4 -0
  28. package/dist/coordination/index.d.ts.map +1 -0
  29. package/dist/coordination/index.js +4 -0
  30. package/dist/coordination/index.js.map +1 -0
  31. package/dist/coordination/service.d.ts +79 -0
  32. package/dist/coordination/service.d.ts.map +1 -0
  33. package/dist/coordination/service.js +591 -0
  34. package/dist/coordination/service.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/tasks/coordination.d.ts +74 -0
  40. package/dist/tasks/coordination.d.ts.map +1 -0
  41. package/dist/tasks/coordination.js +237 -0
  42. package/dist/tasks/coordination.js.map +1 -0
  43. package/dist/tasks/database.d.ts +14 -0
  44. package/dist/tasks/database.d.ts.map +1 -0
  45. package/dist/tasks/database.js +128 -0
  46. package/dist/tasks/database.js.map +1 -0
  47. package/dist/tasks/index.d.ts +5 -0
  48. package/dist/tasks/index.d.ts.map +1 -0
  49. package/dist/tasks/index.js +5 -0
  50. package/dist/tasks/index.js.map +1 -0
  51. package/dist/tasks/service.d.ts +39 -0
  52. package/dist/tasks/service.d.ts.map +1 -0
  53. package/dist/tasks/service.js +582 -0
  54. package/dist/tasks/service.js.map +1 -0
  55. package/dist/tasks/types.d.ts +224 -0
  56. package/dist/tasks/types.d.ts.map +1 -0
  57. package/dist/tasks/types.js +64 -0
  58. package/dist/tasks/types.js.map +1 -0
  59. package/dist/types/coordination.d.ts +240 -0
  60. package/dist/types/coordination.d.ts.map +1 -0
  61. package/dist/types/coordination.js +43 -0
  62. package/dist/types/coordination.js.map +1 -0
  63. package/dist/types/index.d.ts +1 -0
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/types/index.js +1 -0
  66. package/dist/types/index.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,582 @@
1
+ import { createHash, randomBytes } from 'crypto';
2
+ import { TaskDatabase, getDefaultTaskDbPath } from './database.js';
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
4
+ import { dirname } from 'path';
5
+ export class TaskService {
6
+ db;
7
+ jsonlPath;
8
+ agentId;
9
+ constructor(config = {}) {
10
+ const dbPath = config.dbPath || getDefaultTaskDbPath();
11
+ this.db = TaskDatabase.getInstance(dbPath).getDatabase();
12
+ this.jsonlPath = config.jsonlPath || './.uam/tasks/tasks.jsonl';
13
+ this.agentId = config.agentId;
14
+ }
15
+ // ==================== ID Generation ====================
16
+ generateId() {
17
+ const bytes = randomBytes(4);
18
+ const hash = createHash('md5').update(bytes).digest('hex').slice(0, 4);
19
+ return `uam-${hash}`;
20
+ }
21
+ // ==================== CRUD Operations ====================
22
+ create(input) {
23
+ const id = this.generateId();
24
+ const now = new Date().toISOString();
25
+ const task = {
26
+ id,
27
+ title: input.title,
28
+ description: input.description,
29
+ type: input.type || 'task',
30
+ status: 'open',
31
+ priority: (input.priority ?? 2),
32
+ assignee: input.assignee,
33
+ labels: input.labels || [],
34
+ notes: input.notes,
35
+ parentId: input.parentId,
36
+ createdAt: now,
37
+ updatedAt: now,
38
+ };
39
+ const stmt = this.db.prepare(`
40
+ INSERT INTO tasks (id, title, description, type, status, priority, assignee, labels, notes, parent_id, created_at, updated_at)
41
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
42
+ `);
43
+ stmt.run(task.id, task.title, task.description || null, task.type, task.status, task.priority, task.assignee || null, JSON.stringify(task.labels), task.notes || null, task.parentId || null, task.createdAt, task.updatedAt);
44
+ // Record activity
45
+ this.recordActivity(id, 'created', `Created task: ${task.title}`);
46
+ // Record history
47
+ this.recordHistory(id, 'created', null, task.title);
48
+ return task;
49
+ }
50
+ get(id) {
51
+ const stmt = this.db.prepare(`
52
+ SELECT id, title, description, type, status, priority, assignee,
53
+ worktree_branch as worktreeBranch, labels, notes, parent_id as parentId,
54
+ created_at as createdAt, updated_at as updatedAt,
55
+ closed_at as closedAt, closed_reason as closedReason
56
+ FROM tasks WHERE id = ?
57
+ `);
58
+ const row = stmt.get(id);
59
+ if (!row)
60
+ return null;
61
+ return {
62
+ ...row,
63
+ labels: row.labels ? JSON.parse(row.labels) : [],
64
+ };
65
+ }
66
+ getWithRelations(id) {
67
+ const task = this.get(id);
68
+ if (!task)
69
+ return null;
70
+ const deps = this.getDependencies(id);
71
+ const blockedBy = deps.filter(d => d.fromTask === id && d.depType === 'blocks').map(d => d.toTask);
72
+ const blocks = deps.filter(d => d.toTask === id && d.depType === 'blocks').map(d => d.fromTask);
73
+ const relatedTo = deps.filter(d => d.depType === 'related').map(d => d.fromTask === id ? d.toTask : d.fromTask);
74
+ const children = this.getChildren(id).map(t => t.id);
75
+ const parent = task.parentId ? this.get(task.parentId) || undefined : undefined;
76
+ // Check if blocked (has unresolved blocking dependencies)
77
+ const unresolvedBlockers = blockedBy.filter(blockerId => {
78
+ const blocker = this.get(blockerId);
79
+ return blocker && blocker.status !== 'done' && blocker.status !== 'wont_do';
80
+ });
81
+ const isBlocked = unresolvedBlockers.length > 0;
82
+ const isReady = task.status === 'open' && !isBlocked;
83
+ return {
84
+ ...task,
85
+ blockedBy,
86
+ blocks,
87
+ relatedTo,
88
+ children,
89
+ parent,
90
+ isBlocked,
91
+ isReady,
92
+ };
93
+ }
94
+ update(id, input) {
95
+ const existing = this.get(id);
96
+ if (!existing)
97
+ return null;
98
+ const now = new Date().toISOString();
99
+ const updates = [];
100
+ const params = [];
101
+ // Track changes for history
102
+ const changes = [];
103
+ if (input.title !== undefined && input.title !== existing.title) {
104
+ updates.push('title = ?');
105
+ params.push(input.title);
106
+ changes.push({ field: 'title', oldValue: existing.title, newValue: input.title });
107
+ }
108
+ if (input.description !== undefined && input.description !== existing.description) {
109
+ updates.push('description = ?');
110
+ params.push(input.description || null);
111
+ changes.push({ field: 'description', oldValue: existing.description || null, newValue: input.description || null });
112
+ }
113
+ if (input.type !== undefined && input.type !== existing.type) {
114
+ updates.push('type = ?');
115
+ params.push(input.type);
116
+ changes.push({ field: 'type', oldValue: existing.type, newValue: input.type });
117
+ }
118
+ if (input.status !== undefined && input.status !== existing.status) {
119
+ updates.push('status = ?');
120
+ params.push(input.status);
121
+ changes.push({ field: 'status', oldValue: existing.status, newValue: input.status });
122
+ // Set closed_at if closing
123
+ if (input.status === 'done' || input.status === 'wont_do') {
124
+ updates.push('closed_at = ?');
125
+ params.push(now);
126
+ }
127
+ }
128
+ if (input.priority !== undefined && input.priority !== existing.priority) {
129
+ updates.push('priority = ?');
130
+ params.push(input.priority);
131
+ changes.push({ field: 'priority', oldValue: String(existing.priority), newValue: String(input.priority) });
132
+ }
133
+ if (input.assignee !== undefined && input.assignee !== existing.assignee) {
134
+ updates.push('assignee = ?');
135
+ params.push(input.assignee || null);
136
+ changes.push({ field: 'assignee', oldValue: existing.assignee || null, newValue: input.assignee || null });
137
+ }
138
+ if (input.worktreeBranch !== undefined && input.worktreeBranch !== existing.worktreeBranch) {
139
+ updates.push('worktree_branch = ?');
140
+ params.push(input.worktreeBranch || null);
141
+ changes.push({ field: 'worktreeBranch', oldValue: existing.worktreeBranch || null, newValue: input.worktreeBranch || null });
142
+ }
143
+ if (input.labels !== undefined) {
144
+ const newLabels = JSON.stringify(input.labels);
145
+ const oldLabels = JSON.stringify(existing.labels);
146
+ if (newLabels !== oldLabels) {
147
+ updates.push('labels = ?');
148
+ params.push(newLabels);
149
+ changes.push({ field: 'labels', oldValue: oldLabels, newValue: newLabels });
150
+ }
151
+ }
152
+ if (input.notes !== undefined && input.notes !== existing.notes) {
153
+ updates.push('notes = ?');
154
+ params.push(input.notes || null);
155
+ changes.push({ field: 'notes', oldValue: existing.notes || null, newValue: input.notes || null });
156
+ }
157
+ if (updates.length === 0) {
158
+ return existing;
159
+ }
160
+ updates.push('updated_at = ?');
161
+ params.push(now);
162
+ params.push(id);
163
+ const stmt = this.db.prepare(`
164
+ UPDATE tasks SET ${updates.join(', ')} WHERE id = ?
165
+ `);
166
+ stmt.run(...params);
167
+ // Record history for each change
168
+ for (const change of changes) {
169
+ this.recordHistory(id, change.field, change.oldValue, change.newValue);
170
+ }
171
+ // Record activity
172
+ this.recordActivity(id, 'updated', `Updated: ${changes.map(c => c.field).join(', ')}`);
173
+ return this.get(id);
174
+ }
175
+ close(id, reason) {
176
+ const task = this.get(id);
177
+ if (!task)
178
+ return null;
179
+ const now = new Date().toISOString();
180
+ const stmt = this.db.prepare(`
181
+ UPDATE tasks SET status = 'done', closed_at = ?, closed_reason = ?, updated_at = ?
182
+ WHERE id = ?
183
+ `);
184
+ stmt.run(now, reason || null, now, id);
185
+ this.recordHistory(id, 'status', task.status, 'done');
186
+ this.recordActivity(id, 'closed', reason || 'Task completed');
187
+ return this.get(id);
188
+ }
189
+ delete(id) {
190
+ // Delete dependencies first
191
+ this.db.prepare('DELETE FROM task_dependencies WHERE from_task = ? OR to_task = ?').run(id, id);
192
+ // Delete history
193
+ this.db.prepare('DELETE FROM task_history WHERE task_id = ?').run(id);
194
+ // Delete activity
195
+ this.db.prepare('DELETE FROM task_activity WHERE task_id = ?').run(id);
196
+ // Delete task
197
+ const result = this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
198
+ return result.changes > 0;
199
+ }
200
+ // ==================== Query Operations ====================
201
+ list(filter = {}) {
202
+ let sql = `
203
+ SELECT id, title, description, type, status, priority, assignee,
204
+ worktree_branch as worktreeBranch, labels, notes, parent_id as parentId,
205
+ created_at as createdAt, updated_at as updatedAt,
206
+ closed_at as closedAt, closed_reason as closedReason
207
+ FROM tasks WHERE 1=1
208
+ `;
209
+ const params = [];
210
+ if (filter.status) {
211
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
212
+ sql += ` AND status IN (${statuses.map(() => '?').join(',')})`;
213
+ params.push(...statuses);
214
+ }
215
+ if (filter.type) {
216
+ const types = Array.isArray(filter.type) ? filter.type : [filter.type];
217
+ sql += ` AND type IN (${types.map(() => '?').join(',')})`;
218
+ params.push(...types);
219
+ }
220
+ if (filter.priority !== undefined) {
221
+ const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];
222
+ sql += ` AND priority IN (${priorities.map(() => '?').join(',')})`;
223
+ params.push(...priorities);
224
+ }
225
+ if (filter.assignee) {
226
+ sql += ' AND assignee = ?';
227
+ params.push(filter.assignee);
228
+ }
229
+ if (filter.parentId) {
230
+ sql += ' AND parent_id = ?';
231
+ params.push(filter.parentId);
232
+ }
233
+ if (filter.labels && filter.labels.length > 0) {
234
+ // Match any of the specified labels
235
+ const labelConditions = filter.labels.map(() => "labels LIKE ?");
236
+ sql += ` AND (${labelConditions.join(' OR ')})`;
237
+ params.push(...filter.labels.map(l => `%"${l}"%`));
238
+ }
239
+ if (filter.search) {
240
+ sql += ' AND (title LIKE ? OR description LIKE ?)';
241
+ const searchPattern = `%${filter.search}%`;
242
+ params.push(searchPattern, searchPattern);
243
+ }
244
+ sql += ' ORDER BY priority ASC, created_at DESC';
245
+ const stmt = this.db.prepare(sql);
246
+ const rows = stmt.all(...params);
247
+ let tasks = rows.map(row => ({
248
+ ...row,
249
+ labels: row.labels ? JSON.parse(row.labels) : [],
250
+ }));
251
+ // Post-filter for blocked/ready (requires dependency check)
252
+ if (filter.isBlocked !== undefined || filter.isReady !== undefined) {
253
+ tasks = tasks.filter(task => {
254
+ const withRelations = this.getWithRelations(task.id);
255
+ if (!withRelations)
256
+ return false;
257
+ if (filter.isBlocked !== undefined && withRelations.isBlocked !== filter.isBlocked) {
258
+ return false;
259
+ }
260
+ if (filter.isReady !== undefined && withRelations.isReady !== filter.isReady) {
261
+ return false;
262
+ }
263
+ return true;
264
+ });
265
+ }
266
+ return tasks;
267
+ }
268
+ ready() {
269
+ const openTasks = this.list({ status: 'open' });
270
+ return openTasks
271
+ .map(t => this.getWithRelations(t.id))
272
+ .filter((t) => t !== null && t.isReady);
273
+ }
274
+ blocked() {
275
+ const tasks = this.list({ status: ['open', 'in_progress'] });
276
+ return tasks
277
+ .map(t => this.getWithRelations(t.id))
278
+ .filter((t) => t !== null && t.isBlocked);
279
+ }
280
+ getChildren(parentId) {
281
+ return this.list({ parentId });
282
+ }
283
+ // ==================== Dependencies ====================
284
+ addDependency(fromTask, toTask, depType = 'blocks') {
285
+ // Validate both tasks exist
286
+ if (!this.get(fromTask) || !this.get(toTask)) {
287
+ return null;
288
+ }
289
+ // Prevent self-dependency
290
+ if (fromTask === toTask) {
291
+ return null;
292
+ }
293
+ // Check for cycles (for blocking dependencies)
294
+ if (depType === 'blocks' && this.wouldCreateCycle(fromTask, toTask)) {
295
+ return null;
296
+ }
297
+ const now = new Date().toISOString();
298
+ try {
299
+ const stmt = this.db.prepare(`
300
+ INSERT INTO task_dependencies (from_task, to_task, dep_type, created_at)
301
+ VALUES (?, ?, ?, ?)
302
+ `);
303
+ const result = stmt.run(fromTask, toTask, depType, now);
304
+ return {
305
+ id: result.lastInsertRowid,
306
+ fromTask,
307
+ toTask,
308
+ depType,
309
+ createdAt: now,
310
+ };
311
+ }
312
+ catch {
313
+ // Duplicate dependency
314
+ return null;
315
+ }
316
+ }
317
+ removeDependency(fromTask, toTask) {
318
+ const result = this.db.prepare(`
319
+ DELETE FROM task_dependencies WHERE from_task = ? AND to_task = ?
320
+ `).run(fromTask, toTask);
321
+ return result.changes > 0;
322
+ }
323
+ getDependencies(taskId) {
324
+ const stmt = this.db.prepare(`
325
+ SELECT id, from_task as fromTask, to_task as toTask, dep_type as depType, created_at as createdAt
326
+ FROM task_dependencies
327
+ WHERE from_task = ? OR to_task = ?
328
+ `);
329
+ return stmt.all(taskId, taskId);
330
+ }
331
+ getBlockers(taskId) {
332
+ const stmt = this.db.prepare(`
333
+ SELECT t.* FROM tasks t
334
+ JOIN task_dependencies d ON t.id = d.to_task
335
+ WHERE d.from_task = ? AND d.dep_type = 'blocks'
336
+ `);
337
+ const rows = stmt.all(taskId);
338
+ return rows.map(row => ({
339
+ ...row,
340
+ labels: row.labels ? JSON.parse(row.labels) : [],
341
+ }));
342
+ }
343
+ wouldCreateCycle(fromTask, toTask) {
344
+ // BFS to check if toTask can reach fromTask
345
+ const visited = new Set();
346
+ const queue = [toTask];
347
+ while (queue.length > 0) {
348
+ const current = queue.shift();
349
+ if (current === fromTask) {
350
+ return true; // Cycle detected
351
+ }
352
+ if (visited.has(current)) {
353
+ continue;
354
+ }
355
+ visited.add(current);
356
+ // Get tasks that current blocks
357
+ const stmt = this.db.prepare(`
358
+ SELECT to_task FROM task_dependencies
359
+ WHERE from_task = ? AND dep_type = 'blocks'
360
+ `);
361
+ const deps = stmt.all(current);
362
+ queue.push(...deps.map(d => d.to_task));
363
+ }
364
+ return false;
365
+ }
366
+ // ==================== History & Activity ====================
367
+ recordHistory(taskId, field, oldValue, newValue) {
368
+ const stmt = this.db.prepare(`
369
+ INSERT INTO task_history (task_id, field, old_value, new_value, changed_by, changed_at)
370
+ VALUES (?, ?, ?, ?, ?, ?)
371
+ `);
372
+ stmt.run(taskId, field, oldValue, newValue, this.agentId || null, new Date().toISOString());
373
+ }
374
+ recordActivity(taskId, activity, details) {
375
+ if (!this.agentId)
376
+ return;
377
+ const stmt = this.db.prepare(`
378
+ INSERT INTO task_activity (task_id, agent_id, activity, details, timestamp)
379
+ VALUES (?, ?, ?, ?, ?)
380
+ `);
381
+ stmt.run(taskId, this.agentId, activity, details || null, new Date().toISOString());
382
+ }
383
+ getHistory(taskId) {
384
+ const stmt = this.db.prepare(`
385
+ SELECT id, task_id as taskId, field, old_value as oldValue, new_value as newValue,
386
+ changed_by as changedBy, changed_at as changedAt
387
+ FROM task_history
388
+ WHERE task_id = ?
389
+ ORDER BY changed_at DESC
390
+ `);
391
+ return stmt.all(taskId);
392
+ }
393
+ getActivity(taskId) {
394
+ const stmt = this.db.prepare(`
395
+ SELECT id, task_id as taskId, agent_id as agentId, activity, details, timestamp
396
+ FROM task_activity
397
+ WHERE task_id = ?
398
+ ORDER BY timestamp DESC
399
+ `);
400
+ return stmt.all(taskId);
401
+ }
402
+ // ==================== Statistics ====================
403
+ getStats() {
404
+ const total = this.db.prepare('SELECT COUNT(*) as count FROM tasks').get().count;
405
+ const byStatus = {
406
+ open: 0, in_progress: 0, blocked: 0, done: 0, wont_do: 0
407
+ };
408
+ const statusRows = this.db.prepare('SELECT status, COUNT(*) as count FROM tasks GROUP BY status').all();
409
+ for (const row of statusRows) {
410
+ byStatus[row.status] = row.count;
411
+ }
412
+ const byType = {
413
+ task: 0, bug: 0, feature: 0, epic: 0, chore: 0, story: 0
414
+ };
415
+ const typeRows = this.db.prepare('SELECT type, COUNT(*) as count FROM tasks GROUP BY type').all();
416
+ for (const row of typeRows) {
417
+ byType[row.type] = row.count;
418
+ }
419
+ const byPriority = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0 };
420
+ const priorityRows = this.db.prepare('SELECT priority, COUNT(*) as count FROM tasks GROUP BY priority').all();
421
+ for (const row of priorityRows) {
422
+ byPriority[row.priority] = row.count;
423
+ }
424
+ const blocked = this.blocked().length;
425
+ const ready = this.ready().length;
426
+ return {
427
+ total,
428
+ byStatus,
429
+ byType,
430
+ byPriority,
431
+ blocked,
432
+ ready,
433
+ overdue: 0, // TODO: implement with due dates
434
+ };
435
+ }
436
+ // ==================== JSONL Sync ====================
437
+ exportToJSONL() {
438
+ const tasks = this.list({});
439
+ const lines = [];
440
+ for (const task of tasks) {
441
+ const deps = this.getDependencies(task.id)
442
+ .filter(d => d.fromTask === task.id)
443
+ .map(d => ({ toTask: d.toTask, depType: d.depType }));
444
+ const jsonl = {
445
+ id: task.id,
446
+ title: task.title,
447
+ description: task.description,
448
+ type: task.type,
449
+ status: task.status,
450
+ priority: task.priority,
451
+ assignee: task.assignee,
452
+ worktreeBranch: task.worktreeBranch,
453
+ labels: task.labels,
454
+ notes: task.notes,
455
+ parentId: task.parentId,
456
+ createdAt: task.createdAt,
457
+ updatedAt: task.updatedAt,
458
+ closedAt: task.closedAt,
459
+ closedReason: task.closedReason,
460
+ dependencies: deps,
461
+ };
462
+ lines.push(JSON.stringify(jsonl));
463
+ }
464
+ return lines.join('\n');
465
+ }
466
+ saveToJSONL() {
467
+ const dir = dirname(this.jsonlPath);
468
+ if (!existsSync(dir)) {
469
+ mkdirSync(dir, { recursive: true });
470
+ }
471
+ const content = this.exportToJSONL();
472
+ writeFileSync(this.jsonlPath, content);
473
+ }
474
+ importFromJSONL() {
475
+ if (!existsSync(this.jsonlPath)) {
476
+ return 0;
477
+ }
478
+ const content = readFileSync(this.jsonlPath, 'utf-8');
479
+ const lines = content.split('\n').filter(l => l.trim());
480
+ let imported = 0;
481
+ for (const line of lines) {
482
+ try {
483
+ const data = JSON.parse(line);
484
+ // Check if task exists
485
+ const existing = this.get(data.id);
486
+ if (existing) {
487
+ // Update if JSONL is newer
488
+ if (data.updatedAt > existing.updatedAt) {
489
+ this.db.prepare(`
490
+ UPDATE tasks SET title = ?, description = ?, type = ?, status = ?, priority = ?,
491
+ assignee = ?, worktree_branch = ?, labels = ?, notes = ?, parent_id = ?,
492
+ updated_at = ?, closed_at = ?, closed_reason = ?
493
+ WHERE id = ?
494
+ `).run(data.title, data.description || null, data.type, data.status, data.priority, data.assignee || null, data.worktreeBranch || null, JSON.stringify(data.labels), data.notes || null, data.parentId || null, data.updatedAt, data.closedAt || null, data.closedReason || null, data.id);
495
+ }
496
+ }
497
+ else {
498
+ // Insert new task
499
+ this.db.prepare(`
500
+ INSERT INTO tasks (id, title, description, type, status, priority, assignee,
501
+ worktree_branch, labels, notes, parent_id, created_at, updated_at, closed_at, closed_reason)
502
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
503
+ `).run(data.id, data.title, data.description || null, data.type, data.status, data.priority, data.assignee || null, data.worktreeBranch || null, JSON.stringify(data.labels), data.notes || null, data.parentId || null, data.createdAt, data.updatedAt, data.closedAt || null, data.closedReason || null);
504
+ imported++;
505
+ }
506
+ // Sync dependencies
507
+ for (const dep of data.dependencies || []) {
508
+ this.addDependency(data.id, dep.toTask, dep.depType);
509
+ }
510
+ }
511
+ catch {
512
+ // Skip invalid lines
513
+ }
514
+ }
515
+ return imported;
516
+ }
517
+ // ==================== Compaction ====================
518
+ compact(olderThanDays = 90) {
519
+ const cutoff = new Date(Date.now() - olderThanDays * 86400000).toISOString();
520
+ // Find old closed tasks
521
+ const stmt = this.db.prepare(`
522
+ SELECT id, title, type, labels, closed_at as closedAt
523
+ FROM tasks
524
+ WHERE status IN ('done', 'wont_do') AND closed_at < ?
525
+ ORDER BY closed_at ASC
526
+ `);
527
+ const oldTasks = stmt.all(cutoff);
528
+ if (oldTasks.length === 0) {
529
+ return null;
530
+ }
531
+ // Group by quarter
532
+ const quarters = new Map();
533
+ for (const task of oldTasks) {
534
+ const date = new Date(task.closedAt);
535
+ const quarter = `${date.getFullYear()}-Q${Math.floor(date.getMonth() / 3) + 1}`;
536
+ const existing = quarters.get(quarter) || [];
537
+ existing.push(task);
538
+ quarters.set(quarter, existing);
539
+ }
540
+ // Create summaries
541
+ const summaries = [];
542
+ for (const [period, tasks] of quarters) {
543
+ const allLabels = new Set();
544
+ for (const task of tasks) {
545
+ const labels = task.labels ? JSON.parse(task.labels) : [];
546
+ labels.forEach(l => allLabels.add(l));
547
+ }
548
+ const summary = `Completed ${tasks.length} tasks: ${tasks.slice(0, 5).map(t => t.title).join(', ')}${tasks.length > 5 ? '...' : ''}`;
549
+ const insertStmt = this.db.prepare(`
550
+ INSERT INTO task_summaries (original_ids, summary, labels, closed_period, created_at)
551
+ VALUES (?, ?, ?, ?, ?)
552
+ `);
553
+ const result = insertStmt.run(JSON.stringify(tasks.map(t => t.id)), summary, JSON.stringify([...allLabels]), period, new Date().toISOString());
554
+ summaries.push({
555
+ id: result.lastInsertRowid,
556
+ originalIds: tasks.map(t => t.id),
557
+ summary,
558
+ labels: [...allLabels],
559
+ closedPeriod: period,
560
+ createdAt: new Date().toISOString(),
561
+ });
562
+ // Delete compacted tasks
563
+ const ids = tasks.map(t => t.id);
564
+ this.db.prepare(`DELETE FROM tasks WHERE id IN (${ids.map(() => '?').join(',')})`).run(...ids);
565
+ }
566
+ return summaries[0] || null;
567
+ }
568
+ getSummaries() {
569
+ const stmt = this.db.prepare(`
570
+ SELECT id, original_ids as originalIds, summary, labels, closed_period as closedPeriod, created_at as createdAt
571
+ FROM task_summaries
572
+ ORDER BY closed_period DESC
573
+ `);
574
+ const rows = stmt.all();
575
+ return rows.map(row => ({
576
+ ...row,
577
+ originalIds: JSON.parse(row.originalIds),
578
+ labels: row.labels ? JSON.parse(row.labels) : [],
579
+ }));
580
+ }
581
+ }
582
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tasks/service.ts"],"names":[],"mappings":"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"}