From 598fa254cf15f6a5bc8f7560299867ff062e4e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Sat, 21 Mar 2026 13:32:56 +0900 Subject: [PATCH 1/2] mcp: initialize server in mcpThread to avoid V8 isolate crashes When running mcp server, it initialized lp.mcp.Server in the main thread which also implicitly created the V8 isolate in the main thread. When processing requests (like calling the goto tool) inside mcpThread, V8 would assert that the isolate doesn't match the current thread. Fixes #1938 --- src/main.zig | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main.zig b/src/main.zig index ed5faa01..bf6468d6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -150,12 +150,7 @@ fn run(allocator: Allocator, main_arena: Allocator) !void { log.opts.format = .logfmt; - var stdout = std.fs.File.stdout().writer(&.{}); - - var mcp_server: *lp.mcp.Server = try .init(allocator, app, &stdout.interface); - defer mcp_server.deinit(); - - var worker_thread = try std.Thread.spawn(.{}, mcpThread, .{ mcp_server, app }); + var worker_thread = try std.Thread.spawn(.{}, mcpThread, .{ allocator, app }); defer worker_thread.join(); app.network.run(); @@ -171,8 +166,16 @@ fn fetchThread(app: *App, url: [:0]const u8, fetch_opts: lp.FetchOpts) void { }; } -fn mcpThread(mcp_server: *lp.mcp.Server, app: *App) void { +fn mcpThread(allocator: std.mem.Allocator, app: *App) void { defer app.network.stop(); + + var stdout = std.fs.File.stdout().writer(&.{}); + var mcp_server: *lp.mcp.Server = lp.mcp.Server.init(allocator, app, &stdout.interface) catch |err| { + log.fatal(.mcp, "mcp init error", .{ .err = err }); + return; + }; + defer mcp_server.deinit(); + var stdin_buf: [64 * 1024]u8 = undefined; var stdin = std.fs.File.stdin().reader(&stdin_buf); lp.mcp.router.processRequests(mcp_server, &stdin.interface) catch |err| { From 370ae2b85c9b262590456d56aa9f8483cfc0c147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Sat, 21 Mar 2026 14:06:04 +0900 Subject: [PATCH 2/2] main: zig fmt --- src/main.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.zig b/src/main.zig index bf6468d6..560a0128 100644 --- a/src/main.zig +++ b/src/main.zig @@ -168,7 +168,7 @@ fn fetchThread(app: *App, url: [:0]const u8, fetch_opts: lp.FetchOpts) void { fn mcpThread(allocator: std.mem.Allocator, app: *App) void { defer app.network.stop(); - + var stdout = std.fs.File.stdout().writer(&.{}); var mcp_server: *lp.mcp.Server = lp.mcp.Server.init(allocator, app, &stdout.interface) catch |err| { log.fatal(.mcp, "mcp init error", .{ .err = err });