context-vault 3.2.1 → 3.2.3

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/bin/cli.js CHANGED
@@ -4,8 +4,12 @@
4
4
  const nodeVersion = parseInt(process.versions.node.split('.')[0], 10);
5
5
  if (nodeVersion < 22) {
6
6
  process.stderr.write(
7
- `\ncontext-vault requires Node.js >= 22 (you have ${process.versions.node}).\n` +
8
- `Install a newer version: https://nodejs.org/\n\n`
7
+ `\ncontext-vault requires Node.js >= 22 (you have ${process.versions.node}).\n\n` +
8
+ ` Upgrade options:\n` +
9
+ ` nvm install 22 # if using nvm\n` +
10
+ ` fnm install 22 # if using fnm\n` +
11
+ ` volta install node@22 # if using volta\n` +
12
+ ` https://nodejs.org/ # manual download\n\n`
9
13
  );
10
14
  process.exit(1);
11
15
  }
@@ -41,7 +45,8 @@ function isInstalledPackage() {
41
45
  if (ROOT.includes('/node_modules/') || ROOT.includes('\\node_modules\\')) return true;
42
46
  // Also check if `context-vault` binary on PATH resolves to this package
43
47
  try {
44
- const which = execSync('which context-vault', { encoding: 'utf-8', stdio: 'pipe' }).trim();
48
+ const cmd = platform() === 'win32' ? 'where context-vault' : 'which context-vault';
49
+ const which = execSync(cmd, { encoding: 'utf-8', stdio: 'pipe' }).trim();
45
50
  if (which) return true;
46
51
  } catch {}
47
52
  return false;
@@ -960,23 +965,32 @@ async function runSetup() {
960
965
 
961
966
  // Verify DB is accessible
962
967
  let dbAccessible = false;
968
+ let dbError = null;
963
969
  try {
964
970
  const { initDatabase } = await import('@context-vault/core/db');
965
971
  const db = await initDatabase(vaultConfig.dbPath);
966
972
  db.prepare('SELECT 1').get();
967
973
  db.close();
968
974
  dbAccessible = true;
969
- } catch {}
975
+ } catch (e) {
976
+ dbError = e;
977
+ }
970
978
 
971
979
  const checks = [
972
980
  { label: 'Vault directory exists', pass: existsSync(resolvedVaultDir) },
973
981
  { label: 'Config file written', pass: existsSync(configPath) },
974
- { label: 'Database accessible', pass: dbAccessible },
982
+ { label: 'Database accessible', pass: dbAccessible, error: dbError },
975
983
  { label: 'At least one tool configured', pass: okResults.length > 0 },
976
984
  ];
977
985
  const passed = checks.filter((c) => c.pass).length;
978
986
  for (const c of checks) {
979
987
  console.log(` ${c.pass ? green('✓') : red('✗')} ${c.label}`);
988
+ if (!c.pass && c.error) {
989
+ console.log(` ${dim(c.error.message)}`);
990
+ if (c.error.message.includes('EACCES') || c.error.message.includes('permission')) {
991
+ console.log(` ${dim('Fix: check file permissions on ' + vaultConfig.dbPath)}`);
992
+ }
993
+ }
980
994
  }
981
995
 
982
996
  // Completion box
@@ -995,6 +1009,12 @@ async function runSetup() {
995
1009
  ` ${bold('CLI Commands:')}`,
996
1010
  ` ${isNpx() ? 'npx context-vault' : 'context-vault'} status Show vault health`,
997
1011
  ` ${isNpx() ? 'npx context-vault' : 'context-vault'} update Check for updates`,
1012
+ ...(isNpx()
1013
+ ? [
1014
+ ``,
1015
+ ` ${dim('Tip: npm i -g context-vault for faster MCP startup')}`,
1016
+ ]
1017
+ : []),
998
1018
  ];
999
1019
  const innerWidth = Math.max(...boxLines.map((l) => l.length)) + 2;
1000
1020
  const pad = (s) => s + ' '.repeat(Math.max(0, innerWidth - s.length));
@@ -3878,11 +3898,12 @@ function installSessionEndHook() {
3878
3898
  );
3879
3899
  if (alreadyInstalled) return false;
3880
3900
 
3901
+ const flushCmd = isInstalledPackage() && !isNpx() ? 'context-vault flush' : 'npx -y context-vault flush';
3881
3902
  settings.hooks.SessionEnd.push({
3882
3903
  hooks: [
3883
3904
  {
3884
3905
  type: 'command',
3885
- command: 'npx context-vault flush',
3906
+ command: flushCmd,
3886
3907
  timeout: 10,
3887
3908
  },
3888
3909
  ],
@@ -4367,9 +4388,9 @@ async function runDoctor() {
4367
4388
 
4368
4389
  // ── Node.js version ──────────────────────────────────────────────────────
4369
4390
  const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
4370
- if (nodeMajor < 20) {
4371
- console.log(` ${red('✘')} Node.js ${process.versions.node} — requires >= 20`);
4372
- console.log(` ${dim('Fix: install a newer Node.js from https://nodejs.org/')}`);
4391
+ if (nodeMajor < 22) {
4392
+ console.log(` ${red('✘')} Node.js ${process.versions.node} — requires >= 22`);
4393
+ console.log(` ${dim('Fix: nvm install 22 / fnm install 22 / https://nodejs.org/')}`);
4373
4394
  allOk = false;
4374
4395
  } else {
4375
4396
  console.log(` ${green('✓')} Node.js ${process.versions.node} ${dim(`(${process.execPath})`)}`);
@@ -4869,28 +4890,40 @@ async function runRestart() {
4869
4890
  console.log(` ${bold('◇ context-vault restart')}`);
4870
4891
  console.log();
4871
4892
 
4893
+ const isWin = platform() === 'win32';
4872
4894
  let psOutput;
4873
4895
  try {
4874
- psOutput = execSync('ps aux', { encoding: 'utf-8', timeout: 5000 });
4896
+ const psCmd = isWin
4897
+ ? 'wmic process where "CommandLine like \'%context-vault%\'" get ProcessId,CommandLine /format:list'
4898
+ : 'ps aux';
4899
+ psOutput = execSync(psCmd, { encoding: 'utf-8', timeout: 5000 });
4875
4900
  } catch (e) {
4876
4901
  console.error(red(` Failed to list processes: ${e.message}`));
4877
4902
  process.exit(1);
4878
4903
  }
4879
4904
 
4880
4905
  const currentPid = process.pid;
4881
- const lines = psOutput.split('\n');
4882
-
4883
4906
  const serverPids = [];
4884
- for (const line of lines) {
4885
- const match = line.match(/^\S+\s+(\d+)\s/);
4886
- if (!match) continue;
4887
- const pid = parseInt(match[1], 10);
4888
- if (pid === currentPid) continue;
4889
- if (
4890
- /context-vault.*(serve|stdio|server\/index)/.test(line) ||
4891
- /server\/index\.js.*context-vault/.test(line)
4892
- ) {
4893
- serverPids.push(pid);
4907
+
4908
+ if (isWin) {
4909
+ const pidMatches = psOutput.matchAll(/ProcessId=(\d+)/g);
4910
+ for (const m of pidMatches) {
4911
+ const pid = parseInt(m[1], 10);
4912
+ if (pid !== currentPid) serverPids.push(pid);
4913
+ }
4914
+ } else {
4915
+ const lines = psOutput.split('\n');
4916
+ for (const line of lines) {
4917
+ const match = line.match(/^\S+\s+(\d+)\s/);
4918
+ if (!match) continue;
4919
+ const pid = parseInt(match[1], 10);
4920
+ if (pid === currentPid) continue;
4921
+ if (
4922
+ /context-vault.*(serve|stdio|server\/index)/.test(line) ||
4923
+ /server\/index\.js.*context-vault/.test(line)
4924
+ ) {
4925
+ serverPids.push(pid);
4926
+ }
4894
4927
  }
4895
4928
  }
4896
4929
 
@@ -98,7 +98,7 @@ export function registerTools(server, ctx) {
98
98
  cv_version: pkg.version,
99
99
  auto: true,
100
100
  },
101
- });
101
+ }, null /* skip embedding to avoid CPU cascade on repeated errors */);
102
102
  }
103
103
  catch { }
104
104
  return err(e.message, 'INTERNAL_ERROR');
@@ -1 +1 @@
1
- {"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../src/register-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../src/register-tools.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env node
2
+ import { randomUUID } from 'node:crypto';
2
3
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
6
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
7
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
4
8
  import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs';
5
9
  import { join, dirname } from 'node:path';
6
10
  import { homedir } from 'node:os';
@@ -78,21 +82,33 @@ async function main() {
78
82
  console.error(`[context-vault] Warning: startup prune failed: ${pruneErr.message}`);
79
83
  }
80
84
  phase = 'SERVER';
81
- const server = new McpServer({ name: 'context-vault', version: pkg.version }, { capabilities: { tools: {} } });
85
+ const CONFIG_CACHE_TTL_MS = 30_000;
86
+ let cachedConfig = config;
87
+ let configCachedAt = Date.now();
82
88
  let lastVaultDir = config.vaultDir;
83
89
  Object.defineProperty(ctx, 'config', {
84
90
  get() {
91
+ const now = Date.now();
92
+ if (now - configCachedAt < CONFIG_CACHE_TTL_MS)
93
+ return cachedConfig;
85
94
  const fresh = resolveConfig();
86
95
  if (fresh.vaultDir !== lastVaultDir) {
87
96
  console.error(`[context-vault] Config reloaded: vaultDir changed to ${fresh.vaultDir}`);
88
97
  lastVaultDir = fresh.vaultDir;
89
98
  fresh.vaultDirExists = existsSync(fresh.vaultDir);
90
99
  }
100
+ cachedConfig = fresh;
101
+ configCachedAt = now;
91
102
  return fresh;
92
103
  },
93
104
  configurable: true,
94
105
  });
95
- registerTools(server, ctx);
106
+ function createServer() {
107
+ const s = new McpServer({ name: 'context-vault', version: pkg.version }, { capabilities: { tools: {} } });
108
+ registerTools(s, ctx);
109
+ return s;
110
+ }
111
+ const server = createServer();
96
112
  function closeDb() {
97
113
  try {
98
114
  if (db.inTransaction) {
@@ -131,8 +147,88 @@ async function main() {
131
147
  process.on('SIGINT', () => shutdown('SIGINT'));
132
148
  process.on('SIGTERM', () => shutdown('SIGTERM'));
133
149
  phase = 'CONNECTED';
134
- const transport = new StdioServerTransport();
135
- await server.connect(transport);
150
+ const useHttp = process.argv.includes('--http');
151
+ if (useHttp) {
152
+ const portIdx = process.argv.indexOf('--port');
153
+ const port = portIdx !== -1 && process.argv[portIdx + 1]
154
+ ? parseInt(process.argv[portIdx + 1], 10)
155
+ : 3377;
156
+ const app = createMcpExpressApp();
157
+ const transports = {};
158
+ app.post('/mcp', async (req, res) => {
159
+ const sessionId = req.headers['mcp-session-id'];
160
+ try {
161
+ let transport;
162
+ if (sessionId && transports[sessionId]) {
163
+ transport = transports[sessionId];
164
+ }
165
+ else if (!sessionId && isInitializeRequest(req.body)) {
166
+ transport = new StreamableHTTPServerTransport({
167
+ sessionIdGenerator: () => randomUUID(),
168
+ onsessioninitialized: (sid) => {
169
+ transports[sid] = transport;
170
+ },
171
+ });
172
+ transport.onclose = () => {
173
+ const sid = transport.sessionId;
174
+ if (sid && transports[sid]) {
175
+ delete transports[sid];
176
+ }
177
+ };
178
+ const sessionServer = createServer();
179
+ await sessionServer.connect(transport);
180
+ await transport.handleRequest(req, res, req.body);
181
+ return;
182
+ }
183
+ else {
184
+ res.writeHead(400, { 'Content-Type': 'application/json' });
185
+ res.end(JSON.stringify({
186
+ jsonrpc: '2.0',
187
+ error: { code: -32000, message: 'Bad Request: No valid session ID' },
188
+ id: null,
189
+ }));
190
+ return;
191
+ }
192
+ await transport.handleRequest(req, res, req.body);
193
+ }
194
+ catch (error) {
195
+ console.error('[context-vault] HTTP error:', error);
196
+ if (!res.headersSent) {
197
+ res.writeHead(500, { 'Content-Type': 'application/json' });
198
+ res.end(JSON.stringify({
199
+ jsonrpc: '2.0',
200
+ error: { code: -32603, message: 'Internal server error' },
201
+ id: null,
202
+ }));
203
+ }
204
+ }
205
+ });
206
+ app.get('/mcp', async (req, res) => {
207
+ const sessionId = req.headers['mcp-session-id'];
208
+ if (!sessionId || !transports[sessionId]) {
209
+ res.writeHead(400);
210
+ res.end('Invalid or missing session ID');
211
+ return;
212
+ }
213
+ await transports[sessionId].handleRequest(req, res);
214
+ });
215
+ app.delete('/mcp', async (req, res) => {
216
+ const sessionId = req.headers['mcp-session-id'];
217
+ if (!sessionId || !transports[sessionId]) {
218
+ res.writeHead(400);
219
+ res.end('Invalid or missing session ID');
220
+ return;
221
+ }
222
+ await transports[sessionId].handleRequest(req, res);
223
+ });
224
+ app.listen(port, () => {
225
+ console.error(`[context-vault] Serving on http://localhost:${port}/mcp`);
226
+ });
227
+ }
228
+ else {
229
+ const transport = new StdioServerTransport();
230
+ await server.connect(transport);
231
+ }
136
232
  setTimeout(() => {
137
233
  import('node:child_process')
138
234
  .then(({ execSync }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,aAAa,EAAE,KAAK,CAAC;gBACT,aAAa,EAAE,KAAK;CAMjC;AAkCD,eAAO,MAAM,UAAU,szEAoDtB,CAAC;AAIF,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAmExE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,kBAAkB,CAiCtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAIjG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAOxD"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAiDrD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,aAAa,EAAE,KAAK,CAAC;gBACT,aAAa,EAAE,KAAK;CAMjC;AAkCD,eAAO,MAAM,UAAU,szEAoDtB,CAAC;AAIF,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAyExE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,kBAAkB,CAiCtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAIjG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAOxD"}
@@ -1,5 +1,60 @@
1
- import { unlinkSync, copyFileSync, existsSync } from 'node:fs';
1
+ import { unlinkSync, copyFileSync, existsSync, openSync, closeSync, mkdirSync, statSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
2
3
  import { DatabaseSync } from 'node:sqlite';
4
+ /**
5
+ * Acquire an exclusive file lock to serialize database initialization.
6
+ * Multiple MCP clients (Claude, Cursor, Windsurf) may each spawn a server
7
+ * instance simultaneously — without serialization, migrations and schema
8
+ * init race against each other.
9
+ *
10
+ * Uses O_EXCL (via 'wx' flag) as a cross-platform advisory lock.
11
+ * Returns a release function that removes the lock file.
12
+ */
13
+ function acquireInitLock(dbPath, timeoutMs = 10_000) {
14
+ const lockPath = dbPath + '.init-lock';
15
+ mkdirSync(dirname(lockPath), { recursive: true });
16
+ const start = Date.now();
17
+ while (true) {
18
+ try {
19
+ const fd = openSync(lockPath, 'wx');
20
+ closeSync(fd);
21
+ return () => {
22
+ try {
23
+ unlinkSync(lockPath);
24
+ }
25
+ catch { }
26
+ };
27
+ }
28
+ catch (err) {
29
+ if (err.code !== 'EEXIST')
30
+ throw err;
31
+ // Stale lock detection — if lock file is older than 30s, it's from a crashed process
32
+ try {
33
+ const { mtimeMs } = statSync(lockPath);
34
+ if (Date.now() - mtimeMs > 30_000) {
35
+ try {
36
+ unlinkSync(lockPath);
37
+ }
38
+ catch { }
39
+ continue;
40
+ }
41
+ }
42
+ catch { }
43
+ if (Date.now() - start > timeoutMs) {
44
+ // Timeout — break the lock and proceed (better than hanging forever)
45
+ console.error('[context-vault] Init lock timed out, breaking stale lock');
46
+ try {
47
+ unlinkSync(lockPath);
48
+ }
49
+ catch { }
50
+ continue;
51
+ }
52
+ // Busy-wait with small sleep (synchronous — we're in sync init code)
53
+ const waitMs = 50 + Math.random() * 100;
54
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, waitMs);
55
+ }
56
+ }
57
+ }
3
58
  export class NativeModuleError extends Error {
4
59
  originalError;
5
60
  constructor(originalError) {
@@ -99,7 +154,7 @@ export async function initDatabase(dbPath) {
99
154
  const db = new DatabaseSync(path, { allowExtension: true });
100
155
  db.exec('PRAGMA journal_mode = WAL');
101
156
  db.exec('PRAGMA foreign_keys = ON');
102
- db.exec('PRAGMA busy_timeout = 3000');
157
+ db.exec('PRAGMA busy_timeout = 5000');
103
158
  try {
104
159
  sqliteVec.load(db);
105
160
  }
@@ -108,50 +163,57 @@ export async function initDatabase(dbPath) {
108
163
  }
109
164
  return db;
110
165
  }
111
- const db = createDb(dbPath);
112
- const version = db.prepare('PRAGMA user_version').get()
113
- .user_version;
114
- if (version > 0 && version < 15) {
115
- console.error(`[context-vault] Schema v${version} is outdated. Rebuilding database...`);
116
- const backupPath = `${dbPath}.v${version}.backup`;
117
- let backupSucceeded = false;
118
- try {
119
- db.close();
120
- if (existsSync(dbPath)) {
121
- copyFileSync(dbPath, backupPath);
122
- console.error(`[context-vault] Backed up old database to: ${backupPath}`);
123
- backupSucceeded = true;
166
+ // Serialize init across concurrent server instances (Claude + Cursor + Windsurf)
167
+ const releaseLock = acquireInitLock(dbPath);
168
+ try {
169
+ const db = createDb(dbPath);
170
+ const version = db.prepare('PRAGMA user_version').get()
171
+ .user_version;
172
+ if (version > 0 && version < 15) {
173
+ console.error(`[context-vault] Schema v${version} is outdated. Rebuilding database...`);
174
+ const backupPath = `${dbPath}.v${version}.backup`;
175
+ let backupSucceeded = false;
176
+ try {
177
+ db.close();
178
+ if (existsSync(dbPath)) {
179
+ copyFileSync(dbPath, backupPath);
180
+ console.error(`[context-vault] Backed up old database to: ${backupPath}`);
181
+ backupSucceeded = true;
182
+ }
183
+ else {
184
+ backupSucceeded = true;
185
+ }
124
186
  }
125
- else {
126
- backupSucceeded = true;
187
+ catch (backupErr) {
188
+ console.error(`[context-vault] Warning: could not backup old database: ${backupErr.message}`);
127
189
  }
190
+ if (!backupSucceeded) {
191
+ throw new Error(`[context-vault] Aborting schema migration: backup failed for ${dbPath}. ` +
192
+ `Fix the backup issue or manually back up the file before upgrading.`);
193
+ }
194
+ unlinkSync(dbPath);
195
+ try {
196
+ unlinkSync(dbPath + '-wal');
197
+ }
198
+ catch { }
199
+ try {
200
+ unlinkSync(dbPath + '-shm');
201
+ }
202
+ catch { }
203
+ const freshDb = createDb(dbPath);
204
+ freshDb.exec(SCHEMA_DDL);
205
+ freshDb.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
206
+ return freshDb;
128
207
  }
129
- catch (backupErr) {
130
- console.error(`[context-vault] Warning: could not backup old database: ${backupErr.message}`);
131
- }
132
- if (!backupSucceeded) {
133
- throw new Error(`[context-vault] Aborting schema migration: backup failed for ${dbPath}. ` +
134
- `Fix the backup issue or manually back up the file before upgrading.`);
135
- }
136
- unlinkSync(dbPath);
137
- try {
138
- unlinkSync(dbPath + '-wal');
139
- }
140
- catch { }
141
- try {
142
- unlinkSync(dbPath + '-shm');
208
+ if (version < 15) {
209
+ db.exec(SCHEMA_DDL);
210
+ db.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
143
211
  }
144
- catch { }
145
- const freshDb = createDb(dbPath);
146
- freshDb.exec(SCHEMA_DDL);
147
- freshDb.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
148
- return freshDb;
212
+ return db;
149
213
  }
150
- if (version < 15) {
151
- db.exec(SCHEMA_DDL);
152
- db.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
214
+ finally {
215
+ releaseLock();
153
216
  }
154
- return db;
155
217
  }
156
218
  export function prepareStatements(db) {
157
219
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAuCA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAYtE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAmBlF;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAEjD"}
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AA+CA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAYtE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAmBlF;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAEjD"}
@@ -1,6 +1,8 @@
1
1
  import { join } from 'node:path';
2
2
  import { homedir } from 'node:os';
3
3
  import { mkdirSync } from 'node:fs';
4
+ import { availableParallelism } from 'node:os';
5
+ const MAX_EMBED_THREADS = Math.max(1, Math.min(2, Math.floor(availableParallelism() / 4)));
4
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
7
  let extractor = null;
6
8
  let embedAvailable = null;
@@ -15,10 +17,14 @@ async function ensurePipeline() {
15
17
  loadingPromise = (async () => {
16
18
  try {
17
19
  const { pipeline, env } = await import('@huggingface/transformers');
20
+ const threads = Number(process.env.CONTEXT_VAULT_EMBED_THREADS) || MAX_EMBED_THREADS;
21
+ if (env.backends?.onnx?.wasm) {
22
+ env.backends.onnx.wasm.numThreads = threads;
23
+ }
18
24
  const modelCacheDir = join(homedir(), '.context-mcp', 'models');
19
25
  mkdirSync(modelCacheDir, { recursive: true });
20
26
  env.cacheDir = modelCacheDir;
21
- console.error('[context-vault] Loading embedding model (first run may download ~22MB)...');
27
+ console.error(`[context-vault] Loading embedding model (threads=${threads})...`);
22
28
  extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
23
29
  embedAvailable = true;
24
30
  return extractor;
@@ -1 +1 @@
1
- {"version":3,"file":"embed.js","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-vault/core",
3
- "version": "3.2.1",
3
+ "version": "3.2.3",
4
4
  "type": "module",
5
5
  "description": "Pure local engine: capture, index, search, and utilities for context-vault",
6
6
  "main": "dist/main.js",
@@ -1,7 +1,55 @@
1
- import { unlinkSync, copyFileSync, existsSync } from 'node:fs';
1
+ import { unlinkSync, copyFileSync, existsSync, openSync, closeSync, mkdirSync, statSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
2
3
  import { DatabaseSync } from 'node:sqlite';
3
4
  import type { PreparedStatements } from './types.js';
4
5
 
6
+ /**
7
+ * Acquire an exclusive file lock to serialize database initialization.
8
+ * Multiple MCP clients (Claude, Cursor, Windsurf) may each spawn a server
9
+ * instance simultaneously — without serialization, migrations and schema
10
+ * init race against each other.
11
+ *
12
+ * Uses O_EXCL (via 'wx' flag) as a cross-platform advisory lock.
13
+ * Returns a release function that removes the lock file.
14
+ */
15
+ function acquireInitLock(dbPath: string, timeoutMs = 10_000): () => void {
16
+ const lockPath = dbPath + '.init-lock';
17
+ mkdirSync(dirname(lockPath), { recursive: true });
18
+
19
+ const start = Date.now();
20
+ while (true) {
21
+ try {
22
+ const fd = openSync(lockPath, 'wx');
23
+ closeSync(fd);
24
+ return () => {
25
+ try { unlinkSync(lockPath); } catch {}
26
+ };
27
+ } catch (err: any) {
28
+ if (err.code !== 'EEXIST') throw err;
29
+
30
+ // Stale lock detection — if lock file is older than 30s, it's from a crashed process
31
+ try {
32
+ const { mtimeMs } = statSync(lockPath);
33
+ if (Date.now() - mtimeMs > 30_000) {
34
+ try { unlinkSync(lockPath); } catch {}
35
+ continue;
36
+ }
37
+ } catch {}
38
+
39
+ if (Date.now() - start > timeoutMs) {
40
+ // Timeout — break the lock and proceed (better than hanging forever)
41
+ console.error('[context-vault] Init lock timed out, breaking stale lock');
42
+ try { unlinkSync(lockPath); } catch {}
43
+ continue;
44
+ }
45
+
46
+ // Busy-wait with small sleep (synchronous — we're in sync init code)
47
+ const waitMs = 50 + Math.random() * 100;
48
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, waitMs);
49
+ }
50
+ }
51
+ }
52
+
5
53
  export class NativeModuleError extends Error {
6
54
  originalError: Error;
7
55
  constructor(originalError: Error) {
@@ -107,7 +155,7 @@ export async function initDatabase(dbPath: string): Promise<DatabaseSync> {
107
155
  const db = new DatabaseSync(path, { allowExtension: true });
108
156
  db.exec('PRAGMA journal_mode = WAL');
109
157
  db.exec('PRAGMA foreign_keys = ON');
110
- db.exec('PRAGMA busy_timeout = 3000');
158
+ db.exec('PRAGMA busy_timeout = 5000');
111
159
  try {
112
160
  sqliteVec.load(db);
113
161
  } catch (e) {
@@ -116,57 +164,63 @@ export async function initDatabase(dbPath: string): Promise<DatabaseSync> {
116
164
  return db;
117
165
  }
118
166
 
119
- const db = createDb(dbPath);
120
- const version = (db.prepare('PRAGMA user_version').get() as { user_version: number })
121
- .user_version;
167
+ // Serialize init across concurrent server instances (Claude + Cursor + Windsurf)
168
+ const releaseLock = acquireInitLock(dbPath);
169
+ try {
170
+ const db = createDb(dbPath);
171
+ const version = (db.prepare('PRAGMA user_version').get() as { user_version: number })
172
+ .user_version;
122
173
 
123
- if (version > 0 && version < 15) {
124
- console.error(`[context-vault] Schema v${version} is outdated. Rebuilding database...`);
174
+ if (version > 0 && version < 15) {
175
+ console.error(`[context-vault] Schema v${version} is outdated. Rebuilding database...`);
125
176
 
126
- const backupPath = `${dbPath}.v${version}.backup`;
127
- let backupSucceeded = false;
128
- try {
129
- db.close();
130
- if (existsSync(dbPath)) {
131
- copyFileSync(dbPath, backupPath);
132
- console.error(`[context-vault] Backed up old database to: ${backupPath}`);
133
- backupSucceeded = true;
134
- } else {
135
- backupSucceeded = true;
177
+ const backupPath = `${dbPath}.v${version}.backup`;
178
+ let backupSucceeded = false;
179
+ try {
180
+ db.close();
181
+ if (existsSync(dbPath)) {
182
+ copyFileSync(dbPath, backupPath);
183
+ console.error(`[context-vault] Backed up old database to: ${backupPath}`);
184
+ backupSucceeded = true;
185
+ } else {
186
+ backupSucceeded = true;
187
+ }
188
+ } catch (backupErr) {
189
+ console.error(
190
+ `[context-vault] Warning: could not backup old database: ${(backupErr as Error).message}`
191
+ );
136
192
  }
137
- } catch (backupErr) {
138
- console.error(
139
- `[context-vault] Warning: could not backup old database: ${(backupErr as Error).message}`
140
- );
141
- }
142
193
 
143
- if (!backupSucceeded) {
144
- throw new Error(
145
- `[context-vault] Aborting schema migration: backup failed for ${dbPath}. ` +
146
- `Fix the backup issue or manually back up the file before upgrading.`
147
- );
148
- }
194
+ if (!backupSucceeded) {
195
+ throw new Error(
196
+ `[context-vault] Aborting schema migration: backup failed for ${dbPath}. ` +
197
+ `Fix the backup issue or manually back up the file before upgrading.`
198
+ );
199
+ }
149
200
 
150
- unlinkSync(dbPath);
151
- try {
152
- unlinkSync(dbPath + '-wal');
153
- } catch {}
154
- try {
155
- unlinkSync(dbPath + '-shm');
156
- } catch {}
201
+ unlinkSync(dbPath);
202
+ try {
203
+ unlinkSync(dbPath + '-wal');
204
+ } catch {}
205
+ try {
206
+ unlinkSync(dbPath + '-shm');
207
+ } catch {}
157
208
 
158
- const freshDb = createDb(dbPath);
159
- freshDb.exec(SCHEMA_DDL);
160
- freshDb.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
161
- return freshDb;
162
- }
209
+ const freshDb = createDb(dbPath);
210
+ freshDb.exec(SCHEMA_DDL);
211
+ freshDb.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
212
+ return freshDb;
213
+ }
163
214
 
164
- if (version < 15) {
165
- db.exec(SCHEMA_DDL);
166
- db.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
167
- }
215
+ if (version < 15) {
216
+ db.exec(SCHEMA_DDL);
217
+ db.exec(`PRAGMA user_version = ${CURRENT_VERSION}`);
218
+ }
168
219
 
169
- return db;
220
+ return db;
221
+ } finally {
222
+ releaseLock();
223
+ }
170
224
  }
171
225
 
172
226
  export function prepareStatements(db: DatabaseSync): PreparedStatements {
@@ -1,6 +1,9 @@
1
1
  import { join } from 'node:path';
2
2
  import { homedir } from 'node:os';
3
3
  import { mkdirSync } from 'node:fs';
4
+ import { availableParallelism } from 'node:os';
5
+
6
+ const MAX_EMBED_THREADS = Math.max(1, Math.min(2, Math.floor(availableParallelism() / 4)));
4
7
 
5
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
9
  let extractor: any = null;
@@ -16,11 +19,16 @@ async function ensurePipeline(): Promise<typeof extractor> {
16
19
  try {
17
20
  const { pipeline, env } = await import('@huggingface/transformers');
18
21
 
22
+ const threads = Number(process.env.CONTEXT_VAULT_EMBED_THREADS) || MAX_EMBED_THREADS;
23
+ if (env.backends?.onnx?.wasm) {
24
+ env.backends.onnx.wasm.numThreads = threads;
25
+ }
26
+
19
27
  const modelCacheDir = join(homedir(), '.context-mcp', 'models');
20
28
  mkdirSync(modelCacheDir, { recursive: true });
21
29
  env.cacheDir = modelCacheDir;
22
30
 
23
- console.error('[context-vault] Loading embedding model (first run may download ~22MB)...');
31
+ console.error(`[context-vault] Loading embedding model (threads=${threads})...`);
24
32
  extractor = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
25
33
  embedAvailable = true;
26
34
  return extractor;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-vault",
3
- "version": "3.2.1",
3
+ "version": "3.2.3",
4
4
  "type": "module",
5
5
  "description": "Persistent memory for AI agents — saves and searches knowledge across sessions",
6
6
  "bin": {
@@ -63,7 +63,7 @@
63
63
  "@context-vault/core"
64
64
  ],
65
65
  "dependencies": {
66
- "@context-vault/core": "^3.2.1",
66
+ "@context-vault/core": "^3.2.3",
67
67
  "@modelcontextprotocol/sdk": "^1.26.0",
68
68
  "adm-zip": "^0.5.16",
69
69
  "sqlite-vec": "^0.1.0"
@@ -107,7 +107,7 @@ export function registerTools(server: any, ctx: LocalCtx): void {
107
107
  cv_version: pkg.version,
108
108
  auto: true,
109
109
  },
110
- });
110
+ }, null /* skip embedding to avoid CPU cascade on repeated errors */);
111
111
  } catch {}
112
112
  return err(e.message, 'INTERNAL_ERROR');
113
113
  } finally {
package/src/server.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import { randomUUID } from 'node:crypto';
3
4
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
5
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
8
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
9
+ import type { IncomingMessage, ServerResponse } from 'node:http';
5
10
  import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs';
6
11
  import { join, dirname } from 'node:path';
7
12
  import { homedir } from 'node:os';
@@ -109,26 +114,38 @@ async function main(): Promise<void> {
109
114
  }
110
115
 
111
116
  phase = 'SERVER';
112
- const server = new McpServer(
113
- { name: 'context-vault', version: pkg.version },
114
- { capabilities: { tools: {} } }
115
- );
116
117
 
118
+ const CONFIG_CACHE_TTL_MS = 30_000;
119
+ let cachedConfig = config;
120
+ let configCachedAt = Date.now();
117
121
  let lastVaultDir = config.vaultDir;
118
122
  Object.defineProperty(ctx as object, 'config', {
119
123
  get() {
124
+ const now = Date.now();
125
+ if (now - configCachedAt < CONFIG_CACHE_TTL_MS) return cachedConfig!;
120
126
  const fresh = resolveConfig();
121
127
  if (fresh.vaultDir !== lastVaultDir) {
122
128
  console.error(`[context-vault] Config reloaded: vaultDir changed to ${fresh.vaultDir}`);
123
129
  lastVaultDir = fresh.vaultDir;
124
130
  fresh.vaultDirExists = existsSync(fresh.vaultDir);
125
131
  }
132
+ cachedConfig = fresh;
133
+ configCachedAt = now;
126
134
  return fresh;
127
135
  },
128
136
  configurable: true,
129
137
  });
130
138
 
131
- registerTools(server, ctx);
139
+ function createServer(): McpServer {
140
+ const s = new McpServer(
141
+ { name: 'context-vault', version: pkg.version },
142
+ { capabilities: { tools: {} } }
143
+ );
144
+ registerTools(s, ctx);
145
+ return s;
146
+ }
147
+
148
+ const server = createServer();
132
149
 
133
150
  function closeDb(): void {
134
151
  try {
@@ -173,8 +190,91 @@ async function main(): Promise<void> {
173
190
  process.on('SIGTERM', () => shutdown('SIGTERM'));
174
191
 
175
192
  phase = 'CONNECTED';
176
- const transport = new StdioServerTransport();
177
- await server.connect(transport);
193
+
194
+ const useHttp = process.argv.includes('--http');
195
+
196
+ if (useHttp) {
197
+ const portIdx = process.argv.indexOf('--port');
198
+ const port = portIdx !== -1 && process.argv[portIdx + 1]
199
+ ? parseInt(process.argv[portIdx + 1], 10)
200
+ : 3377;
201
+
202
+ const app = createMcpExpressApp();
203
+ const transports: Record<string, StreamableHTTPServerTransport> = {};
204
+
205
+ app.post('/mcp', async (req: IncomingMessage & { body?: unknown }, res: ServerResponse) => {
206
+ const sessionId = req.headers['mcp-session-id'] as string | undefined;
207
+ try {
208
+ let transport: StreamableHTTPServerTransport;
209
+ if (sessionId && transports[sessionId]) {
210
+ transport = transports[sessionId];
211
+ } else if (!sessionId && isInitializeRequest((req as any).body)) {
212
+ transport = new StreamableHTTPServerTransport({
213
+ sessionIdGenerator: () => randomUUID(),
214
+ onsessioninitialized: (sid: string) => {
215
+ transports[sid] = transport;
216
+ },
217
+ });
218
+ transport.onclose = () => {
219
+ const sid = transport.sessionId;
220
+ if (sid && transports[sid]) {
221
+ delete transports[sid];
222
+ }
223
+ };
224
+ const sessionServer = createServer();
225
+ await sessionServer.connect(transport);
226
+ await transport.handleRequest(req, res, (req as any).body);
227
+ return;
228
+ } else {
229
+ res.writeHead(400, { 'Content-Type': 'application/json' });
230
+ res.end(JSON.stringify({
231
+ jsonrpc: '2.0',
232
+ error: { code: -32000, message: 'Bad Request: No valid session ID' },
233
+ id: null,
234
+ }));
235
+ return;
236
+ }
237
+ await transport.handleRequest(req, res, (req as any).body);
238
+ } catch (error) {
239
+ console.error('[context-vault] HTTP error:', error);
240
+ if (!res.headersSent) {
241
+ res.writeHead(500, { 'Content-Type': 'application/json' });
242
+ res.end(JSON.stringify({
243
+ jsonrpc: '2.0',
244
+ error: { code: -32603, message: 'Internal server error' },
245
+ id: null,
246
+ }));
247
+ }
248
+ }
249
+ });
250
+
251
+ app.get('/mcp', async (req: IncomingMessage, res: ServerResponse) => {
252
+ const sessionId = req.headers['mcp-session-id'] as string | undefined;
253
+ if (!sessionId || !transports[sessionId]) {
254
+ res.writeHead(400);
255
+ res.end('Invalid or missing session ID');
256
+ return;
257
+ }
258
+ await transports[sessionId].handleRequest(req, res);
259
+ });
260
+
261
+ app.delete('/mcp', async (req: IncomingMessage, res: ServerResponse) => {
262
+ const sessionId = req.headers['mcp-session-id'] as string | undefined;
263
+ if (!sessionId || !transports[sessionId]) {
264
+ res.writeHead(400);
265
+ res.end('Invalid or missing session ID');
266
+ return;
267
+ }
268
+ await transports[sessionId].handleRequest(req, res);
269
+ });
270
+
271
+ app.listen(port, () => {
272
+ console.error(`[context-vault] Serving on http://localhost:${port}/mcp`);
273
+ });
274
+ } else {
275
+ const transport = new StdioServerTransport();
276
+ await server.connect(transport);
277
+ }
178
278
 
179
279
  setTimeout(() => {
180
280
  import('node:child_process')