From 6507e803b6a7e36aca3df0875d77146788c5dde9 Mon Sep 17 00:00:00 2001 From: Yash Date: Sat, 7 Feb 2026 14:59:13 +0530 Subject: [PATCH 1/3] feat: Pass through data URLs directly and gracefully handle unknown URL protocols in prompt part processing. --- packages/opencode/src/session/prompt.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index ad7b6f1a91d7..7af3f67bcff6 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -971,7 +971,16 @@ export namespace SessionPrompt { }, ] } - break + // For non-text data URLs (images, PDFs from clipboard), pass through as-is + log.info("data url", { mime: part.mime }) + return [ + { + ...part, + id: part.id ?? Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + }, + ] case "file:": log.info("file", { mime: part.mime }) // have to normalize, symbol search returns absolute paths @@ -1157,6 +1166,17 @@ export namespace SessionPrompt { source: part.source, }, ] + default: + // Handle unknown protocols gracefully to prevent crashes + log.warn("unsupported URL protocol", { protocol: url.protocol, url: part.url.slice(0, 100) }) + return [ + { + ...part, + id: part.id ?? Identifier.ascending("part"), + messageID: info.id, + sessionID: input.sessionID, + }, + ] } } From ccfd30fb556b38528cda1b73135c2cbd5c7ecfe7 Mon Sep 17 00:00:00 2001 From: Yash Date: Sat, 7 Feb 2026 18:48:57 +0530 Subject: [PATCH 2/3] fix: handle non-text data URLs to prevent Windows clipboard paste crash When pasting images from clipboard on Windows 11, the app crashed with: TypeError: The URL must be of scheme file (ERR_INVALID_URL_SCHEME) Root cause: The data: case only handled text/plain and broke, causing non-text data URLs to fall through to file: case which called fileURLToPath() on a data: URL. Fix: - Return non-text data URLs directly instead of breaking - Add default case to prevent fall-through for unknown protocols --- packages/opencode/src/session/prompt.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 7af3f67bcff6..0ce187909ccb 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -971,8 +971,7 @@ export namespace SessionPrompt { }, ] } - // For non-text data URLs (images, PDFs from clipboard), pass through as-is - log.info("data url", { mime: part.mime }) + // For non-text data URLs (images, PDFs from clipboard paste), pass through as-is return [ { ...part, @@ -1167,8 +1166,16 @@ export namespace SessionPrompt { }, ] default: +<<<<<<< HEAD // Handle unknown protocols gracefully to prevent crashes log.warn("unsupported URL protocol", { protocol: url.protocol, url: part.url.slice(0, 100) }) +======= + // Unknown protocol - log and return part unchanged to prevent crashes + log.warn("unsupported URL protocol for file part", { + protocol: url.protocol, + url: part.url.slice(0, 100), + }) +>>>>>>> cfbf89264 (fix: handle non-text data URLs to prevent Windows clipboard paste crash) return [ { ...part, From 684dbd48810642db3a073b471a466746dcc706c5 Mon Sep 17 00:00:00 2001 From: Yash Date: Sat, 7 Feb 2026 18:52:02 +0530 Subject: [PATCH 3/3] refactor: Resolve merge conflict and clarify unsupported URL protocol warning message. --- packages/opencode/src/session/prompt.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 0ce187909ccb..717a4fd1cc4e 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1166,16 +1166,11 @@ export namespace SessionPrompt { }, ] default: -<<<<<<< HEAD - // Handle unknown protocols gracefully to prevent crashes - log.warn("unsupported URL protocol", { protocol: url.protocol, url: part.url.slice(0, 100) }) -======= // Unknown protocol - log and return part unchanged to prevent crashes log.warn("unsupported URL protocol for file part", { protocol: url.protocol, url: part.url.slice(0, 100), }) ->>>>>>> cfbf89264 (fix: handle non-text data URLs to prevent Windows clipboard paste crash) return [ { ...part,