From f0f5acfa4213fae493cfc4f255b469ec06f85f0c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 1 Jan 2026 16:46:40 +0000 Subject: [PATCH] fix: update pi-agent-core integration --- CHANGELOG.md | 1 + src/agents/bash-tools.ts | 3 ++- src/agents/clawdis-tools.ts | 4 ++-- src/agents/pi-embedded-helpers.ts | 16 +++++++++------- src/agents/pi-embedded-runner.ts | 11 ++++------- src/agents/pi-embedded-subscribe.ts | 6 +++--- src/agents/pi-tools.ts | 2 +- src/agents/tool-images.ts | 2 +- 8 files changed, 23 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2fde369b..cb1a65591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ - macOS menu: top status line now shows pending node pairing approvals (incl. repairs). - CLI: avoid spurious gateway close errors after successful request/response cycles. - Agent runtime: clamp tool-result images to the 5MB Anthropic limit to avoid hard request rejections. +- Agent runtime: align pi-agent-core imports and write v2 session headers so Pi session branching stays in the Clawdis sessions dir. - Tests: add Swift Testing coverage for camera errors and Kotest coverage for Android bridge endpoints. ## 2.0.0-beta4 — 2025-12-27 diff --git a/src/agents/bash-tools.ts b/src/agents/bash-tools.ts index 30e43a875..067f887ba 100644 --- a/src/agents/bash-tools.ts +++ b/src/agents/bash-tools.ts @@ -1,6 +1,7 @@ import { type ChildProcessWithoutNullStreams, spawn } from "node:child_process"; import { randomUUID } from "node:crypto"; -import type { AgentTool, AgentToolResult } from "@mariozechner/pi-ai"; +import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core"; +import { StringEnum } from "@mariozechner/pi-ai"; import { Type } from "@sinclair/typebox"; import { diff --git a/src/agents/clawdis-tools.ts b/src/agents/clawdis-tools.ts index e77a66472..0251b54bc 100644 --- a/src/agents/clawdis-tools.ts +++ b/src/agents/clawdis-tools.ts @@ -1,8 +1,8 @@ import crypto from "node:crypto"; import fs from "node:fs/promises"; -import type { AgentTool, AgentToolResult } from "@mariozechner/pi-ai"; -import { Type } from "@sinclair/typebox"; +import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core"; +import { type TSchema, Type } from "@sinclair/typebox"; import { browserCloseTab, browserFocusTab, diff --git a/src/agents/pi-embedded-helpers.ts b/src/agents/pi-embedded-helpers.ts index 6d062448d..031d0ec84 100644 --- a/src/agents/pi-embedded-helpers.ts +++ b/src/agents/pi-embedded-helpers.ts @@ -1,8 +1,8 @@ import fs from "node:fs/promises"; import path from "node:path"; -import type { AppMessage } from "@mariozechner/pi-agent-core"; -import type { AgentToolResult, AssistantMessage } from "@mariozechner/pi-ai"; +import type { AgentMessage, AgentToolResult } from "@mariozechner/pi-agent-core"; +import type { AssistantMessage } from "@mariozechner/pi-ai"; import { sanitizeContentBlocksImages } from "./tool-images.js"; import type { WorkspaceBootstrapFile } from "./workspace.js"; @@ -22,8 +22,10 @@ export async function ensureSessionHeader(params: { // create } await fs.mkdir(path.dirname(file), { recursive: true }); + const sessionVersion = 2; const entry = { type: "session", + version: sessionVersion, id: params.sessionId, timestamp: new Date().toISOString(), cwd: params.cwd, @@ -34,12 +36,12 @@ export async function ensureSessionHeader(params: { type ContentBlock = AgentToolResult["content"][number]; export async function sanitizeSessionMessagesImages( - messages: AppMessage[], + messages: AgentMessage[], label: string, -): Promise { +): Promise { // We sanitize historical session messages because Anthropic can reject a request // if the transcript contains oversized base64 images (see MAX_IMAGE_DIMENSION_PX). - const out: AppMessage[] = []; + const out: AgentMessage[] = []; for (const msg of messages) { if (!msg || typeof msg !== "object") { out.push(msg); @@ -48,7 +50,7 @@ export async function sanitizeSessionMessagesImages( const role = (msg as { role?: unknown }).role; if (role === "toolResult") { - const toolMsg = msg as Extract; + const toolMsg = msg as Extract; const content = Array.isArray(toolMsg.content) ? toolMsg.content : []; const nextContent = (await sanitizeContentBlocksImages( content as ContentBlock[], @@ -59,7 +61,7 @@ export async function sanitizeSessionMessagesImages( } if (role === "user") { - const userMsg = msg as Extract; + const userMsg = msg as Extract; const content = userMsg.content; if (Array.isArray(content)) { const nextContent = (await sanitizeContentBlocksImages( diff --git a/src/agents/pi-embedded-runner.ts b/src/agents/pi-embedded-runner.ts index 19e82499d..10f8abc97 100644 --- a/src/agents/pi-embedded-runner.ts +++ b/src/agents/pi-embedded-runner.ts @@ -3,7 +3,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import type { AppMessage, ThinkingLevel } from "@mariozechner/pi-agent-core"; +import type { AgentMessage, ThinkingLevel } from "@mariozechner/pi-agent-core"; import { type Api, type AssistantMessage, @@ -433,10 +433,7 @@ export async function runEmbeddedPiAgent(params: { tools, }); - const sessionManager = SessionManager.open( - params.sessionFile, - agentDir, - ); + const sessionManager = SessionManager.open(params.sessionFile); const settingsManager = SettingsManager.create( resolvedWorkspace, agentDir, @@ -504,7 +501,7 @@ export async function runEmbeddedPiAgent(params: { Math.max(1, params.timeoutMs), ); - let messagesSnapshot: AppMessage[] = []; + let messagesSnapshot: AgentMessage[] = []; let sessionIdUsed = session.sessionId; const onAbort = () => { abortRun(); @@ -545,7 +542,7 @@ export async function runEmbeddedPiAgent(params: { const lastAssistant = messagesSnapshot .slice() .reverse() - .find((m) => (m as AppMessage)?.role === "assistant") as + .find((m) => (m as AgentMessage)?.role === "assistant") as | AssistantMessage | undefined; diff --git a/src/agents/pi-embedded-subscribe.ts b/src/agents/pi-embedded-subscribe.ts index dd1b8a262..421e49454 100644 --- a/src/agents/pi-embedded-subscribe.ts +++ b/src/agents/pi-embedded-subscribe.ts @@ -1,4 +1,4 @@ -import type { AgentEvent, AppMessage } from "@mariozechner/pi-agent-core"; +import type { AgentEvent, AgentMessage } from "@mariozechner/pi-agent-core"; import type { AssistantMessage } from "@mariozechner/pi-ai"; import type { AgentSession } from "@mariozechner/pi-coding-agent"; @@ -234,7 +234,7 @@ export function subscribeEmbeddedPiSession(params: { } if (evt.type === "message_update") { - const msg = (evt as AgentEvent & { message: AppMessage }).message; + const msg = (evt as AgentEvent & { message: AgentMessage }).message; if (msg?.role === "assistant") { const assistantEvent = ( evt as AgentEvent & { assistantMessageEvent?: unknown } @@ -298,7 +298,7 @@ export function subscribeEmbeddedPiSession(params: { } if (evt.type === "message_end") { - const msg = (evt as AgentEvent & { message: AppMessage }).message; + const msg = (evt as AgentEvent & { message: AgentMessage }).message; if (msg?.role === "assistant") { const cleaned = params.enforceFinalTag ? stripThinkingSegments( diff --git a/src/agents/pi-tools.ts b/src/agents/pi-tools.ts index b7c9c9cc4..0c30d3746 100644 --- a/src/agents/pi-tools.ts +++ b/src/agents/pi-tools.ts @@ -1,4 +1,4 @@ -import type { AgentTool, AgentToolResult } from "@mariozechner/pi-ai"; +import type { AgentTool, AgentToolResult } from "@mariozechner/pi-agent-core"; import { codingTools, readTool } from "@mariozechner/pi-coding-agent"; import { Type } from "@sinclair/typebox"; diff --git a/src/agents/tool-images.ts b/src/agents/tool-images.ts index 5182d5f3c..64b6dec7e 100644 --- a/src/agents/tool-images.ts +++ b/src/agents/tool-images.ts @@ -1,4 +1,4 @@ -import type { AgentToolResult } from "@mariozechner/pi-ai"; +import type { AgentToolResult } from "@mariozechner/pi-agent-core"; import { getImageMetadata, resizeToJpeg } from "../media/image-ops.js";