kimi-code-memory-mcp-server 0.1.2 → 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.
package/dist/vis/api.d.ts CHANGED
@@ -62,12 +62,38 @@ export declare function getWorkspace(ctx: Ctx): WorkspaceInfo;
62
62
  export declare function getThemes(ctx: Ctx): ThemeInfo[];
63
63
  export declare function getThemeTimeline(ctx: Ctx, themeName: string): ThemeTimeline;
64
64
  export declare function getRecentDecisions(ctx: Ctx, limit?: number): DecisionItem[];
65
+ export declare function listMemoryFolders(ctx: Ctx): string[];
65
66
  export declare function getMemories(ctx: Ctx): MemoryNode;
66
67
  export declare function getMemoryContent(ctx: Ctx, folder: string, key: string): {
67
68
  content: string;
68
69
  title: string;
69
70
  tags: string[];
70
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
+ }>;
71
97
  export declare function saveEssence(ctx: Ctx, content: string): {
72
98
  ok: boolean;
73
99
  };
@@ -80,3 +106,12 @@ export declare function updateTheme(ctx: Ctx, themeName: string, patch: {
80
106
  }): {
81
107
  ok: boolean;
82
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
+ }>;
package/dist/vis/api.js CHANGED
@@ -8,7 +8,9 @@
8
8
  import fs from 'fs';
9
9
  import path from 'path';
10
10
  import { getSessionsRoot } from '../config.js';
11
- import { atomicWriteFile } from '../utils/paths.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';
12
14
  function readEssence(storeRoot) {
13
15
  const essencePath = path.join(storeRoot, 'essence', 'essence.md');
14
16
  if (!fs.existsSync(essencePath))
@@ -154,27 +156,109 @@ export function getRecentDecisions(ctx, limit = 20) {
154
156
  }
155
157
  return decisions;
156
158
  }
157
- function treeNodeToMemoryNode(node) {
158
- const children = [];
159
- node.children.forEach((child) => {
160
- children.push(treeNodeToMemoryNode(child));
161
- });
162
- return {
163
- name: node.name,
164
- comment: node.comment || '',
165
- files: node.files.map((file) => ({
166
- key: file.key,
167
- title: file.title,
168
- tags: file.tags,
169
- createdAt: file.createdAt || '',
170
- updatedAt: file.updatedAt || '',
171
- })),
172
- children,
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: [],
173
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;
174
253
  }
175
254
  export function getMemories(ctx) {
176
- const tree = ctx.indexDao.buildMemoryTreeData();
177
- return treeNodeToMemoryNode(tree);
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
+ };
178
262
  }
179
263
  export function getMemoryContent(ctx, folder, key) {
180
264
  const result = ctx.memoryStore.read(folder, key);
@@ -186,6 +270,94 @@ export function getMemoryContent(ctx, folder, key) {
186
270
  tags: Array.isArray(result.tags) ? result.tags : [],
187
271
  };
188
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
+ }
189
361
  export function saveEssence(ctx, content) {
190
362
  const essenceDir = path.join(ctx.storeRoot, 'essence');
191
363
  fs.mkdirSync(essenceDir, { recursive: true });
@@ -209,4 +381,46 @@ export function updateTheme(ctx, themeName, patch) {
209
381
  ctx.themeManager.saveTheme(themeName, association);
210
382
  return { ok: true };
211
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
+ }
212
426
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vis/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vis/api.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,92 @@ import { Hono } from 'hono';
7
7
  import { serve } from '@hono/node-server';
8
8
  import { serveStatic } from '@hono/node-server/serve-static';
9
9
  import { getProjectRoot } from '../utils/paths.js';
10
- import { getWorkspace, getThemes, getThemeTimeline, getRecentDecisions, getMemories, getMemoryContent, saveEssence, updateTheme, } from './api.js';
10
+ import { getWorkspace, getThemes, getThemeTimeline, getRecentDecisions, getMemories, getMemoryContent, saveEssence, updateTheme, deleteTheme, deleteSearchView, listMemoryFolders, writeMemory, deleteMemory, createFolder, renameFolder, deleteFolder, } from './api.js';
11
+ const KIMI_ORIGIN = 'http://127.0.0.1:58627';
12
+ const THEME_CACHE_TTL_MS = 60_000;
13
+ const FALLBACK_CSS = `:root {
14
+ color-scheme: light dark;
15
+ --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
16
+ --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
17
+ --r-sm: 6px;
18
+ --r-md: 8px;
19
+ --r-lg: 12px;
20
+ }
21
+ @media (prefers-color-scheme: light) {
22
+ :root {
23
+ --bg: #ffffff;
24
+ --canvas: #f6f8fa;
25
+ --panel: #f6f8fa;
26
+ --panel2: #f3f4f6;
27
+ --line: #d1d9e0;
28
+ --ink: #1f2328;
29
+ --text: #1f2328;
30
+ --muted: #656d76;
31
+ --dim: #8c959f;
32
+ --blue: #0969da;
33
+ --blue2: #218bff;
34
+ --bluebg: #ddf4ff;
35
+ --soft: #f6f8fa;
36
+ --bd: #0969da;
37
+ --ok: #1a7f37;
38
+ --err: #cf222e;
39
+ --warn: #9a6700;
40
+ }
41
+ }
42
+ @media (prefers-color-scheme: dark) {
43
+ :root {
44
+ --bg: #0d1117;
45
+ --canvas: #161b22;
46
+ --panel: #1c2128;
47
+ --panel2: #21262d;
48
+ --line: #2d333b;
49
+ --ink: rgba(255,255,255,0.84);
50
+ --text: rgba(255,255,255,0.84);
51
+ --muted: rgba(255,255,255,0.55);
52
+ --dim: rgba(255,255,255,0.35);
53
+ --blue: #58a6ff;
54
+ --blue2: #79b8ff;
55
+ --bluebg: #1c2a3a;
56
+ --soft: #21262d;
57
+ --bd: #1f6feb;
58
+ --ok: #3fb950;
59
+ --err: #f85149;
60
+ --warn: #f5b301;
61
+ }
62
+ }`;
63
+ let cachedTheme = null;
64
+ async function fetchTextWithTimeout(url, timeoutMs) {
65
+ const controller = new AbortController();
66
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
67
+ try {
68
+ const res = await fetch(url, { signal: controller.signal });
69
+ if (!res.ok)
70
+ throw new Error(`HTTP ${res.status}`);
71
+ return await res.text();
72
+ }
73
+ finally {
74
+ clearTimeout(timer);
75
+ }
76
+ }
77
+ async function proxyKimiThemeCss() {
78
+ if (cachedTheme && Date.now() - cachedTheme.fetchedAt < THEME_CACHE_TTL_MS) {
79
+ return { css: cachedTheme.css, fromCache: true };
80
+ }
81
+ try {
82
+ const html = await fetchTextWithTimeout(`${KIMI_ORIGIN}/`, 3000);
83
+ const match = html.match(new RegExp(`<link[^>]+rel=["']stylesheet["'][^>]*href=["'](/assets/index-[a-zA-Z0-9]+\\.css)["'][^>]*>`, 'i')) ||
84
+ html.match(new RegExp(`<link[^>]+href=["'](/assets/index-[a-zA-Z0-9]+\\.css)["'][^>]*rel=["']stylesheet["'][^>]*>`, 'i'));
85
+ const cssPath = match?.[1];
86
+ if (!cssPath)
87
+ throw new Error('Kimi stylesheet link not found');
88
+ const css = await fetchTextWithTimeout(`${KIMI_ORIGIN}${cssPath}`, 3000);
89
+ cachedTheme = { css, fetchedAt: Date.now() };
90
+ return { css, fromCache: false };
91
+ }
92
+ catch {
93
+ return { css: FALLBACK_CSS, fromCache: false };
94
+ }
95
+ }
11
96
  function getStaticRoot() {
12
97
  return path.join(getProjectRoot(), 'dist', 'vis', 'static');
13
98
  }
@@ -15,7 +100,7 @@ export function createApp(ctx) {
15
100
  const app = new Hono();
16
101
  app.use('/api/*', async (c, next) => {
17
102
  c.header('Access-Control-Allow-Origin', '*');
18
- c.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
103
+ c.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
19
104
  c.header('Access-Control-Allow-Headers', 'Content-Type');
20
105
  if (c.req.method === 'OPTIONS')
21
106
  return c.body(null, 204);
@@ -39,6 +124,112 @@ export function createApp(ctx) {
39
124
  app.get('/api/memories', (c) => {
40
125
  return c.json(getMemories(ctx));
41
126
  });
127
+ app.get('/api/searches', (c) => {
128
+ const dir = path.join(ctx.storeRoot, 'searches');
129
+ if (!fs.existsSync(dir)) {
130
+ return c.json([]);
131
+ }
132
+ const entries = fs
133
+ .readdirSync(dir)
134
+ .filter((f) => f.endsWith('.json'))
135
+ .map((f) => {
136
+ try {
137
+ const raw = fs.readFileSync(path.join(dir, f), 'utf8');
138
+ const data = JSON.parse(raw);
139
+ const clusters = Array.isArray(data.clusters) ? data.clusters : [];
140
+ return {
141
+ key: data.key || f.replace(/\.json$/, ''),
142
+ query: data.query || '',
143
+ createdAt: data.createdAt || '',
144
+ resultCount: clusters.length,
145
+ };
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ })
151
+ .filter((e) => e !== null)
152
+ .sort((a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime());
153
+ return c.json(entries);
154
+ });
155
+ app.get('/api/searches/:key', (c) => {
156
+ const key = decodeURIComponent(c.req.param('key'));
157
+ const filePath = path.join(ctx.storeRoot, 'searches', `${key}.json`);
158
+ if (!fs.existsSync(filePath)) {
159
+ return c.json({ error: 'Search view not found' }, 404);
160
+ }
161
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
162
+ const clusters = Array.isArray(data.clusters) ? data.clusters : [];
163
+ const seen = new Set();
164
+ const turns = [];
165
+ clusters.forEach((cluster, clusterIdx) => {
166
+ const members = Array.isArray(cluster.members) ? cluster.members : [];
167
+ members.forEach((m) => {
168
+ const id = `${m.sessionId}:${m.turnId}`;
169
+ if (seen.has(id))
170
+ return;
171
+ seen.add(id);
172
+ const refined = ctx.refinedManager.loadRefinedTurn(m.sessionId, m.turnId);
173
+ turns.push({
174
+ sessionId: m.sessionId,
175
+ turnId: m.turnId,
176
+ clusterId: clusterIdx,
177
+ isHit: cluster.hitTurnId === m.turnId,
178
+ summary: refined?.summary || '',
179
+ facts: refined?.facts || [],
180
+ notes: refined?.notes || [],
181
+ timestamp: refined?.timestamp || data.createdAt || '',
182
+ });
183
+ });
184
+ });
185
+ turns.sort((a, b) => {
186
+ const sa = String(a.sessionId);
187
+ const sb = String(b.sessionId);
188
+ if (sa !== sb)
189
+ return sa.localeCompare(sb);
190
+ return (a.turnId ?? 0) - (b.turnId ?? 0);
191
+ });
192
+ return c.json({
193
+ key,
194
+ query: data.query || '',
195
+ createdAt: data.createdAt || '',
196
+ totalHits: turns.length,
197
+ clusterCount: clusters.length,
198
+ turns,
199
+ });
200
+ });
201
+ app.get('/api/refined-turn/:sessionId/:turnId', (c) => {
202
+ const sessionId = decodeURIComponent(c.req.param('sessionId'));
203
+ const turnId = parseInt(c.req.param('turnId'), 10);
204
+ const turn = ctx.refinedManager.loadRefinedTurn(sessionId, turnId);
205
+ if (!turn) {
206
+ return c.json({ error: 'Turn not found' }, 404);
207
+ }
208
+ return c.json(turn);
209
+ });
210
+ app.get('/api/folders', (c) => {
211
+ return c.json(listMemoryFolders(ctx));
212
+ });
213
+ app.post('/api/memory/:folder{.+}/:key', async (c) => {
214
+ const folder = decodeURIComponent(c.req.param('folder'));
215
+ const key = decodeURIComponent(c.req.param('key'));
216
+ const body = (await c.req.json().catch(() => ({})));
217
+ const tags = Array.isArray(body.tags)
218
+ ? body.tags.filter((t) => typeof t === 'string')
219
+ : [];
220
+ const result = await writeMemory(ctx, folder, key, {
221
+ content: typeof body.content === 'string' ? body.content : '',
222
+ title: typeof body.title === 'string' ? body.title : undefined,
223
+ tags,
224
+ });
225
+ return c.json(result, result.ok ? 200 : 400);
226
+ });
227
+ app.delete('/api/memory/:folder{.+}/:key', async (c) => {
228
+ const folder = decodeURIComponent(c.req.param('folder'));
229
+ const key = decodeURIComponent(c.req.param('key'));
230
+ const result = await deleteMemory(ctx, folder, key);
231
+ return c.json(result, result.ok ? 200 : 404);
232
+ });
42
233
  app.get('/api/memory/:folder{.+}/:key', (c) => {
43
234
  const folder = decodeURIComponent(c.req.param('folder'));
44
235
  const key = decodeURIComponent(c.req.param('key'));
@@ -47,6 +238,29 @@ export function createApp(ctx) {
47
238
  return c.json({ error: 'Memory not found' }, 404);
48
239
  return c.json(result);
49
240
  });
241
+ app.post('/api/folders', async (c) => {
242
+ const body = (await c.req.json().catch(() => ({})));
243
+ if (typeof body.folder !== 'string') {
244
+ return c.json({ ok: false, error: 'folder is required' }, 400);
245
+ }
246
+ const result = await createFolder(ctx, body.folder);
247
+ return c.json(result, result.ok ? 200 : 400);
248
+ });
249
+ app.post('/api/folders/:folder{.+}/rename', async (c) => {
250
+ const folder = decodeURIComponent(c.req.param('folder'));
251
+ const body = (await c.req.json().catch(() => ({})));
252
+ if (typeof body.newFolder !== 'string') {
253
+ return c.json({ ok: false, error: 'newFolder is required' }, 400);
254
+ }
255
+ const result = await renameFolder(ctx, folder, body.newFolder);
256
+ return c.json(result, result.ok ? 200 : 400);
257
+ });
258
+ app.delete('/api/folders/:folder{.+}', async (c) => {
259
+ const folder = decodeURIComponent(c.req.param('folder'));
260
+ const recursive = c.req.query('recursive') === 'true';
261
+ const result = await deleteFolder(ctx, folder, recursive);
262
+ return c.json(result, result.ok ? 200 : 400);
263
+ });
50
264
  app.post('/api/essence', async (c) => {
51
265
  const body = (await c.req.json().catch(() => ({})));
52
266
  if (typeof body.content !== 'string') {
@@ -69,11 +283,31 @@ export function createApp(ctx) {
69
283
  const result = updateTheme(ctx, theme, patch);
70
284
  return c.json(result, result.ok ? 200 : 404);
71
285
  });
286
+ app.delete('/api/themes/:theme', async (c) => {
287
+ const theme = decodeURIComponent(c.req.param('theme'));
288
+ const result = deleteTheme(ctx, theme);
289
+ return c.json(result, result.ok ? 200 : 404);
290
+ });
291
+ app.delete('/api/searches/:key', async (c) => {
292
+ const key = decodeURIComponent(c.req.param('key'));
293
+ const deleteRefinedTurns = c.req.query('deleteRefinedTurns') === 'true';
294
+ const result = await deleteSearchView(ctx, key, deleteRefinedTurns);
295
+ return c.json(result, result.ok ? 200 : 404);
296
+ });
72
297
  app.post('/api/sync', async (c) => {
73
298
  const result = await ctx.indexDao.reconcileIndex();
74
299
  return c.json(result);
75
300
  });
301
+ app.get('/kimi-theme.css', async (c) => {
302
+ const result = await proxyKimiThemeCss();
303
+ c.header('Content-Type', 'text/css');
304
+ c.header('X-Theme-Source', result.fromCache ? 'cache' : result.css === FALLBACK_CSS ? 'fallback' : 'proxy');
305
+ return c.body(result.css);
306
+ });
76
307
  const staticRoot = getStaticRoot();
308
+ if (!fs.existsSync(staticRoot)) {
309
+ fs.mkdirSync(staticRoot, { recursive: true });
310
+ }
77
311
  app.use('/*', serveStatic({
78
312
  root: staticRoot,
79
313
  index: 'index.html',
@@ -82,7 +316,7 @@ export function createApp(ctx) {
82
316
  const indexPath = path.join(staticRoot, 'index.html');
83
317
  const html = fs.existsSync(indexPath)
84
318
  ? fs.readFileSync(indexPath, 'utf8')
85
- : '<h1>kimi-memory-vis</h1><p>Static files not found. Run npm run build first.</p>';
319
+ : '<!doctype html><html><head><title>Memory Vis</title></head><body><h1>kimi-memory-vis</h1><p>Static files not found. Run npm run build first.</p></body></html>';
86
320
  return c.html(html);
87
321
  });
88
322
  return app;