fix: restore image paste and image tool-result handling (#308)

This commit is contained in:
KRATOS
2026-04-04 11:40:26 +05:30
committed by GitHub
parent 365bd3102d
commit c52245fc0a
7 changed files with 228 additions and 11 deletions

View File

@@ -0,0 +1,22 @@
import { expect, test } from 'bun:test'
import { supportsClipboardImageFallback } from './usePasteHandler.ts'
test('supports clipboard image fallback on Windows', () => {
expect(supportsClipboardImageFallback('windows')).toBe(true)
})
test('supports clipboard image fallback on macOS', () => {
expect(supportsClipboardImageFallback('macos')).toBe(true)
})
test('supports clipboard image fallback on Linux', () => {
expect(supportsClipboardImageFallback('linux')).toBe(true)
})
test('does not support clipboard image fallback on WSL', () => {
expect(supportsClipboardImageFallback('wsl')).toBe(false)
})
test('does not support clipboard image fallback on unknown platforms', () => {
expect(supportsClipboardImageFallback('unknown')).toBe(false)
})

View File

@@ -15,6 +15,14 @@ import { getPlatform } from '../utils/platform.js'
const CLIPBOARD_CHECK_DEBOUNCE_MS = 50
const PASTE_COMPLETION_TIMEOUT_MS = 100
export function supportsClipboardImageFallback(
platform: ReturnType<typeof getPlatform>,
): boolean {
return (
platform === 'macos' || platform === 'windows' || platform === 'linux'
)
}
type PasteHandlerProps = {
onPaste?: (text: string) => void
onInput: (input: string, key: Key) => void
@@ -52,7 +60,9 @@ export function usePasteHandler({
// that key is Enter, it submits the old input and the paste is lost.
const pastePendingRef = React.useRef(false)
const isMacOS = React.useMemo(() => getPlatform() === 'macos', [])
const platform = React.useMemo(() => getPlatform(), [])
const isMacOS = platform === 'macos'
const canFallbackToClipboardImage = supportsClipboardImageFallback(platform)
React.useEffect(() => {
return () => {
@@ -178,7 +188,11 @@ export function usePasteHandler({
// If paste is empty (common when trying to paste images with Cmd+V),
// check if clipboard has an image (macOS only)
if (isMacOS && onImagePaste && pastedText.length === 0) {
if (
canFallbackToClipboardImage &&
onImagePaste &&
pastedText.length === 0
) {
checkClipboardForImage()
return { chunks: [], timeoutId: null }
}
@@ -202,7 +216,13 @@ export function usePasteHandler({
pastePendingRef,
)
},
[checkClipboardForImage, isMacOS, onImagePaste, onPaste],
[
checkClipboardForImage,
canFallbackToClipboardImage,
isMacOS,
onImagePaste,
onPaste,
],
)
// Paste detection is now done via the InputEvent's keypress.isPasted flag,
@@ -242,7 +262,12 @@ export function usePasteHandler({
// When the user pastes an image with Cmd+V, the terminal sends an empty
// bracketed paste sequence. The keypress parser emits this as isPasted=true
// with empty input.
if (isFromPaste && input.length === 0 && isMacOS && onImagePaste) {
if (
isFromPaste &&
input.length === 0 &&
canFallbackToClipboardImage &&
onImagePaste
) {
checkClipboardForImage()
// Reset isPasting since there's no text content to process
setIsPasting(false)