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.
- package/dist/__tests__/context-ranker.test.d.ts +2 -0
- package/dist/__tests__/context-ranker.test.d.ts.map +1 -0
- package/dist/__tests__/context-ranker.test.js +61 -0
- package/dist/__tests__/context-ranker.test.js.map +1 -0
- package/dist/__tests__/memory-compact.test.d.ts +2 -0
- package/dist/__tests__/memory-compact.test.d.ts.map +1 -0
- package/dist/__tests__/memory-compact.test.js +43 -0
- package/dist/__tests__/memory-compact.test.js.map +1 -0
- package/dist/__tests__/summary-generator.test.d.ts +2 -0
- package/dist/__tests__/summary-generator.test.d.ts.map +1 -0
- package/dist/__tests__/summary-generator.test.js +53 -0
- package/dist/__tests__/summary-generator.test.js.map +1 -0
- package/dist/walls/01-context/context/prompt-builder.d.ts +7 -0
- package/dist/walls/01-context/context/prompt-builder.d.ts.map +1 -1
- package/dist/walls/01-context/context/prompt-builder.js +29 -0
- package/dist/walls/01-context/context/prompt-builder.js.map +1 -1
- package/dist/walls/06-memory/archive/memory-compact.d.ts +17 -0
- package/dist/walls/06-memory/archive/memory-compact.d.ts.map +1 -0
- package/dist/walls/06-memory/archive/memory-compact.js +128 -0
- package/dist/walls/06-memory/archive/memory-compact.js.map +1 -0
- package/dist/walls/06-memory/stores/context-ranker.d.ts +21 -0
- package/dist/walls/06-memory/stores/context-ranker.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/context-ranker.js +84 -0
- package/dist/walls/06-memory/stores/context-ranker.js.map +1 -0
- package/dist/walls/06-memory/stores/summary-generator.d.ts +16 -0
- package/dist/walls/06-memory/stores/summary-generator.d.ts.map +1 -0
- package/dist/walls/06-memory/stores/summary-generator.js +151 -0
- package/dist/walls/06-memory/stores/summary-generator.js.map +1 -0
- package/dist/walls/07-runtime/cli/cli.js +59 -0
- package/dist/walls/07-runtime/cli/cli.js.map +1 -1
- package/dist/walls/07-runtime/daemon/server.d.ts.map +1 -1
- package/dist/walls/07-runtime/daemon/server.js +99 -0
- package/dist/walls/07-runtime/daemon/server.js.map +1 -1
- package/dist/walls/07-runtime/watcher/live-watcher.d.ts.map +1 -1
- package/dist/walls/07-runtime/watcher/live-watcher.js +32 -0
- package/dist/walls/07-runtime/watcher/live-watcher.js.map +1 -1
- 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":"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"}
|
|
@@ -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();
|