kratos-memory 1.4.1 → 1.5.1

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 (38) hide show
  1. package/README.md +5 -8
  2. package/bin/kratos-cli +3 -0
  3. package/dist/cli/capture-handler.d.ts.map +1 -1
  4. package/dist/cli/capture-handler.js +12 -3
  5. package/dist/cli/capture-handler.js.map +1 -1
  6. package/dist/cli/commands/create.d.ts +5 -0
  7. package/dist/cli/commands/create.d.ts.map +1 -0
  8. package/dist/cli/commands/create.js +42 -0
  9. package/dist/cli/commands/create.js.map +1 -0
  10. package/dist/cli/commands/save.d.ts.map +1 -1
  11. package/dist/cli/commands/save.js +13 -0
  12. package/dist/cli/commands/save.js.map +1 -1
  13. package/dist/cli/commands/status.d.ts.map +1 -1
  14. package/dist/cli/commands/status.js +0 -2
  15. package/dist/cli/commands/status.js.map +1 -1
  16. package/dist/cli/commands/switch.d.ts.map +1 -1
  17. package/dist/cli/commands/switch.js +2 -1
  18. package/dist/cli/commands/switch.js.map +1 -1
  19. package/dist/cli/index.js +11 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/memory-server/database.d.ts +2 -1
  22. package/dist/memory-server/database.d.ts.map +1 -1
  23. package/dist/memory-server/database.js +80 -39
  24. package/dist/memory-server/database.js.map +1 -1
  25. package/dist/project-manager.d.ts +13 -37
  26. package/dist/project-manager.d.ts.map +1 -1
  27. package/dist/project-manager.js +101 -80
  28. package/dist/project-manager.js.map +1 -1
  29. package/package.json +4 -2
  30. package/scripts/ensure-better-sqlite3.mjs +115 -0
  31. package/dist/security/data-retention.d.ts +0 -104
  32. package/dist/security/data-retention.d.ts.map +0 -1
  33. package/dist/security/data-retention.js +0 -444
  34. package/dist/security/data-retention.js.map +0 -1
  35. package/dist/security/encryption.d.ts +0 -48
  36. package/dist/security/encryption.d.ts.map +0 -1
  37. package/dist/security/encryption.js +0 -131
  38. package/dist/security/encryption.js.map +0 -1
@@ -2,56 +2,55 @@ import path from 'path';
2
2
  import fs from 'node:fs';
3
3
  import crypto from 'crypto';
4
4
  /**
5
- * Smart Project Manager - Handles project isolation and auto-detection
6
- * Optimized for CLI: no eager loading, minimal I/O
5
+ * Smart Project Manager - Registry-based project detection
6
+ * No filesystem marker sniffing Kratos remembers where it's been activated.
7
7
  */
8
8
  export class ProjectManager {
9
9
  kratosHome;
10
10
  currentProject = null;
11
- projectsCache = null; // Lazy — only loaded when needed
11
+ projectsCache = null;
12
12
  constructor() {
13
13
  this.kratosHome = path.join(process.env.HOME || process.env.USERPROFILE || '', '.kratos');
14
- // Only mkdir if it doesn't exist (avoid sync I/O when possible)
15
14
  if (!fs.existsSync(this.kratosHome)) {
16
15
  fs.mkdirSync(this.kratosHome, { recursive: true });
17
16
  }
18
- // DON'T load projects cache here — load lazily when needed
19
17
  }
20
18
  /**
21
- * Auto-detect project from current working directory
22
- * Creates a project ID based on the directory path
19
+ * Auto-detect project from current working directory.
20
+ * 1. Check if cwd (or an ancestor) is already a registered kratos project
21
+ * 2. If yes, use the deepest (most specific) match
22
+ * 3. If no, register cwd as a new project
23
23
  */
24
24
  async detectProject(workingDir, options = {}) {
25
25
  const requestedPath = workingDir || process.cwd();
26
26
  const dir = this.resolveRequestedPath(requestedPath);
27
27
  let projectRoot = dir;
28
28
  if (!options.exactPath) {
29
- const strongRoot = this.findNearestStrongProjectRoot(dir);
30
- if (strongRoot) {
31
- projectRoot = strongRoot;
32
- }
33
- else if (this.hasLocalProjectMarker(dir)) {
34
- projectRoot = dir;
29
+ const registered = this.findRegisteredProjectForPath(dir);
30
+ if (registered) {
31
+ projectRoot = registered.root;
35
32
  }
33
+ // No registered project found — projectRoot stays as cwd
36
34
  }
37
35
  projectRoot = this.normalizeProjectPath(projectRoot);
38
36
  const projectId = this.generateProjectId(projectRoot);
39
37
  const projectName = path.basename(projectRoot);
40
- // Check project dir directly on disk — skip loading entire cache
41
38
  const projectDir = this.getProjectDir(projectId);
42
39
  const projectJsonPath = path.join(projectDir, 'project.json');
43
40
  let project;
44
41
  if (fs.existsSync(projectJsonPath)) {
45
- // Known project — read just this one project's metadata
46
42
  const raw = JSON.parse(fs.readFileSync(projectJsonPath, 'utf-8'));
47
43
  project = {
48
44
  ...raw,
49
45
  createdAt: new Date(raw.createdAt),
50
46
  lastAccessed: new Date()
51
47
  };
48
+ // Persist updated lastAccessed
49
+ fs.writeFileSync(projectJsonPath, JSON.stringify(project, null, 2));
50
+ // Keep in-memory cache and projects.json in sync
51
+ this.ensureProjectInCache(project);
52
52
  }
53
53
  else {
54
- // New project
55
54
  project = {
56
55
  id: projectId,
57
56
  name: projectName,
@@ -59,11 +58,8 @@ export class ProjectManager {
59
58
  createdAt: new Date(),
60
59
  lastAccessed: new Date()
61
60
  };
62
- // Create isolated project directory
63
61
  fs.mkdirSync(projectDir, { recursive: true });
64
- // Save project metadata
65
62
  fs.writeFileSync(projectJsonPath, JSON.stringify(project, null, 2));
66
- // Update the global projects cache file (append this project)
67
63
  this.ensureProjectInCache(project);
68
64
  }
69
65
  this.currentProject = project;
@@ -73,16 +69,18 @@ export class ProjectManager {
73
69
  * Switch to a different project
74
70
  */
75
71
  async switchProject(projectIdOrPath) {
76
- // Check if it's a project ID — look in cache
77
72
  const cache = this.getProjectsCache();
78
73
  let project = cache.get(projectIdOrPath);
79
74
  if (!project) {
80
75
  const normalizedTarget = projectIdOrPath.trim().toLowerCase();
81
- // Allow switching by human-readable project name from `kratos status`
82
- project = Array.from(cache.values()).find(candidate => candidate.name.toLowerCase() === normalizedTarget);
76
+ const matches = Array.from(cache.values()).filter(candidate => candidate.name.toLowerCase() === normalizedTarget);
77
+ if (matches.length > 1) {
78
+ const roots = matches.map(m => ` ${m.id} → ${m.root}`).join('\n');
79
+ throw new Error(`Ambiguous project name "${projectIdOrPath}". Multiple matches:\n${roots}\nUse the project ID or path instead.`);
80
+ }
81
+ project = matches[0] || undefined;
83
82
  }
84
83
  if (!project) {
85
- // Maybe it's a path
86
84
  if (fs.existsSync(projectIdOrPath)) {
87
85
  project = await this.detectProject(projectIdOrPath, { exactPath: true });
88
86
  }
@@ -96,9 +94,34 @@ export class ProjectManager {
96
94
  return project;
97
95
  }
98
96
  /**
99
- * Get the isolated directory for a project
100
- * This is where ALL project data lives - memories, concepts, etc.
97
+ * Find the deepest registered project whose root contains dir.
98
+ * $HOME and / are exact-match only they never swallow subdirectories.
101
99
  */
100
+ findRegisteredProjectForPath(dir) {
101
+ const homeDir = this.normalizeProjectPath(process.env.HOME || process.env.USERPROFILE || '');
102
+ const cache = this.getProjectsCache();
103
+ let best = null;
104
+ let bestLen = -1;
105
+ for (const project of cache.values()) {
106
+ const root = project.root;
107
+ // $HOME and / are exact-match only
108
+ if (root === homeDir || root === '/') {
109
+ if (dir === root && root.length > bestLen) {
110
+ best = project;
111
+ bestLen = root.length;
112
+ }
113
+ continue;
114
+ }
115
+ // Check if dir is equal to or a descendant of this project root
116
+ if (dir === root || dir.startsWith(root + path.sep)) {
117
+ if (root.length > bestLen) {
118
+ best = project;
119
+ bestLen = root.length;
120
+ }
121
+ }
122
+ }
123
+ return best;
124
+ }
102
125
  getProjectDir(projectId) {
103
126
  const id = projectId || this.currentProject?.id;
104
127
  if (!id) {
@@ -106,30 +129,17 @@ export class ProjectManager {
106
129
  }
107
130
  return path.join(this.kratosHome, 'projects', id);
108
131
  }
109
- /**
110
- * Get database path for current project
111
- * COMPLETELY ISOLATED - no cross-contamination possible
112
- */
113
132
  getDatabasePath(dbName) {
114
133
  const projectDir = this.getProjectDir();
115
134
  return path.join(projectDir, 'databases', `${dbName}.db`);
116
135
  }
117
- /**
118
- * List all known projects (loads cache on first call)
119
- */
120
136
  listProjects() {
121
137
  return Array.from(this.getProjectsCache().values())
122
138
  .sort((a, b) => b.lastAccessed.getTime() - a.lastAccessed.getTime());
123
139
  }
124
- /**
125
- * Get current active project
126
- */
127
140
  getCurrentProject() {
128
141
  return this.currentProject;
129
142
  }
130
- /**
131
- * Clean up old project data (optional)
132
- */
133
143
  async cleanupProject(projectId, options = {}) {
134
144
  const projectDir = this.getProjectDir(projectId);
135
145
  if (!options.keepMemories) {
@@ -145,12 +155,9 @@ export class ProjectManager {
145
155
  }
146
156
  }
147
157
  }
148
- /**
149
- * Generate stable project ID from path
150
- */
151
158
  generateProjectId(projectPath) {
152
- // Use hash of normalized path for stable ID
153
- const normalized = this.normalizeProjectPath(projectPath).toLowerCase();
159
+ // Don't lowercase preserve case sensitivity for filesystems that distinguish it
160
+ const normalized = this.normalizeProjectPath(projectPath);
154
161
  const hash = crypto.createHash('sha256').update(normalized).digest('hex');
155
162
  return `proj_${hash.substring(0, 12)}`;
156
163
  }
@@ -172,33 +179,16 @@ export class ProjectManager {
172
179
  return normalized;
173
180
  }
174
181
  }
175
- findNearestStrongProjectRoot(dir) {
176
- let currentDir = dir;
177
- while (currentDir !== path.dirname(currentDir)) {
178
- if (this.hasStrongProjectMarker(currentDir)) {
179
- return currentDir;
180
- }
181
- currentDir = path.dirname(currentDir);
182
- }
183
- if (this.hasStrongProjectMarker(currentDir)) {
184
- return currentDir;
185
- }
186
- return null;
187
- }
188
- hasStrongProjectMarker(dir) {
189
- return ['.git', '.kratos'].some(marker => fs.existsSync(path.join(dir, marker)));
190
- }
191
- hasLocalProjectMarker(dir) {
192
- return ['package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml'].some(marker => fs.existsSync(path.join(dir, marker)));
193
- }
194
182
  /**
195
- * Get projects cache — lazy loaded on first access
183
+ * Get projects cache — lazy loaded on first access.
184
+ * If projects.json is corrupted, rebuild from individual project.json files.
196
185
  */
197
186
  getProjectsCache() {
198
187
  if (this.projectsCache)
199
188
  return this.projectsCache;
200
189
  this.projectsCache = new Map();
201
190
  const cacheFile = path.join(this.kratosHome, 'projects.json');
191
+ let loaded = false;
202
192
  if (fs.existsSync(cacheFile)) {
203
193
  try {
204
194
  const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
@@ -209,17 +199,51 @@ export class ProjectManager {
209
199
  lastAccessed: new Date(project.lastAccessed)
210
200
  });
211
201
  }
202
+ loaded = true;
212
203
  }
213
204
  catch {
214
- // Corrupted cache start fresh
205
+ // Corrupted — fall through to rebuild
215
206
  }
216
207
  }
208
+ if (!loaded) {
209
+ this.rebuildCacheFromDisk();
210
+ }
217
211
  return this.projectsCache;
218
212
  }
219
213
  /**
220
- * Ensure a single project is registered in the global cache file
221
- * (append without loading all projects into memory)
214
+ * Rebuild projects.json by scanning per-project metadata files on disk
222
215
  */
216
+ rebuildCacheFromDisk() {
217
+ const projectsDir = path.join(this.kratosHome, 'projects');
218
+ if (!fs.existsSync(projectsDir))
219
+ return;
220
+ try {
221
+ const entries = fs.readdirSync(projectsDir, { withFileTypes: true });
222
+ for (const entry of entries) {
223
+ if (!entry.isDirectory())
224
+ continue;
225
+ const pjPath = path.join(projectsDir, entry.name, 'project.json');
226
+ if (!fs.existsSync(pjPath))
227
+ continue;
228
+ try {
229
+ const raw = JSON.parse(fs.readFileSync(pjPath, 'utf-8'));
230
+ this.projectsCache.set(raw.id, {
231
+ ...raw,
232
+ createdAt: new Date(raw.createdAt),
233
+ lastAccessed: new Date(raw.lastAccessed)
234
+ });
235
+ }
236
+ catch {
237
+ // Skip corrupted individual project
238
+ }
239
+ }
240
+ }
241
+ catch {
242
+ // projectsDir unreadable — nothing to rebuild
243
+ }
244
+ // Persist the rebuilt cache
245
+ this.saveProjectsCache();
246
+ }
223
247
  ensureProjectInCache(project) {
224
248
  const cacheFile = path.join(this.kratosHome, 'projects.json');
225
249
  let cache = { projects: [], lastUpdated: new Date() };
@@ -231,16 +255,20 @@ export class ProjectManager {
231
255
  // Corrupted — start fresh
232
256
  }
233
257
  }
234
- // Only add if not already there
235
- if (!cache.projects.some((p) => p.id === project.id)) {
258
+ const idx = cache.projects.findIndex((p) => p.id === project.id);
259
+ if (idx >= 0) {
260
+ cache.projects[idx] = project;
261
+ }
262
+ else {
236
263
  cache.projects.push(project);
237
- cache.lastUpdated = new Date();
238
- fs.writeFileSync(cacheFile, JSON.stringify(cache, null, 2));
264
+ }
265
+ cache.lastUpdated = new Date();
266
+ fs.writeFileSync(cacheFile, JSON.stringify(cache, null, 2));
267
+ // Also update in-memory cache if loaded
268
+ if (this.projectsCache) {
269
+ this.projectsCache.set(project.id, project);
239
270
  }
240
271
  }
241
- /**
242
- * Save projects cache to disk
243
- */
244
272
  saveProjectsCache() {
245
273
  const cacheFile = path.join(this.kratosHome, 'projects.json');
246
274
  const cache = {
@@ -254,19 +282,12 @@ export class ProjectManager {
254
282
  // Silently fail — non-critical
255
283
  }
256
284
  }
257
- /**
258
- * Get current Kratos home directory
259
- */
260
285
  getKratosHome() {
261
286
  return this.kratosHome;
262
287
  }
263
- /**
264
- * Dynamically update Kratos home directory
265
- */
266
288
  async updateKratosHome(newPath) {
267
289
  this.kratosHome = newPath;
268
290
  fs.mkdirSync(this.kratosHome, { recursive: true });
269
- // Reset cache so it reloads from new location
270
291
  this.projectsCache = null;
271
292
  }
272
293
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project-manager.js","sourceRoot":"","sources":["../src/project-manager.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAU5B;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,UAAU,CAAS;IACnB,cAAc,GAAmB,IAAI,CAAC;IACtC,aAAa,GAAgC,IAAI,CAAC,CAAC,iCAAiC;IAE5F;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAC1F,gEAAgE;QAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,2DAA2D;IAC7D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,UAAmB,EAAE,UAErC,EAAE;QACJ,MAAM,aAAa,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,WAAW,GAAG,GAAG,CAAC;QAEtB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,GAAG,UAAU,CAAC;YAC3B,CAAC;iBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3C,WAAW,GAAG,GAAG,CAAC;YACpB,CAAC;QACH,CAAC;QAED,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE/C,iEAAiE;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,OAAgB,CAAC;QAErB,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,wDAAwD;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,OAAO,GAAG;gBACR,GAAG,GAAG;gBACN,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAClC,YAAY,EAAE,IAAI,IAAI,EAAE;aACzB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc;YACd,OAAO,GAAG;gBACR,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,YAAY,EAAE,IAAI,IAAI,EAAE;aACzB,CAAC;YAEF,oCAAoC;YACpC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9C,wBAAwB;YACxB,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEpE,8DAA8D;YAC9D,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,eAAuB;QACzC,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE9D,sEAAsE;YACtE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CACpD,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAClD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,oBAAoB;YACpB,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,sBAAsB,eAAe,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,SAAkB;QAC9B,MAAM,EAAE,GAAG,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,MAAc;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,CAAC;aAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,UAGpC,EAAE;QACJ,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEjD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YACrE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YACrE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,WAAmB;QAC3C,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1E,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;IAEO,oBAAoB,CAAC,WAAmB;QAC9C,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,WAAmB;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,4BAA4B,CAAC,GAAW;QAC9C,IAAI,UAAU,GAAG,GAAG,CAAC;QACrB,OAAO,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,sBAAsB,CAAC,GAAW;QACxC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAEO,qBAAqB,CAAC,GAAW;QACvC,OAAO,CAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC9E,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAElD,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE9D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;oBAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;wBACjC,GAAG,OAAO;wBACV,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;wBACtC,YAAY,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;qBAC7C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,OAAgB;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC9D,IAAI,KAAK,GAA2C,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAE9F,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG;YACZ,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,CAAC;YACtD,WAAW,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;QAEF,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnD,8CAA8C;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"project-manager.js","sourceRoot":"","sources":["../src/project-manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kratos-memory",
3
- "version": "1.4.1",
4
- "description": "Persistent memory for AI coding agents — CLI-first, encrypted, local",
3
+ "version": "1.5.1",
4
+ "description": "Persistent memory for AI coding agents — CLI-first, local, zero network calls",
5
5
  "main": "dist/cli/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -17,6 +17,7 @@
17
17
  "dev": "tsx src/cli/index.ts",
18
18
  "start": "node dist/cli/index.js",
19
19
  "test": "npm run build && node --test tests/*.test.mjs",
20
+ "postinstall": "node ./scripts/ensure-better-sqlite3.mjs",
20
21
  "prepublishOnly": "npm run build"
21
22
  },
22
23
  "keywords": [
@@ -52,6 +53,7 @@
52
53
  "files": [
53
54
  "dist/**/*",
54
55
  "bin/**/*",
56
+ "scripts/**/*",
55
57
  "README.md",
56
58
  "LICENSE",
57
59
  "AGENTS.md"
@@ -0,0 +1,115 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, rmSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createRequire } from 'node:module';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const packageRoot = path.resolve(__dirname, '..');
10
+ const requireFromPackage = createRequire(path.join(packageRoot, 'package.json'));
11
+
12
+ function resolveBetterSqlite3Dir() {
13
+ const pkgPath = requireFromPackage.resolve('better-sqlite3/package.json');
14
+ return path.dirname(pkgPath);
15
+ }
16
+
17
+ function getBinaryPath(moduleDir) {
18
+ return path.join(moduleDir, 'build', 'Release', 'better_sqlite3.node');
19
+ }
20
+
21
+ function canLoadBetterSqlite3(moduleDir) {
22
+ if (!existsSync(getBinaryPath(moduleDir))) {
23
+ return false;
24
+ }
25
+
26
+ const script = `
27
+ const { createRequire } = require('node:module');
28
+ const req = createRequire(${JSON.stringify(path.join(packageRoot, 'package.json'))});
29
+ req('better-sqlite3');
30
+ `;
31
+
32
+ const result = spawnSync(process.execPath, ['-e', script], {
33
+ cwd: packageRoot,
34
+ env: process.env,
35
+ encoding: 'utf8',
36
+ stdio: 'pipe',
37
+ });
38
+
39
+ return result.status === 0;
40
+ }
41
+
42
+ function runCommand(command, args, cwd) {
43
+ return spawnSync(command, args, {
44
+ cwd,
45
+ env: {
46
+ ...process.env,
47
+ npm_config_loglevel: process.env.npm_config_loglevel || 'error',
48
+ },
49
+ encoding: 'utf8',
50
+ stdio: 'pipe',
51
+ });
52
+ }
53
+
54
+ function findNpmCommand() {
55
+ if (process.env.npm_execpath) {
56
+ return {
57
+ command: process.execPath,
58
+ argsPrefix: [process.env.npm_execpath],
59
+ };
60
+ }
61
+
62
+ return {
63
+ command: process.platform === 'win32' ? 'npm.cmd' : 'npm',
64
+ argsPrefix: [],
65
+ };
66
+ }
67
+
68
+ function formatOutput(result) {
69
+ const chunks = [result.stdout?.trim(), result.stderr?.trim()].filter(Boolean);
70
+ return chunks.join('\n');
71
+ }
72
+
73
+ export function ensureBetterSqlite3() {
74
+ let moduleDir;
75
+
76
+ try {
77
+ moduleDir = resolveBetterSqlite3Dir();
78
+ } catch (error) {
79
+ console.warn('[kratos-memory] better-sqlite3 is not installed yet:', error.message);
80
+ return;
81
+ }
82
+
83
+ if (canLoadBetterSqlite3(moduleDir)) {
84
+ return;
85
+ }
86
+
87
+ const binaryPath = getBinaryPath(moduleDir);
88
+ console.warn(`[kratos-memory] better-sqlite3 binary missing or unloadable at ${binaryPath}`);
89
+ console.warn('[kratos-memory] rebuilding better-sqlite3 from source...');
90
+
91
+ rmSync(path.join(moduleDir, 'build'), { recursive: true, force: true });
92
+
93
+ const npm = findNpmCommand();
94
+ const rebuild = runCommand(
95
+ npm.command,
96
+ [...npm.argsPrefix, 'run', 'build-release', '--foreground-scripts'],
97
+ moduleDir
98
+ );
99
+
100
+ if (canLoadBetterSqlite3(moduleDir)) {
101
+ console.warn('[kratos-memory] better-sqlite3 rebuild succeeded.');
102
+ return;
103
+ }
104
+
105
+ const detail = formatOutput(rebuild);
106
+ throw new Error(
107
+ detail
108
+ ? `Failed to build better-sqlite3.\n${detail}`
109
+ : 'Failed to build better-sqlite3.'
110
+ );
111
+ }
112
+
113
+ if (process.argv[1] === __filename) {
114
+ ensureBetterSqlite3();
115
+ }
@@ -1,104 +0,0 @@
1
- export interface RetentionPolicy {
2
- id: string;
3
- name: string;
4
- description: string;
5
- retentionDays: number;
6
- archiveAfterDays?: number;
7
- deleteAfterDays: number;
8
- tags?: string[];
9
- importance?: number;
10
- createdAt: Date;
11
- }
12
- export interface DeletionRequest {
13
- id: string;
14
- projectId: string;
15
- userId: string;
16
- targetType: 'memory' | 'project' | 'user';
17
- targetId: string;
18
- reason: string;
19
- scheduledAt: Date;
20
- executedAt?: Date;
21
- status: 'pending' | 'completed' | 'failed';
22
- }
23
- export interface ArchiveEntry {
24
- id: string;
25
- projectId: string;
26
- memoryId: string;
27
- encryptedData: string;
28
- archivedAt: Date;
29
- expiresAt: Date;
30
- }
31
- /**
32
- * Data retention and deletion management
33
- */
34
- export declare class DataRetentionManager {
35
- private db;
36
- private archiveDb;
37
- private encryption;
38
- private projectId;
39
- private policies;
40
- constructor(projectRoot: string, projectId: string);
41
- /**
42
- * Initialize archive database
43
- */
44
- private initializeArchiveDb;
45
- /**
46
- * Load retention policies
47
- */
48
- private loadPolicies;
49
- /**
50
- * Apply retention policy
51
- */
52
- applyPolicy(memoryId: string, policyId?: string): void;
53
- /**
54
- * Archive old memories
55
- */
56
- archiveOldMemories(): Promise<number>;
57
- /**
58
- * Archive a single memory
59
- */
60
- private archiveMemory;
61
- /**
62
- * Restore from archive
63
- */
64
- restoreFromArchive(memoryId: string): Promise<boolean>;
65
- /**
66
- * Delete data permanently (GDPR right to erasure)
67
- */
68
- deleteData(request: {
69
- targetType: 'memory' | 'project' | 'user';
70
- targetId: string;
71
- userId: string;
72
- reason: string;
73
- }): Promise<void>;
74
- /**
75
- * Delete a single memory
76
- */
77
- private deleteMemory;
78
- /**
79
- * Delete entire project
80
- */
81
- private deleteProject;
82
- /**
83
- * Delete all user data (GDPR)
84
- */
85
- private deleteUserData;
86
- /**
87
- * Export data for GDPR compliance
88
- */
89
- exportUserData(userId: string): Promise<string>;
90
- /**
91
- * Start background cleanup scheduler
92
- */
93
- private startCleanupScheduler;
94
- /**
95
- * Run cleanup tasks
96
- */
97
- private runCleanup;
98
- /**
99
- * Get retention statistics
100
- */
101
- getStats(): any;
102
- close(): void;
103
- }
104
- //# sourceMappingURL=data-retention.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-retention.d.ts","sourceRoot":"","sources":["../../src/security/data-retention.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAA2C;gBAE/C,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAuBlD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAgDpB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,IAAI;IAqBjE;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAqC3C;;OAEG;YACW,aAAa;IAuC3B;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6C5D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE;QACxB,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QAC1C,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjB;;OAEG;YACW,YAAY;IAwB1B;;OAEG;YACW,aAAa;IAuB3B;;OAEG;YACW,cAAc;IAa5B;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoErD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;YACW,UAAU;IAyCxB;;OAEG;IACH,QAAQ,IAAI,GAAG;IAqBf,KAAK,IAAI,IAAI;CAId"}