kratos-memory 1.4.0 → 1.5.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/README.md +5 -8
- 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 -34
- package/dist/project-manager.d.ts.map +1 -1
- package/dist/project-manager.js +101 -70
- package/dist/project-manager.js.map +1 -1
- package/package.json +3 -2
- 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,65 +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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
let currentDir = dir;
|
|
33
|
-
while (currentDir !== path.dirname(currentDir)) {
|
|
34
|
-
for (const marker of markers) {
|
|
35
|
-
if (fs.existsSync(path.join(currentDir, marker))) {
|
|
36
|
-
projectRoot = currentDir;
|
|
37
|
-
found = true;
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (found)
|
|
42
|
-
break;
|
|
43
|
-
currentDir = path.dirname(currentDir);
|
|
29
|
+
const registered = this.findRegisteredProjectForPath(dir);
|
|
30
|
+
if (registered) {
|
|
31
|
+
projectRoot = registered.root;
|
|
44
32
|
}
|
|
33
|
+
// No registered project found — projectRoot stays as cwd
|
|
45
34
|
}
|
|
46
35
|
projectRoot = this.normalizeProjectPath(projectRoot);
|
|
47
36
|
const projectId = this.generateProjectId(projectRoot);
|
|
48
37
|
const projectName = path.basename(projectRoot);
|
|
49
|
-
// Check project dir directly on disk — skip loading entire cache
|
|
50
38
|
const projectDir = this.getProjectDir(projectId);
|
|
51
39
|
const projectJsonPath = path.join(projectDir, 'project.json');
|
|
52
40
|
let project;
|
|
53
41
|
if (fs.existsSync(projectJsonPath)) {
|
|
54
|
-
// Known project — read just this one project's metadata
|
|
55
42
|
const raw = JSON.parse(fs.readFileSync(projectJsonPath, 'utf-8'));
|
|
56
43
|
project = {
|
|
57
44
|
...raw,
|
|
58
45
|
createdAt: new Date(raw.createdAt),
|
|
59
46
|
lastAccessed: new Date()
|
|
60
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);
|
|
61
52
|
}
|
|
62
53
|
else {
|
|
63
|
-
// New project
|
|
64
54
|
project = {
|
|
65
55
|
id: projectId,
|
|
66
56
|
name: projectName,
|
|
@@ -68,11 +58,8 @@ export class ProjectManager {
|
|
|
68
58
|
createdAt: new Date(),
|
|
69
59
|
lastAccessed: new Date()
|
|
70
60
|
};
|
|
71
|
-
// Create isolated project directory
|
|
72
61
|
fs.mkdirSync(projectDir, { recursive: true });
|
|
73
|
-
// Save project metadata
|
|
74
62
|
fs.writeFileSync(projectJsonPath, JSON.stringify(project, null, 2));
|
|
75
|
-
// Update the global projects cache file (append this project)
|
|
76
63
|
this.ensureProjectInCache(project);
|
|
77
64
|
}
|
|
78
65
|
this.currentProject = project;
|
|
@@ -82,16 +69,18 @@ export class ProjectManager {
|
|
|
82
69
|
* Switch to a different project
|
|
83
70
|
*/
|
|
84
71
|
async switchProject(projectIdOrPath) {
|
|
85
|
-
// Check if it's a project ID — look in cache
|
|
86
72
|
const cache = this.getProjectsCache();
|
|
87
73
|
let project = cache.get(projectIdOrPath);
|
|
88
74
|
if (!project) {
|
|
89
75
|
const normalizedTarget = projectIdOrPath.trim().toLowerCase();
|
|
90
|
-
|
|
91
|
-
|
|
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;
|
|
92
82
|
}
|
|
93
83
|
if (!project) {
|
|
94
|
-
// Maybe it's a path
|
|
95
84
|
if (fs.existsSync(projectIdOrPath)) {
|
|
96
85
|
project = await this.detectProject(projectIdOrPath, { exactPath: true });
|
|
97
86
|
}
|
|
@@ -105,9 +94,34 @@ export class ProjectManager {
|
|
|
105
94
|
return project;
|
|
106
95
|
}
|
|
107
96
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
97
|
+
* Find the deepest registered project whose root contains dir.
|
|
98
|
+
* $HOME and / are exact-match only — they never swallow subdirectories.
|
|
110
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
|
+
}
|
|
111
125
|
getProjectDir(projectId) {
|
|
112
126
|
const id = projectId || this.currentProject?.id;
|
|
113
127
|
if (!id) {
|
|
@@ -115,30 +129,17 @@ export class ProjectManager {
|
|
|
115
129
|
}
|
|
116
130
|
return path.join(this.kratosHome, 'projects', id);
|
|
117
131
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Get database path for current project
|
|
120
|
-
* COMPLETELY ISOLATED - no cross-contamination possible
|
|
121
|
-
*/
|
|
122
132
|
getDatabasePath(dbName) {
|
|
123
133
|
const projectDir = this.getProjectDir();
|
|
124
134
|
return path.join(projectDir, 'databases', `${dbName}.db`);
|
|
125
135
|
}
|
|
126
|
-
/**
|
|
127
|
-
* List all known projects (loads cache on first call)
|
|
128
|
-
*/
|
|
129
136
|
listProjects() {
|
|
130
137
|
return Array.from(this.getProjectsCache().values())
|
|
131
138
|
.sort((a, b) => b.lastAccessed.getTime() - a.lastAccessed.getTime());
|
|
132
139
|
}
|
|
133
|
-
/**
|
|
134
|
-
* Get current active project
|
|
135
|
-
*/
|
|
136
140
|
getCurrentProject() {
|
|
137
141
|
return this.currentProject;
|
|
138
142
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Clean up old project data (optional)
|
|
141
|
-
*/
|
|
142
143
|
async cleanupProject(projectId, options = {}) {
|
|
143
144
|
const projectDir = this.getProjectDir(projectId);
|
|
144
145
|
if (!options.keepMemories) {
|
|
@@ -154,12 +155,9 @@ export class ProjectManager {
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Generate stable project ID from path
|
|
159
|
-
*/
|
|
160
158
|
generateProjectId(projectPath) {
|
|
161
|
-
//
|
|
162
|
-
const normalized = this.normalizeProjectPath(projectPath)
|
|
159
|
+
// Don't lowercase — preserve case sensitivity for filesystems that distinguish it
|
|
160
|
+
const normalized = this.normalizeProjectPath(projectPath);
|
|
163
161
|
const hash = crypto.createHash('sha256').update(normalized).digest('hex');
|
|
164
162
|
return `proj_${hash.substring(0, 12)}`;
|
|
165
163
|
}
|
|
@@ -182,13 +180,15 @@ export class ProjectManager {
|
|
|
182
180
|
}
|
|
183
181
|
}
|
|
184
182
|
/**
|
|
185
|
-
* 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.
|
|
186
185
|
*/
|
|
187
186
|
getProjectsCache() {
|
|
188
187
|
if (this.projectsCache)
|
|
189
188
|
return this.projectsCache;
|
|
190
189
|
this.projectsCache = new Map();
|
|
191
190
|
const cacheFile = path.join(this.kratosHome, 'projects.json');
|
|
191
|
+
let loaded = false;
|
|
192
192
|
if (fs.existsSync(cacheFile)) {
|
|
193
193
|
try {
|
|
194
194
|
const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
|
|
@@ -199,17 +199,51 @@ export class ProjectManager {
|
|
|
199
199
|
lastAccessed: new Date(project.lastAccessed)
|
|
200
200
|
});
|
|
201
201
|
}
|
|
202
|
+
loaded = true;
|
|
202
203
|
}
|
|
203
204
|
catch {
|
|
204
|
-
// Corrupted
|
|
205
|
+
// Corrupted — fall through to rebuild
|
|
205
206
|
}
|
|
206
207
|
}
|
|
208
|
+
if (!loaded) {
|
|
209
|
+
this.rebuildCacheFromDisk();
|
|
210
|
+
}
|
|
207
211
|
return this.projectsCache;
|
|
208
212
|
}
|
|
209
213
|
/**
|
|
210
|
-
*
|
|
211
|
-
* (append without loading all projects into memory)
|
|
214
|
+
* Rebuild projects.json by scanning per-project metadata files on disk
|
|
212
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
|
+
}
|
|
213
247
|
ensureProjectInCache(project) {
|
|
214
248
|
const cacheFile = path.join(this.kratosHome, 'projects.json');
|
|
215
249
|
let cache = { projects: [], lastUpdated: new Date() };
|
|
@@ -221,16 +255,20 @@ export class ProjectManager {
|
|
|
221
255
|
// Corrupted — start fresh
|
|
222
256
|
}
|
|
223
257
|
}
|
|
224
|
-
|
|
225
|
-
if (
|
|
258
|
+
const idx = cache.projects.findIndex((p) => p.id === project.id);
|
|
259
|
+
if (idx >= 0) {
|
|
260
|
+
cache.projects[idx] = project;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
226
263
|
cache.projects.push(project);
|
|
227
|
-
|
|
228
|
-
|
|
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);
|
|
229
270
|
}
|
|
230
271
|
}
|
|
231
|
-
/**
|
|
232
|
-
* Save projects cache to disk
|
|
233
|
-
*/
|
|
234
272
|
saveProjectsCache() {
|
|
235
273
|
const cacheFile = path.join(this.kratosHome, 'projects.json');
|
|
236
274
|
const cache = {
|
|
@@ -244,19 +282,12 @@ export class ProjectManager {
|
|
|
244
282
|
// Silently fail — non-critical
|
|
245
283
|
}
|
|
246
284
|
}
|
|
247
|
-
/**
|
|
248
|
-
* Get current Kratos home directory
|
|
249
|
-
*/
|
|
250
285
|
getKratosHome() {
|
|
251
286
|
return this.kratosHome;
|
|
252
287
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Dynamically update Kratos home directory
|
|
255
|
-
*/
|
|
256
288
|
async updateKratosHome(newPath) {
|
|
257
289
|
this.kratosHome = newPath;
|
|
258
290
|
fs.mkdirSync(this.kratosHome, { recursive: true });
|
|
259
|
-
// Reset cache so it reloads from new location
|
|
260
291
|
this.projectsCache = null;
|
|
261
292
|
}
|
|
262
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":"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;IAE1D;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,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;IACH,CAAC;IAED;;;;;OAKG;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,IAAI,CAAC;YAChC,CAAC;YACD,yDAAyD;QAC3D,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,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,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;YACF,+BAA+B;YAC/B,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACpE,iDAAiD;YACjD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,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,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACpE,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,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;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAC5D,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAClD,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,2BAA2B,eAAe,yBAAyB,KAAK,uCAAuC,CAAC,CAAC;YACnI,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,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;IACK,4BAA4B,CAAC,GAAW;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,IAAI,GAAmB,IAAI,CAAC;QAChC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QAEjB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAE1B,mCAAmC;YACnC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACrC,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBAC1C,IAAI,GAAG,OAAO,CAAC;oBACf,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;gBACxB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,gEAAgE;YAChE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpD,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBAC1B,IAAI,GAAG,OAAO,CAAC;oBACf,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,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,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,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,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,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;IAEO,iBAAiB,CAAC,WAAmB;QAC3C,kFAAkF;QAClF,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC1D,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;IAED;;;OAGG;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,MAAM,GAAG,KAAK,CAAC;QACnB,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;gBACD,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO;QAExC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAAE,SAAS;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACrC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBACzD,IAAI,CAAC,aAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;wBAC9B,GAAG,GAAG;wBACN,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;wBAClC,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;qBACzC,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,oCAAoC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,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,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,wCAAwC;QACxC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,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,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,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;QACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF"}
|
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.0",
|
|
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": "npm rebuild better-sqlite3 || exit 0",
|
|
20
21
|
"prepublishOnly": "npm run build"
|
|
21
22
|
},
|
|
22
23
|
"keywords": [
|
|
@@ -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"}
|