kimi-code-memory-mcp-server 0.1.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 (74) hide show
  1. package/AGENTS.md +144 -0
  2. package/CHANGELOG.md +26 -0
  3. package/LICENSE +21 -0
  4. package/README.md +227 -0
  5. package/README.zh-CN.md +227 -0
  6. package/dist/config.d.ts +36 -0
  7. package/dist/config.js +63 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/context/wire-context.d.ts +171 -0
  10. package/dist/context/wire-context.js +586 -0
  11. package/dist/context/wire-context.js.map +1 -0
  12. package/dist/dao/index.d.ts +76 -0
  13. package/dist/dao/index.js +490 -0
  14. package/dist/dao/index.js.map +1 -0
  15. package/dist/dao/memory-store.d.ts +24 -0
  16. package/dist/dao/memory-store.js +112 -0
  17. package/dist/dao/memory-store.js.map +1 -0
  18. package/dist/refined-manager.d.ts +70 -0
  19. package/dist/refined-manager.js +369 -0
  20. package/dist/refined-manager.js.map +1 -0
  21. package/dist/server.d.ts +8 -0
  22. package/dist/server.js +71 -0
  23. package/dist/server.js.map +1 -0
  24. package/dist/theme-manager.d.ts +40 -0
  25. package/dist/theme-manager.js +88 -0
  26. package/dist/theme-manager.js.map +1 -0
  27. package/dist/tools/context-tools.d.ts +56 -0
  28. package/dist/tools/context-tools.js +332 -0
  29. package/dist/tools/context-tools.js.map +1 -0
  30. package/dist/tools/index.d.ts +835 -0
  31. package/dist/tools/index.js +370 -0
  32. package/dist/tools/index.js.map +1 -0
  33. package/dist/tools/memory-tools.d.ts +62 -0
  34. package/dist/tools/memory-tools.js +292 -0
  35. package/dist/tools/memory-tools.js.map +1 -0
  36. package/dist/tools/system-tools.d.ts +37 -0
  37. package/dist/tools/system-tools.js +195 -0
  38. package/dist/tools/system-tools.js.map +1 -0
  39. package/dist/tools/theme-tools.d.ts +34 -0
  40. package/dist/tools/theme-tools.js +186 -0
  41. package/dist/tools/theme-tools.js.map +1 -0
  42. package/dist/types.d.ts +93 -0
  43. package/dist/types.js +5 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/utils/frontmatter.d.ts +10 -0
  46. package/dist/utils/frontmatter.js +61 -0
  47. package/dist/utils/frontmatter.js.map +1 -0
  48. package/dist/utils/mutex.d.ts +11 -0
  49. package/dist/utils/mutex.js +17 -0
  50. package/dist/utils/mutex.js.map +1 -0
  51. package/dist/utils/paths.d.ts +19 -0
  52. package/dist/utils/paths.js +54 -0
  53. package/dist/utils/paths.js.map +1 -0
  54. package/dist/utils/validation.d.ts +15 -0
  55. package/dist/utils/validation.js +40 -0
  56. package/dist/utils/validation.js.map +1 -0
  57. package/dist/version.d.ts +9 -0
  58. package/dist/version.js +10 -0
  59. package/dist/version.js.map +1 -0
  60. package/docs/ARCHITECTURE.md +144 -0
  61. package/docs/CONTRIBUTING.md +83 -0
  62. package/docs/CONTRIBUTING.zh-CN.md +83 -0
  63. package/docs/search-logic.md +157 -0
  64. package/docs/search-logic.zh-CN.md +157 -0
  65. package/examples/README.md +34 -0
  66. package/examples/sample-workspace/essence/essence.md +26 -0
  67. package/examples/sample-workspace/index.json +36 -0
  68. package/examples/sample-workspace/memory/decisions/sample-decision.md +30 -0
  69. package/examples/sample-workspace/memory/knowledge/sample-knowledge.md +24 -0
  70. package/examples/sample-workspace/memory/reference/sample-reference.md +20 -0
  71. package/examples/sample-workspace/memory/rules/sample-rule.md +31 -0
  72. package/examples/sample-workspace/themes/cache-design.json +15 -0
  73. package/package.json +72 -0
  74. package/skills/memory-manage/SKILL.md +43 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * index.json v3-kv DAO.
3
+ *
4
+ * File layer is the source of truth; index.json is a rebuildable cache of
5
+ * metadata (title, tags, folder comments).
6
+ */
7
+ export interface IndexEntry {
8
+ title?: string;
9
+ tags?: string[];
10
+ comment?: string;
11
+ }
12
+ export interface IndexData {
13
+ version: string;
14
+ meta: {
15
+ lastSyncAt: string | null;
16
+ structureHash: string | null;
17
+ };
18
+ index: Record<string, IndexEntry>;
19
+ }
20
+ export interface ReconcileOptions {
21
+ folderComments?: Record<string, string>;
22
+ }
23
+ export interface ReconcileReport {
24
+ scannedFiles: number;
25
+ addedEntries: number;
26
+ removedEntries: number;
27
+ updatedEntries: number;
28
+ addedFolders: number;
29
+ }
30
+ export interface ReconcileResult {
31
+ synced: boolean;
32
+ skipped: boolean;
33
+ structureHash: string;
34
+ report: ReconcileReport;
35
+ }
36
+ export declare class IndexDao {
37
+ storeRoot: string;
38
+ backupRoot: string;
39
+ indexCache: IndexData | null;
40
+ private mutex;
41
+ constructor(storeRoot: string, options?: {
42
+ backupRoot?: string;
43
+ });
44
+ get indexPath(): string;
45
+ loadIndex(): IndexData;
46
+ saveIndex(index: IndexData): void;
47
+ private runExclusive;
48
+ getIndex(): IndexData;
49
+ getBackupId(): string;
50
+ backupIndex(backupId: string): {
51
+ backedUp: boolean;
52
+ backupPath?: string;
53
+ };
54
+ migrateV1ToV3(v1: {
55
+ entries?: Record<string, {
56
+ folder?: string;
57
+ key?: string;
58
+ title?: string;
59
+ tags?: string[];
60
+ }>;
61
+ }): IndexData;
62
+ computeStructureHash(): string;
63
+ buildEntryValueFromFile(filePath: string): IndexEntry;
64
+ reconcileIndex(options?: ReconcileOptions): Promise<ReconcileResult>;
65
+ upsertEntry(filePath: string): Promise<void>;
66
+ deleteEntryByPath(relativePath: string): Promise<void>;
67
+ moveEntry(oldRelativePath: string, newRelativePath: string): Promise<void>;
68
+ setFolderComment(folderPath: string, comment: string): Promise<void>;
69
+ listRefs(folder?: string): {
70
+ key: string;
71
+ folder: string;
72
+ title: string;
73
+ tags: string[];
74
+ }[];
75
+ buildMemoryIndexTree(recentLimit?: number): string;
76
+ }
@@ -0,0 +1,490 @@
1
+ /**
2
+ * index.json v3-kv DAO.
3
+ *
4
+ * File layer is the source of truth; index.json is a rebuildable cache of
5
+ * metadata (title, tags, folder comments).
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import crypto from 'crypto';
10
+ import { parseFrontmatter } from '../utils/frontmatter.js';
11
+ import { relativeStorePath } from '../utils/paths.js';
12
+ import { toTitle } from '../utils/validation.js';
13
+ import { Mutex } from '../utils/mutex.js';
14
+ const FALLBACK_FOLDER_COMMENTS = {
15
+ memory: '完整记忆索引(按领域分组)',
16
+ decisions: '关键产品/架构决策',
17
+ rules: '协作规则与编码红线',
18
+ knowledge: '项目知识',
19
+ architecture: '架构与数据模型',
20
+ frontend: '前端与渲染',
21
+ product: '产品与版型',
22
+ engineering: '工程实践',
23
+ reference: '参考文档',
24
+ notes: '日常速记',
25
+ essence: '整理后的工作区精要',
26
+ };
27
+ function createEmptyIndex() {
28
+ return {
29
+ version: '3-kv',
30
+ meta: { lastSyncAt: null, structureHash: null },
31
+ index: {},
32
+ };
33
+ }
34
+ function safeParseFile(filePath) {
35
+ try {
36
+ const text = fs.readFileSync(filePath, 'utf8');
37
+ return parseFrontmatter(text) || { frontmatter: {}, body: text };
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export class IndexDao {
44
+ storeRoot;
45
+ backupRoot;
46
+ indexCache;
47
+ mutex;
48
+ constructor(storeRoot, options = {}) {
49
+ this.storeRoot = storeRoot;
50
+ this.backupRoot = options.backupRoot || path.join(storeRoot, '..', 'backup');
51
+ this.indexCache = null;
52
+ this.mutex = new Mutex();
53
+ }
54
+ get indexPath() {
55
+ return path.join(this.storeRoot, 'index.json');
56
+ }
57
+ loadIndex() {
58
+ if (this.indexCache)
59
+ return this.indexCache;
60
+ if (!fs.existsSync(this.indexPath)) {
61
+ this.indexCache = createEmptyIndex();
62
+ return this.indexCache;
63
+ }
64
+ try {
65
+ const text = fs.readFileSync(this.indexPath, 'utf8');
66
+ const parsed = JSON.parse(text);
67
+ if (parsed &&
68
+ typeof parsed === 'object' &&
69
+ parsed.version === '3-kv' &&
70
+ typeof parsed.index === 'object') {
71
+ this.indexCache = parsed;
72
+ return this.indexCache;
73
+ }
74
+ if (parsed &&
75
+ typeof parsed === 'object' &&
76
+ parsed.version === 1 &&
77
+ typeof parsed.entries === 'object') {
78
+ const backupId = this.getBackupId();
79
+ this.backupIndex(backupId);
80
+ this.indexCache = this.migrateV1ToV3(parsed);
81
+ this.saveIndex(this.indexCache);
82
+ return this.indexCache;
83
+ }
84
+ }
85
+ catch {
86
+ // Corrupt index: fall through to empty index.
87
+ }
88
+ this.indexCache = createEmptyIndex();
89
+ return this.indexCache;
90
+ }
91
+ saveIndex(index) {
92
+ index.meta.lastSyncAt = new Date().toISOString();
93
+ const tmpPath = this.indexPath + '.tmp';
94
+ fs.writeFileSync(tmpPath, JSON.stringify(index, null, 2), 'utf8');
95
+ fs.renameSync(tmpPath, this.indexPath);
96
+ this.indexCache = index;
97
+ }
98
+ async runExclusive(fn) {
99
+ return this.mutex.runExclusive(fn);
100
+ }
101
+ getIndex() {
102
+ return this.loadIndex();
103
+ }
104
+ getBackupId() {
105
+ const now = new Date();
106
+ const yy = String(now.getFullYear()).slice(2);
107
+ const mm = String(now.getMonth() + 1).padStart(2, '0');
108
+ const dd = String(now.getDate()).padStart(2, '0');
109
+ const yymmdd = `${yy}${mm}${dd}`;
110
+ let seq = 1;
111
+ while (fs.existsSync(path.join(this.backupRoot, `${yymmdd}_${String(seq).padStart(2, '0')}`))) {
112
+ seq++;
113
+ }
114
+ return `${yymmdd}_${String(seq).padStart(2, '0')}`;
115
+ }
116
+ backupIndex(backupId) {
117
+ if (!fs.existsSync(this.indexPath))
118
+ return { backedUp: false };
119
+ const backupPath = path.join(this.backupRoot, backupId);
120
+ fs.mkdirSync(backupPath, { recursive: true });
121
+ const dest = path.join(backupPath, 'index.json');
122
+ fs.copyFileSync(this.indexPath, dest);
123
+ return { backedUp: true, backupPath: dest };
124
+ }
125
+ migrateV1ToV3(v1) {
126
+ const v3 = createEmptyIndex();
127
+ const entries = v1.entries || {};
128
+ for (const id of Object.keys(entries)) {
129
+ const e = entries[id];
130
+ if (!e || !e.folder || !e.key)
131
+ continue;
132
+ const relativePath = `${e.folder}/${e.key}.md`;
133
+ v3.index[relativePath] = {
134
+ title: e.title || toTitle(e.key),
135
+ tags: Array.isArray(e.tags) ? e.tags : [],
136
+ };
137
+ }
138
+ for (const key of Object.keys(v3.index)) {
139
+ if (!key.endsWith('.md'))
140
+ continue;
141
+ const dir = path.dirname(key);
142
+ const parts = dir.split('/').filter(Boolean);
143
+ let current = '';
144
+ for (const part of parts) {
145
+ current = current ? `${current}/${part}` : part;
146
+ const folderPath = `${current}/`;
147
+ if (!v3.index[folderPath]) {
148
+ v3.index[folderPath] = { comment: FALLBACK_FOLDER_COMMENTS[part] || '' };
149
+ }
150
+ }
151
+ }
152
+ return v3;
153
+ }
154
+ computeStructureHash() {
155
+ const paths = [];
156
+ const scan = (dir, relativePrefix) => {
157
+ if (!fs.existsSync(dir))
158
+ return false;
159
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
160
+ let hasContent = false;
161
+ for (const entry of entries) {
162
+ if (entry.name.startsWith('.'))
163
+ continue;
164
+ const relativePath = relativePrefix ? `${relativePrefix}/${entry.name}` : entry.name;
165
+ if (entry.isDirectory()) {
166
+ const childHasContent = scan(path.join(dir, entry.name), relativePath);
167
+ if (childHasContent)
168
+ hasContent = true;
169
+ }
170
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
171
+ const fullPath = path.join(dir, entry.name);
172
+ const stats = fs.statSync(fullPath);
173
+ paths.push(`${relativePath}:${stats.mtime.toISOString()}`);
174
+ hasContent = true;
175
+ }
176
+ }
177
+ if (!hasContent && relativePrefix) {
178
+ paths.push(`${relativePrefix}/`);
179
+ }
180
+ return hasContent;
181
+ };
182
+ scan(path.join(this.storeRoot, 'memory'), 'memory');
183
+ scan(path.join(this.storeRoot, 'notes'), 'notes');
184
+ scan(path.join(this.storeRoot, 'essence'), 'essence');
185
+ paths.sort();
186
+ const content = paths.join('\n');
187
+ return content ? crypto.createHash('md5').update(content).digest('hex') : '';
188
+ }
189
+ buildEntryValueFromFile(filePath) {
190
+ const parsed = safeParseFile(filePath);
191
+ const key = path.basename(filePath, '.md');
192
+ const title = String(parsed?.frontmatter?.title || toTitle(key));
193
+ const tags = Array.isArray(parsed?.frontmatter?.tags)
194
+ ? parsed.frontmatter.tags
195
+ : [];
196
+ return { title, tags };
197
+ }
198
+ async reconcileIndex(options = {}) {
199
+ return this.runExclusive(() => {
200
+ const index = this.getIndex();
201
+ const currentHash = this.computeStructureHash();
202
+ if (currentHash &&
203
+ currentHash === index.meta.structureHash &&
204
+ Object.keys(index.index).length > 0) {
205
+ let patched = false;
206
+ if (options.folderComments) {
207
+ for (let folderPath of Object.keys(options.folderComments)) {
208
+ const comment = options.folderComments[folderPath];
209
+ if (!folderPath.endsWith('/'))
210
+ folderPath += '/';
211
+ index.index[folderPath] = { comment };
212
+ patched = true;
213
+ }
214
+ }
215
+ if (patched) {
216
+ this.saveIndex(index);
217
+ }
218
+ return {
219
+ synced: true,
220
+ skipped: true,
221
+ structureHash: currentHash,
222
+ report: {
223
+ scannedFiles: 0,
224
+ addedEntries: 0,
225
+ removedEntries: 0,
226
+ updatedEntries: 0,
227
+ addedFolders: 0,
228
+ },
229
+ };
230
+ }
231
+ const report = {
232
+ scannedFiles: 0,
233
+ addedEntries: 0,
234
+ removedEntries: 0,
235
+ updatedEntries: 0,
236
+ addedFolders: 0,
237
+ };
238
+ const diskFiles = new Set();
239
+ const scanDir = (dir, relativePrefix) => {
240
+ if (!fs.existsSync(dir))
241
+ return;
242
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
243
+ for (const entry of entries) {
244
+ if (entry.name.startsWith('.'))
245
+ continue;
246
+ const relativePath = relativePrefix ? `${relativePrefix}/${entry.name}` : entry.name;
247
+ if (entry.isDirectory()) {
248
+ scanDir(path.join(dir, entry.name), relativePath);
249
+ }
250
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
251
+ diskFiles.add(relativePath);
252
+ report.scannedFiles++;
253
+ const value = this.buildEntryValueFromFile(path.join(this.storeRoot, relativePath));
254
+ const existing = index.index[relativePath];
255
+ if (!existing) {
256
+ index.index[relativePath] = value;
257
+ report.addedEntries++;
258
+ }
259
+ else if (existing.title !== value.title ||
260
+ JSON.stringify(existing.tags) !== JSON.stringify(value.tags)) {
261
+ index.index[relativePath] = value;
262
+ report.updatedEntries++;
263
+ }
264
+ const dirPath = path.dirname(relativePath);
265
+ const parts = dirPath.split('/').filter(Boolean);
266
+ let current = '';
267
+ for (const part of parts) {
268
+ current = current ? `${current}/${part}` : part;
269
+ const folderPath = `${current}/`;
270
+ if (!(folderPath in index.index)) {
271
+ index.index[folderPath] = { comment: FALLBACK_FOLDER_COMMENTS[part] || '' };
272
+ report.addedFolders++;
273
+ }
274
+ }
275
+ }
276
+ }
277
+ };
278
+ scanDir(path.join(this.storeRoot, 'memory'), 'memory');
279
+ scanDir(path.join(this.storeRoot, 'notes'), 'notes');
280
+ scanDir(path.join(this.storeRoot, 'essence'), 'essence');
281
+ for (const key of Object.keys(index.index)) {
282
+ if (key.endsWith('.md') && !diskFiles.has(key)) {
283
+ delete index.index[key];
284
+ report.removedEntries++;
285
+ }
286
+ }
287
+ if (options.folderComments) {
288
+ for (let folderPath of Object.keys(options.folderComments)) {
289
+ const comment = options.folderComments[folderPath];
290
+ if (!folderPath.endsWith('/'))
291
+ folderPath += '/';
292
+ index.index[folderPath] = { comment };
293
+ }
294
+ }
295
+ index.meta.structureHash = currentHash;
296
+ this.saveIndex(index);
297
+ return { synced: true, skipped: false, structureHash: currentHash, report };
298
+ });
299
+ }
300
+ async upsertEntry(filePath) {
301
+ return this.runExclusive(() => {
302
+ const relativePath = relativeStorePath(this.storeRoot, filePath);
303
+ if (!relativePath.endsWith('.md'))
304
+ return;
305
+ const index = this.getIndex();
306
+ index.index[relativePath] = this.buildEntryValueFromFile(filePath);
307
+ const dirPath = path.dirname(relativePath);
308
+ const parts = dirPath.split('/').filter(Boolean);
309
+ let current = '';
310
+ for (const part of parts) {
311
+ current = current ? `${current}/${part}` : part;
312
+ const folderPath = `${current}/`;
313
+ if (!(folderPath in index.index)) {
314
+ index.index[folderPath] = { comment: FALLBACK_FOLDER_COMMENTS[part] || '' };
315
+ }
316
+ }
317
+ index.meta.structureHash = null;
318
+ this.saveIndex(index);
319
+ });
320
+ }
321
+ async deleteEntryByPath(relativePath) {
322
+ return this.runExclusive(() => {
323
+ const index = this.getIndex();
324
+ delete index.index[relativePath];
325
+ index.meta.structureHash = null;
326
+ this.saveIndex(index);
327
+ });
328
+ }
329
+ async moveEntry(oldRelativePath, newRelativePath) {
330
+ return this.runExclusive(() => {
331
+ const index = this.getIndex();
332
+ if (index.index[oldRelativePath]) {
333
+ index.index[newRelativePath] = index.index[oldRelativePath];
334
+ delete index.index[oldRelativePath];
335
+ const dirPath = path.dirname(newRelativePath);
336
+ const parts = dirPath.split('/').filter(Boolean);
337
+ let current = '';
338
+ for (const part of parts) {
339
+ current = current ? `${current}/${part}` : part;
340
+ const folderPath = `${current}/`;
341
+ if (!(folderPath in index.index)) {
342
+ index.index[folderPath] = { comment: FALLBACK_FOLDER_COMMENTS[part] || '' };
343
+ }
344
+ }
345
+ }
346
+ index.meta.structureHash = null;
347
+ this.saveIndex(index);
348
+ });
349
+ }
350
+ async setFolderComment(folderPath, comment) {
351
+ return this.runExclusive(() => {
352
+ if (!folderPath.endsWith('/'))
353
+ folderPath += '/';
354
+ const index = this.getIndex();
355
+ index.index[folderPath] = { comment };
356
+ this.saveIndex(index);
357
+ });
358
+ }
359
+ listRefs(folder) {
360
+ const index = this.getIndex().index;
361
+ const prefix = folder ? (folder.endsWith('/') ? folder : `${folder}/`) : '';
362
+ const keys = Object.keys(index).filter((k) => {
363
+ if (!k.endsWith('.md'))
364
+ return false;
365
+ return !prefix || k.startsWith(prefix);
366
+ });
367
+ return keys
368
+ .map((k) => {
369
+ const value = index[k];
370
+ return {
371
+ key: path.basename(k, '.md'),
372
+ folder: path.dirname(k),
373
+ title: value.title || toTitle(path.basename(k, '.md')),
374
+ tags: Array.isArray(value.tags) ? value.tags : [],
375
+ };
376
+ })
377
+ .sort((a, b) => a.folder.localeCompare(b.folder) || a.key.localeCompare(b.key));
378
+ }
379
+ buildMemoryIndexTree(recentLimit = 5) {
380
+ const index = this.getIndex().index;
381
+ const root = {
382
+ name: 'memory',
383
+ children: new Map(),
384
+ files: [],
385
+ comment: index['memory/']?.comment || '',
386
+ };
387
+ const timeEntries = [];
388
+ for (const key of Object.keys(index)) {
389
+ if (!key.startsWith('memory/'))
390
+ continue;
391
+ if (key.endsWith('/')) {
392
+ if (key === 'memory/')
393
+ continue;
394
+ const relativeFolder = key.slice(7, -1);
395
+ const parts = relativeFolder ? relativeFolder.split('/') : [];
396
+ let current = root;
397
+ for (const part of parts) {
398
+ let child = current.children.get(part);
399
+ if (!child) {
400
+ child = { name: part, children: new Map(), files: [], comment: '' };
401
+ current.children.set(part, child);
402
+ }
403
+ current = child;
404
+ }
405
+ current.comment = index[key].comment || '';
406
+ }
407
+ else if (key.endsWith('.md')) {
408
+ const relativePath = key.slice(7);
409
+ const dirPart = path.dirname(relativePath);
410
+ const parts = dirPart === '.' ? [] : dirPart.split('/');
411
+ const fileName = path.basename(key, '.md');
412
+ const value = index[key];
413
+ let current = root;
414
+ for (const part of parts) {
415
+ let child = current.children.get(part);
416
+ if (!child) {
417
+ child = { name: part, children: new Map(), files: [], comment: '' };
418
+ current.children.set(part, child);
419
+ }
420
+ current = child;
421
+ }
422
+ current.files.push({
423
+ key: fileName,
424
+ title: value.title || toTitle(fileName),
425
+ tags: Array.isArray(value.tags) ? value.tags : [],
426
+ });
427
+ const filePath = path.join(this.storeRoot, key);
428
+ const parsed = safeParseFile(filePath);
429
+ const updatedAt = String(parsed?.frontmatter?.updatedAt || '');
430
+ const createdAt = String(parsed?.frontmatter?.createdAt || '');
431
+ timeEntries.push({
432
+ fullPath: key.slice(0, -3),
433
+ updatedAt,
434
+ createdAt,
435
+ });
436
+ }
437
+ }
438
+ const recentKeys = new Set(timeEntries
439
+ .sort((a, b) => {
440
+ const aUpdated = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;
441
+ const bUpdated = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;
442
+ if (bUpdated !== aUpdated)
443
+ return bUpdated - aUpdated;
444
+ const aCreated = a.createdAt ? new Date(a.createdAt).getTime() : 0;
445
+ const bCreated = b.createdAt ? new Date(b.createdAt).getTime() : 0;
446
+ return bCreated - aCreated;
447
+ })
448
+ .slice(0, recentLimit)
449
+ .map((e) => e.fullPath));
450
+ const renderNode = (node, nodePath, prefix = '', isLast = true, isRoot = false) => {
451
+ const lines = [];
452
+ const comment = node.comment;
453
+ if (isRoot) {
454
+ lines.push(`${node.name}/${comment ? ` — ${comment}` : ''}`);
455
+ }
456
+ else {
457
+ const connector = prefix === '' ? '' : isLast ? '└── ' : '├── ';
458
+ lines.push(`${prefix}${connector}${node.name}/${comment ? ` — ${comment}` : ''}`);
459
+ }
460
+ const childEntries = Array.from(node.children.entries()).sort((a, b) => a[0].localeCompare(b[0]));
461
+ const allFiles = [...node.files].sort((a, b) => a.key.localeCompare(b.key));
462
+ const items = [
463
+ ...childEntries.map(([name, childNode]) => ({
464
+ type: 'folder',
465
+ name,
466
+ data: childNode,
467
+ })),
468
+ ...allFiles.map((file) => ({ type: 'file', name: file.key, data: file })),
469
+ ];
470
+ for (let i = 0; i < items.length; i++) {
471
+ const item = items[i];
472
+ const isLastItem = i === items.length - 1;
473
+ const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');
474
+ if (item.type === 'folder') {
475
+ lines.push(...renderNode(item.data, `${nodePath}/${item.name}`, childPrefix, isLastItem, false));
476
+ }
477
+ else {
478
+ const file = item.data;
479
+ const fileConnector = isLastItem ? '└── ' : '├── ';
480
+ const tagStr = file.tags.length > 0 ? ` [${file.tags.join(', ')}]` : '';
481
+ const newMark = recentKeys.has(`${nodePath}/${file.key}`) ? ' [new]' : '';
482
+ lines.push(`${childPrefix}${fileConnector}${file.key} — ${file.title}${tagStr}${newMark}`);
483
+ }
484
+ }
485
+ return lines;
486
+ };
487
+ return renderNode(root, 'memory', '', true, true).join('\n');
488
+ }
489
+ }
490
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dao/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Markdown memory file operations.
3
+ */
4
+ import type { Frontmatter } from '../utils/frontmatter.js';
5
+ export interface MemoryReadResult extends Frontmatter {
6
+ content: string;
7
+ filePath: string;
8
+ tags: string[];
9
+ }
10
+ export interface WriteOptions {
11
+ title?: string;
12
+ }
13
+ export declare class MemoryStore {
14
+ storeRoot: string;
15
+ constructor(storeRoot: string);
16
+ resolveFilePath(folder: string, key: string): string;
17
+ exists(folder: string, key: string): boolean;
18
+ read(folder: string, key: string): MemoryReadResult | null;
19
+ write(folder: string, key: string, content: string, tags?: string[], options?: WriteOptions): string;
20
+ delete(folder: string, key: string): boolean;
21
+ move(oldFolder: string, oldKey: string, toFolder: string, newKey?: string): string;
22
+ listMarkdownFiles(dir: string): string[];
23
+ toTitle(key: string): string;
24
+ }