diff --git a/packages/agent-runtime/src/pi/adapter.test.ts b/packages/agent-runtime/src/pi/adapter.test.ts index 45899b6a7a..4042f2fbe6 100644 --- a/packages/agent-runtime/src/pi/adapter.test.ts +++ b/packages/agent-runtime/src/pi/adapter.test.ts @@ -808,6 +808,82 @@ describe("pi provider adapter", () => { expect(events.some((event) => event.type === "provider/error")).toBe(false); }); + it("completes extension-triggered turns when agent_end includes string custom content", () => { + const adapter = createPiProviderAdapter(); + const context = { threadId: "pi-thread-1" }; + const agentEndEvent = { + type: "agent_end", + messages: [ + { + role: "custom", + customType: "pi-processes", + content: "Process completed successfully", + display: true, + timestamp: 1777995780000, + }, + { + role: "assistant", + content: [{ type: "text", text: "The process finished." }], + api: "anthropic-messages", + provider: "anthropic", + model: "claude-haiku-4-5", + usage: { + input: 10, + output: 5, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 15, + cost: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + total: 0, + }, + }, + stopReason: "stop", + timestamp: 1777995781000, + }, + ], + willRetry: false, + } satisfies AgentSessionEvent; + + adapter.translateEvent( + { + jsonrpc: "2.0", + method: "sdk/message", + params: { + threadId: context.threadId, + message: { type: "agent_start" }, + }, + }, + context, + ); + + const events = adapter.translateEvent( + { + jsonrpc: "2.0", + method: "sdk/message", + params: { + threadId: context.threadId, + message: agentEndEvent, + }, + }, + context, + ); + + expect(events).toContainEqual( + expect.objectContaining({ + type: "turn/completed", + scope: turnScope("turn-1"), + status: "completed", + }), + ); + expect(events.some((event) => event.type === "provider/unhandled")).toBe( + false, + ); + }); + it("translateEvent agent_end surfaces Pi assistant stop errors as failed turns", () => { const adapter = createPiProviderAdapter(); const context = { threadId: "bb-thread-1" }; diff --git a/packages/agent-runtime/src/pi/adapter.ts b/packages/agent-runtime/src/pi/adapter.ts index 82ae6f7d3e..ba48a11e2f 100644 --- a/packages/agent-runtime/src/pi/adapter.ts +++ b/packages/agent-runtime/src/pi/adapter.ts @@ -260,7 +260,9 @@ const piAssistantMessageSchema = z const piConversationMessageSchema = z .object({ role: z.string(), - content: z.array(piMessageContentBlockSchema).optional(), + content: z + .union([z.string(), z.array(piMessageContentBlockSchema)]) + .optional(), stopReason: z.string().optional(), errorMessage: z.string().optional(), provider: z.string().optional(),