fivocell 4.5.0 → 4.6.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 (37) hide show
  1. package/dist/__tests__/context-ranker.test.d.ts +2 -0
  2. package/dist/__tests__/context-ranker.test.d.ts.map +1 -0
  3. package/dist/__tests__/context-ranker.test.js +61 -0
  4. package/dist/__tests__/context-ranker.test.js.map +1 -0
  5. package/dist/__tests__/memory-compact.test.d.ts +2 -0
  6. package/dist/__tests__/memory-compact.test.d.ts.map +1 -0
  7. package/dist/__tests__/memory-compact.test.js +43 -0
  8. package/dist/__tests__/memory-compact.test.js.map +1 -0
  9. package/dist/__tests__/summary-generator.test.d.ts +2 -0
  10. package/dist/__tests__/summary-generator.test.d.ts.map +1 -0
  11. package/dist/__tests__/summary-generator.test.js +53 -0
  12. package/dist/__tests__/summary-generator.test.js.map +1 -0
  13. package/dist/walls/01-context/context/prompt-builder.d.ts +7 -0
  14. package/dist/walls/01-context/context/prompt-builder.d.ts.map +1 -1
  15. package/dist/walls/01-context/context/prompt-builder.js +29 -0
  16. package/dist/walls/01-context/context/prompt-builder.js.map +1 -1
  17. package/dist/walls/06-memory/archive/memory-compact.d.ts +17 -0
  18. package/dist/walls/06-memory/archive/memory-compact.d.ts.map +1 -0
  19. package/dist/walls/06-memory/archive/memory-compact.js +128 -0
  20. package/dist/walls/06-memory/archive/memory-compact.js.map +1 -0
  21. package/dist/walls/06-memory/stores/context-ranker.d.ts +21 -0
  22. package/dist/walls/06-memory/stores/context-ranker.d.ts.map +1 -0
  23. package/dist/walls/06-memory/stores/context-ranker.js +84 -0
  24. package/dist/walls/06-memory/stores/context-ranker.js.map +1 -0
  25. package/dist/walls/06-memory/stores/summary-generator.d.ts +16 -0
  26. package/dist/walls/06-memory/stores/summary-generator.d.ts.map +1 -0
  27. package/dist/walls/06-memory/stores/summary-generator.js +151 -0
  28. package/dist/walls/06-memory/stores/summary-generator.js.map +1 -0
  29. package/dist/walls/07-runtime/cli/cli.js +59 -0
  30. package/dist/walls/07-runtime/cli/cli.js.map +1 -1
  31. package/dist/walls/07-runtime/daemon/server.d.ts.map +1 -1
  32. package/dist/walls/07-runtime/daemon/server.js +99 -0
  33. package/dist/walls/07-runtime/daemon/server.js.map +1 -1
  34. package/dist/walls/07-runtime/watcher/live-watcher.d.ts.map +1 -1
  35. package/dist/walls/07-runtime/watcher/live-watcher.js +32 -0
  36. package/dist/walls/07-runtime/watcher/live-watcher.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.compactMemoryEvents = compactMemoryEvents;
37
+ exports.compactArchiveChunks = compactArchiveChunks;
38
+ exports.getMemoryHealth = getMemoryHealth;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const database_1 = require("../database/database");
42
+ function compactMemoryEvents(olderThanDays = 90) {
43
+ const db = (0, database_1.getDb)();
44
+ const cutoff = new Date(Date.now() - olderThanDays * 86400000).toISOString();
45
+ const result = db.prepare('DELETE FROM memory_events WHERE created_at < ? AND importance < 5').run(cutoff);
46
+ return result.changes;
47
+ }
48
+ function compactArchiveChunks(projectDir, olderThanDays = 90) {
49
+ const archiveDir = path.join(projectDir, '.cell', 'memory', 'archive');
50
+ if (!fs.existsSync(archiveDir)) {
51
+ return { mergedChunks: 0, deletedChunks: 0, keptChunks: 0, totalRecords: 0 };
52
+ }
53
+ const cutoff = Date.now() - olderThanDays * 86400000;
54
+ let mergedChunks = 0;
55
+ let deletedChunks = 0;
56
+ let keptChunks = 0;
57
+ let totalRecords = 0;
58
+ function walk(dir) {
59
+ if (!fs.existsSync(dir))
60
+ return;
61
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
62
+ const full = path.join(dir, entry.name);
63
+ if (entry.isDirectory()) {
64
+ walk(full);
65
+ continue;
66
+ }
67
+ if (entry.name.endsWith('.meta.json')) {
68
+ try {
69
+ const meta = JSON.parse(fs.readFileSync(full, 'utf-8'));
70
+ const chunkDate = new Date(meta.createdAt).getTime();
71
+ if (chunkDate < cutoff && meta.records <= 10) {
72
+ fs.unlinkSync(full);
73
+ const encPath = full.replace('.meta.json', '');
74
+ if (fs.existsSync(encPath))
75
+ fs.unlinkSync(encPath);
76
+ deletedChunks++;
77
+ }
78
+ else {
79
+ keptChunks++;
80
+ totalRecords += meta.records || 0;
81
+ }
82
+ }
83
+ catch { /* skip corrupted */ }
84
+ }
85
+ }
86
+ }
87
+ walk(archiveDir);
88
+ return { mergedChunks, deletedChunks, keptChunks, totalRecords };
89
+ }
90
+ function getMemoryHealth(projectDir) {
91
+ const db = (0, database_1.getDb)();
92
+ const totalRow = db.prepare('SELECT COUNT(*) as c FROM memory_events').get();
93
+ const oldestRow = db.prepare('SELECT MIN(created_at) as o FROM memory_events').get();
94
+ const newestRow = db.prepare('SELECT MAX(created_at) as n FROM memory_events').get();
95
+ const avgRow = db.prepare('SELECT AVG(importance) as a FROM memory_events').get();
96
+ const archiveDir = path.join(projectDir, '.cell', 'memory', 'archive');
97
+ let archiveChunks = 0;
98
+ if (fs.existsSync(archiveDir)) {
99
+ function countChunks(dir) {
100
+ if (!fs.existsSync(dir))
101
+ return;
102
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
103
+ const full = path.join(dir, entry.name);
104
+ if (entry.isDirectory()) {
105
+ countChunks(full);
106
+ continue;
107
+ }
108
+ if (entry.name.endsWith('.meta.json'))
109
+ archiveChunks++;
110
+ }
111
+ }
112
+ countChunks(archiveDir);
113
+ }
114
+ const currentPath = path.join(projectDir, '.cell', 'handoff', 'current.md');
115
+ let handoffLines = 0;
116
+ if (fs.existsSync(currentPath)) {
117
+ handoffLines = fs.readFileSync(currentPath, 'utf-8').split('\n').length;
118
+ }
119
+ return {
120
+ eventCount: totalRow.c,
121
+ archiveChunks,
122
+ handoffLines,
123
+ oldestEvent: oldestRow.o,
124
+ newestEvent: newestRow.n,
125
+ avgImportance: Math.round((avgRow.a || 0) * 10) / 10,
126
+ };
127
+ }
128
+ //# sourceMappingURL=memory-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-compact.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/archive/memory-compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface RankedMemory {
2
+ id: number;
3
+ type: string;
4
+ topic: string | null;
5
+ summary: string;
6
+ importance: number;
7
+ relevance: number;
8
+ created_at: string;
9
+ files_json: string | null;
10
+ }
11
+ export interface RankOptions {
12
+ project?: string;
13
+ query?: string;
14
+ topic?: string;
15
+ maxResults?: number;
16
+ minImportance?: number;
17
+ maxAgeDays?: number;
18
+ }
19
+ export declare function rankMemories(opts?: RankOptions): RankedMemory[];
20
+ export declare function getTopMemoriesForContext(project: string, maxWords?: number): RankedMemory[];
21
+ //# sourceMappingURL=context-ranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-ranker.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/context-ranker.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,YAAY,EAAE,CAmCnE;AAoCD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,GAAG,YAAY,EAAE,CAajG"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rankMemories = rankMemories;
4
+ exports.getTopMemoriesForContext = getTopMemoriesForContext;
5
+ const database_1 = require("../database/database");
6
+ function rankMemories(opts = {}) {
7
+ const db = (0, database_1.getDb)();
8
+ const conditions = [];
9
+ const params = [];
10
+ if (opts.project) {
11
+ conditions.push('project = ?');
12
+ params.push(opts.project);
13
+ }
14
+ if (opts.minImportance !== undefined) {
15
+ conditions.push('importance >= ?');
16
+ params.push(opts.minImportance);
17
+ }
18
+ if (opts.maxAgeDays) {
19
+ const since = new Date(Date.now() - opts.maxAgeDays * 86400000).toISOString();
20
+ conditions.push('created_at >= ?');
21
+ params.push(since);
22
+ }
23
+ if (opts.topic) {
24
+ conditions.push('topic LIKE ?');
25
+ params.push(`%${opts.topic}%`);
26
+ }
27
+ if (opts.query) {
28
+ conditions.push('(summary LIKE ? OR topic LIKE ? OR details_json LIKE ? OR tags_json LIKE ?)');
29
+ const q = `%${opts.query}%`;
30
+ params.push(q, q, q, q);
31
+ }
32
+ const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
33
+ const limit = opts.maxResults || 20;
34
+ const rows = db.prepare(`SELECT id, type, topic, summary, importance, created_at, files_json
35
+ FROM memory_events ${where}
36
+ ORDER BY importance DESC, created_at DESC
37
+ LIMIT ?`).all(...params, limit);
38
+ return rows.map(r => ({
39
+ ...r,
40
+ relevance: calculateRelevance(r, opts),
41
+ })).sort((a, b) => b.relevance - a.relevance);
42
+ }
43
+ function calculateRelevance(row, opts) {
44
+ let score = row.importance * 10;
45
+ // Recency boost (newer = higher)
46
+ const ageMs = Date.now() - new Date(row.created_at).getTime();
47
+ const ageDays = ageMs / 86400000;
48
+ if (ageDays < 1)
49
+ score += 30;
50
+ else if (ageDays < 7)
51
+ score += 20;
52
+ else if (ageDays < 30)
53
+ score += 10;
54
+ // Type boost
55
+ const typeBoost = {
56
+ decision: 25, error: 20, fix: 22, publish: 18, handoff: 15,
57
+ pattern: 24, style: 20, risk: 19, question: 12, ai_work: 14,
58
+ session: 10, branch: 8, edit: 5, verification: 8, file_event: 2,
59
+ };
60
+ score += typeBoost[row.type] || 0;
61
+ // Topic match boost
62
+ if (opts.topic && row.topic && row.topic.toLowerCase().includes(opts.topic.toLowerCase())) {
63
+ score += 40;
64
+ }
65
+ // Query match boost
66
+ if (opts.query && row.summary.toLowerCase().includes(opts.query.toLowerCase())) {
67
+ score += 35;
68
+ }
69
+ return Math.round(score);
70
+ }
71
+ function getTopMemoriesForContext(project, maxWords = 2000) {
72
+ const memories = rankMemories({ project, maxResults: 50, minImportance: 3 });
73
+ const result = [];
74
+ let wordCount = 0;
75
+ for (const mem of memories) {
76
+ const summaryWords = mem.summary.split(/\s+/).length;
77
+ if (wordCount + summaryWords > maxWords)
78
+ break;
79
+ result.push(mem);
80
+ wordCount += summaryWords;
81
+ }
82
+ return result;
83
+ }
84
+ //# sourceMappingURL=context-ranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-ranker.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/context-ranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface DailySummary {
2
+ date: string;
3
+ project: string;
4
+ totalEvents: number;
5
+ byType: Record<string, number>;
6
+ topTopics: string[];
7
+ keyDecisions: string[];
8
+ errors: string[];
9
+ filesChanged: string[];
10
+ importance: number;
11
+ }
12
+ export declare function generateDailySummary(project: string, date?: string): DailySummary;
13
+ export declare function saveDailySummary(project: string, projectDir: string, date?: string): string;
14
+ export declare function generateWeeklySummary(project: string, projectDir: string): DailySummary;
15
+ export declare function saveWeeklySummary(project: string, projectDir: string): string;
16
+ //# sourceMappingURL=summary-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-generator.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/summary-generator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAoDjF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAgDvF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ7E"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateDailySummary = generateDailySummary;
37
+ exports.saveDailySummary = saveDailySummary;
38
+ exports.generateWeeklySummary = generateWeeklySummary;
39
+ exports.saveWeeklySummary = saveWeeklySummary;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const database_1 = require("../database/database");
43
+ function generateDailySummary(project, date) {
44
+ const targetDate = date || new Date().toISOString().slice(0, 10);
45
+ const db = (0, database_1.getDb)();
46
+ const rows = db.prepare(`SELECT type, topic, summary, importance, files_json FROM memory_events
47
+ WHERE project = ? AND date(created_at) = date(?)
48
+ ORDER BY importance DESC`).all(project, targetDate);
49
+ const byType = {};
50
+ const topicCounts = {};
51
+ const keyDecisions = [];
52
+ const errors = [];
53
+ const filesSet = new Set();
54
+ let totalImportance = 0;
55
+ for (const row of rows) {
56
+ byType[row.type] = (byType[row.type] || 0) + 1;
57
+ if (row.topic)
58
+ topicCounts[row.topic] = (topicCounts[row.topic] || 0) + 1;
59
+ totalImportance += row.importance;
60
+ if (row.type === 'decision')
61
+ keyDecisions.push(row.summary);
62
+ if (row.type === 'error')
63
+ errors.push(row.summary);
64
+ if (row.files_json) {
65
+ try {
66
+ const files = JSON.parse(row.files_json);
67
+ files.forEach(f => filesSet.add(f));
68
+ }
69
+ catch { }
70
+ }
71
+ }
72
+ const topTopics = Object.entries(topicCounts)
73
+ .sort((a, b) => b[1] - a[1])
74
+ .slice(0, 5)
75
+ .map(([t]) => t);
76
+ return {
77
+ date: targetDate,
78
+ project,
79
+ totalEvents: rows.length,
80
+ byType,
81
+ topTopics,
82
+ keyDecisions,
83
+ errors,
84
+ filesChanged: Array.from(filesSet).slice(0, 20),
85
+ importance: rows.length > 0 ? Math.round(totalImportance / rows.length * 10) / 10 : 0,
86
+ };
87
+ }
88
+ function saveDailySummary(project, projectDir, date) {
89
+ const summary = generateDailySummary(project, date);
90
+ const summaryDir = path.join(projectDir, '.cell', 'memory', 'summaries', 'daily');
91
+ if (!fs.existsSync(summaryDir))
92
+ fs.mkdirSync(summaryDir, { recursive: true });
93
+ const filePath = path.join(summaryDir, `${summary.date}.json`);
94
+ fs.writeFileSync(filePath, JSON.stringify(summary, null, 2));
95
+ return filePath;
96
+ }
97
+ function generateWeeklySummary(project, projectDir) {
98
+ const db = (0, database_1.getDb)();
99
+ const end = new Date();
100
+ const start = new Date(end.getTime() - 7 * 86400000);
101
+ const rows = db.prepare(`SELECT type, topic, summary, importance, files_json, created_at FROM memory_events
102
+ WHERE project = ? AND date(created_at) >= date(?)
103
+ ORDER BY importance DESC`).all(project, start.toISOString().slice(0, 10));
104
+ const byType = {};
105
+ const topicCounts = {};
106
+ const keyDecisions = [];
107
+ const errors = [];
108
+ const filesSet = new Set();
109
+ let totalImportance = 0;
110
+ for (const row of rows) {
111
+ byType[row.type] = (byType[row.type] || 0) + 1;
112
+ if (row.topic)
113
+ topicCounts[row.topic] = (topicCounts[row.topic] || 0) + 1;
114
+ totalImportance += row.importance;
115
+ if (row.type === 'decision')
116
+ keyDecisions.push(row.summary);
117
+ if (row.type === 'error')
118
+ errors.push(row.summary);
119
+ if (row.files_json) {
120
+ try {
121
+ JSON.parse(row.files_json).forEach(f => filesSet.add(f));
122
+ }
123
+ catch { }
124
+ }
125
+ }
126
+ const topTopics = Object.entries(topicCounts)
127
+ .sort((a, b) => b[1] - a[1])
128
+ .slice(0, 10)
129
+ .map(([t]) => t);
130
+ return {
131
+ date: `${start.toISOString().slice(0, 10)}_to_${end.toISOString().slice(0, 10)}`,
132
+ project,
133
+ totalEvents: rows.length,
134
+ byType,
135
+ topTopics,
136
+ keyDecisions: keyDecisions.slice(0, 10),
137
+ errors: errors.slice(0, 10),
138
+ filesChanged: Array.from(filesSet).slice(0, 50),
139
+ importance: rows.length > 0 ? Math.round(totalImportance / rows.length * 10) / 10 : 0,
140
+ };
141
+ }
142
+ function saveWeeklySummary(project, projectDir) {
143
+ const summary = generateWeeklySummary(project, projectDir);
144
+ const summaryDir = path.join(projectDir, '.cell', 'memory', 'summaries', 'weekly');
145
+ if (!fs.existsSync(summaryDir))
146
+ fs.mkdirSync(summaryDir, { recursive: true });
147
+ const filePath = path.join(summaryDir, `${summary.date}.json`);
148
+ fs.writeFileSync(filePath, JSON.stringify(summary, null, 2));
149
+ return filePath;
150
+ }
151
+ //# sourceMappingURL=summary-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-generator.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/summary-generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,oDAoDC;AAED,4CAQC;AAED,sDAgDC;AAED,8CAQC;AA1ID,uCAAyB;AACzB,2CAA6B;AAC7B,mDAA6C;AAc7C,SAAgB,oBAAoB,CAAC,OAAe,EAAE,IAAa;IACjE,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;8BAE0B,CAC3B,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAGvB,CAAC;IAEH,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,KAAK;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC;QAElC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU;YAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAa,CAAC;gBACrD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,MAAM;QACN,SAAS;QACT,YAAY;QACZ,MAAM;QACN,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe,EAAE,UAAkB,EAAE,IAAa;IACjF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAClF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAe,EAAE,UAAkB;IACvE,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;IACnB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;8BAE0B,CAC3B,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAG7C,CAAC;IAEH,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,KAAK;YAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU;YAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,IAAI,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QAChF,OAAO;QACP,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,MAAM;QACN,SAAS;QACT,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAe,EAAE,UAAkB;IACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;IAC/D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -3523,12 +3523,71 @@ function doMemory() {
3523
3523
  console.log();
3524
3524
  return;
3525
3525
  }
3526
+ if (sub === 'health') {
3527
+ console.log(C.bold(' ── Memory Health ──\n'));
3528
+ try {
3529
+ const { getMemoryHealth } = require('../../06-memory/archive/memory-compact');
3530
+ const h = getMemoryHealth(cwd);
3531
+ console.log(` Events: ${C.num(String(h.eventCount))}`);
3532
+ console.log(` Archive chunks: ${h.archiveChunks}`);
3533
+ console.log(` Handoff lines: ${h.handoffLines}`);
3534
+ console.log(` Avg importance: ${h.avgImportance}`);
3535
+ console.log(` Oldest: ${h.oldestEvent || 'none'}`);
3536
+ console.log(` Newest: ${h.newestEvent || 'none'}`);
3537
+ }
3538
+ catch (e) {
3539
+ console.log(C.warn(` Health check failed: ${e?.message || String(e)}`));
3540
+ }
3541
+ console.log();
3542
+ return;
3543
+ }
3544
+ if (sub === 'summary' || sub === 'sum') {
3545
+ const period = args[2] || 'daily';
3546
+ console.log(C.bold(` ── Memory Summary (${period}) ──\n`));
3547
+ try {
3548
+ const { generateDailySummary, generateWeeklySummary } = require('../../06-memory/stores/summary-generator');
3549
+ const { detectProject } = require('../setup/setup');
3550
+ const project = detectProject(cwd).name;
3551
+ const summary = period === 'weekly'
3552
+ ? generateWeeklySummary(project, cwd)
3553
+ : generateDailySummary(project);
3554
+ console.log(` Date: ${summary.date}`);
3555
+ console.log(` Project: ${summary.project}`);
3556
+ console.log(` Total events: ${summary.totalEvents}`);
3557
+ console.log(` Avg importance: ${summary.importance}`);
3558
+ if (summary.topTopics.length > 0)
3559
+ console.log(` Top topics: ${summary.topTopics.join(', ')}`);
3560
+ if (summary.keyDecisions.length > 0) {
3561
+ console.log(C.dim('\n Key decisions:'));
3562
+ for (const d of summary.keyDecisions.slice(0, 5))
3563
+ console.log(` ${C.primary('→')} ${d}`);
3564
+ }
3565
+ if (summary.errors.length > 0) {
3566
+ console.log(C.dim('\n Errors:'));
3567
+ for (const e of summary.errors.slice(0, 5))
3568
+ console.log(` ${C.warn('✗')} ${e}`);
3569
+ }
3570
+ if (Object.keys(summary.byType).length > 0) {
3571
+ console.log(C.dim('\n By type:'));
3572
+ for (const [type, count] of Object.entries(summary.byType).sort((a, b) => b[1] - a[1])) {
3573
+ console.log(` ${type}: ${count}`);
3574
+ }
3575
+ }
3576
+ }
3577
+ catch (e) {
3578
+ console.log(C.warn(` Summary failed: ${e?.message || String(e)}`));
3579
+ }
3580
+ console.log();
3581
+ return;
3582
+ }
3526
3583
  console.log(C.bold(' Cell Memory'));
3527
3584
  console.log(C.dim(' ──────────'));
3528
3585
  console.log(C.dim(' cell memory search <query> Search memory events'));
3529
3586
  console.log(C.dim(' cell memory timeline [days] Show activity timeline'));
3530
3587
  console.log(C.dim(' cell memory compact Compact & rotate'));
3531
3588
  console.log(C.dim(' cell memory verify Verify memory health'));
3589
+ console.log(C.dim(' cell memory health Full memory health check'));
3590
+ console.log(C.dim(' cell memory summary [daily|weekly] Generate summary'));
3532
3591
  console.log(C.dim(' cell memory export Export to JSON'));
3533
3592
  console.log(C.dim(' cell memory stats Show memory stats'));
3534
3593
  console.log();