@jcmrs/opencode-vmem 1.0.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/CHANGELOG.md +83 -0
- package/LICENSE +21 -0
- package/README.md +172 -0
- package/dist/capture/classification.d.ts +37 -0
- package/dist/capture/classification.d.ts.map +1 -0
- package/dist/capture/classification.js +181 -0
- package/dist/capture/classification.js.map +1 -0
- package/dist/capture/filtering.d.ts +63 -0
- package/dist/capture/filtering.d.ts.map +1 -0
- package/dist/capture/filtering.js +195 -0
- package/dist/capture/filtering.js.map +1 -0
- package/dist/capture/observation.d.ts +28 -0
- package/dist/capture/observation.d.ts.map +1 -0
- package/dist/capture/observation.js +188 -0
- package/dist/capture/observation.js.map +1 -0
- package/dist/commands/index.d.ts +38 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +375 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/context/builder.d.ts +19 -0
- package/dist/context/builder.d.ts.map +1 -0
- package/dist/context/builder.js +209 -0
- package/dist/context/builder.js.map +1 -0
- package/dist/context/format.d.ts +32 -0
- package/dist/context/format.d.ts.map +1 -0
- package/dist/context/format.js +211 -0
- package/dist/context/format.js.map +1 -0
- package/dist/embedding/index.d.ts +3 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +3 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/provider.d.ts +15 -0
- package/dist/embedding/provider.d.ts.map +1 -0
- package/dist/embedding/provider.js +19 -0
- package/dist/embedding/provider.js.map +1 -0
- package/dist/embedding/transformers.d.ts +14 -0
- package/dist/embedding/transformers.d.ts.map +1 -0
- package/dist/embedding/transformers.js +55 -0
- package/dist/embedding/transformers.js.map +1 -0
- package/dist/extract/confidence.d.ts +48 -0
- package/dist/extract/confidence.d.ts.map +1 -0
- package/dist/extract/confidence.js +230 -0
- package/dist/extract/confidence.js.map +1 -0
- package/dist/extract/llm-extractor.d.ts +35 -0
- package/dist/extract/llm-extractor.d.ts.map +1 -0
- package/dist/extract/llm-extractor.js +204 -0
- package/dist/extract/llm-extractor.js.map +1 -0
- package/dist/extract/pipeline.d.ts +44 -0
- package/dist/extract/pipeline.d.ts.map +1 -0
- package/dist/extract/pipeline.js +171 -0
- package/dist/extract/pipeline.js.map +1 -0
- package/dist/extract/rules-engine.d.ts +14 -0
- package/dist/extract/rules-engine.d.ts.map +1 -0
- package/dist/extract/rules-engine.js +314 -0
- package/dist/extract/rules-engine.js.map +1 -0
- package/dist/extract/summarizer.d.ts +27 -0
- package/dist/extract/summarizer.d.ts.map +1 -0
- package/dist/extract/summarizer.js +148 -0
- package/dist/extract/summarizer.js.map +1 -0
- package/dist/hooks/session-idle.d.ts +38 -0
- package/dist/hooks/session-idle.d.ts.map +1 -0
- package/dist/hooks/session-idle.js +142 -0
- package/dist/hooks/session-idle.js.map +1 -0
- package/dist/hooks/system-transform.d.ts +41 -0
- package/dist/hooks/system-transform.d.ts.map +1 -0
- package/dist/hooks/system-transform.js +98 -0
- package/dist/hooks/system-transform.js.map +1 -0
- package/dist/hooks/tool-after.d.ts +66 -0
- package/dist/hooks/tool-after.d.ts.map +1 -0
- package/dist/hooks/tool-after.js +155 -0
- package/dist/hooks/tool-after.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mind.d.ts +69 -0
- package/dist/mind.d.ts.map +1 -0
- package/dist/mind.js +368 -0
- package/dist/mind.js.map +1 -0
- package/dist/procedural/index.d.ts +4 -0
- package/dist/procedural/index.d.ts.map +1 -0
- package/dist/procedural/index.js +4 -0
- package/dist/procedural/index.js.map +1 -0
- package/dist/procedural/induction.d.ts +23 -0
- package/dist/procedural/induction.d.ts.map +1 -0
- package/dist/procedural/induction.js +104 -0
- package/dist/procedural/induction.js.map +1 -0
- package/dist/procedural/miner.d.ts +45 -0
- package/dist/procedural/miner.d.ts.map +1 -0
- package/dist/procedural/miner.js +171 -0
- package/dist/procedural/miner.js.map +1 -0
- package/dist/procedural/suggester.d.ts +20 -0
- package/dist/procedural/suggester.d.ts.map +1 -0
- package/dist/procedural/suggester.js +69 -0
- package/dist/procedural/suggester.js.map +1 -0
- package/dist/store/archive.d.ts +31 -0
- package/dist/store/archive.d.ts.map +1 -0
- package/dist/store/archive.js +137 -0
- package/dist/store/archive.js.map +1 -0
- package/dist/store/backup.d.ts +36 -0
- package/dist/store/backup.d.ts.map +1 -0
- package/dist/store/backup.js +163 -0
- package/dist/store/backup.js.map +1 -0
- package/dist/store/memorycards.d.ts +31 -0
- package/dist/store/memorycards.d.ts.map +1 -0
- package/dist/store/memorycards.js +161 -0
- package/dist/store/memorycards.js.map +1 -0
- package/dist/store/mv2-adapter.d.ts +29 -0
- package/dist/store/mv2-adapter.d.ts.map +1 -0
- package/dist/store/mv2-adapter.js +359 -0
- package/dist/store/mv2-adapter.js.map +1 -0
- package/dist/store/procedures.d.ts +79 -0
- package/dist/store/procedures.d.ts.map +1 -0
- package/dist/store/procedures.js +183 -0
- package/dist/store/procedures.js.map +1 -0
- package/dist/store/tombstone.d.ts +27 -0
- package/dist/store/tombstone.d.ts.map +1 -0
- package/dist/store/tombstone.js +136 -0
- package/dist/store/tombstone.js.map +1 -0
- package/dist/tools/index.d.ts +36 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +236 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +301 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +69 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/error.d.ts +57 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +143 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/uuid.d.ts +2 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/utils/uuid.js +5 -0
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { mkdir, stat, writeFile, readFile, rename } from 'fs/promises';
|
|
2
|
+
import { join, basename } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
export class ArchiveManager {
|
|
5
|
+
archiveDir;
|
|
6
|
+
index = null;
|
|
7
|
+
constructor(projectDir) {
|
|
8
|
+
this.archiveDir = join(projectDir, '.opencode', 'memory', 'archive');
|
|
9
|
+
}
|
|
10
|
+
async loadIndex() {
|
|
11
|
+
if (this.index)
|
|
12
|
+
return this.index;
|
|
13
|
+
const indexPath = join(this.archiveDir, 'index.json');
|
|
14
|
+
try {
|
|
15
|
+
const raw = await readFile(indexPath, 'utf-8');
|
|
16
|
+
this.index = JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
this.index = {
|
|
20
|
+
version: 1,
|
|
21
|
+
archives: [],
|
|
22
|
+
lastUpdated: Date.now()
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return this.index;
|
|
26
|
+
}
|
|
27
|
+
async saveIndex() {
|
|
28
|
+
if (!this.index)
|
|
29
|
+
return;
|
|
30
|
+
await mkdir(this.archiveDir, { recursive: true });
|
|
31
|
+
this.index.lastUpdated = Date.now();
|
|
32
|
+
const indexPath = join(this.archiveDir, 'index.json');
|
|
33
|
+
await writeFile(indexPath, JSON.stringify(this.index, null, 2), 'utf-8');
|
|
34
|
+
}
|
|
35
|
+
async archive(sourcePath, reason, frameCount) {
|
|
36
|
+
if (!existsSync(sourcePath))
|
|
37
|
+
return null;
|
|
38
|
+
await mkdir(this.archiveDir, { recursive: true });
|
|
39
|
+
const timestamp = Date.now();
|
|
40
|
+
const baseName = basename(sourcePath);
|
|
41
|
+
const archiveName = `${baseName}.${timestamp}.archive`;
|
|
42
|
+
const archivePath = join(this.archiveDir, archiveName);
|
|
43
|
+
try {
|
|
44
|
+
await rename(sourcePath, archivePath);
|
|
45
|
+
const stats = await stat(archivePath);
|
|
46
|
+
const index = await this.loadIndex();
|
|
47
|
+
index.archives.push({
|
|
48
|
+
path: archivePath,
|
|
49
|
+
size: stats.size,
|
|
50
|
+
createdAt: timestamp,
|
|
51
|
+
frameCount,
|
|
52
|
+
reason
|
|
53
|
+
});
|
|
54
|
+
await this.saveIndex();
|
|
55
|
+
console.error(`[vmem] Archived memory: ${archiveName} (${reason}, ${frameCount} frames, ${(stats.size / 1024 / 1024).toFixed(2)} MB)`);
|
|
56
|
+
return archivePath;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(`[vmem] Failed to archive memory: ${error}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async listArchives() {
|
|
64
|
+
const index = await this.loadIndex();
|
|
65
|
+
return [...index.archives].sort((a, b) => b.createdAt - a.createdAt);
|
|
66
|
+
}
|
|
67
|
+
async getArchive(path) {
|
|
68
|
+
const index = await this.loadIndex();
|
|
69
|
+
return index.archives.find(a => a.path === path) || null;
|
|
70
|
+
}
|
|
71
|
+
async deleteArchive(path) {
|
|
72
|
+
const index = await this.loadIndex();
|
|
73
|
+
const idx = index.archives.findIndex(a => a.path === path);
|
|
74
|
+
if (idx < 0)
|
|
75
|
+
return false;
|
|
76
|
+
try {
|
|
77
|
+
const { unlink } = await import('fs/promises');
|
|
78
|
+
await unlink(path);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// File may already be deleted
|
|
82
|
+
}
|
|
83
|
+
index.archives.splice(idx, 1);
|
|
84
|
+
await this.saveIndex();
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
async pruneArchives(keepCount) {
|
|
88
|
+
const index = await this.loadIndex();
|
|
89
|
+
if (index.archives.length <= keepCount)
|
|
90
|
+
return 0;
|
|
91
|
+
const sorted = [...index.archives].sort((a, b) => b.createdAt - a.createdAt);
|
|
92
|
+
const toDelete = sorted.slice(keepCount);
|
|
93
|
+
let deleted = 0;
|
|
94
|
+
for (const archive of toDelete) {
|
|
95
|
+
try {
|
|
96
|
+
const { unlink } = await import('fs/promises');
|
|
97
|
+
await unlink(archive.path);
|
|
98
|
+
deleted++;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Ignore
|
|
102
|
+
}
|
|
103
|
+
const idx = index.archives.findIndex(a => a.path === archive.path);
|
|
104
|
+
if (idx >= 0) {
|
|
105
|
+
index.archives.splice(idx, 1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await this.saveIndex();
|
|
109
|
+
return deleted;
|
|
110
|
+
}
|
|
111
|
+
async getStats() {
|
|
112
|
+
const index = await this.loadIndex();
|
|
113
|
+
if (index.archives.length === 0) {
|
|
114
|
+
return {
|
|
115
|
+
totalArchives: 0,
|
|
116
|
+
totalSize: 0,
|
|
117
|
+
oldestArchive: null,
|
|
118
|
+
newestArchive: null
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
let totalSize = 0;
|
|
122
|
+
let oldest = Infinity;
|
|
123
|
+
let newest = 0;
|
|
124
|
+
for (const archive of index.archives) {
|
|
125
|
+
totalSize += archive.size;
|
|
126
|
+
oldest = Math.min(oldest, archive.createdAt);
|
|
127
|
+
newest = Math.max(newest, archive.createdAt);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
totalArchives: index.archives.length,
|
|
131
|
+
totalSize,
|
|
132
|
+
oldestArchive: oldest === Infinity ? null : oldest,
|
|
133
|
+
newestArchive: newest
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/store/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface BackupInfo {
|
|
2
|
+
filename: string;
|
|
3
|
+
path: string;
|
|
4
|
+
size: number;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
}
|
|
7
|
+
export interface BackupConfig {
|
|
8
|
+
maxBackups: number;
|
|
9
|
+
backupOnOpen: boolean;
|
|
10
|
+
backupIntervalMs: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class BackupManager {
|
|
13
|
+
private projectDir;
|
|
14
|
+
private memoryPath;
|
|
15
|
+
private config;
|
|
16
|
+
private lastBackupTime;
|
|
17
|
+
constructor(projectDir: string, memoryPath: string, config?: Partial<BackupConfig>);
|
|
18
|
+
private getBackupDir;
|
|
19
|
+
createBackup(reason?: string): Promise<BackupInfo | null>;
|
|
20
|
+
listBackups(): Promise<BackupInfo[]>;
|
|
21
|
+
restoreBackup(backupPath: string): Promise<boolean>;
|
|
22
|
+
deleteBackup(filename: string): Promise<boolean>;
|
|
23
|
+
private pruneOldBackups;
|
|
24
|
+
shouldAutoBackup(): Promise<boolean>;
|
|
25
|
+
autoBackupIfNeeded(): Promise<BackupInfo | null>;
|
|
26
|
+
getBackupStats(): Promise<{
|
|
27
|
+
totalBackups: number;
|
|
28
|
+
totalSize: number;
|
|
29
|
+
oldestBackup: number | null;
|
|
30
|
+
newestBackup: number | null;
|
|
31
|
+
}>;
|
|
32
|
+
getLastBackupTime(): number;
|
|
33
|
+
getConfig(): BackupConfig;
|
|
34
|
+
setConfig(config: Partial<BackupConfig>): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/store/backup.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAa;gBAEvB,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAMlF,OAAO,CAAC,YAAY;IAId,YAAY,CAAC,MAAM,GAAE,MAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA4BnE,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IA+BpC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBnD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAexC,eAAe;IAkBvB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBpC,kBAAkB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOhD,cAAc,IAAI,OAAO,CAAC;QAC9B,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC;IAsBF,iBAAiB,IAAI,MAAM;IAI3B,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;CAG/C"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { copyFile, readdir, mkdir, stat, unlink } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { join, basename } from 'path';
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
maxBackups: 5,
|
|
6
|
+
backupOnOpen: true,
|
|
7
|
+
backupIntervalMs: 24 * 60 * 60 * 1000 // 24 hours
|
|
8
|
+
};
|
|
9
|
+
export class BackupManager {
|
|
10
|
+
projectDir;
|
|
11
|
+
memoryPath;
|
|
12
|
+
config;
|
|
13
|
+
lastBackupTime = 0;
|
|
14
|
+
constructor(projectDir, memoryPath, config) {
|
|
15
|
+
this.projectDir = projectDir;
|
|
16
|
+
this.memoryPath = memoryPath;
|
|
17
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
18
|
+
}
|
|
19
|
+
getBackupDir() {
|
|
20
|
+
return join(this.projectDir, '.opencode', 'memory', 'backups');
|
|
21
|
+
}
|
|
22
|
+
async createBackup(reason = 'manual') {
|
|
23
|
+
if (!existsSync(this.memoryPath)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const backupDir = this.getBackupDir();
|
|
27
|
+
await mkdir(backupDir, { recursive: true });
|
|
28
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
29
|
+
const baseName = basename(this.memoryPath);
|
|
30
|
+
const backupFilename = `${baseName}-${timestamp}-${reason}.bak`;
|
|
31
|
+
const backupPath = join(backupDir, backupFilename);
|
|
32
|
+
await copyFile(this.memoryPath, backupPath);
|
|
33
|
+
const stats = await stat(backupPath);
|
|
34
|
+
this.lastBackupTime = Date.now();
|
|
35
|
+
await this.pruneOldBackups();
|
|
36
|
+
return {
|
|
37
|
+
filename: backupFilename,
|
|
38
|
+
path: backupPath,
|
|
39
|
+
size: stats.size,
|
|
40
|
+
createdAt: Date.now()
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async listBackups() {
|
|
44
|
+
const backupDir = this.getBackupDir();
|
|
45
|
+
if (!existsSync(backupDir)) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
const files = await readdir(backupDir);
|
|
49
|
+
const backups = [];
|
|
50
|
+
for (const file of files) {
|
|
51
|
+
const filePath = join(backupDir, file);
|
|
52
|
+
try {
|
|
53
|
+
const stats = await stat(filePath);
|
|
54
|
+
if (stats.isFile()) {
|
|
55
|
+
backups.push({
|
|
56
|
+
filename: file,
|
|
57
|
+
path: filePath,
|
|
58
|
+
size: stats.size,
|
|
59
|
+
createdAt: stats.mtimeMs
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Skip files we can't stat
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return backups.sort((a, b) => b.createdAt - a.createdAt);
|
|
68
|
+
}
|
|
69
|
+
async restoreBackup(backupPath) {
|
|
70
|
+
if (!existsSync(backupPath)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
if (existsSync(this.memoryPath)) {
|
|
75
|
+
const preRestoreBackup = await this.createBackup('pre-restore');
|
|
76
|
+
if (preRestoreBackup) {
|
|
77
|
+
console.error(`[vmem] Created pre-restore backup: ${preRestoreBackup.filename}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
await copyFile(backupPath, this.memoryPath);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(`[vmem] Restore failed: ${error}`);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async deleteBackup(filename) {
|
|
89
|
+
const backupPath = join(this.getBackupDir(), filename);
|
|
90
|
+
if (!existsSync(backupPath)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
await unlink(backupPath);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async pruneOldBackups() {
|
|
102
|
+
const backups = await this.listBackups();
|
|
103
|
+
if (backups.length <= this.config.maxBackups) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const toDelete = backups.slice(this.config.maxBackups);
|
|
107
|
+
for (const backup of toDelete) {
|
|
108
|
+
try {
|
|
109
|
+
await unlink(backup.path);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore deletion errors
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async shouldAutoBackup() {
|
|
117
|
+
if (!this.config.backupOnOpen) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
if (!existsSync(this.memoryPath)) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
if (this.lastBackupTime === 0) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
const timeSinceLastBackup = Date.now() - this.lastBackupTime;
|
|
127
|
+
return timeSinceLastBackup >= this.config.backupIntervalMs;
|
|
128
|
+
}
|
|
129
|
+
async autoBackupIfNeeded() {
|
|
130
|
+
if (await this.shouldAutoBackup()) {
|
|
131
|
+
return this.createBackup('auto');
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
async getBackupStats() {
|
|
136
|
+
const backups = await this.listBackups();
|
|
137
|
+
if (backups.length === 0) {
|
|
138
|
+
return {
|
|
139
|
+
totalBackups: 0,
|
|
140
|
+
totalSize: 0,
|
|
141
|
+
oldestBackup: null,
|
|
142
|
+
newestBackup: null
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const totalSize = backups.reduce((sum, b) => sum + b.size, 0);
|
|
146
|
+
return {
|
|
147
|
+
totalBackups: backups.length,
|
|
148
|
+
totalSize,
|
|
149
|
+
oldestBackup: backups[backups.length - 1]?.createdAt || null,
|
|
150
|
+
newestBackup: backups[0]?.createdAt || null
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
getLastBackupTime() {
|
|
154
|
+
return this.lastBackupTime;
|
|
155
|
+
}
|
|
156
|
+
getConfig() {
|
|
157
|
+
return { ...this.config };
|
|
158
|
+
}
|
|
159
|
+
setConfig(config) {
|
|
160
|
+
this.config = { ...this.config, ...config };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/store/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MemoryCard } from '../types.js';
|
|
2
|
+
export interface MemoryCardIndex {
|
|
3
|
+
version: number;
|
|
4
|
+
cards: MemoryCard[];
|
|
5
|
+
lastUpdated: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class MemoryCardStore {
|
|
8
|
+
private projectDir;
|
|
9
|
+
private index;
|
|
10
|
+
constructor(projectDir: string);
|
|
11
|
+
private load;
|
|
12
|
+
private save;
|
|
13
|
+
add(card: Omit<MemoryCard, 'id' | 'createdAt' | 'updatedAt'>): Promise<string>;
|
|
14
|
+
get(id: string): Promise<MemoryCard | null>;
|
|
15
|
+
getAll(): Promise<MemoryCard[]>;
|
|
16
|
+
getByEntity(entity: string): Promise<MemoryCard[]>;
|
|
17
|
+
getBySlot(slot: string): Promise<MemoryCard[]>;
|
|
18
|
+
getByKind(kind: MemoryCard['kind']): Promise<MemoryCard[]>;
|
|
19
|
+
getLatest(entity: string, slot: string): Promise<MemoryCard | null>;
|
|
20
|
+
update(id: string, updates: Partial<MemoryCard>): Promise<boolean>;
|
|
21
|
+
remove(id: string): Promise<boolean>;
|
|
22
|
+
clear(): Promise<void>;
|
|
23
|
+
getStats(): Promise<{
|
|
24
|
+
total: number;
|
|
25
|
+
byEntity: Record<string, number>;
|
|
26
|
+
byKind: Record<MemoryCard['kind'], number>;
|
|
27
|
+
}>;
|
|
28
|
+
reload(): Promise<void>;
|
|
29
|
+
getLoadedCards(): MemoryCard[];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=memorycards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memorycards.d.ts","sourceRoot":"","sources":["../../src/store/memorycards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAgC;gBAEjC,UAAU,EAAE,MAAM;YAIhB,IAAI;YAoBJ,IAAI;IASZ,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA4C9E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAK3C,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAK/B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKlD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK9C,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK1D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAWnE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,IAAI,OAAO,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;KAC5C,CAAC;IAuBI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,cAAc,IAAI,UAAU,EAAE;CAI/B"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { readFile, writeFile, access } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { uuid } from '../utils/uuid.js';
|
|
4
|
+
const MEMORYCARDS_FILE = 'memorycards.json';
|
|
5
|
+
export class MemoryCardStore {
|
|
6
|
+
projectDir;
|
|
7
|
+
index = null;
|
|
8
|
+
constructor(projectDir) {
|
|
9
|
+
this.projectDir = projectDir;
|
|
10
|
+
}
|
|
11
|
+
async load() {
|
|
12
|
+
if (this.index)
|
|
13
|
+
return this.index;
|
|
14
|
+
const filePath = join(this.projectDir, '.opencode', 'memory', MEMORYCARDS_FILE);
|
|
15
|
+
try {
|
|
16
|
+
await access(filePath);
|
|
17
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
18
|
+
this.index = JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
this.index = {
|
|
22
|
+
version: 1,
|
|
23
|
+
cards: [],
|
|
24
|
+
lastUpdated: Date.now()
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return this.index;
|
|
28
|
+
}
|
|
29
|
+
async save() {
|
|
30
|
+
if (!this.index)
|
|
31
|
+
return;
|
|
32
|
+
const filePath = join(this.projectDir, '.opencode', 'memory', MEMORYCARDS_FILE);
|
|
33
|
+
this.index.lastUpdated = Date.now();
|
|
34
|
+
await writeFile(filePath, JSON.stringify(this.index, null, 2), 'utf-8');
|
|
35
|
+
}
|
|
36
|
+
async add(card) {
|
|
37
|
+
const index = await this.load();
|
|
38
|
+
const id = uuid();
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
const fullCard = {
|
|
41
|
+
...card,
|
|
42
|
+
id,
|
|
43
|
+
createdAt: now,
|
|
44
|
+
updatedAt: now
|
|
45
|
+
};
|
|
46
|
+
const versionKey = `${card.entity}:${card.slot}`;
|
|
47
|
+
const existingIndex = index.cards.findIndex(c => `${c.entity}:${c.slot}` === versionKey);
|
|
48
|
+
if (existingIndex >= 0 && card.versionRelation === 'replaces') {
|
|
49
|
+
index.cards[existingIndex] = {
|
|
50
|
+
...fullCard,
|
|
51
|
+
id: index.cards[existingIndex].id,
|
|
52
|
+
createdAt: index.cards[existingIndex].createdAt
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
else if (existingIndex >= 0 && card.versionRelation === 'extends') {
|
|
56
|
+
const existing = index.cards[existingIndex];
|
|
57
|
+
const existingValues = existing.value.split(',').map(v => v.trim());
|
|
58
|
+
if (!existingValues.includes(card.value)) {
|
|
59
|
+
existingValues.push(card.value);
|
|
60
|
+
index.cards[existingIndex] = {
|
|
61
|
+
...fullCard,
|
|
62
|
+
id: existing.id,
|
|
63
|
+
createdAt: existing.createdAt,
|
|
64
|
+
value: existingValues.join(', ')
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
index.cards.push(fullCard);
|
|
70
|
+
}
|
|
71
|
+
await this.save();
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
async get(id) {
|
|
75
|
+
const index = await this.load();
|
|
76
|
+
return index.cards.find(c => c.id === id) || null;
|
|
77
|
+
}
|
|
78
|
+
async getAll() {
|
|
79
|
+
const index = await this.load();
|
|
80
|
+
return [...index.cards];
|
|
81
|
+
}
|
|
82
|
+
async getByEntity(entity) {
|
|
83
|
+
const index = await this.load();
|
|
84
|
+
return index.cards.filter(c => c.entity === entity);
|
|
85
|
+
}
|
|
86
|
+
async getBySlot(slot) {
|
|
87
|
+
const index = await this.load();
|
|
88
|
+
return index.cards.filter(c => c.slot === slot);
|
|
89
|
+
}
|
|
90
|
+
async getByKind(kind) {
|
|
91
|
+
const index = await this.load();
|
|
92
|
+
return index.cards.filter(c => c.kind === kind);
|
|
93
|
+
}
|
|
94
|
+
async getLatest(entity, slot) {
|
|
95
|
+
const index = await this.load();
|
|
96
|
+
const matches = index.cards.filter(c => c.entity === entity && c.slot === slot);
|
|
97
|
+
if (matches.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
return matches.sort((a, b) => (b.updatedAt ?? b.createdAt) - (a.updatedAt ?? a.createdAt))[0];
|
|
100
|
+
}
|
|
101
|
+
async update(id, updates) {
|
|
102
|
+
const index = await this.load();
|
|
103
|
+
const cardIndex = index.cards.findIndex(c => c.id === id);
|
|
104
|
+
if (cardIndex < 0)
|
|
105
|
+
return false;
|
|
106
|
+
index.cards[cardIndex] = {
|
|
107
|
+
...index.cards[cardIndex],
|
|
108
|
+
...updates,
|
|
109
|
+
updatedAt: Date.now()
|
|
110
|
+
};
|
|
111
|
+
await this.save();
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
async remove(id) {
|
|
115
|
+
const index = await this.load();
|
|
116
|
+
const initialLength = index.cards.length;
|
|
117
|
+
index.cards = index.cards.filter(c => c.id !== id);
|
|
118
|
+
if (index.cards.length === initialLength) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
await this.save();
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
async clear() {
|
|
125
|
+
this.index = {
|
|
126
|
+
version: 1,
|
|
127
|
+
cards: [],
|
|
128
|
+
lastUpdated: Date.now()
|
|
129
|
+
};
|
|
130
|
+
await this.save();
|
|
131
|
+
}
|
|
132
|
+
async getStats() {
|
|
133
|
+
const index = await this.load();
|
|
134
|
+
const byEntity = {};
|
|
135
|
+
const byKind = {
|
|
136
|
+
fact: 0,
|
|
137
|
+
preference: 0,
|
|
138
|
+
profile: 0,
|
|
139
|
+
goal: 0
|
|
140
|
+
};
|
|
141
|
+
for (const card of index.cards) {
|
|
142
|
+
byEntity[card.entity] = (byEntity[card.entity] || 0) + 1;
|
|
143
|
+
byKind[card.kind] = (byKind[card.kind] || 0) + 1;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
total: index.cards.length,
|
|
147
|
+
byEntity,
|
|
148
|
+
byKind
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async reload() {
|
|
152
|
+
this.index = null;
|
|
153
|
+
await this.load();
|
|
154
|
+
}
|
|
155
|
+
getLoadedCards() {
|
|
156
|
+
if (!this.index)
|
|
157
|
+
return [];
|
|
158
|
+
return [...this.index.cards];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=memorycards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memorycards.js","sourceRoot":"","sources":["../../src/store/memorycards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Observation } from '../types.js';
|
|
2
|
+
export declare class MV2Adapter {
|
|
3
|
+
private memvid;
|
|
4
|
+
private memoryPath;
|
|
5
|
+
private frameCache;
|
|
6
|
+
constructor(memoryPath: string);
|
|
7
|
+
open(): Promise<void>;
|
|
8
|
+
private isCorruptionError;
|
|
9
|
+
private backupAndRecreate;
|
|
10
|
+
private pruneBackups;
|
|
11
|
+
addObservation(observation: Omit<Observation, 'id' | 'frameId'>, embedding?: number[]): Promise<string>;
|
|
12
|
+
getObservation(id: string): Promise<Observation | null>;
|
|
13
|
+
search(query: string, limit?: number, mode?: 'lex' | 'sem' | 'auto', queryEmbedding?: number[]): Promise<Observation[]>;
|
|
14
|
+
getRecent(limit?: number): Promise<Observation[]>;
|
|
15
|
+
getTimeline(limit?: number): Promise<Observation[]>;
|
|
16
|
+
private getFrameInfo;
|
|
17
|
+
removeFrame(frameId: string): Promise<void>;
|
|
18
|
+
getState(): Promise<{
|
|
19
|
+
frameCount: number;
|
|
20
|
+
activeFrameCount: number;
|
|
21
|
+
}>;
|
|
22
|
+
getPath(): string;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
clearCache(): void;
|
|
25
|
+
private toObservation;
|
|
26
|
+
private parseSnippet;
|
|
27
|
+
private extractSessionFromTags;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=mv2-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mv2-adapter.d.ts","sourceRoot":"","sources":["../../src/store/mv2-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAwD,MAAM,aAAa,CAAC;AAoBhG,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAqC;gBAE3C,UAAU,EAAE,MAAM;IAIxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C3B,OAAO,CAAC,iBAAiB;YAgBX,iBAAiB;IAc/B,OAAO,CAAC,YAAY;IA4Bd,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDvG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA8BvD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,IAAI,GAAE,KAAK,GAAG,KAAK,GAAG,MAAc,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmBlI,SAAS,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAyBrD,WAAW,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAI/C,YAAY;IAgBpB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;IAU3E,OAAO,IAAI,MAAM;IAIX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAyDpB,OAAO,CAAC,sBAAsB;CAK/B"}
|