Fix: Enable Clipboard context with custom AI enhancers

This commit is contained in:
Serwan Asaad 2025-09-22 13:49:07 +02:00
parent afd6e91207
commit c91f92f4d0
2 changed files with 27 additions and 22 deletions

View File

@ -132,8 +132,9 @@ class AIEnhancementService: ObservableObject {
}
private func getSystemMessage(for mode: EnhancementPrompt) -> String {
let clipboardSnapshot = NSPasteboard.general.string(forType: .string)
let selectedText = SelectedTextService.fetchSelectedText()
if let activePrompt = activePrompt,
activePrompt.id == PredefinedPrompts.assistantPromptId,
let selectedText = selectedText, !selectedText.isEmpty {
@ -149,7 +150,7 @@ class AIEnhancementService: ObservableObject {
}
let clipboardContext = if useClipboardContext,
let clipboardText = NSPasteboard.general.string(forType: .string),
let clipboardText = clipboardSnapshot ?? NSPasteboard.general.string(forType: .string),
!clipboardText.isEmpty {
"\n\n<CLIPBOARD_CONTEXT>\n\(clipboardText)\n</CLIPBOARD_CONTEXT>"
} else {

View File

@ -1,11 +1,7 @@
import Foundation
import AppKit
class SelectedTextService {
// Private pasteboard type to avoid clipboard history pollution
private static let privatePasteboardType = NSPasteboard.PasteboardType("com.prakashjoshipax.VoiceInk.transient")
static func fetchSelectedText() -> String? {
// Don't check for selected text within VoiceInk itself
guard let frontmostApp = NSWorkspace.shared.frontmostApplication,
@ -14,10 +10,15 @@ class SelectedTextService {
}
let pasteboard = NSPasteboard.general
// Save original clipboard content
let originalClipboardText = pasteboard.string(forType: .string)
// Save original clipboard content (all UTIs with their data)
let originalPasteboardItems = pasteboard.pasteboardItems?.map { item in
(item.types, item.data(forType: item.types.first ?? .string))
item.types.reduce(into: [NSPasteboard.PasteboardType: Data]()) { acc, type in
if let data = item.data(forType: type) {
acc[type] = data
}
}
}
// Clear clipboard to prepare for selection detection
@ -43,24 +44,27 @@ class SelectedTextService {
// Read the copied text
let selectedText = pasteboard.string(forType: .string)
// Restore original clipboard content
pasteboard.clearContents()
if let originalItems = originalPasteboardItems {
for (types, data) in originalItems {
if let data = data {
let pasteboardItem = NSPasteboardItem()
pasteboardItem.setData(data, forType: types.first ?? .string)
pasteboard.writeObjects([pasteboardItem])
if let originalItems = originalPasteboardItems, !originalItems.isEmpty {
let restoredItems: [NSPasteboardItem] = originalItems.compactMap { dataMap in
guard !dataMap.isEmpty else { return nil }
let item = NSPasteboardItem()
for (type, data) in dataMap {
item.setData(data, forType: type)
}
return item
}
if !restoredItems.isEmpty {
pasteboard.writeObjects(restoredItems)
} else if let originalClipboardText {
_ = pasteboard.setString(originalClipboardText, forType: .string)
}
} else if let originalClipboardText {
_ = pasteboard.setString(originalClipboardText, forType: .string)
}
// Clear clipboard history by writing transient data
let transientItem = NSPasteboardItem()
transientItem.setString("", forType: privatePasteboardType)
pasteboard.writeObjects([transientItem])
return selectedText
}
}
}