From cd12ad8aabcd75eb7f6358719e39b6e2486f4a5e Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 12 Jan 2026 20:53:16 +0000 Subject: [PATCH] fix(image): accept @-prefixed file paths --- CHANGELOG.md | 2 +- src/agents/tools/image-tool.test.ts | 2 +- src/agents/tools/image-tool.ts | 5 ++++- src/discord/monitor.ts | 6 +++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 942d13b16..e0cf92c28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Subagents: add config to set default sub-agent model (`agents.defaults.subagents.model` + per-agent override); still overridden by `sessions_spawn.model`. ### Fixes -- Tools/Models: MiniMax vision now uses the Coding Plan VLM endpoint (`/v1/coding_plan/vlm`) so the `image` tool works with MiniMax keys. +- Tools/Models: MiniMax vision now uses the Coding Plan VLM endpoint (`/v1/coding_plan/vlm`) so the `image` tool works with MiniMax keys (also accepts `@/path/to/file.png`-style inputs). - Gateway/macOS: reduce noisy loopback WS “closed before connect” logs during tests. ## 2026.1.12-1 diff --git a/src/agents/tools/image-tool.test.ts b/src/agents/tools/image-tool.test.ts index bfdea82db..726ee3763 100644 --- a/src/agents/tools/image-tool.test.ts +++ b/src/agents/tools/image-tool.test.ts @@ -182,7 +182,7 @@ describe("image tool implicit imageModel config", () => { const res = await tool.execute("t1", { prompt: "Describe the image.", - image: "/Users/steipete/.clawdbot/media/inbound/photo.png", + image: "@/Users/steipete/.clawdbot/media/inbound/photo.png", }); expect(fetch).toHaveBeenCalledTimes(1); diff --git a/src/agents/tools/image-tool.ts b/src/agents/tools/image-tool.ts index 46a16e3d2..6558c6125 100644 --- a/src/agents/tools/image-tool.ts +++ b/src/agents/tools/image-tool.ts @@ -440,8 +440,11 @@ export function createImageTool(options?: { args && typeof args === "object" ? (args as Record) : {}; - const imageRaw = + const imageRawInput = typeof record.image === "string" ? record.image.trim() : ""; + const imageRaw = imageRawInput.startsWith("@") + ? imageRawInput.slice(1).trim() + : imageRawInput; if (!imageRaw) throw new Error("image required"); const promptRaw = typeof record.prompt === "string" && record.prompt.trim() diff --git a/src/discord/monitor.ts b/src/discord/monitor.ts index 1ed748ade..5541c0616 100644 --- a/src/discord/monitor.ts +++ b/src/discord/monitor.ts @@ -2446,7 +2446,11 @@ export function resolveDiscordShouldRequireMention(params: { }): boolean { if (!params.isGuildMessage) return false; if (params.isThread && params.channelConfig?.autoThread) return false; - return params.channelConfig?.requireMention ?? params.guildInfo?.requireMention ?? true; + return ( + params.channelConfig?.requireMention ?? + params.guildInfo?.requireMention ?? + true + ); } export function isDiscordGroupAllowedByPolicy(params: {