Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions packages/opencode/src/session/message-v2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -705,8 +705,13 @@ export const toModelMessagesEffect = Effect.fnUntraced(function* (
type: "text",
text: part.text,
})
// 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") {
// text/plain, directory files, and MCP resources are converted into text parts, ignore them
if (
part.type === "file" &&
part.mime !== "text/plain" &&
part.mime !== "application/x-directory" &&
part.source?.type !== "resource"
) {
if (options?.stripMedia && isMedia(part.mime)) {
userMessage.parts.push({
type: "text",
Expand Down
47 changes: 47 additions & 0 deletions packages/opencode/test/session/message-v2.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,53 @@ describe("session.message-v2.toModelMessage", () => {
])
})

test("does not forward resolved MCP resource parts as file downloads", async () => {
const messageID = "m-user"

const input: MessageV2.WithParts[] = [
{
info: userInfo(messageID),
parts: [
{
...basePart(messageID, "p1"),
type: "text",
text: "Reading MCP resource: status (status://info)",
synthetic: true,
},
{
...basePart(messageID, "p2"),
type: "text",
text: '{"ok":true}',
synthetic: true,
},
{
...basePart(messageID, "p3"),
type: "file",
mime: "application/json",
filename: "status",
url: "status://info",
source: {
type: "resource",
clientName: "status-server",
uri: "status://info",
text: { value: "@status", start: 0, end: 7 },
},
},
] as MessageV2.Part[],
},
]

expect(await MessageV2.toModelMessages(input, model)).toStrictEqual([
{
role: "user",
content: [
{ type: "text", text: "Reading MCP resource: status (status://info)" },
{ type: "text", text: '{"ok":true}' },
],
},
])
})

test("converts assistant tool completion into tool-call + tool-result messages with attachments", async () => {
const userID = "m-user"
const assistantID = "m-assistant"
Expand Down
Loading