summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-09-10 13:27:44 -0500
committerGitHub <[email protected]>2025-09-10 13:27:44 -0500
commit29310957c8aa0dd6c5ba17fbf22ce708c8ccb775 (patch)
tree4c22993ee36b9c047d3cfa2468b6f2c6e23d9a3b
parent2b0577c725f9a5c6f84cbe3c72f92830b48353c1 (diff)
downloadopencode-29310957c8aa0dd6c5ba17fbf22ce708c8ccb775.tar.gz
opencode-29310957c8aa0dd6c5ba17fbf22ce708c8ccb775.zip
fix: handle @dir in command (#2533)
-rw-r--r--packages/opencode/src/session/index.ts51
-rw-r--r--packages/opencode/src/session/message-v2.ts4
2 files changed, 51 insertions, 4 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 0fa2d66ed..6b93a1275 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 be09d31d8..fd14afbd7 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",