fivocell 5.1.0 → 5.3.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.
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportCIBuild = reportCIBuild;
4
+ exports.reportCITest = reportCITest;
5
+ exports.reportCIDeploy = reportCIDeploy;
6
+ exports.getCISummary = getCISummary;
7
+ exports.detectCIFailurePatterns = detectCIFailurePatterns;
8
+ exports.getBuildTrend = getBuildTrend;
9
+ exports.formatCISummary = formatCISummary;
10
+ const database_1 = require("../database/database");
11
+ const memory_event_store_1 = require("../stores/memory-event-store");
12
+ function reportCIBuild(result) {
13
+ const topic = result.status === 'failure' ? 'ci-build-failed' : 'ci-build';
14
+ const type = result.status === 'failure' ? 'error' : 'verification';
15
+ const importance = result.status === 'failure' ? 7 : 5;
16
+ const summary = `Build ${result.status}: ${result.stage} [${result.ciPlatform}] ${result.commitHash.slice(0, 8)}`;
17
+ const event = {
18
+ project: result.project,
19
+ branch: result.branch,
20
+ type,
21
+ topic,
22
+ summary,
23
+ details: {
24
+ buildId: result.buildId,
25
+ status: result.status,
26
+ duration: result.duration,
27
+ stage: result.stage,
28
+ commitHash: result.commitHash,
29
+ commitMessage: result.commitMessage,
30
+ author: result.author,
31
+ ciPlatform: result.ciPlatform,
32
+ logSnippet: result.logSnippet,
33
+ source: 'ci-reporter',
34
+ },
35
+ files: [],
36
+ importance,
37
+ tool: 'cell-ci',
38
+ };
39
+ return (0, memory_event_store_1.recordMemoryEvent)(event);
40
+ }
41
+ function reportCITest(result) {
42
+ const allPassed = result.failed === 0;
43
+ const type = allPassed ? 'verification' : 'error';
44
+ const topic = allPassed ? 'ci-test-passed' : 'ci-test-failed';
45
+ const importance = result.failed > 0 ? 7 : 4;
46
+ const summary = `Tests: ${result.passed}/${result.totalTests} passed` +
47
+ (result.failed > 0 ? `, ${result.failed} failed` : '') +
48
+ (result.skipped > 0 ? `, ${result.skipped} skipped` : '') +
49
+ (result.coverage !== undefined ? ` (${result.coverage}% coverage)` : '');
50
+ const event = {
51
+ project: result.project,
52
+ branch: result.branch,
53
+ type,
54
+ topic,
55
+ summary,
56
+ details: {
57
+ buildId: result.buildId,
58
+ totalTests: result.totalTests,
59
+ passed: result.passed,
60
+ failed: result.failed,
61
+ skipped: result.skipped,
62
+ duration: result.duration,
63
+ failedTests: result.failedTests,
64
+ coverage: result.coverage,
65
+ source: 'ci-reporter',
66
+ },
67
+ files: [],
68
+ importance,
69
+ tool: 'cell-ci',
70
+ };
71
+ return (0, memory_event_store_1.recordMemoryEvent)(event);
72
+ }
73
+ function reportCIDeploy(result) {
74
+ const type = result.status === 'success' ? 'publish' : 'error';
75
+ const topic = result.status === 'success' ? 'ci-deploy' : 'ci-deploy-failed';
76
+ const importance = result.status === 'failed' ? 8 : 6;
77
+ const summary = `Deploy ${result.status}: ${result.version} → ${result.environment}` +
78
+ (result.status === 'rolled_back' ? ' (rolled back)' : '');
79
+ const event = {
80
+ project: result.project,
81
+ branch: '',
82
+ type,
83
+ topic,
84
+ summary,
85
+ details: {
86
+ environment: result.environment,
87
+ status: result.status,
88
+ version: result.version,
89
+ duration: result.duration,
90
+ source: 'ci-reporter',
91
+ },
92
+ files: [],
93
+ importance,
94
+ tool: 'cell-ci',
95
+ };
96
+ return (0, memory_event_store_1.recordMemoryEvent)(event);
97
+ }
98
+ function getCISummary(project, days = 30) {
99
+ const db = (0, database_1.getDb)();
100
+ const since = new Date(Date.now() - days * 86400000).toISOString();
101
+ const builds = db.prepare(`
102
+ SELECT details_json, type FROM memory_events
103
+ WHERE project = ? AND topic LIKE 'ci-build%' AND created_at >= ?
104
+ `).all(project, since);
105
+ const tests = db.prepare(`
106
+ SELECT details_json, type FROM memory_events
107
+ WHERE project = ? AND topic LIKE 'ci-test%' AND created_at >= ?
108
+ `).all(project, since);
109
+ const deploys = db.prepare(`
110
+ SELECT details_json, type FROM memory_events
111
+ WHERE project = ? AND topic LIKE 'ci-deploy%' AND created_at >= ?
112
+ `).all(project, since);
113
+ // Build stats
114
+ let totalBuilds = builds.length;
115
+ let successfulBuilds = 0;
116
+ let totalDuration = 0;
117
+ for (const b of builds) {
118
+ try {
119
+ const d = JSON.parse(b.details_json);
120
+ if (d.status === 'success')
121
+ successfulBuilds++;
122
+ totalDuration += d.duration || 0;
123
+ }
124
+ catch { }
125
+ }
126
+ // Test stats
127
+ let totalTests = 0;
128
+ let totalPassed = 0;
129
+ for (const t of tests) {
130
+ try {
131
+ const d = JSON.parse(t.details_json);
132
+ totalTests += d.totalTests || 0;
133
+ totalPassed += d.passed || 0;
134
+ }
135
+ catch { }
136
+ }
137
+ // Deploy stats
138
+ let totalDeploys = deploys.length;
139
+ let successfulDeploys = 0;
140
+ for (const d of deploys) {
141
+ try {
142
+ const details = JSON.parse(d.details_json);
143
+ if (details.status === 'success')
144
+ successfulDeploys++;
145
+ }
146
+ catch { }
147
+ }
148
+ const successRate = totalBuilds > 0 ? Math.round(successfulBuilds / totalBuilds * 100) : 0;
149
+ const testPassRate = totalTests > 0 ? Math.round(totalPassed / totalTests * 100) : 0;
150
+ const deploySuccessRate = totalDeploys > 0 ? Math.round(successfulDeploys / totalDeploys * 100) : 0;
151
+ const avgBuildDuration = totalBuilds > 0 ? Math.round(totalDuration / totalBuilds) : 0;
152
+ const failurePatterns = detectCIFailurePatterns(project, days);
153
+ return {
154
+ totalBuilds,
155
+ successRate,
156
+ avgBuildDuration,
157
+ totalTests,
158
+ testPassRate,
159
+ deployments: totalDeploys,
160
+ deploySuccessRate,
161
+ failurePatterns,
162
+ };
163
+ }
164
+ function detectCIFailurePatterns(project, days = 30) {
165
+ const db = (0, database_1.getDb)();
166
+ const since = new Date(Date.now() - days * 86400000).toISOString();
167
+ const failures = db.prepare(`
168
+ SELECT summary, branch, created_at FROM memory_events
169
+ WHERE project = ? AND type = 'error' AND (topic LIKE 'ci-%')
170
+ AND created_at >= ? ORDER BY created_at
171
+ `).all(project, since);
172
+ if (failures.length === 0)
173
+ return [];
174
+ // Group by summary pattern
175
+ const patternMap = new Map();
176
+ for (const f of failures) {
177
+ // Normalize: remove commit hashes, IDs, timestamps
178
+ const pattern = f.summary
179
+ .replace(/\[[a-f0-9]{8}\]/g, '[hash]')
180
+ .replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/g, '[time]')
181
+ .replace(/run[_-]?\d+/gi, '[run]')
182
+ .slice(0, 100);
183
+ const existing = patternMap.get(pattern) || {
184
+ count: 0,
185
+ firstSeen: f.created_at,
186
+ lastSeen: f.created_at,
187
+ branches: new Set(),
188
+ };
189
+ existing.count++;
190
+ if (f.created_at < existing.firstSeen)
191
+ existing.firstSeen = f.created_at;
192
+ if (f.created_at > existing.lastSeen)
193
+ existing.lastSeen = f.created_at;
194
+ existing.branches.add(f.branch);
195
+ patternMap.set(pattern, existing);
196
+ }
197
+ const patterns = [];
198
+ for (const [pattern, data] of patternMap) {
199
+ if (data.count < 2)
200
+ continue; // Only report patterns with 2+ occurrences
201
+ patterns.push({
202
+ pattern,
203
+ count: data.count,
204
+ firstSeen: data.firstSeen,
205
+ lastSeen: data.lastSeen,
206
+ affectedBranches: [...data.branches],
207
+ severity: data.count >= 5 ? 'critical' : data.count >= 2 ? 'warning' : 'info',
208
+ suggestion: data.count >= 5
209
+ ? 'Frequent failure — investigate root cause immediately'
210
+ : 'Recurring failure — consider adding retries or fixing root cause',
211
+ });
212
+ }
213
+ return patterns.sort((a, b) => b.count - a.count).slice(0, 10);
214
+ }
215
+ function getBuildTrend(project, days = 14) {
216
+ const db = (0, database_1.getDb)();
217
+ const since = new Date(Date.now() - days * 86400000).toISOString();
218
+ const rows = db.prepare(`
219
+ SELECT date(created_at) as date, details_json FROM memory_events
220
+ WHERE project = ? AND topic LIKE 'ci-build%' AND created_at >= ?
221
+ ORDER BY date
222
+ `).all(project, since);
223
+ const dayMap = new Map();
224
+ for (const r of rows) {
225
+ const existing = dayMap.get(r.date) || { total: 0, successes: 0 };
226
+ existing.total++;
227
+ try {
228
+ const d = JSON.parse(r.details_json);
229
+ if (d.status === 'success')
230
+ existing.successes++;
231
+ }
232
+ catch { }
233
+ dayMap.set(r.date, existing);
234
+ }
235
+ return [...dayMap.entries()].map(([date, data]) => ({
236
+ date,
237
+ builds: data.total,
238
+ successes: data.successes,
239
+ failures: data.total - data.successes,
240
+ successRate: data.total > 0 ? Math.round(data.successes / data.total * 100) : 0,
241
+ }));
242
+ }
243
+ function formatCISummary(summary) {
244
+ const lines = [];
245
+ lines.push('## CI/CD Summary\n');
246
+ lines.push('| Metric | Value |');
247
+ lines.push('|--------|-------|');
248
+ lines.push(`| Total builds | ${summary.totalBuilds} |`);
249
+ lines.push(`| Build success rate | ${summary.successRate}% |`);
250
+ lines.push(`| Avg build duration | ${formatDuration(summary.avgBuildDuration)} |`);
251
+ lines.push(`| Total tests | ${summary.totalTests} |`);
252
+ lines.push(`| Test pass rate | ${summary.testPassRate}% |`);
253
+ lines.push(`| Deployments | ${summary.deployments} |`);
254
+ lines.push(`| Deploy success rate | ${summary.deploySuccessRate}% |`);
255
+ if (summary.failurePatterns.length > 0) {
256
+ lines.push('\n### Failure Patterns');
257
+ for (const p of summary.failurePatterns) {
258
+ lines.push(`- [${p.severity}] ${p.pattern} (×${p.count}, branches: ${p.affectedBranches.join(', ')})`);
259
+ }
260
+ }
261
+ return lines.join('\n');
262
+ }
263
+ function formatDuration(ms) {
264
+ if (ms === 0)
265
+ return 'N/A';
266
+ if (ms < 60000)
267
+ return `${Math.round(ms / 1000)}s`;
268
+ if (ms < 3600000)
269
+ return `${Math.round(ms / 60000)}m`;
270
+ return `${(ms / 3600000).toFixed(1)}h`;
271
+ }
272
+ //# sourceMappingURL=ci-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-reporter.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/ci-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ export interface EncryptedPayload {
2
+ version: number;
3
+ algorithm: string;
4
+ project: string;
5
+ timestamp: string;
6
+ checksum: string;
7
+ encryptedData: string;
8
+ iv: string;
9
+ tag: string;
10
+ compression: string;
11
+ eventCount: number;
12
+ }
13
+ export interface DiffResult {
14
+ localOnly: number[];
15
+ remoteOnly: number[];
16
+ conflicts: SyncConflict[];
17
+ bothPresent: number;
18
+ }
19
+ export interface SyncConflict {
20
+ eventId: number;
21
+ localSummary: string;
22
+ remoteSummary: string;
23
+ localTimestamp: string;
24
+ remoteTimestamp: string;
25
+ localImportance: number;
26
+ remoteImportance: number;
27
+ resolved: boolean;
28
+ resolution?: 'local-wins' | 'remote-wins' | 'merge';
29
+ }
30
+ export interface MergeResult {
31
+ added: number;
32
+ updated: number;
33
+ conflicts: number;
34
+ unresolvedConflicts: number;
35
+ skipped: number;
36
+ errors: string[];
37
+ }
38
+ export interface SyncStatus {
39
+ lastSyncAt: string | null;
40
+ pendingUpload: number;
41
+ pendingDownload: number;
42
+ conflicts: number;
43
+ lastSyncDuration: number;
44
+ encryptionKeySet: boolean;
45
+ }
46
+ export interface SyncSnapshot {
47
+ project: string;
48
+ eventIds: number[];
49
+ timestamp: string;
50
+ checksum: string;
51
+ }
52
+ export declare function exportMemory(project: string): EncryptedPayload;
53
+ export declare function importMemory(payload: EncryptedPayload, targetProject: string): MergeResult;
54
+ export declare function computeDiff(project: string, remotePayload: EncryptedPayload): DiffResult;
55
+ export declare function resolveConflicts(conflicts: SyncConflict[], strategy: 'local-wins' | 'remote-wins' | 'importance' | 'timestamp'): SyncConflict[];
56
+ export declare function getSyncStatus(project: string): SyncStatus;
57
+ export declare function markEventsSynced(eventIds: number[]): void;
58
+ export declare function getUnsyncedEvents(project: string, limit?: number): any[];
59
+ export declare function saveSyncSnapshot(project: string): void;
60
+ export declare function getLatestSnapshot(project: string): SyncSnapshot | null;
61
+ //# sourceMappingURL=sync-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/sync-engine.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAeD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAwC9D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,WAAW,CAqD1F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,GAAG,UAAU,CAqCxF;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,YAAY,EAAE,EACzB,QAAQ,EAAE,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAClE,YAAY,EAAE,CAmBhB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA0BzD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAKzD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,GAAG,EAAE,CAI7E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAWtD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAgBtE"}
@@ -0,0 +1,253 @@
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.exportMemory = exportMemory;
37
+ exports.importMemory = importMemory;
38
+ exports.computeDiff = computeDiff;
39
+ exports.resolveConflicts = resolveConflicts;
40
+ exports.getSyncStatus = getSyncStatus;
41
+ exports.markEventsSynced = markEventsSynced;
42
+ exports.getUnsyncedEvents = getUnsyncedEvents;
43
+ exports.saveSyncSnapshot = saveSyncSnapshot;
44
+ exports.getLatestSnapshot = getLatestSnapshot;
45
+ const crypto = __importStar(require("crypto"));
46
+ const zlib = __importStar(require("zlib"));
47
+ const database_1 = require("../database/database");
48
+ function getArchiveKey() {
49
+ const keyPath = require('path').join(process.cwd(), '.cell', 'private', '.archive.key');
50
+ try {
51
+ return require('fs').readFileSync(keyPath);
52
+ }
53
+ catch {
54
+ const key = crypto.randomBytes(32);
55
+ const dir = require('path').dirname(keyPath);
56
+ if (!require('fs').existsSync(dir))
57
+ require('fs').mkdirSync(dir, { recursive: true });
58
+ require('fs').writeFileSync(keyPath, key);
59
+ return key;
60
+ }
61
+ }
62
+ function exportMemory(project) {
63
+ const db = (0, database_1.getDb)();
64
+ const events = db.prepare('SELECT * FROM memory_events WHERE project = ? ORDER BY id').all(project);
65
+ const data = JSON.stringify({
66
+ version: 1,
67
+ project,
68
+ exportedAt: new Date().toISOString(),
69
+ events: events.map(e => ({
70
+ id: e.id, type: e.type, topic: e.topic, summary: e.summary,
71
+ importance: e.importance, files_json: e.files_json,
72
+ details_json: e.details_json, created_at: e.created_at,
73
+ branch: e.branch, tool: e.tool, model: e.model, tags_json: e.tags_json,
74
+ })),
75
+ });
76
+ const compressed = zlib.gzipSync(Buffer.from(data, 'utf-8'));
77
+ const key = getArchiveKey();
78
+ const iv = crypto.randomBytes(16);
79
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
80
+ const encrypted = Buffer.concat([cipher.update(compressed), cipher.final()]);
81
+ const tag = cipher.getAuthTag();
82
+ const checksum = crypto.createHash('sha256').update(compressed).digest('hex');
83
+ return {
84
+ version: 1,
85
+ algorithm: 'aes-256-gcm',
86
+ project,
87
+ timestamp: new Date().toISOString(),
88
+ checksum,
89
+ encryptedData: encrypted.toString('base64'),
90
+ iv: iv.toString('base64'),
91
+ tag: tag.toString('base64'),
92
+ compression: 'gzip',
93
+ eventCount: events.length,
94
+ };
95
+ }
96
+ function importMemory(payload, targetProject) {
97
+ const result = { added: 0, updated: 0, conflicts: 0, unresolvedConflicts: 0, skipped: 0, errors: [] };
98
+ try {
99
+ const key = getArchiveKey();
100
+ const encrypted = Buffer.from(payload.encryptedData, 'base64');
101
+ const iv = Buffer.from(payload.iv, 'base64');
102
+ const tag = Buffer.from(payload.tag, 'base64');
103
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
104
+ decipher.setAuthTag(tag);
105
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
106
+ const decompressed = zlib.gunzipSync(decrypted);
107
+ const data = JSON.parse(decompressed.toString('utf-8'));
108
+ const remoteChecksum = crypto.createHash('sha256').update(decrypted).digest('hex');
109
+ if (remoteChecksum !== payload.checksum) {
110
+ result.errors.push('Checksum mismatch — data may be corrupted');
111
+ return result;
112
+ }
113
+ const db = (0, database_1.getDb)();
114
+ const tx = db.transaction(() => {
115
+ for (const event of data.events) {
116
+ const existing = db.prepare('SELECT id FROM memory_events WHERE project = ? AND summary = ? AND created_at = ?').get(targetProject, event.summary, event.created_at);
117
+ if (!existing) {
118
+ db.prepare(`
119
+ INSERT INTO memory_events (project, branch, type, topic, summary, details_json, files_json, importance, tool, model, tags_json, created_at)
120
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
121
+ `).run(targetProject, event.branch || null, event.type, event.topic || null, event.summary, event.details_json || null, event.files_json || null, event.importance || 3, event.tool || null, event.model || null, event.tags_json || null, event.created_at);
122
+ result.added++;
123
+ }
124
+ else {
125
+ result.skipped++;
126
+ }
127
+ }
128
+ });
129
+ tx();
130
+ }
131
+ catch (err) {
132
+ result.errors.push(err.message);
133
+ }
134
+ return result;
135
+ }
136
+ function computeDiff(project, remotePayload) {
137
+ const localEvents = new Map((0, database_1.getDb)().prepare('SELECT id, summary, created_at FROM memory_events WHERE project = ?').all(project).map(r => [r.id, r]));
138
+ const remoteEvents = new Map(parseRemoteEvents(remotePayload));
139
+ const localOnly = [];
140
+ const conflicts = [];
141
+ let bothPresent = 0;
142
+ for (const [id, local] of localEvents) {
143
+ if (!remoteEvents.has(id)) {
144
+ localOnly.push(id);
145
+ }
146
+ else {
147
+ bothPresent++;
148
+ const remote = remoteEvents.get(id);
149
+ if (local.summary !== remote.summary || local.created_at !== remote.created_at) {
150
+ conflicts.push({
151
+ eventId: id,
152
+ localSummary: local.summary,
153
+ remoteSummary: remote.summary,
154
+ localTimestamp: local.created_at,
155
+ remoteTimestamp: remote.created_at,
156
+ localImportance: 0,
157
+ remoteImportance: 0,
158
+ resolved: false,
159
+ });
160
+ }
161
+ }
162
+ }
163
+ const remoteOnly = [...remoteEvents.keys()].filter(id => !localEvents.has(id));
164
+ return { localOnly, remoteOnly, conflicts, bothPresent };
165
+ }
166
+ function resolveConflicts(conflicts, strategy) {
167
+ return conflicts.map(c => {
168
+ switch (strategy) {
169
+ case 'local-wins':
170
+ return { ...c, resolution: 'local-wins', resolved: true };
171
+ case 'remote-wins':
172
+ return { ...c, resolution: 'remote-wins', resolved: true };
173
+ case 'importance': {
174
+ const resolution = c.localImportance >= c.remoteImportance ? 'local-wins' : 'remote-wins';
175
+ return { ...c, resolution, resolved: true };
176
+ }
177
+ case 'timestamp': {
178
+ const resolution = new Date(c.localTimestamp) >= new Date(c.remoteTimestamp) ? 'local-wins' : 'remote-wins';
179
+ return { ...c, resolution, resolved: true };
180
+ }
181
+ default:
182
+ return c;
183
+ }
184
+ });
185
+ }
186
+ function getSyncStatus(project) {
187
+ const db = (0, database_1.getDb)();
188
+ const lastSync = db.prepare('SELECT MAX(last_sync_at) as ls FROM sync_state WHERE project = ?').get(project);
189
+ const pendingUpload = db.prepare("SELECT COUNT(*) as c FROM memory_events WHERE project = ? AND (synced IS NULL OR synced = 0)").get(project);
190
+ const keyPath = require('path').join(process.cwd(), '.cell', 'private', '.archive.key');
191
+ const encryptionKeySet = require('fs').existsSync(keyPath);
192
+ const conflicts = db.prepare('SELECT COUNT(*) as c FROM sync_conflicts WHERE project = ? AND resolved = 0').get(project);
193
+ return {
194
+ lastSyncAt: lastSync?.ls || null,
195
+ pendingUpload: pendingUpload.c,
196
+ pendingDownload: 0,
197
+ conflicts: conflicts.c,
198
+ lastSyncDuration: 0,
199
+ encryptionKeySet,
200
+ };
201
+ }
202
+ function markEventsSynced(eventIds) {
203
+ if (eventIds.length === 0)
204
+ return;
205
+ const db = (0, database_1.getDb)();
206
+ const placeholders = eventIds.map(() => '?').join(',');
207
+ db.prepare(`UPDATE memory_events SET synced = 1 WHERE id IN (${placeholders})`).run(...eventIds);
208
+ }
209
+ function getUnsyncedEvents(project, limit = 500) {
210
+ return (0, database_1.getDb)().prepare('SELECT * FROM memory_events WHERE project = ? AND (synced IS NULL OR synced = 0) ORDER BY id LIMIT ?').all(project, limit);
211
+ }
212
+ function saveSyncSnapshot(project) {
213
+ const db = (0, database_1.getDb)();
214
+ const events = db.prepare('SELECT id FROM memory_events WHERE project = ? ORDER BY id').all(project);
215
+ const eventIds = events.map(e => e.id);
216
+ const checksum = crypto.createHash('sha256').update(eventIds.join(',')).digest('hex');
217
+ db.prepare(`
218
+ INSERT INTO sync_state (project, last_snapshot_at, snapshot_checksum, pending_uploads, pending_downloads, conflicts)
219
+ VALUES (?, ?, ?, 0, 0, 0)
220
+ ON CONFLICT(project) DO UPDATE SET last_snapshot_at = ?, snapshot_checksum = ?
221
+ `).run(project, new Date().toISOString(), checksum, new Date().toISOString(), checksum);
222
+ }
223
+ function getLatestSnapshot(project) {
224
+ const db = (0, database_1.getDb)();
225
+ const row = db.prepare('SELECT last_snapshot_at as ts, snapshot_checksum as chk FROM sync_state WHERE project = ?').get(project);
226
+ if (!row?.ts)
227
+ return null;
228
+ const events = db.prepare('SELECT id FROM memory_events WHERE project = ? ORDER BY id').all(project);
229
+ return {
230
+ project,
231
+ eventIds: events.map(e => e.id),
232
+ timestamp: row.ts,
233
+ checksum: row.chk || '',
234
+ };
235
+ }
236
+ function parseRemoteEvents(payload) {
237
+ try {
238
+ const key = getArchiveKey();
239
+ const encrypted = Buffer.from(payload.encryptedData, 'base64');
240
+ const iv = Buffer.from(payload.iv, 'base64');
241
+ const tag = Buffer.from(payload.tag, 'base64');
242
+ const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);
243
+ decipher.setAuthTag(tag);
244
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
245
+ const decompressed = zlib.gunzipSync(decrypted);
246
+ const data = JSON.parse(decompressed.toString('utf-8'));
247
+ return (data.events || []).map((e) => [e.id, { summary: e.summary, created_at: e.created_at }]);
248
+ }
249
+ catch {
250
+ return [];
251
+ }
252
+ }
253
+ //# sourceMappingURL=sync-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/sync-engine.ts"],"names":[],"mappings":"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"}