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
This commit is contained in:
Adrià Arrufat
2026-03-21 13:32:56 +09:00
parent b4b7a7d58a
commit 598fa254cf

View File

@@ -150,12 +150,7 @@ fn run(allocator: Allocator, main_arena: Allocator) !void {
log.opts.format = .logfmt; log.opts.format = .logfmt;
var stdout = std.fs.File.stdout().writer(&.{}); var worker_thread = try std.Thread.spawn(.{}, mcpThread, .{ allocator, app });
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 });
defer worker_thread.join(); defer worker_thread.join();
app.network.run(); 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(); 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_buf: [64 * 1024]u8 = undefined;
var stdin = std.fs.File.stdin().reader(&stdin_buf); var stdin = std.fs.File.stdin().reader(&stdin_buf);
lp.mcp.router.processRequests(mcp_server, &stdin.interface) catch |err| { lp.mcp.router.processRequests(mcp_server, &stdin.interface) catch |err| {