kimi-code-memory-mcp-server 0.1.1 → 0.2.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 (129) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.en.md +349 -0
  3. package/README.md +223 -137
  4. package/assets/contextFlow.svg +144 -0
  5. package/dist/config.d.ts +13 -0
  6. package/dist/config.js +13 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/context/wire-context.d.ts +3 -0
  9. package/dist/context/wire-context.js +20 -50
  10. package/dist/context/wire-context.js.map +1 -1
  11. package/dist/dao/constants.d.ts +33 -0
  12. package/dist/dao/constants.js +17 -0
  13. package/dist/dao/constants.js.map +1 -0
  14. package/dist/dao/index-catalog.d.ts +19 -0
  15. package/dist/dao/index-catalog.js +94 -0
  16. package/dist/dao/index-catalog.js.map +1 -0
  17. package/dist/dao/index-reconciler.d.ts +13 -0
  18. package/dist/dao/index-reconciler.js +162 -0
  19. package/dist/dao/index-reconciler.js.map +1 -0
  20. package/dist/dao/index-store.d.ts +31 -0
  21. package/dist/dao/index-store.js +128 -0
  22. package/dist/dao/index-store.js.map +1 -0
  23. package/dist/dao/index.d.ts +12 -31
  24. package/dist/dao/index.js +50 -404
  25. package/dist/dao/index.js.map +1 -1
  26. package/dist/dao/memory-store.js +2 -10
  27. package/dist/dao/memory-store.js.map +1 -1
  28. package/dist/dao/memory-tree-renderer.d.ts +22 -0
  29. package/dist/dao/memory-tree-renderer.js +75 -0
  30. package/dist/dao/memory-tree-renderer.js.map +1 -0
  31. package/dist/prompts/index.d.ts +26 -0
  32. package/dist/prompts/index.js +103 -0
  33. package/dist/prompts/index.js.map +1 -0
  34. package/dist/refine/adapter.d.ts +6 -0
  35. package/dist/refine/adapter.js +28 -0
  36. package/dist/refine/adapter.js.map +1 -0
  37. package/dist/refine/constants.d.ts +35 -0
  38. package/dist/refine/constants.js +107 -0
  39. package/dist/refine/constants.js.map +1 -0
  40. package/dist/refine/extractor.d.ts +12 -0
  41. package/dist/refine/extractor.js +122 -0
  42. package/dist/refine/extractor.js.map +1 -0
  43. package/dist/refine/store.d.ts +23 -0
  44. package/dist/refine/store.js +153 -0
  45. package/dist/refine/store.js.map +1 -0
  46. package/dist/refine/types.d.ts +56 -0
  47. package/dist/refine/types.js +5 -0
  48. package/dist/refine/types.js.map +1 -0
  49. package/dist/refined-manager.d.ts +14 -56
  50. package/dist/refined-manager.js +27 -341
  51. package/dist/refined-manager.js.map +1 -1
  52. package/dist/resources/index.d.ts +15 -0
  53. package/dist/resources/index.js +134 -0
  54. package/dist/resources/index.js.map +1 -0
  55. package/dist/server.js +46 -2
  56. package/dist/server.js.map +1 -1
  57. package/dist/theme-manager.d.ts +1 -0
  58. package/dist/theme-manager.js +7 -0
  59. package/dist/theme-manager.js.map +1 -1
  60. package/dist/tools/context-tools.d.ts +16 -51
  61. package/dist/tools/context-tools.js +303 -55
  62. package/dist/tools/context-tools.js.map +1 -1
  63. package/dist/tools/index.d.ts +5 -827
  64. package/dist/tools/index.js +23 -354
  65. package/dist/tools/index.js.map +1 -1
  66. package/dist/tools/memory-tools.d.ts +4 -60
  67. package/dist/tools/memory-tools.js +129 -79
  68. package/dist/tools/memory-tools.js.map +1 -1
  69. package/dist/tools/system-tools.d.ts +3 -34
  70. package/dist/tools/system-tools.js +110 -33
  71. package/dist/tools/system-tools.js.map +1 -1
  72. package/dist/tools/theme-tools.d.ts +3 -31
  73. package/dist/tools/theme-tools.js +101 -22
  74. package/dist/tools/theme-tools.js.map +1 -1
  75. package/dist/tools/types.d.ts +21 -0
  76. package/dist/tools/types.js +13 -0
  77. package/dist/tools/types.js.map +1 -0
  78. package/dist/types.d.ts +11 -2
  79. package/dist/utils/action-entities.d.ts +16 -0
  80. package/dist/utils/action-entities.js +35 -0
  81. package/dist/utils/action-entities.js.map +1 -0
  82. package/dist/utils/date.d.ts +11 -0
  83. package/dist/utils/date.js +13 -0
  84. package/dist/utils/date.js.map +1 -0
  85. package/dist/utils/file-helpers.d.ts +10 -0
  86. package/dist/utils/file-helpers.js +28 -0
  87. package/dist/utils/file-helpers.js.map +1 -0
  88. package/dist/utils/headings.d.ts +5 -0
  89. package/dist/utils/headings.js +21 -0
  90. package/dist/utils/headings.js.map +1 -0
  91. package/dist/utils/search.d.ts +17 -0
  92. package/dist/utils/search.js +60 -0
  93. package/dist/utils/search.js.map +1 -0
  94. package/dist/utils/tools.d.ts +5 -0
  95. package/dist/utils/tools.js +10 -0
  96. package/dist/utils/tools.js.map +1 -0
  97. package/dist/version.d.ts +1 -1
  98. package/dist/version.js +1 -1
  99. package/dist/vis/api.d.ts +117 -0
  100. package/dist/vis/api.js +426 -0
  101. package/dist/vis/api.js.map +1 -0
  102. package/dist/vis/auto-start.d.ts +12 -0
  103. package/dist/vis/auto-start.js +87 -0
  104. package/dist/vis/auto-start.js.map +1 -0
  105. package/dist/vis/server.d.ts +14 -0
  106. package/dist/vis/server.js +337 -0
  107. package/dist/vis/server.js.map +1 -0
  108. package/dist/vis/static/api.js +57 -0
  109. package/dist/vis/static/app.js +1468 -0
  110. package/dist/vis/static/index.html +25 -0
  111. package/dist/vis/static/state.js +26 -0
  112. package/dist/vis/static/style.css +1553 -0
  113. package/dist/vis/static/utils/helpers.js +94 -0
  114. package/dist/vis/static/utils/markdown.js +81 -0
  115. package/dist/vis-cli.d.ts +7 -0
  116. package/dist/vis-cli.js +140 -0
  117. package/dist/vis-cli.js.map +1 -0
  118. package/docs/0.agent-memory-market-research.md +354 -0
  119. package/docs/1.memory-system-proposal-for-kimi-code.md +688 -0
  120. package/docs/2.memory-architecture-overview.md +417 -0
  121. package/docs/3.memory-skill-prompt-design.md +430 -0
  122. package/docs/4.kimi-code-native-evolution-roadmap.md +559 -0
  123. package/docs/5.decision-guard-design-notes.md +500 -0
  124. package/docs/ARCHITECTURE.md +2 -2
  125. package/docs/design-story.md +350 -0
  126. package/docs/three-layer-memory-model.md +153 -0
  127. package/docs/three-layer-memory-model.zh-CN.md +153 -0
  128. package/package.json +12 -6
  129. package/README.zh-CN.md +0 -292
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Data access helpers for the vis dashboard.
3
+ *
4
+ * All functions receive the shared MCP server context and return plain
5
+ * JSON-serializable objects so they can be reused by the Hono routes and by
6
+ * tests without touching HTTP details.
7
+ */
8
+ import type { Ctx } from '../types.js';
9
+ export interface WorkspaceInfo {
10
+ id: string;
11
+ cwd: string;
12
+ storePath: string;
13
+ essence: string;
14
+ stats: {
15
+ memories: number;
16
+ themes: number;
17
+ refinedTurns: number;
18
+ sessions: number;
19
+ };
20
+ }
21
+ export interface ThemeInfo {
22
+ name: string;
23
+ displayName: string;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ turnCount: number;
27
+ memoryCount: number;
28
+ }
29
+ export interface TimelineItem {
30
+ type: 'turn' | 'memory';
31
+ timestamp: string;
32
+ data: unknown;
33
+ }
34
+ export interface ThemeTimeline {
35
+ theme: string;
36
+ displayName: string;
37
+ items: TimelineItem[];
38
+ }
39
+ export interface DecisionItem {
40
+ sessionId: string;
41
+ turnId: number;
42
+ timestamp: string | undefined;
43
+ summary: string;
44
+ decisions: string[];
45
+ files: string[];
46
+ tags: string[];
47
+ }
48
+ export interface MemoryNode {
49
+ name: string;
50
+ comment: string;
51
+ files: MemoryFile[];
52
+ children: MemoryNode[];
53
+ }
54
+ export interface MemoryFile {
55
+ key: string;
56
+ title: string;
57
+ tags: string[];
58
+ createdAt: string;
59
+ updatedAt: string;
60
+ }
61
+ export declare function getWorkspace(ctx: Ctx): WorkspaceInfo;
62
+ export declare function getThemes(ctx: Ctx): ThemeInfo[];
63
+ export declare function getThemeTimeline(ctx: Ctx, themeName: string): ThemeTimeline;
64
+ export declare function getRecentDecisions(ctx: Ctx, limit?: number): DecisionItem[];
65
+ export declare function listMemoryFolders(ctx: Ctx): string[];
66
+ export declare function getMemories(ctx: Ctx): MemoryNode;
67
+ export declare function getMemoryContent(ctx: Ctx, folder: string, key: string): {
68
+ content: string;
69
+ title: string;
70
+ tags: string[];
71
+ } | null;
72
+ export declare function writeMemory(ctx: Ctx, folder: string, key: string, options: {
73
+ content?: string;
74
+ title?: string;
75
+ tags?: string[];
76
+ }): Promise<{
77
+ ok: boolean;
78
+ filePath?: string;
79
+ error?: string;
80
+ }>;
81
+ export declare function deleteMemory(ctx: Ctx, folder: string, key: string): Promise<{
82
+ ok: boolean;
83
+ error?: string;
84
+ }>;
85
+ export declare function createFolder(ctx: Ctx, folderPath: string): Promise<{
86
+ ok: boolean;
87
+ error?: string;
88
+ }>;
89
+ export declare function renameFolder(ctx: Ctx, oldFolderPath: string, newFolderPath: string): Promise<{
90
+ ok: boolean;
91
+ error?: string;
92
+ }>;
93
+ export declare function deleteFolder(ctx: Ctx, folderPath: string, recursive?: boolean): Promise<{
94
+ ok: boolean;
95
+ error?: string;
96
+ }>;
97
+ export declare function saveEssence(ctx: Ctx, content: string): {
98
+ ok: boolean;
99
+ };
100
+ export declare function updateTheme(ctx: Ctx, themeName: string, patch: {
101
+ displayName?: string;
102
+ removeTurns?: Array<{
103
+ sessionId: string;
104
+ turnId: number;
105
+ }>;
106
+ }): {
107
+ ok: boolean;
108
+ };
109
+ export declare function deleteTheme(ctx: Ctx, themeName: string): {
110
+ ok: boolean;
111
+ error?: string;
112
+ };
113
+ export declare function deleteSearchView(ctx: Ctx, key: string, deleteRefinedTurns?: boolean): Promise<{
114
+ ok: boolean;
115
+ error?: string;
116
+ deletedRefinedTurns?: number;
117
+ }>;
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Data access helpers for the vis dashboard.
3
+ *
4
+ * All functions receive the shared MCP server context and return plain
5
+ * JSON-serializable objects so they can be reused by the Hono routes and by
6
+ * tests without touching HTTP details.
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { getSessionsRoot } from '../config.js';
11
+ import { atomicWriteFile, safeResolve } from '../utils/paths.js';
12
+ import { sanitizeFolder, sanitizeKey, toTitle } from '../utils/validation.js';
13
+ import { safeParseFile } from '../utils/file-helpers.js';
14
+ function readEssence(storeRoot) {
15
+ const essencePath = path.join(storeRoot, 'essence', 'essence.md');
16
+ if (!fs.existsSync(essencePath))
17
+ return '';
18
+ return fs.readFileSync(essencePath, 'utf8');
19
+ }
20
+ function countSessionDirectories() {
21
+ const sessionsRoot = getSessionsRoot();
22
+ if (!fs.existsSync(sessionsRoot))
23
+ return 0;
24
+ return fs
25
+ .readdirSync(sessionsRoot, { withFileTypes: true })
26
+ .filter((entry) => entry.isDirectory()).length;
27
+ }
28
+ export function getWorkspace(ctx) {
29
+ const index = ctx.indexDao.getIndex().index;
30
+ const memories = Object.keys(index).filter((k) => k.endsWith('.md')).length;
31
+ return {
32
+ id: ctx.workspaceId,
33
+ cwd: ctx.cwd,
34
+ storePath: ctx.storeRoot,
35
+ essence: readEssence(ctx.storeRoot),
36
+ stats: {
37
+ memories,
38
+ themes: ctx.themeManager.listThemes().length,
39
+ refinedTurns: ctx.refinedManager.countAll(),
40
+ sessions: countSessionDirectories(),
41
+ },
42
+ };
43
+ }
44
+ export function getThemes(ctx) {
45
+ return ctx.themeManager.listThemes().map((name) => {
46
+ const association = ctx.themeManager.loadTheme(name);
47
+ if (!association) {
48
+ return {
49
+ name,
50
+ displayName: name,
51
+ createdAt: '',
52
+ updatedAt: '',
53
+ turnCount: 0,
54
+ memoryCount: 0,
55
+ };
56
+ }
57
+ return {
58
+ name: association.theme,
59
+ displayName: association.displayName || association.theme,
60
+ createdAt: association.createdAt,
61
+ updatedAt: association.updatedAt,
62
+ turnCount: association.turns.length,
63
+ memoryCount: association.memories.length,
64
+ };
65
+ });
66
+ }
67
+ function turnToTimelineItem(turn) {
68
+ return {
69
+ type: 'turn',
70
+ timestamp: turn.timestamp || new Date(0).toISOString(),
71
+ data: {
72
+ sessionId: turn.sessionId,
73
+ turnId: turn.turnId,
74
+ timestamp: turn.timestamp,
75
+ summary: turn.summary,
76
+ facts: turn.facts,
77
+ notes: turn.notes,
78
+ entities: turn.entities,
79
+ categories: turn.categories,
80
+ },
81
+ };
82
+ }
83
+ function memoryToTimelineItem(memory, storeRoot) {
84
+ const filePath = path.join(storeRoot, memory.folder, `${memory.key}.md`);
85
+ let content = '';
86
+ if (fs.existsSync(filePath)) {
87
+ content = fs.readFileSync(filePath, 'utf8');
88
+ }
89
+ return {
90
+ type: 'memory',
91
+ timestamp: memory.timestamp,
92
+ data: {
93
+ key: memory.key,
94
+ folder: memory.folder,
95
+ title: memory.title,
96
+ content,
97
+ },
98
+ };
99
+ }
100
+ export function getThemeTimeline(ctx, themeName) {
101
+ const association = ctx.themeManager.loadTheme(themeName);
102
+ const empty = {
103
+ theme: themeName,
104
+ displayName: themeName,
105
+ items: [],
106
+ };
107
+ if (!association)
108
+ return empty;
109
+ const items = [];
110
+ for (const turnRef of association.turns) {
111
+ const turn = ctx.refinedManager.loadRefinedTurn(turnRef.sessionId, turnRef.turnId);
112
+ if (turn) {
113
+ items.push(turnToTimelineItem(turn));
114
+ }
115
+ else {
116
+ items.push({
117
+ type: 'turn',
118
+ timestamp: turnRef.timestamp,
119
+ data: {
120
+ sessionId: turnRef.sessionId,
121
+ turnId: turnRef.turnId,
122
+ timestamp: turnRef.timestamp,
123
+ missing: true,
124
+ },
125
+ });
126
+ }
127
+ }
128
+ for (const memory of association.memories) {
129
+ items.push(memoryToTimelineItem(memory, ctx.storeRoot));
130
+ }
131
+ items.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
132
+ return {
133
+ theme: association.theme,
134
+ displayName: association.displayName || association.theme,
135
+ items,
136
+ };
137
+ }
138
+ export function getRecentDecisions(ctx, limit = 20) {
139
+ const turns = ctx.refinedManager.listRecentTurns(limit * 5);
140
+ const decisions = [];
141
+ for (const turn of turns) {
142
+ const turnDecisions = turn.categories?.decisions;
143
+ if (!Array.isArray(turnDecisions) || turnDecisions.length === 0)
144
+ continue;
145
+ decisions.push({
146
+ sessionId: turn.sessionId,
147
+ turnId: turn.turnId,
148
+ timestamp: turn.timestamp,
149
+ summary: turn.summary,
150
+ decisions: turnDecisions,
151
+ files: turn.entities?.files || [],
152
+ tags: Object.values(turn.categories || {}).flat(),
153
+ });
154
+ if (decisions.length >= limit)
155
+ break;
156
+ }
157
+ return decisions;
158
+ }
159
+ function validateFolderPath(folder, allowRoot = true) {
160
+ const sanitized = sanitizeFolder(folder);
161
+ if (!sanitized)
162
+ return null;
163
+ if (sanitized !== 'memory' &&
164
+ !sanitized.startsWith('memory/') &&
165
+ sanitized !== 'notes' &&
166
+ !sanitized.startsWith('notes/')) {
167
+ return null;
168
+ }
169
+ if (!allowRoot && (sanitized === 'memory' || sanitized === 'notes'))
170
+ return null;
171
+ return sanitized;
172
+ }
173
+ export function listMemoryFolders(ctx) {
174
+ const folders = [];
175
+ for (const root of ['memory', 'notes']) {
176
+ const rootPath = path.join(ctx.storeRoot, root);
177
+ if (!fs.existsSync(rootPath))
178
+ continue;
179
+ folders.push(root);
180
+ const walk = (dir, prefix) => {
181
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
182
+ if (!entry.isDirectory())
183
+ continue;
184
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
185
+ folders.push(rel);
186
+ walk(path.join(dir, entry.name), rel);
187
+ }
188
+ };
189
+ walk(rootPath, root);
190
+ }
191
+ return folders.sort();
192
+ }
193
+ function buildRootNode(rootName, index, storeRoot) {
194
+ const root = {
195
+ name: rootName,
196
+ comment: index[`${rootName}/`]?.comment || '',
197
+ files: [],
198
+ children: [],
199
+ };
200
+ for (const key of Object.keys(index).sort()) {
201
+ if (!key.startsWith(`${rootName}/`))
202
+ continue;
203
+ if (key.endsWith('/')) {
204
+ if (key === `${rootName}/`)
205
+ continue;
206
+ const relativeFolder = key.slice(rootName.length + 1, -1);
207
+ const parts = relativeFolder.split('/');
208
+ let current = root;
209
+ let currentPath = rootName;
210
+ for (const part of parts) {
211
+ currentPath = `${currentPath}/${part}`;
212
+ let child = current.children.find((c) => c.name === part);
213
+ if (!child) {
214
+ child = {
215
+ name: part,
216
+ comment: index[`${currentPath}/`]?.comment || '',
217
+ files: [],
218
+ children: [],
219
+ };
220
+ current.children.push(child);
221
+ }
222
+ current = child;
223
+ }
224
+ current.comment = index[key]?.comment || '';
225
+ }
226
+ else if (key.endsWith('.md')) {
227
+ const relativePath = key.slice(rootName.length + 1);
228
+ const dirPart = path.dirname(relativePath);
229
+ const parts = dirPart === '.' ? [] : dirPart.split('/');
230
+ const fileName = path.basename(key, '.md');
231
+ const value = index[key];
232
+ let current = root;
233
+ for (const part of parts) {
234
+ let child = current.children.find((c) => c.name === part);
235
+ if (!child) {
236
+ child = { name: part, comment: '', files: [], children: [] };
237
+ current.children.push(child);
238
+ }
239
+ current = child;
240
+ }
241
+ const filePath = path.join(storeRoot, key);
242
+ const parsed = safeParseFile(filePath);
243
+ current.files.push({
244
+ key: fileName,
245
+ title: value?.title || toTitle(fileName),
246
+ tags: Array.isArray(value?.tags) ? value.tags : [],
247
+ createdAt: String(parsed?.frontmatter?.createdAt || ''),
248
+ updatedAt: String(parsed?.frontmatter?.updatedAt || ''),
249
+ });
250
+ }
251
+ }
252
+ return root;
253
+ }
254
+ export function getMemories(ctx) {
255
+ const index = ctx.indexDao.getIndex().index;
256
+ return {
257
+ name: '',
258
+ comment: '',
259
+ files: [],
260
+ children: [buildRootNode('memory', index, ctx.storeRoot), buildRootNode('notes', index, ctx.storeRoot)],
261
+ };
262
+ }
263
+ export function getMemoryContent(ctx, folder, key) {
264
+ const result = ctx.memoryStore.read(folder, key);
265
+ if (!result)
266
+ return null;
267
+ return {
268
+ content: result.content,
269
+ title: String(result.title || key),
270
+ tags: Array.isArray(result.tags) ? result.tags : [],
271
+ };
272
+ }
273
+ export async function writeMemory(ctx, folder, key, options) {
274
+ const normalizedFolder = validateFolderPath(folder);
275
+ if (!normalizedFolder) {
276
+ return { ok: false, error: 'Invalid folder path' };
277
+ }
278
+ const normalizedKey = sanitizeKey(key);
279
+ const content = typeof options.content === 'string' ? options.content : '';
280
+ const title = typeof options.title === 'string' ? options.title : undefined;
281
+ const tags = Array.isArray(options.tags) ? options.tags.filter((t) => typeof t === 'string') : [];
282
+ const filePath = ctx.memoryStore.write(normalizedFolder, normalizedKey, content, tags, { title });
283
+ await ctx.indexDao.upsertEntry(filePath);
284
+ return { ok: true, filePath: path.relative(ctx.storeRoot, filePath).replace(/\\/g, '/') };
285
+ }
286
+ export async function deleteMemory(ctx, folder, key) {
287
+ const normalizedFolder = validateFolderPath(folder);
288
+ if (!normalizedFolder) {
289
+ return { ok: false, error: 'Invalid folder path' };
290
+ }
291
+ const normalizedKey = sanitizeKey(key);
292
+ const filePath = ctx.memoryStore.resolveFilePath(normalizedFolder, normalizedKey);
293
+ const relativePath = path.relative(ctx.storeRoot, filePath).replace(/\\/g, '/');
294
+ const deleted = ctx.memoryStore.delete(normalizedFolder, normalizedKey);
295
+ if (!deleted) {
296
+ return { ok: false, error: 'Memory not found' };
297
+ }
298
+ await ctx.indexDao.deleteEntryByPath(relativePath);
299
+ return { ok: true };
300
+ }
301
+ export async function createFolder(ctx, folderPath) {
302
+ const normalized = validateFolderPath(folderPath, false);
303
+ if (!normalized) {
304
+ return { ok: false, error: 'Invalid folder path' };
305
+ }
306
+ const absPath = safeResolve(ctx.storeRoot, normalized);
307
+ if (fs.existsSync(absPath)) {
308
+ return { ok: false, error: 'Folder already exists' };
309
+ }
310
+ fs.mkdirSync(absPath, { recursive: true });
311
+ await ctx.indexDao.setFolderComment(normalized, '');
312
+ return { ok: true };
313
+ }
314
+ export async function renameFolder(ctx, oldFolderPath, newFolderPath) {
315
+ const oldNormalized = validateFolderPath(oldFolderPath, false);
316
+ if (!oldNormalized) {
317
+ return { ok: false, error: 'Invalid source folder path' };
318
+ }
319
+ const newNormalized = validateFolderPath(newFolderPath, false);
320
+ if (!newNormalized) {
321
+ return { ok: false, error: 'Invalid destination folder path' };
322
+ }
323
+ if (oldNormalized === newNormalized) {
324
+ return { ok: false, error: 'Source and destination are the same' };
325
+ }
326
+ const oldAbs = safeResolve(ctx.storeRoot, oldNormalized);
327
+ const newAbs = safeResolve(ctx.storeRoot, newNormalized);
328
+ if (!fs.existsSync(oldAbs)) {
329
+ return { ok: false, error: 'Source folder not found' };
330
+ }
331
+ if (fs.existsSync(newAbs)) {
332
+ return { ok: false, error: 'Destination folder already exists' };
333
+ }
334
+ fs.mkdirSync(path.dirname(newAbs), { recursive: true });
335
+ fs.renameSync(oldAbs, newAbs);
336
+ await ctx.indexDao.reconcileIndex();
337
+ return { ok: true };
338
+ }
339
+ export async function deleteFolder(ctx, folderPath, recursive = false) {
340
+ const normalized = validateFolderPath(folderPath, false);
341
+ if (!normalized) {
342
+ return { ok: false, error: 'Invalid folder path' };
343
+ }
344
+ const absPath = safeResolve(ctx.storeRoot, normalized);
345
+ if (!fs.existsSync(absPath)) {
346
+ return { ok: false, error: 'Folder not found' };
347
+ }
348
+ if (recursive) {
349
+ fs.rmSync(absPath, { recursive: true, force: true });
350
+ }
351
+ else {
352
+ const entries = fs.readdirSync(absPath);
353
+ if (entries.length > 0) {
354
+ return { ok: false, error: 'Folder is not empty' };
355
+ }
356
+ fs.rmdirSync(absPath);
357
+ }
358
+ await ctx.indexDao.reconcileIndex();
359
+ return { ok: true };
360
+ }
361
+ export function saveEssence(ctx, content) {
362
+ const essenceDir = path.join(ctx.storeRoot, 'essence');
363
+ fs.mkdirSync(essenceDir, { recursive: true });
364
+ const essencePath = path.join(essenceDir, 'essence.md');
365
+ atomicWriteFile(essencePath, content, 'utf8');
366
+ ctx.indexDao.upsertEntry(essencePath);
367
+ return { ok: true };
368
+ }
369
+ export function updateTheme(ctx, themeName, patch) {
370
+ const association = ctx.themeManager.loadTheme(themeName);
371
+ if (!association)
372
+ return { ok: false };
373
+ if (typeof patch.displayName === 'string' && patch.displayName.trim()) {
374
+ association.displayName = patch.displayName.trim();
375
+ }
376
+ if (Array.isArray(patch.removeTurns)) {
377
+ const removeSet = new Set(patch.removeTurns.map((t) => `${t.sessionId}:${t.turnId}`));
378
+ association.turns = association.turns.filter((t) => !removeSet.has(`${t.sessionId}:${t.turnId}`));
379
+ }
380
+ association.updatedAt = new Date().toISOString();
381
+ ctx.themeManager.saveTheme(themeName, association);
382
+ return { ok: true };
383
+ }
384
+ export function deleteTheme(ctx, themeName) {
385
+ const deleted = ctx.themeManager.deleteTheme(themeName);
386
+ if (!deleted) {
387
+ return { ok: false, error: 'Theme not found' };
388
+ }
389
+ return { ok: true };
390
+ }
391
+ export async function deleteSearchView(ctx, key, deleteRefinedTurns = false) {
392
+ const filePath = path.join(ctx.storeRoot, 'searches', `${key}.json`);
393
+ if (!fs.existsSync(filePath)) {
394
+ return { ok: false, error: 'Search view not found' };
395
+ }
396
+ const refinedTurnsToDelete = [];
397
+ if (deleteRefinedTurns) {
398
+ try {
399
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
400
+ const clusters = Array.isArray(data.clusters) ? data.clusters : [];
401
+ const seen = new Set();
402
+ for (const cluster of clusters) {
403
+ const members = Array.isArray(cluster.members) ? cluster.members : [];
404
+ for (const m of members) {
405
+ if (m && typeof m.sessionId === 'string' && typeof m.turnId === 'number') {
406
+ const id = `${m.sessionId}:${m.turnId}`;
407
+ if (!seen.has(id)) {
408
+ seen.add(id);
409
+ refinedTurnsToDelete.push({ sessionId: m.sessionId, turnId: m.turnId });
410
+ }
411
+ }
412
+ }
413
+ }
414
+ }
415
+ catch {
416
+ // Fall through to deleting the file even if parsing fails.
417
+ }
418
+ }
419
+ fs.unlinkSync(filePath);
420
+ let deletedRefinedTurns = 0;
421
+ if (deleteRefinedTurns && refinedTurnsToDelete.length > 0) {
422
+ deletedRefinedTurns = await ctx.refinedManager.deleteRefinedTurns(refinedTurnsToDelete);
423
+ }
424
+ return { ok: true, deletedRefinedTurns };
425
+ }
426
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vis/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Optional auto-start of the kimi-memory-vis dashboard when the MCP server starts.
3
+ */
4
+ import type { Ctx } from '../types.js';
5
+ export interface AutoStartResult {
6
+ started: boolean;
7
+ url?: string;
8
+ error?: string;
9
+ }
10
+ export declare function maybeStartVisServer(ctx: Ctx): Promise<AutoStartResult>;
11
+ export declare function stopVisServer(): void;
12
+ export declare function getVisUrl(): string | null;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Optional auto-start of the kimi-memory-vis dashboard when the MCP server starts.
3
+ */
4
+ import { startVisServer } from './server.js';
5
+ const DEFAULT_VIS_PORT = 58628;
6
+ const MAX_PORT_ATTEMPTS = 10;
7
+ let activeServer = null;
8
+ let activeUrl = null;
9
+ function getEnvFlag() {
10
+ const raw = process.env.KIMI_MEMORY_AUTO_VIS;
11
+ if (!raw)
12
+ return false;
13
+ return raw === '1' || raw.toLowerCase() === 'true';
14
+ }
15
+ function getDesiredPort() {
16
+ const raw = process.env.KIMI_MEMORY_VIS_PORT;
17
+ if (!raw)
18
+ return DEFAULT_VIS_PORT;
19
+ const parsed = parseInt(raw, 10);
20
+ return Number.isNaN(parsed) ? DEFAULT_VIS_PORT : parsed;
21
+ }
22
+ function isPortAvailable(port, hostname) {
23
+ return new Promise((resolve) => {
24
+ import('net')
25
+ .then(({ createServer }) => {
26
+ const tester = createServer()
27
+ .once('error', () => resolve(false))
28
+ .once('listening', () => {
29
+ tester.close(() => resolve(true));
30
+ })
31
+ .listen(port, hostname);
32
+ })
33
+ .catch(() => resolve(false));
34
+ });
35
+ }
36
+ async function findAvailablePort(startPort, hostname) {
37
+ for (let offset = 0; offset < MAX_PORT_ATTEMPTS; offset++) {
38
+ const port = startPort + offset;
39
+ if (await isPortAvailable(port, hostname)) {
40
+ return port;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ export async function maybeStartVisServer(ctx) {
46
+ if (!getEnvFlag()) {
47
+ return { started: false };
48
+ }
49
+ if (activeServer) {
50
+ return { started: true, url: activeUrl ?? undefined };
51
+ }
52
+ const hostname = process.env.KIMI_MEMORY_VIS_HOST || '127.0.0.1';
53
+ const startPort = getDesiredPort();
54
+ const port = await findAvailablePort(startPort, hostname);
55
+ if (port === null) {
56
+ const error = `No available port found for vis dashboard between ${startPort} and ${startPort + MAX_PORT_ATTEMPTS - 1}`;
57
+ return { started: false, error };
58
+ }
59
+ try {
60
+ const url = `http://${hostname}:${port}`;
61
+ activeServer = startVisServer({
62
+ ctx,
63
+ port,
64
+ hostname,
65
+ onReady: () => {
66
+ // Intentionally quiet; URL is returned to the caller.
67
+ },
68
+ });
69
+ activeUrl = url;
70
+ return { started: true, url };
71
+ }
72
+ catch (err) {
73
+ const error = err instanceof Error ? err.message : String(err);
74
+ return { started: false, error };
75
+ }
76
+ }
77
+ export function stopVisServer() {
78
+ if (activeServer) {
79
+ activeServer.close();
80
+ activeServer = null;
81
+ activeUrl = null;
82
+ }
83
+ }
84
+ export function getVisUrl() {
85
+ return activeUrl;
86
+ }
87
+ //# sourceMappingURL=auto-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-start.js","sourceRoot":"","sources":["../../src/vis/auto-start.ts"],"names":[],"mappings":"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"}