UNPKG

acp-claude-code

Version:

ACP (Agent Client Protocol) bridge for Claude Code

55 lines 2.29 kB
import { AgentSideConnection } from "@zed-industries/agent-client-protocol"; import { ClaudeACPAgent } from "./agent.js"; import { Writable, Readable } from "node:stream"; export async function main() { // Only log to stderr in debug mode const DEBUG = process.env.ACP_DEBUG === "true"; const log = (message) => { if (DEBUG) { console.error(`[ACP-Claude] ${message}`); } }; log("Starting Claude Code ACP Bridge..."); try { // Prevent any accidental stdout writes that could corrupt the protocol console.log = (...args) => { console.error("[WARNING] console.log intercepted:", ...args); }; log("Creating ACP connection via stdio..."); // Convert Node.js streams to Web Streams // IMPORTANT: stdout is for sending to client, stdin is for receiving from client const outputStream = Writable.toWeb(process.stdout); const inputStream = Readable.toWeb(process.stdin); // We're implementing an Agent, so we use AgentSideConnection // First parameter is output (to client), second is input (from client) new AgentSideConnection((client) => new ClaudeACPAgent(client), outputStream, // WritableStream for sending data to client (stdout) inputStream); log("Claude Code ACP Bridge is running"); // Keep the process alive process.stdin.resume(); // Handle graceful shutdown process.on("SIGINT", () => { log("Received SIGINT, shutting down..."); process.exit(0); }); process.on("SIGTERM", () => { log("Received SIGTERM, shutting down..."); process.exit(0); }); // Handle uncaught errors process.on("uncaughtException", (error) => { console.error("[FATAL] Uncaught exception:", error); process.exit(1); }); process.on("unhandledRejection", (reason, promise) => { console.error("[FATAL] Unhandled rejection at:", promise, "reason:", reason); process.exit(1); }); } catch (error) { console.error("[FATAL] Error starting ACP bridge:", error); process.exit(1); } } export { ClaudeACPAgent }; //# sourceMappingURL=index.js.map