@romandp/context-memory-mcp 1.0.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 +454 -0
- package/bin/mcp-memory.js +306 -0
- package/dist/config/paths.d.ts +10 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +41 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/db/init.d.ts +6 -0
- package/dist/db/init.d.ts.map +1 -0
- package/dist/db/init.js +37 -0
- package/dist/db/init.js.map +1 -0
- package/dist/db/migrations/runner.d.ts +9 -0
- package/dist/db/migrations/runner.d.ts.map +1 -0
- package/dist/db/migrations/runner.js +285 -0
- package/dist/db/migrations/runner.js.map +1 -0
- package/dist/db/schema.d.ts +51 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +496 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/http/routes.d.ts +3 -0
- package/dist/http/routes.d.ts.map +1 -0
- package/dist/http/routes.js +968 -0
- package/dist/http/routes.js.map +1 -0
- package/dist/http/server.d.ts +5 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +45 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/swagger.d.ts +2 -0
- package/dist/http/swagger.d.ts.map +1 -0
- package/dist/http/swagger.js +101 -0
- package/dist/http/swagger.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/budget.d.ts +22 -0
- package/dist/memory/budget.d.ts.map +1 -0
- package/dist/memory/budget.js +51 -0
- package/dist/memory/budget.js.map +1 -0
- package/dist/memory/facts.d.ts +3 -0
- package/dist/memory/facts.d.ts.map +1 -0
- package/dist/memory/facts.js +63 -0
- package/dist/memory/facts.js.map +1 -0
- package/dist/memory/rebuild.d.ts +4 -0
- package/dist/memory/rebuild.d.ts.map +1 -0
- package/dist/memory/rebuild.js +31 -0
- package/dist/memory/rebuild.js.map +1 -0
- package/dist/memory/response.d.ts +11 -0
- package/dist/memory/response.d.ts.map +1 -0
- package/dist/memory/response.js +20 -0
- package/dist/memory/response.js.map +1 -0
- package/dist/memory/summary.d.ts +3 -0
- package/dist/memory/summary.d.ts.map +1 -0
- package/dist/memory/summary.js +67 -0
- package/dist/memory/summary.js.map +1 -0
- package/dist/memory/toon.d.ts +20 -0
- package/dist/memory/toon.d.ts.map +1 -0
- package/dist/memory/toon.js +102 -0
- package/dist/memory/toon.js.map +1 -0
- package/dist/memory/view.d.ts +4 -0
- package/dist/memory/view.d.ts.map +1 -0
- package/dist/memory/view.js +7 -0
- package/dist/memory/view.js.map +1 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.d.ts.map +1 -0
- package/dist/server/setup.js +291 -0
- package/dist/server/setup.js.map +1 -0
- package/dist/tools/audit.d.ts +2 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +22 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/context.d.ts +5 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +104 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/entry.d.ts +9 -0
- package/dist/tools/entry.d.ts.map +1 -0
- package/dist/tools/entry.js +214 -0
- package/dist/tools/entry.js.map +1 -0
- package/dist/tools/project.d.ts +4 -0
- package/dist/tools/project.d.ts.map +1 -0
- package/dist/tools/project.js +54 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/task.d.ts +4 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +49 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/types/context.d.ts +139 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync, copyFileSync, unlinkSync, openSync, closeSync } from 'fs';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { resolve, dirname } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import http from 'http';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const ROOT = resolve(__dirname, '..');
|
|
11
|
+
const DIST_ENTRY = resolve(ROOT, 'dist/index.js');
|
|
12
|
+
const PKG = JSON.parse(readFileSync(resolve(ROOT, 'package.json'), 'utf-8'));
|
|
13
|
+
|
|
14
|
+
function getAppPaths(env = process.env, platform = process.platform) {
|
|
15
|
+
const appName = 'mcp-memory';
|
|
16
|
+
|
|
17
|
+
function resolveAppHome() {
|
|
18
|
+
if (env.MCP_MEMORY_HOME) return resolve(env.MCP_MEMORY_HOME);
|
|
19
|
+
|
|
20
|
+
if (platform === 'win32') {
|
|
21
|
+
const localAppData = env.LOCALAPPDATA || resolve(os.homedir(), 'AppData', 'Local');
|
|
22
|
+
return resolve(localAppData, appName);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (platform === 'darwin') {
|
|
26
|
+
return resolve(os.homedir(), 'Library', 'Application Support', appName);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const dataHome = env.XDG_DATA_HOME || resolve(os.homedir(), '.local', 'share');
|
|
30
|
+
return resolve(dataHome, appName);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function resolveStateDir(appHome) {
|
|
34
|
+
if (env.MCP_MEMORY_HOME) return resolve(appHome, 'state');
|
|
35
|
+
if (platform === 'win32' || platform === 'darwin') return resolve(appHome, 'state');
|
|
36
|
+
const stateHome = env.XDG_STATE_HOME || resolve(os.homedir(), '.local', 'state');
|
|
37
|
+
return resolve(stateHome, appName);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const appHome = resolveAppHome();
|
|
41
|
+
const dataDir = env.MCP_MEMORY_HOME ? resolve(appHome, 'data') : appHome;
|
|
42
|
+
const stateDir = resolveStateDir(appHome);
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
appHome,
|
|
46
|
+
dataDir,
|
|
47
|
+
stateDir,
|
|
48
|
+
dbPath: resolve(env.DB_PATH || resolve(dataDir, 'memory.db')),
|
|
49
|
+
logPath: resolve(env.LOG_PATH || resolve(stateDir, 'server.log')),
|
|
50
|
+
pidPath: resolve(env.PID_PATH || resolve(stateDir, 'server.pid')),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const PATHS = getAppPaths();
|
|
55
|
+
|
|
56
|
+
function ensureParentDirs() {
|
|
57
|
+
mkdirSync(dirname(PATHS.dbPath), { recursive: true });
|
|
58
|
+
mkdirSync(dirname(PATHS.logPath), { recursive: true });
|
|
59
|
+
mkdirSync(dirname(PATHS.pidPath), { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function ensureDistExists() {
|
|
63
|
+
if (!existsSync(DIST_ENTRY)) {
|
|
64
|
+
console.error('[mcp-memory] Compiled server not found. Reinstall package or run npm run build in development checkout.');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function readPid() {
|
|
70
|
+
if (!existsSync(PATHS.pidPath)) return null;
|
|
71
|
+
const pid = parseInt(readFileSync(PATHS.pidPath, 'utf-8').trim(), 10);
|
|
72
|
+
return isNaN(pid) ? null : pid;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function isRunning(pid) {
|
|
76
|
+
if (!pid) return false;
|
|
77
|
+
try {
|
|
78
|
+
process.kill(pid, 0);
|
|
79
|
+
return true;
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function getStatus() {
|
|
86
|
+
const pid = readPid();
|
|
87
|
+
const running = pid && isRunning(pid);
|
|
88
|
+
return { pid, running };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function spawnServer(detached, stdio, extraEnv = {}) {
|
|
92
|
+
ensureParentDirs();
|
|
93
|
+
ensureDistExists();
|
|
94
|
+
|
|
95
|
+
return spawn(process.execPath, [DIST_ENTRY], {
|
|
96
|
+
cwd: ROOT,
|
|
97
|
+
detached,
|
|
98
|
+
stdio,
|
|
99
|
+
env: {
|
|
100
|
+
...process.env,
|
|
101
|
+
DB_PATH: PATHS.dbPath,
|
|
102
|
+
LOG_PATH: PATHS.logPath,
|
|
103
|
+
PID_PATH: PATHS.pidPath,
|
|
104
|
+
...extraEnv,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function cmdStart() {
|
|
110
|
+
const { running, pid } = getStatus();
|
|
111
|
+
if (running) {
|
|
112
|
+
console.log(`[mcp-memory] Server already running (PID ${pid})`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
console.log('[mcp-memory] Starting server...');
|
|
117
|
+
ensureParentDirs();
|
|
118
|
+
const logFd = openSync(PATHS.logPath, 'a');
|
|
119
|
+
const child = spawnServer(true, ['ignore', logFd, logFd]);
|
|
120
|
+
child.unref();
|
|
121
|
+
closeSync(logFd);
|
|
122
|
+
|
|
123
|
+
const serverPid = child.pid;
|
|
124
|
+
writeFileSync(PATHS.pidPath, String(serverPid));
|
|
125
|
+
|
|
126
|
+
await new Promise(r => setTimeout(r, 1500));
|
|
127
|
+
|
|
128
|
+
if (isRunning(serverPid)) {
|
|
129
|
+
console.log(`[mcp-memory] Server started (PID ${serverPid})`);
|
|
130
|
+
console.log(`[mcp-memory] HTTP: http://localhost:${process.env.HTTP_PORT || 3001}`);
|
|
131
|
+
console.log(`[mcp-memory] MCP: stdio`);
|
|
132
|
+
console.log(`[mcp-memory] DB: ${PATHS.dbPath}`);
|
|
133
|
+
console.log(`[mcp-memory] Logs: ${PATHS.logPath}`);
|
|
134
|
+
console.log(`[mcp-memory] PID file: ${PATHS.pidPath}`);
|
|
135
|
+
} else {
|
|
136
|
+
console.error('[mcp-memory] Server failed to start. Check logs:');
|
|
137
|
+
console.error(` ${PATHS.logPath}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function cmdStop() {
|
|
142
|
+
const { running, pid } = getStatus();
|
|
143
|
+
if (!running) {
|
|
144
|
+
console.log('[mcp-memory] Server not running');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
console.log(`[mcp-memory] Stopping server (PID ${pid})...`);
|
|
149
|
+
try {
|
|
150
|
+
process.kill(pid, 'SIGTERM');
|
|
151
|
+
setTimeout(() => {
|
|
152
|
+
if (isRunning(pid)) process.kill(pid, 'SIGKILL');
|
|
153
|
+
}, 3000);
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.error(`[mcp-memory] Error: ${e.message}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
try { unlinkSync(PATHS.pidPath); } catch {}
|
|
159
|
+
console.log('[mcp-memory] Server stopped');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function cmdStatus() {
|
|
163
|
+
const { running, pid } = getStatus();
|
|
164
|
+
if (running) {
|
|
165
|
+
console.log(`[mcp-memory] Server is RUNNING (PID ${pid})`);
|
|
166
|
+
console.log(` HTTP: http://localhost:${process.env.HTTP_PORT || 3001}`);
|
|
167
|
+
console.log(` DB: ${PATHS.dbPath}`);
|
|
168
|
+
console.log(` Log: ${PATHS.logPath}`);
|
|
169
|
+
|
|
170
|
+
const healthUrl = `http://localhost:${process.env.HTTP_PORT || 3001}/health`;
|
|
171
|
+
try {
|
|
172
|
+
const req = http.get(healthUrl, (r) => {
|
|
173
|
+
let data = '';
|
|
174
|
+
r.on('data', c => data += c);
|
|
175
|
+
r.on('end', () => {
|
|
176
|
+
try {
|
|
177
|
+
const j = JSON.parse(data);
|
|
178
|
+
console.log(` Health: ${j.status} (${j.timestamp})`);
|
|
179
|
+
} catch {
|
|
180
|
+
console.log(' Health: unreachable');
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
req.on('error', () => console.log(' Health: unreachable'));
|
|
185
|
+
req.setTimeout(2000, () => { req.destroy(); });
|
|
186
|
+
} catch {}
|
|
187
|
+
} else {
|
|
188
|
+
console.log('[mcp-memory] Server is STOPPED');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function cmdRestart() {
|
|
193
|
+
cmdStop();
|
|
194
|
+
setTimeout(() => cmdStart(), 1000);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function cmdLogs() {
|
|
198
|
+
if (!existsSync(PATHS.logPath)) {
|
|
199
|
+
console.log('[mcp-memory] No logs yet');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const tail = spawn('tail', ['-f', PATHS.logPath], { stdio: 'inherit' });
|
|
203
|
+
process.on('SIGINT', () => { tail.kill(); process.exit(0); });
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function cmdStdio() {
|
|
207
|
+
console.error('[mcp-memory] Starting MCP stdio server...');
|
|
208
|
+
const child = spawnServer(false, ['inherit', 'inherit', 'inherit']);
|
|
209
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function cmdInfo() {
|
|
213
|
+
console.log(`Project: ${PKG.name} v${PKG.version}`);
|
|
214
|
+
console.log(`Install: ${ROOT}`);
|
|
215
|
+
console.log(`DB: ${PATHS.dbPath}`);
|
|
216
|
+
console.log(`Log: ${PATHS.logPath}`);
|
|
217
|
+
console.log(`PID File: ${PATHS.pidPath}`);
|
|
218
|
+
console.log(`HTTP Port: ${process.env.HTTP_PORT || 3001}`);
|
|
219
|
+
console.log('');
|
|
220
|
+
console.log('Commands:');
|
|
221
|
+
console.log(' mcp-memory start Start server in background');
|
|
222
|
+
console.log(' mcp-memory stop Stop server');
|
|
223
|
+
console.log(' mcp-memory status Check server status');
|
|
224
|
+
console.log(' mcp-memory restart Restart server');
|
|
225
|
+
console.log(' mcp-memory logs Tail server logs');
|
|
226
|
+
console.log(' mcp-memory stdio Run MCP server in foreground');
|
|
227
|
+
console.log(' mcp-memory paths Show resolved storage paths');
|
|
228
|
+
console.log(' mcp-memory version Show package version');
|
|
229
|
+
console.log(' mcp-memory rebuild-memory Rebuild derived summaries and facts');
|
|
230
|
+
console.log(' mcp-memory migrate-db --from X Copy legacy database to default location');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function cmdPaths() {
|
|
234
|
+
console.log(`Home: ${PATHS.appHome}`);
|
|
235
|
+
console.log(`Data: ${PATHS.dataDir}`);
|
|
236
|
+
console.log(`State: ${PATHS.stateDir}`);
|
|
237
|
+
console.log(`DB: ${PATHS.dbPath}`);
|
|
238
|
+
console.log(`Log: ${PATHS.logPath}`);
|
|
239
|
+
console.log(`PID: ${PATHS.pidPath}`);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function cmdVersion() {
|
|
243
|
+
console.log(PKG.version);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function cmdRebuildMemory() {
|
|
247
|
+
ensureParentDirs();
|
|
248
|
+
ensureDistExists();
|
|
249
|
+
|
|
250
|
+
const child = spawn(process.execPath, [DIST_ENTRY, '--rebuild-memory'], {
|
|
251
|
+
cwd: ROOT,
|
|
252
|
+
stdio: 'inherit',
|
|
253
|
+
env: {
|
|
254
|
+
...process.env,
|
|
255
|
+
DB_PATH: PATHS.dbPath,
|
|
256
|
+
LOG_PATH: PATHS.logPath,
|
|
257
|
+
PID_PATH: PATHS.pidPath,
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function cmdMigrateDb() {
|
|
265
|
+
const fromFlag = process.argv.indexOf('--from');
|
|
266
|
+
if (fromFlag === -1 || !process.argv[fromFlag + 1]) {
|
|
267
|
+
console.error('Usage: mcp-memory migrate-db --from /path/to/memory.db');
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const sourcePath = resolve(process.argv[fromFlag + 1]);
|
|
272
|
+
if (!existsSync(sourcePath)) {
|
|
273
|
+
console.error(`[mcp-memory] Source database not found: ${sourcePath}`);
|
|
274
|
+
process.exit(1);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
ensureParentDirs();
|
|
278
|
+
if (existsSync(PATHS.dbPath)) {
|
|
279
|
+
console.error(`[mcp-memory] Destination database already exists: ${PATHS.dbPath}`);
|
|
280
|
+
console.error('[mcp-memory] Move or override DB_PATH if you want another target.');
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
copyFileSync(sourcePath, PATHS.dbPath);
|
|
285
|
+
console.log(`[mcp-memory] Database copied to ${PATHS.dbPath}`);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const cmd = process.argv[2] || 'status';
|
|
289
|
+
|
|
290
|
+
switch (cmd) {
|
|
291
|
+
case 'start': cmdStart(); break;
|
|
292
|
+
case 'stop': cmdStop(); break;
|
|
293
|
+
case 'status': cmdStatus(); break;
|
|
294
|
+
case 'restart': cmdRestart(); break;
|
|
295
|
+
case 'logs': cmdLogs(); break;
|
|
296
|
+
case 'info': cmdInfo(); break;
|
|
297
|
+
case 'stdio': cmdStdio(); break;
|
|
298
|
+
case 'paths': cmdPaths(); break;
|
|
299
|
+
case 'version': cmdVersion(); break;
|
|
300
|
+
case 'rebuild-memory': cmdRebuildMemory(); break;
|
|
301
|
+
case 'migrate-db': cmdMigrateDb(); break;
|
|
302
|
+
default:
|
|
303
|
+
console.log(`Unknown command: ${cmd}`);
|
|
304
|
+
console.log('Usage: mcp-memory <start|stop|status|restart|logs|info|stdio|paths|version|rebuild-memory|migrate-db>');
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface AppPaths {
|
|
2
|
+
appHome: string;
|
|
3
|
+
dataDir: string;
|
|
4
|
+
stateDir: string;
|
|
5
|
+
dbPath: string;
|
|
6
|
+
logPath: string;
|
|
7
|
+
pidPath: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getAppPaths(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): AppPaths;
|
|
10
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AA+BD,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,QAAQ,CAaxH"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const APP_NAME = 'mcp-memory';
|
|
4
|
+
function resolveAppHome(env, platform) {
|
|
5
|
+
const homeDir = env.HOME || os.homedir();
|
|
6
|
+
if (env.MCP_MEMORY_HOME)
|
|
7
|
+
return path.resolve(env.MCP_MEMORY_HOME);
|
|
8
|
+
if (platform === 'win32') {
|
|
9
|
+
const localAppData = env.LOCALAPPDATA || path.join(homeDir, 'AppData', 'Local');
|
|
10
|
+
return path.join(localAppData, APP_NAME);
|
|
11
|
+
}
|
|
12
|
+
if (platform === 'darwin') {
|
|
13
|
+
return path.join(homeDir, 'Library', 'Application Support', APP_NAME);
|
|
14
|
+
}
|
|
15
|
+
const dataHome = env.XDG_DATA_HOME || path.join(homeDir, '.local', 'share');
|
|
16
|
+
return path.join(dataHome, APP_NAME);
|
|
17
|
+
}
|
|
18
|
+
function resolveStateDir(env, platform, appHome) {
|
|
19
|
+
const homeDir = env.HOME || os.homedir();
|
|
20
|
+
if (env.MCP_MEMORY_HOME)
|
|
21
|
+
return path.join(appHome, 'state');
|
|
22
|
+
if (platform === 'win32' || platform === 'darwin') {
|
|
23
|
+
return path.join(appHome, 'state');
|
|
24
|
+
}
|
|
25
|
+
const stateHome = env.XDG_STATE_HOME || path.join(homeDir, '.local', 'state');
|
|
26
|
+
return path.join(stateHome, APP_NAME);
|
|
27
|
+
}
|
|
28
|
+
export function getAppPaths(env = process.env, platform = process.platform) {
|
|
29
|
+
const appHome = resolveAppHome(env, platform);
|
|
30
|
+
const dataDir = env.MCP_MEMORY_HOME ? path.join(appHome, 'data') : appHome;
|
|
31
|
+
const stateDir = resolveStateDir(env, platform, appHome);
|
|
32
|
+
return {
|
|
33
|
+
appHome,
|
|
34
|
+
dataDir,
|
|
35
|
+
stateDir,
|
|
36
|
+
dbPath: path.resolve(env.DB_PATH || path.join(dataDir, 'memory.db')),
|
|
37
|
+
logPath: path.resolve(env.LOG_PATH || path.join(stateDir, 'server.log')),
|
|
38
|
+
pidPath: path.resolve(env.PID_PATH || path.join(stateDir, 'server.pid')),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,QAAQ,GAAG,YAAY,CAAC;AAW9B,SAAS,cAAc,CAAC,GAAsB,EAAE,QAAyB;IACvE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAElE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,GAAsB,EAAE,QAAyB,EAAE,OAAe;IACzF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5D,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC5G,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO;QACP,OAAO;QACP,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;KACzE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export declare function getDbPath(): string;
|
|
3
|
+
export declare function initializeDatabase(dbPath: string): Database.Database;
|
|
4
|
+
export declare function getDatabase(): Database.Database;
|
|
5
|
+
export declare function closeDatabase(): void;
|
|
6
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/db/init.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAepE;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAK/C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
package/dist/db/init.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { runMigrations } from './migrations/runner.js';
|
|
5
|
+
let db;
|
|
6
|
+
let currentDbPath;
|
|
7
|
+
export function getDbPath() {
|
|
8
|
+
if (!currentDbPath)
|
|
9
|
+
throw new Error('Database not initialized');
|
|
10
|
+
return currentDbPath;
|
|
11
|
+
}
|
|
12
|
+
export function initializeDatabase(dbPath) {
|
|
13
|
+
const dir = path.dirname(dbPath);
|
|
14
|
+
if (!fs.existsSync(dir)) {
|
|
15
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
currentDbPath = dbPath;
|
|
18
|
+
db = new Database(dbPath);
|
|
19
|
+
db.pragma('journal_mode = WAL');
|
|
20
|
+
db.pragma('foreign_keys = ON');
|
|
21
|
+
runMigrations(db);
|
|
22
|
+
console.log('[DB] Database initialized successfully at:', dbPath);
|
|
23
|
+
return db;
|
|
24
|
+
}
|
|
25
|
+
export function getDatabase() {
|
|
26
|
+
if (!db) {
|
|
27
|
+
throw new Error('Database not initialized. Call initializeDatabase() first.');
|
|
28
|
+
}
|
|
29
|
+
return db;
|
|
30
|
+
}
|
|
31
|
+
export function closeDatabase() {
|
|
32
|
+
if (db) {
|
|
33
|
+
db.close();
|
|
34
|
+
console.log('[DB] Database connection closed.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/db/init.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,IAAI,EAAqB,CAAC;AAC1B,IAAI,aAAqB,CAAC;AAE1B,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,aAAa,GAAG,MAAM,CAAC;IACvB,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,aAAa,CAAC,EAAE,CAAC,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export interface Migration {
|
|
3
|
+
name: string;
|
|
4
|
+
up: (db: Database.Database) => void;
|
|
5
|
+
}
|
|
6
|
+
declare function toFtsQuery(input: string): string;
|
|
7
|
+
export { toFtsQuery };
|
|
8
|
+
export declare function runMigrations(db: Database.Database): void;
|
|
9
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/runner.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;CACrC;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOzC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AA0QtB,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAiBzD"}
|