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.
- package/README.md +5 -8
- package/bin/kratos-cli +3 -0
- package/dist/cli/capture-handler.d.ts.map +1 -1
- package/dist/cli/capture-handler.js +12 -3
- package/dist/cli/capture-handler.js.map +1 -1
- package/dist/cli/commands/create.d.ts +5 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +42 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/save.d.ts.map +1 -1
- package/dist/cli/commands/save.js +13 -0
- package/dist/cli/commands/save.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +0 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/switch.d.ts.map +1 -1
- package/dist/cli/commands/switch.js +2 -1
- package/dist/cli/commands/switch.js.map +1 -1
- package/dist/cli/index.js +11 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/memory-server/database.d.ts +2 -1
- package/dist/memory-server/database.d.ts.map +1 -1
- package/dist/memory-server/database.js +80 -39
- package/dist/memory-server/database.js.map +1 -1
- package/dist/project-manager.d.ts +13 -37
- package/dist/project-manager.d.ts.map +1 -1
- package/dist/project-manager.js +101 -80
- package/dist/project-manager.js.map +1 -1
- package/package.json +4 -2
- package/scripts/ensure-better-sqlite3.mjs +115 -0
- package/dist/security/data-retention.d.ts +0 -104
- package/dist/security/data-retention.d.ts.map +0 -1
- package/dist/security/data-retention.js +0 -444
- package/dist/security/data-retention.js.map +0 -1
- package/dist/security/encryption.d.ts +0 -48
- package/dist/security/encryption.d.ts.map +0 -1
- package/dist/security/encryption.js +0 -131
- package/dist/security/encryption.js.map +0 -1
package/dist/project-manager.js
CHANGED
|
@@ -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 -
|
|
6
|
-
*
|
|
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;
|
|
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
|
-
*
|
|
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
|
|
30
|
-
if (
|
|
31
|
-
projectRoot =
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
*
|
|
100
|
-
*
|
|
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
|
-
//
|
|
153
|
-
const normalized = this.normalizeProjectPath(projectPath)
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
235
|
-
if (
|
|
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
|
-
|
|
238
|
-
|
|
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
|
|
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
|
-
"description": "Persistent memory for AI coding agents — CLI-first,
|
|
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"}
|