fix(acpx): parse JSON-RPC done/error prompt events

This commit is contained in:
Alex via Neo 2026-03-12 20:15:52 -06:00
parent 4fb3b88e57
commit a25a6dcb6d
2 changed files with 53 additions and 0 deletions

View File

@ -67,6 +67,37 @@ describe("parsePromptEventLine", () => {
});
});
it("parses JSON-RPC result stopReason as done", () => {
const line = JSON.stringify({
jsonrpc: "2.0",
id: 3,
result: {
stopReason: "end_turn",
},
});
expect(parsePromptEventLine(line)).toEqual({
type: "done",
stopReason: "end_turn",
});
});
it("parses JSON-RPC errors as runtime errors", () => {
const line = JSON.stringify({
jsonrpc: "2.0",
id: 2,
error: {
code: -32002,
message: "Resource not found",
},
});
expect(parsePromptEventLine(line)).toEqual({
type: "error",
message: "Resource not found",
code: undefined,
retryable: undefined,
});
});
it("keeps compatibility with simplified text/done lines", () => {
expect(parsePromptEventLine(JSON.stringify({ type: "text", content: "alpha" }))).toEqual({
type: "text_delta",

View File

@ -65,6 +65,28 @@ function resolveStructuredPromptPayload(parsed: Record<string, unknown>): {
}
}
const result = parsed.result;
if (isRecord(result)) {
const stopReason = asTrimmedString(result.stopReason);
if (stopReason) {
return {
type: "done",
payload: result,
};
}
}
const rpcError = parsed.error;
if (isRecord(rpcError)) {
const message = asTrimmedString(rpcError.message);
if (message) {
return {
type: "error",
payload: rpcError,
};
}
}
const sessionUpdate = asOptionalString(parsed.sessionUpdate) as AcpSessionUpdateTag | undefined;
if (sessionUpdate) {
return {