@codemem/mcp 0.47.0-beta.3 → 0.47.0-beta.4

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/stdio.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as e } from "./server-C-Z_tmAr.js";
2
+ import { t as e } from "./server-igIo9ay0.js";
3
3
  import { MemoryStore as t, probeCodememViewerLiveness as n, resolveDbPath as r } from "@codemem/core";
4
4
  import { existsSync as i } from "node:fs";
5
5
  import { dirname as a, join as o } from "node:path";
@@ -60,25 +60,42 @@ async function g(e = {}) {
60
60
  }
61
61
  //#endregion
62
62
  //#region src/stdio.ts
63
- async function _() {
64
- let n = r(), i = new t(n);
65
- try {
66
- g().catch(() => {});
67
- let t = e(i), n = new s(), r = () => {
63
+ function _(e) {
64
+ let t, n = 0;
65
+ return (r) => {
66
+ if (n = Math.max(n, r), t) return t;
67
+ let i = setTimeout(() => process.exit(1), 3e4);
68
+ return i.unref(), t = Promise.resolve().then(async () => {
68
69
  try {
69
- i.close();
70
- } catch {}
71
- process.exit(0);
72
- };
73
- process.on("SIGINT", r), process.on("SIGTERM", r), await t.connect(n);
74
- } catch (e) {
70
+ await e();
71
+ } catch {
72
+ n = 1;
73
+ } finally {
74
+ clearTimeout(i);
75
+ }
76
+ process.exit(n);
77
+ }), t;
78
+ };
79
+ }
80
+ async function v() {
81
+ let n = r(), i = new t(n), a, o, c = !1, l = _(() => o || (c = !0, o = (async () => {
75
82
  try {
76
- i.close();
77
- } catch {}
78
- throw e;
83
+ await a?.close();
84
+ } finally {
85
+ await i.closeAsync();
86
+ }
87
+ })(), o));
88
+ try {
89
+ g().catch(() => {}), a = e(i);
90
+ let t = new s();
91
+ a.server.onclose = () => {
92
+ c || l(0);
93
+ }, process.on("SIGINT", () => void l(0)), process.on("SIGTERM", () => void l(0)), process.stdin.once("end", () => void l(0)), process.stdin.once("error", () => void l(1)), await a.connect(t);
94
+ } catch (e) {
95
+ console.error("codemem MCP server failed to start:", e), await l(1);
79
96
  }
80
97
  }
81
- _().catch((e) => {
98
+ v().catch((e) => {
82
99
  console.error("codemem MCP server failed to start:", e), process.exit(1);
83
100
  });
84
101
  //#endregion
package/dist/stdio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","names":[],"sources":["../src/stdio-viewer.ts","../src/stdio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { probeCodememViewerLiveness } from \"@codemem/core\";\n\nconst DEFAULT_VIEWER_HOST = \"127.0.0.1\";\nconst DEFAULT_VIEWER_PORT = \"38888\";\nconst VIEWER_PROBE_TIMEOUT_MS = 2_000;\nconst VIEWER_POLL_INTERVAL_MS = 1_000;\nconst VIEWER_POLL_ATTEMPTS = 5;\n\nexport interface ViewerChildProcess {\n\ton(event: \"error\", listener: () => void): unknown;\n\tunref(): void;\n}\n\nexport type SpawnViewerProcess = (\n\tcommand: string,\n\targs: string[],\n\toptions: {\n\t\tdetached: true;\n\t\tstdio: \"ignore\";\n\t\tenv: NodeJS.ProcessEnv;\n\t},\n) => ViewerChildProcess;\n\nexport interface ViewerProbeOptions {\n\thost?: string;\n\tport?: string;\n\tfetchImpl?: typeof fetch;\n}\n\nexport interface EnsureViewerOptions extends ViewerProbeOptions {\n\tenv?: NodeJS.ProcessEnv;\n\texecPath?: string;\n\tresolveCliPath?: () => string | null;\n\tsleep?: (milliseconds: number) => Promise<void>;\n\tspawnImpl?: SpawnViewerProcess;\n}\n\n/** Resolve the `codemem` CLI binary path. Checks package-local paths first, then PATH. */\nexport function resolveCliPath(): string | null {\n\tconst selfDir = dirname(import.meta.dirname ?? \".\");\n\tconst candidates = [\n\t\tjoin(selfDir, \"..\", \"cli\", \"dist\", \"index.js\"),\n\t\tjoin(selfDir, \"..\", \".bin\", \"codemem\"),\n\t\tjoin(selfDir, \"..\", \"..\", \".bin\", \"codemem\"),\n\t];\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) return candidate;\n\t}\n\treturn \"codemem\";\n}\n\n/** Check for a live CodeMem viewer via the shared core probe contract. */\nexport async function isViewerHealthy(options: ViewerProbeOptions = {}): Promise<boolean> {\n\tconst host = options.host ?? process.env.CODEMEM_VIEWER_HOST ?? DEFAULT_VIEWER_HOST;\n\tconst rawPort = options.port ?? process.env.CODEMEM_VIEWER_PORT ?? DEFAULT_VIEWER_PORT;\n\t// Strict parse: \"38888abc\" must not silently probe a different port than\n\t// the `--port` value forwarded to `serve start`.\n\tif (!/^\\d+$/.test(rawPort.trim())) return false;\n\tconst port = Number.parseInt(rawPort, 10);\n\tif (!Number.isInteger(port) || port <= 0 || port > 65_535) return false;\n\n\t// A degraded-but-live viewer must not trigger redundant detached starts.\n\tconst probe = await probeCodememViewerLiveness(\n\t\t{ host, port },\n\t\t{ fetch: options.fetchImpl ?? fetch, timeoutMs: VIEWER_PROBE_TIMEOUT_MS },\n\t);\n\treturn probe.state === \"live\";\n}\n\n/** Attempt to start the viewer as a detached, best-effort background process. */\nexport async function ensureViewer(options: EnsureViewerOptions = {}): Promise<void> {\n\tconst env = options.env ?? process.env;\n\tif (env.CODEMEM_VIEWER === \"0\" || env.CODEMEM_VIEWER_AUTO === \"0\") return;\n\n\tconst host = options.host ?? env.CODEMEM_VIEWER_HOST ?? DEFAULT_VIEWER_HOST;\n\tconst port = options.port ?? env.CODEMEM_VIEWER_PORT ?? DEFAULT_VIEWER_PORT;\n\tconst probeOptions = { host, port, fetchImpl: options.fetchImpl };\n\tif (await isViewerHealthy(probeOptions)) return;\n\n\tconst cli = (options.resolveCliPath ?? resolveCliPath)();\n\tif (!cli) return;\n\n\ttry {\n\t\tconst isJsFile = cli.endsWith(\".js\");\n\t\tconst command = isJsFile ? (options.execPath ?? process.execPath) : cli;\n\t\tconst args = isJsFile ? [cli, \"serve\", \"start\"] : [\"serve\", \"start\"];\n\t\tif (host !== DEFAULT_VIEWER_HOST) args.push(\"--host\", host);\n\t\tif (port !== DEFAULT_VIEWER_PORT) args.push(\"--port\", port);\n\n\t\tconst spawnImpl: SpawnViewerProcess =\n\t\t\toptions.spawnImpl ?? ((command, args, spawnOptions) => spawn(command, args, spawnOptions));\n\t\tconst child = spawnImpl(command, args, {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: { ...env, CODEMEM_PLUGIN_IGNORE: \"1\" },\n\t\t});\n\t\tchild.on(\"error\", () => {});\n\t\tchild.unref();\n\n\t\tconst sleep =\n\t\t\toptions.sleep ??\n\t\t\t((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));\n\t\tfor (let attempt = 0; attempt < VIEWER_POLL_ATTEMPTS; attempt++) {\n\t\t\tawait sleep(VIEWER_POLL_INTERVAL_MS);\n\t\t\tif (await isViewerHealthy(probeOptions)) return;\n\t\t}\n\t} catch {\n\t\t// Best effort — MCP server continues regardless.\n\t}\n}\n","#!/usr/bin/env node\n\n/**\n * @codemem/mcp — MCP stdio server bootstrap.\n *\n * Runs as a separate process spawned by the host (OpenCode/Claude).\n * Owns its own better-sqlite3 connection. Communicates via stdio JSON-RPC.\n */\n\nimport { MemoryStore, resolveDbPath } from \"@codemem/core\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createCodememMcpServer } from \"./server.js\";\nimport { ensureViewer } from \"./stdio-viewer.js\";\n\nasync function main() {\n\tconst dbPath = resolveDbPath();\n\tconst store = new MemoryStore(dbPath);\n\n\ttry {\n\t\t// Auto-start viewer in background (belt and suspenders with any hook-based start)\n\t\tensureViewer().catch(() => {});\n\n\t\tconst server = createCodememMcpServer(store);\n\t\tconst transport = new StdioServerTransport();\n\n\t\tconst shutdown = () => {\n\t\t\ttry {\n\t\t\t\tstore.close();\n\t\t\t} catch {\n\t\t\t\t// Best effort — process is exiting\n\t\t\t}\n\t\t\tprocess.exit(0);\n\t\t};\n\n\t\tprocess.on(\"SIGINT\", shutdown);\n\t\tprocess.on(\"SIGTERM\", shutdown);\n\n\t\tawait server.connect(transport);\n\t} catch (err) {\n\t\t// Close the store before bubbling so a startup failure does not leave\n\t\t// the SQLite journal behind. Signal handlers are not yet attached if we\n\t\t// crash before `server.connect` resolves.\n\t\ttry {\n\t\t\tstore.close();\n\t\t} catch {\n\t\t\t// best effort\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nmain().catch((err) => {\n\tconsole.error(\"codemem MCP server failed to start:\", err);\n\tprocess.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"stdio.js","names":[],"sources":["../src/stdio-viewer.ts","../src/stdio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { probeCodememViewerLiveness } from \"@codemem/core\";\n\nconst DEFAULT_VIEWER_HOST = \"127.0.0.1\";\nconst DEFAULT_VIEWER_PORT = \"38888\";\nconst VIEWER_PROBE_TIMEOUT_MS = 2_000;\nconst VIEWER_POLL_INTERVAL_MS = 1_000;\nconst VIEWER_POLL_ATTEMPTS = 5;\n\nexport interface ViewerChildProcess {\n\ton(event: \"error\", listener: () => void): unknown;\n\tunref(): void;\n}\n\nexport type SpawnViewerProcess = (\n\tcommand: string,\n\targs: string[],\n\toptions: {\n\t\tdetached: true;\n\t\tstdio: \"ignore\";\n\t\tenv: NodeJS.ProcessEnv;\n\t},\n) => ViewerChildProcess;\n\nexport interface ViewerProbeOptions {\n\thost?: string;\n\tport?: string;\n\tfetchImpl?: typeof fetch;\n}\n\nexport interface EnsureViewerOptions extends ViewerProbeOptions {\n\tenv?: NodeJS.ProcessEnv;\n\texecPath?: string;\n\tresolveCliPath?: () => string | null;\n\tsleep?: (milliseconds: number) => Promise<void>;\n\tspawnImpl?: SpawnViewerProcess;\n}\n\n/** Resolve the `codemem` CLI binary path. Checks package-local paths first, then PATH. */\nexport function resolveCliPath(): string | null {\n\tconst selfDir = dirname(import.meta.dirname ?? \".\");\n\tconst candidates = [\n\t\tjoin(selfDir, \"..\", \"cli\", \"dist\", \"index.js\"),\n\t\tjoin(selfDir, \"..\", \".bin\", \"codemem\"),\n\t\tjoin(selfDir, \"..\", \"..\", \".bin\", \"codemem\"),\n\t];\n\tfor (const candidate of candidates) {\n\t\tif (existsSync(candidate)) return candidate;\n\t}\n\treturn \"codemem\";\n}\n\n/** Check for a live CodeMem viewer via the shared core probe contract. */\nexport async function isViewerHealthy(options: ViewerProbeOptions = {}): Promise<boolean> {\n\tconst host = options.host ?? process.env.CODEMEM_VIEWER_HOST ?? DEFAULT_VIEWER_HOST;\n\tconst rawPort = options.port ?? process.env.CODEMEM_VIEWER_PORT ?? DEFAULT_VIEWER_PORT;\n\t// Strict parse: \"38888abc\" must not silently probe a different port than\n\t// the `--port` value forwarded to `serve start`.\n\tif (!/^\\d+$/.test(rawPort.trim())) return false;\n\tconst port = Number.parseInt(rawPort, 10);\n\tif (!Number.isInteger(port) || port <= 0 || port > 65_535) return false;\n\n\t// A degraded-but-live viewer must not trigger redundant detached starts.\n\tconst probe = await probeCodememViewerLiveness(\n\t\t{ host, port },\n\t\t{ fetch: options.fetchImpl ?? fetch, timeoutMs: VIEWER_PROBE_TIMEOUT_MS },\n\t);\n\treturn probe.state === \"live\";\n}\n\n/** Attempt to start the viewer as a detached, best-effort background process. */\nexport async function ensureViewer(options: EnsureViewerOptions = {}): Promise<void> {\n\tconst env = options.env ?? process.env;\n\tif (env.CODEMEM_VIEWER === \"0\" || env.CODEMEM_VIEWER_AUTO === \"0\") return;\n\n\tconst host = options.host ?? env.CODEMEM_VIEWER_HOST ?? DEFAULT_VIEWER_HOST;\n\tconst port = options.port ?? env.CODEMEM_VIEWER_PORT ?? DEFAULT_VIEWER_PORT;\n\tconst probeOptions = { host, port, fetchImpl: options.fetchImpl };\n\tif (await isViewerHealthy(probeOptions)) return;\n\n\tconst cli = (options.resolveCliPath ?? resolveCliPath)();\n\tif (!cli) return;\n\n\ttry {\n\t\tconst isJsFile = cli.endsWith(\".js\");\n\t\tconst command = isJsFile ? (options.execPath ?? process.execPath) : cli;\n\t\tconst args = isJsFile ? [cli, \"serve\", \"start\"] : [\"serve\", \"start\"];\n\t\tif (host !== DEFAULT_VIEWER_HOST) args.push(\"--host\", host);\n\t\tif (port !== DEFAULT_VIEWER_PORT) args.push(\"--port\", port);\n\n\t\tconst spawnImpl: SpawnViewerProcess =\n\t\t\toptions.spawnImpl ?? ((command, args, spawnOptions) => spawn(command, args, spawnOptions));\n\t\tconst child = spawnImpl(command, args, {\n\t\t\tdetached: true,\n\t\t\tstdio: \"ignore\",\n\t\t\tenv: { ...env, CODEMEM_PLUGIN_IGNORE: \"1\" },\n\t\t});\n\t\tchild.on(\"error\", () => {});\n\t\tchild.unref();\n\n\t\tconst sleep =\n\t\t\toptions.sleep ??\n\t\t\t((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));\n\t\tfor (let attempt = 0; attempt < VIEWER_POLL_ATTEMPTS; attempt++) {\n\t\t\tawait sleep(VIEWER_POLL_INTERVAL_MS);\n\t\t\tif (await isViewerHealthy(probeOptions)) return;\n\t\t}\n\t} catch {\n\t\t// Best effort — MCP server continues regardless.\n\t}\n}\n","#!/usr/bin/env node\n\n/**\n * @codemem/mcp — MCP stdio server bootstrap.\n *\n * Runs as a separate process spawned by the host (OpenCode/Claude).\n * Owns its own better-sqlite3 connection. Communicates via stdio JSON-RPC.\n */\n\nimport { MemoryStore, resolveDbPath } from \"@codemem/core\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createCodememMcpServer } from \"./server.js\";\nimport { ensureViewer } from \"./stdio-viewer.js\";\n\nfunction createStdioShutdown(close: () => Promise<void>) {\n\tlet shutdownPromise: Promise<void> | undefined;\n\tlet shutdownExitCode = 0;\n\treturn (exitCode: number): Promise<void> => {\n\t\tshutdownExitCode = Math.max(shutdownExitCode, exitCode);\n\t\tif (shutdownPromise) return shutdownPromise;\n\t\t// Parent embedding work cannot be interrupted; forced exit must not close SQLite under it.\n\t\tconst deadline = setTimeout(() => process.exit(1), 30_000);\n\t\tdeadline.unref();\n\t\tshutdownPromise = Promise.resolve().then(async () => {\n\t\t\ttry {\n\t\t\t\tawait close();\n\t\t\t} catch {\n\t\t\t\tshutdownExitCode = 1;\n\t\t\t} finally {\n\t\t\t\tclearTimeout(deadline);\n\t\t\t}\n\t\t\tprocess.exit(shutdownExitCode);\n\t\t});\n\t\treturn shutdownPromise;\n\t};\n}\n\nasync function main() {\n\tconst dbPath = resolveDbPath();\n\tconst store = new MemoryStore(dbPath);\n\tlet server: ReturnType<typeof createCodememMcpServer> | undefined;\n\tlet closePromise: Promise<void> | undefined;\n\tlet closing = false;\n\tconst close = () => {\n\t\tif (closePromise) return closePromise;\n\t\tclosing = true;\n\t\tclosePromise = (async () => {\n\t\t\ttry {\n\t\t\t\t// Stop dispatch and cancel active MCP request signals before draining the store.\n\t\t\t\tawait server?.close();\n\t\t\t} finally {\n\t\t\t\tawait store.closeAsync();\n\t\t\t}\n\t\t})();\n\t\treturn closePromise;\n\t};\n\tconst shutdown = createStdioShutdown(close);\n\n\ttry {\n\t\t// Auto-start viewer in background (belt and suspenders with any hook-based start)\n\t\tensureViewer().catch(() => {});\n\n\t\tserver = createCodememMcpServer(store);\n\t\tconst transport = new StdioServerTransport();\n\t\tserver.server.onclose = () => {\n\t\t\tif (!closing) void shutdown(0);\n\t\t};\n\n\t\tprocess.on(\"SIGINT\", () => void shutdown(0));\n\t\tprocess.on(\"SIGTERM\", () => void shutdown(0));\n\t\tprocess.stdin.once(\"end\", () => void shutdown(0));\n\t\tprocess.stdin.once(\"error\", () => void shutdown(1));\n\n\t\tawait server.connect(transport);\n\t} catch (err) {\n\t\t// Preserve the startup error and exit code after transport and store cleanup.\n\t\tconsole.error(\"codemem MCP server failed to start:\", err);\n\t\tawait shutdown(1);\n\t}\n}\n\nmain().catch((err) => {\n\tconsole.error(\"codemem MCP server failed to start:\", err);\n\tprocess.exit(1);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAqDlE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAiN7F"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAoElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CA4M7F"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemem/mcp",
3
- "version": "0.47.0-beta.3",
3
+ "version": "0.47.0-beta.4",
4
4
  "type": "module",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -27,13 +27,14 @@
27
27
  "dist/"
28
28
  ],
29
29
  "dependencies": {
30
- "@codemem/core": "^0.47.0-beta.3",
30
+ "@codemem/core": "^0.47.0-beta.4",
31
31
  "@modelcontextprotocol/sdk": "^1.32.0",
32
32
  "express": "^5.2.1",
33
33
  "express-rate-limit": "^8.7.0",
34
- "zod": "^4.5.4"
34
+ "zod": "4.6.6"
35
35
  },
36
36
  "devDependencies": {
37
+ "@codemem/server": "^0.47.0-beta.4",
37
38
  "@types/express": "^5.0.6",
38
39
  "@types/node": "^24.12.4",
39
40
  "typescript": "^7.0.2",