From 31c6a12cfa661b5e0c05679cf92f8d4dbeb041f1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 13 Feb 2026 15:42:00 +0000 Subject: [PATCH] fix(agents): restore missing runtime helpers and sandbox types --- src/agents/apply-patch.ts | 3 +-- src/agents/pi-embedded-runner/run/images.ts | 26 +++++++++++++++++++ ...ses-schemas-without-dropping-d.e2e.test.ts | 2 +- src/agents/sandbox/docker.ts | 1 + 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/agents/apply-patch.ts b/src/agents/apply-patch.ts index f6b29d42423..731607602e5 100644 --- a/src/agents/apply-patch.ts +++ b/src/agents/apply-patch.ts @@ -78,8 +78,7 @@ const applyPatchSchema = Type.Object({ export function createApplyPatchTool( options: { cwd?: string; sandbox?: SandboxApplyPatchConfig } = {}, - // biome-ignore lint/suspicious/noExplicitAny: TypeBox schema type from pi-agent-core uses a different module instance. -): AgentTool { +): AgentTool { const cwd = options.cwd ?? process.cwd(); const sandbox = options.sandbox; diff --git a/src/agents/pi-embedded-runner/run/images.ts b/src/agents/pi-embedded-runner/run/images.ts index 2511728ca79..076a32867e4 100644 --- a/src/agents/pi-embedded-runner/run/images.ts +++ b/src/agents/pi-embedded-runner/run/images.ts @@ -2,6 +2,8 @@ import type { ImageContent } from "@mariozechner/pi-ai"; import path from "node:path"; import { fileURLToPath } from "node:url"; import type { SandboxFsBridge } from "../../sandbox/fs-bridge.js"; +import { resolveUserPath } from "../../../utils.js"; +import { loadWebMedia } from "../../../web/media.js"; import { sanitizeImageBlocks } from "../../tool-images.js"; import { log } from "../logger.js"; @@ -244,6 +246,30 @@ export function modelSupportsImages(model: { input?: string[] }): boolean { return model.input?.includes("image") ?? false; } +function extractTextFromMessage(message: unknown): string { + if (!message || typeof message !== "object") { + return ""; + } + const content = (message as { content?: unknown }).content; + if (typeof content === "string") { + return content; + } + if (!Array.isArray(content)) { + return ""; + } + const textParts: string[] = []; + for (const part of content) { + if (!part || typeof part !== "object") { + continue; + } + const record = part as Record; + if (record.type === "text" && typeof record.text === "string") { + textParts.push(record.text); + } + } + return textParts.join("\n").trim(); +} + /** * Extracts image references from conversation history messages. * Scans user messages for image paths/URLs that can be loaded. diff --git a/src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.e2e.test.ts b/src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.e2e.test.ts index 362d2835b86..3437e6253ef 100644 --- a/src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.e2e.test.ts +++ b/src/agents/pi-tools.create-openclaw-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.e2e.test.ts @@ -4,7 +4,7 @@ import path from "node:path"; import sharp from "sharp"; import { describe, expect, it } from "vitest"; import "./test-helpers/fast-coding-tools.js"; -import { createMoltbotCodingTools } from "./pi-tools.js"; +import { createOpenClawCodingTools } from "./pi-tools.js"; import { createHostSandboxFsBridge } from "./test-helpers/host-sandbox-fs-bridge.js"; const defaultTools = createOpenClawCodingTools(); diff --git a/src/agents/sandbox/docker.ts b/src/agents/sandbox/docker.ts index 5223e6edcf0..11ada7d295d 100644 --- a/src/agents/sandbox/docker.ts +++ b/src/agents/sandbox/docker.ts @@ -104,6 +104,7 @@ export function execDockerRaw( }); } +import type { SandboxConfig, SandboxDockerConfig, SandboxWorkspaceAccess } from "./types.js"; import { formatCliCommand } from "../../cli/command-format.js"; import { defaultRuntime } from "../../runtime.js"; import { computeSandboxConfigHash } from "./config-hash.js";