From 29310957c8aa0dd6c5ba17fbf22ce708c8ccb775 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:27:44 -0500 Subject: [PATCH] fix: handle @dir in command (#2533) --- packages/opencode/src/session/index.ts | 51 ++++++++++++++++++++- packages/opencode/src/session/message-v2.ts | 4 +- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 0fa2d66e..6b93a127 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -52,6 +52,7 @@ import { ulid } from "ulid" import { defer } from "../util/defer" import { Command } from "../command" import { $ } from "bun" +import { ListTool } from "../tool/ls" export namespace Session { const log = Log.create({ service: "session" }) @@ -576,7 +577,45 @@ export namespace Session { ] } - let file = Bun.file(filePath) + if (part.mime === "application/x-directory") { + const args = { path: filePath } + const result = await ListTool.init().then((t) => + t.execute(args, { + sessionID: input.sessionID, + abort: new AbortController().signal, + agent: input.agent!, + messageID: userMsg.id, + extra: { bypassCwdCheck: true }, + metadata: async () => {}, + }), + ) + return [ + { + id: Identifier.ascending("part"), + messageID: userMsg.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: `Called the list tool with the following input: ${JSON.stringify(args)}`, + }, + { + id: Identifier.ascending("part"), + messageID: userMsg.id, + sessionID: input.sessionID, + type: "text", + synthetic: true, + text: result.output, + }, + { + ...part, + id: part.id ?? Identifier.ascending("part"), + messageID: userMsg.id, + sessionID: input.sessionID, + }, + ] + } + + const file = Bun.file(filePath) FileTime.read(input.sessionID, filePath) return [ { @@ -1318,7 +1357,15 @@ export namespace Session { return } - if (stats.isDirectory()) return + if (stats.isDirectory()) { + parts.push({ + type: "file", + url: `file://${filepath}`, + filename: name, + mime: "application/x-directory", + }) + return + } parts.push({ type: "file", diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index be09d31d..fd14afbd 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -487,8 +487,8 @@ export namespace MessageV2 { text: part.text, }, ] - // text/plain files are converted into text parts, ignore them - if (part.type === "file" && part.mime !== "text/plain") + // text/plain and directory files are converted into text parts, ignore them + if (part.type === "file" && part.mime !== "text/plain" && part.mime !== "application/x-directory") return [ { type: "file",