sandbox-agent/examples/mock-acp-agent/src/index.ts
2026-02-11 07:57:02 -08:00

100 lines
1.8 KiB
TypeScript

import { createInterface } from "node:readline";
interface JsonRpcRequest {
jsonrpc?: unknown;
id?: unknown;
method?: unknown;
params?: unknown;
result?: unknown;
error?: unknown;
}
let outboundRequestSeq = 0;
function writeMessage(payload: unknown): void {
process.stdout.write(`${JSON.stringify(payload)}\n`);
}
function echoNotification(message: unknown): void {
writeMessage({
jsonrpc: "2.0",
method: "mock/echo",
params: {
message,
},
});
}
function handleMessage(raw: string): void {
if (!raw.trim()) {
return;
}
let msg: JsonRpcRequest;
try {
msg = JSON.parse(raw) as JsonRpcRequest;
} catch (error) {
writeMessage({
jsonrpc: "2.0",
method: "mock/parse_error",
params: {
error: error instanceof Error ? error.message : String(error),
raw,
},
});
return;
}
echoNotification(msg);
const hasMethod = typeof msg.method === "string";
const hasId = msg.id !== undefined;
if (hasMethod && hasId) {
if (msg.method === "mock/ask_client") {
outboundRequestSeq += 1;
writeMessage({
jsonrpc: "2.0",
id: `agent-req-${outboundRequestSeq}`,
method: "mock/request",
params: {
prompt: "please respond",
},
});
}
writeMessage({
jsonrpc: "2.0",
id: msg.id,
result: {
echoed: msg,
},
});
return;
}
if (!hasMethod && hasId) {
writeMessage({
jsonrpc: "2.0",
method: "mock/client_response",
params: {
id: msg.id,
result: msg.result ?? null,
error: msg.error ?? null,
},
});
}
}
const rl = createInterface({
input: process.stdin,
crlfDelay: Infinity,
});
rl.on("line", (line) => {
handleMessage(line);
});
rl.on("close", () => {
process.exit(0);
});