Adding support for pi-local

This commit is contained in:
Richard Anaya
2026-03-06 18:29:38 -08:00
parent ffc59f5b08
commit eb7f690ceb
25 changed files with 1861 additions and 12 deletions

View File

@@ -0,0 +1,113 @@
import { describe, expect, it } from "vitest";
import { parsePiJsonl, isPiUnknownSessionError } from "./parse.js";
describe("parsePiJsonl", () => {
it("parses agent lifecycle and messages", () => {
const stdout = [
JSON.stringify({ type: "agent_start" }),
JSON.stringify({
type: "turn_end",
message: {
role: "assistant",
content: [{ type: "text", text: "Hello from Pi" }],
},
}),
JSON.stringify({ type: "agent_end", messages: [] }),
].join("\n");
const parsed = parsePiJsonl(stdout);
expect(parsed.messages).toContain("Hello from Pi");
expect(parsed.finalMessage).toBe("Hello from Pi");
});
it("parses streaming text deltas", () => {
const stdout = [
JSON.stringify({
type: "message_update",
assistantMessageEvent: { type: "text_delta", delta: "Hello " },
}),
JSON.stringify({
type: "message_update",
assistantMessageEvent: { type: "text_delta", delta: "World" },
}),
JSON.stringify({
type: "turn_end",
message: {
role: "assistant",
content: "Hello World",
},
}),
].join("\n");
const parsed = parsePiJsonl(stdout);
expect(parsed.messages).toContain("Hello World");
});
it("parses tool execution", () => {
const stdout = [
JSON.stringify({
type: "tool_execution_start",
toolCallId: "tool_1",
toolName: "read",
args: { path: "/tmp/test.txt" },
}),
JSON.stringify({
type: "tool_execution_end",
toolCallId: "tool_1",
toolName: "read",
result: "file contents",
isError: false,
}),
JSON.stringify({
type: "turn_end",
message: { role: "assistant", content: "Done" },
toolResults: [
{
toolCallId: "tool_1",
content: "file contents",
isError: false,
},
],
}),
].join("\n");
const parsed = parsePiJsonl(stdout);
expect(parsed.toolCalls).toHaveLength(1);
expect(parsed.toolCalls[0].toolName).toBe("read");
expect(parsed.toolCalls[0].result).toBe("file contents");
expect(parsed.toolCalls[0].isError).toBe(false);
});
it("handles errors in tool execution", () => {
const stdout = [
JSON.stringify({
type: "tool_execution_start",
toolCallId: "tool_1",
toolName: "read",
args: { path: "/missing.txt" },
}),
JSON.stringify({
type: "tool_execution_end",
toolCallId: "tool_1",
toolName: "read",
result: "File not found",
isError: true,
}),
].join("\n");
const parsed = parsePiJsonl(stdout);
expect(parsed.toolCalls).toHaveLength(1);
expect(parsed.toolCalls[0].isError).toBe(true);
expect(parsed.toolCalls[0].result).toBe("File not found");
});
});
describe("isPiUnknownSessionError", () => {
it("detects unknown session errors", () => {
expect(isPiUnknownSessionError("session not found: s_123", "")).toBe(true);
expect(isPiUnknownSessionError("", "unknown session id")).toBe(true);
expect(isPiUnknownSessionError("", "no session available")).toBe(true);
expect(isPiUnknownSessionError("all good", "")).toBe(false);
expect(isPiUnknownSessionError("working fine", "no errors")).toBe(false);
});
});