浏览代码

fix: MCP session support and cross-runtime test compat

- mcp.ts: add sessionIdGenerator to HTTP transport (fixes "stateless
  transport cannot be reused" error in CI)
- test-preload.ts: set 30s default timeout for bun test runner (matches
  vitest config, prevents CLI subprocess test timeouts)
- mcp.test.ts: use == null check instead of toBeUndefined for SQLite
  get() result (bun:sqlite returns null, better-sqlite3 returns undefined)
Tobi Lutke 3 月之前
父节点
当前提交
93f277c5e3
共有 3 个文件被更改,包括 7 次插入2 次删除
  1. 2 0
      src/mcp.ts
  2. 4 1
      src/test-preload.ts
  3. 1 1
      test/mcp.test.ts

+ 2 - 0
src/mcp.ts

@@ -8,6 +8,7 @@
  */
 
 import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
+import { randomUUID } from "node:crypto";
 import { fileURLToPath } from "url";
 import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
 import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -553,6 +554,7 @@ export async function startMcpHttpServer(port: number, options?: { quiet?: boole
   const store = createStore();
   const mcpServer = createMcpServer(store);
   const transport = new WebStandardStreamableHTTPServerTransport({
+    sessionIdGenerator: () => randomUUID(),
     enableJsonResponse: true,
   });
   await mcpServer.connect(transport);

+ 4 - 1
src/test-preload.ts

@@ -4,9 +4,12 @@
  * Uses bun:test afterAll to properly dispose of llama.cpp Metal
  * resources before the process exits, avoiding GGML_ASSERT failures.
  */
-import { afterAll } from "bun:test";
+import { afterAll, setDefaultTimeout } from "bun:test";
 import { disposeDefaultLlamaCpp } from "./llm";
 
+// Match vitest's testTimeout (default 5s is too short for CLI subprocess tests)
+setDefaultTimeout(30_000);
+
 // Global afterAll runs after all test files complete
 afterAll(async () => {
   await disposeDefaultLlamaCpp();

+ 1 - 1
test/mcp.test.ts

@@ -649,7 +649,7 @@ describe("MCP Server", () => {
         WHERE d.path = ? AND d.active = 1
       `).get(path) as { filepath: string; display_path: string; body: string } | null;
 
-      expect(doc).toBeUndefined();
+      expect(doc == null).toBe(true); // bun:sqlite returns null, better-sqlite3 returns undefined
     });
 
     test("includes context in document body", () => {