@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.
Files changed (140) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/LICENSE +21 -0
  3. package/README.md +172 -0
  4. package/dist/capture/classification.d.ts +37 -0
  5. package/dist/capture/classification.d.ts.map +1 -0
  6. package/dist/capture/classification.js +181 -0
  7. package/dist/capture/classification.js.map +1 -0
  8. package/dist/capture/filtering.d.ts +63 -0
  9. package/dist/capture/filtering.d.ts.map +1 -0
  10. package/dist/capture/filtering.js +195 -0
  11. package/dist/capture/filtering.js.map +1 -0
  12. package/dist/capture/observation.d.ts +28 -0
  13. package/dist/capture/observation.d.ts.map +1 -0
  14. package/dist/capture/observation.js +188 -0
  15. package/dist/capture/observation.js.map +1 -0
  16. package/dist/commands/index.d.ts +38 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +375 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +41 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/context/builder.d.ts +19 -0
  25. package/dist/context/builder.d.ts.map +1 -0
  26. package/dist/context/builder.js +209 -0
  27. package/dist/context/builder.js.map +1 -0
  28. package/dist/context/format.d.ts +32 -0
  29. package/dist/context/format.d.ts.map +1 -0
  30. package/dist/context/format.js +211 -0
  31. package/dist/context/format.js.map +1 -0
  32. package/dist/embedding/index.d.ts +3 -0
  33. package/dist/embedding/index.d.ts.map +1 -0
  34. package/dist/embedding/index.js +3 -0
  35. package/dist/embedding/index.js.map +1 -0
  36. package/dist/embedding/provider.d.ts +15 -0
  37. package/dist/embedding/provider.d.ts.map +1 -0
  38. package/dist/embedding/provider.js +19 -0
  39. package/dist/embedding/provider.js.map +1 -0
  40. package/dist/embedding/transformers.d.ts +14 -0
  41. package/dist/embedding/transformers.d.ts.map +1 -0
  42. package/dist/embedding/transformers.js +55 -0
  43. package/dist/embedding/transformers.js.map +1 -0
  44. package/dist/extract/confidence.d.ts +48 -0
  45. package/dist/extract/confidence.d.ts.map +1 -0
  46. package/dist/extract/confidence.js +230 -0
  47. package/dist/extract/confidence.js.map +1 -0
  48. package/dist/extract/llm-extractor.d.ts +35 -0
  49. package/dist/extract/llm-extractor.d.ts.map +1 -0
  50. package/dist/extract/llm-extractor.js +204 -0
  51. package/dist/extract/llm-extractor.js.map +1 -0
  52. package/dist/extract/pipeline.d.ts +44 -0
  53. package/dist/extract/pipeline.d.ts.map +1 -0
  54. package/dist/extract/pipeline.js +171 -0
  55. package/dist/extract/pipeline.js.map +1 -0
  56. package/dist/extract/rules-engine.d.ts +14 -0
  57. package/dist/extract/rules-engine.d.ts.map +1 -0
  58. package/dist/extract/rules-engine.js +314 -0
  59. package/dist/extract/rules-engine.js.map +1 -0
  60. package/dist/extract/summarizer.d.ts +27 -0
  61. package/dist/extract/summarizer.d.ts.map +1 -0
  62. package/dist/extract/summarizer.js +148 -0
  63. package/dist/extract/summarizer.js.map +1 -0
  64. package/dist/hooks/session-idle.d.ts +38 -0
  65. package/dist/hooks/session-idle.d.ts.map +1 -0
  66. package/dist/hooks/session-idle.js +142 -0
  67. package/dist/hooks/session-idle.js.map +1 -0
  68. package/dist/hooks/system-transform.d.ts +41 -0
  69. package/dist/hooks/system-transform.d.ts.map +1 -0
  70. package/dist/hooks/system-transform.js +98 -0
  71. package/dist/hooks/system-transform.js.map +1 -0
  72. package/dist/hooks/tool-after.d.ts +66 -0
  73. package/dist/hooks/tool-after.d.ts.map +1 -0
  74. package/dist/hooks/tool-after.js +155 -0
  75. package/dist/hooks/tool-after.js.map +1 -0
  76. package/dist/index.d.ts +10 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +10 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mind.d.ts +69 -0
  81. package/dist/mind.d.ts.map +1 -0
  82. package/dist/mind.js +368 -0
  83. package/dist/mind.js.map +1 -0
  84. package/dist/procedural/index.d.ts +4 -0
  85. package/dist/procedural/index.d.ts.map +1 -0
  86. package/dist/procedural/index.js +4 -0
  87. package/dist/procedural/index.js.map +1 -0
  88. package/dist/procedural/induction.d.ts +23 -0
  89. package/dist/procedural/induction.d.ts.map +1 -0
  90. package/dist/procedural/induction.js +104 -0
  91. package/dist/procedural/induction.js.map +1 -0
  92. package/dist/procedural/miner.d.ts +45 -0
  93. package/dist/procedural/miner.d.ts.map +1 -0
  94. package/dist/procedural/miner.js +171 -0
  95. package/dist/procedural/miner.js.map +1 -0
  96. package/dist/procedural/suggester.d.ts +20 -0
  97. package/dist/procedural/suggester.d.ts.map +1 -0
  98. package/dist/procedural/suggester.js +69 -0
  99. package/dist/procedural/suggester.js.map +1 -0
  100. package/dist/store/archive.d.ts +31 -0
  101. package/dist/store/archive.d.ts.map +1 -0
  102. package/dist/store/archive.js +137 -0
  103. package/dist/store/archive.js.map +1 -0
  104. package/dist/store/backup.d.ts +36 -0
  105. package/dist/store/backup.d.ts.map +1 -0
  106. package/dist/store/backup.js +163 -0
  107. package/dist/store/backup.js.map +1 -0
  108. package/dist/store/memorycards.d.ts +31 -0
  109. package/dist/store/memorycards.d.ts.map +1 -0
  110. package/dist/store/memorycards.js +161 -0
  111. package/dist/store/memorycards.js.map +1 -0
  112. package/dist/store/mv2-adapter.d.ts +29 -0
  113. package/dist/store/mv2-adapter.d.ts.map +1 -0
  114. package/dist/store/mv2-adapter.js +359 -0
  115. package/dist/store/mv2-adapter.js.map +1 -0
  116. package/dist/store/procedures.d.ts +79 -0
  117. package/dist/store/procedures.d.ts.map +1 -0
  118. package/dist/store/procedures.js +183 -0
  119. package/dist/store/procedures.js.map +1 -0
  120. package/dist/store/tombstone.d.ts +27 -0
  121. package/dist/store/tombstone.d.ts.map +1 -0
  122. package/dist/store/tombstone.js +136 -0
  123. package/dist/store/tombstone.js.map +1 -0
  124. package/dist/tools/index.d.ts +36 -0
  125. package/dist/tools/index.d.ts.map +1 -0
  126. package/dist/tools/index.js +236 -0
  127. package/dist/tools/index.js.map +1 -0
  128. package/dist/types.d.ts +301 -0
  129. package/dist/types.d.ts.map +1 -0
  130. package/dist/types.js +69 -0
  131. package/dist/types.js.map +1 -0
  132. package/dist/utils/error.d.ts +57 -0
  133. package/dist/utils/error.d.ts.map +1 -0
  134. package/dist/utils/error.js +143 -0
  135. package/dist/utils/error.js.map +1 -0
  136. package/dist/utils/uuid.d.ts +2 -0
  137. package/dist/utils/uuid.d.ts.map +1 -0
  138. package/dist/utils/uuid.js +5 -0
  139. package/dist/utils/uuid.js.map +1 -0
  140. 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"}