From 563701fed8145d3a0540ac6f6f7e56a721944606 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 8 Dec 2025 16:35:03 +0100 Subject: [PATCH] fix: trim overlay transcript to post-trigger --- .../Sources/Clawdis/VoiceWakeRuntime.swift | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift b/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift index d49153fcb..fe1bfe0a5 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeRuntime.swift @@ -144,10 +144,11 @@ actor VoiceWakeRuntime { if !transcript.isEmpty { self.lastHeard = now if self.isCapturing { - self.capturedTranscript = transcript + self.capturedTranscript = Self.trimmedAfterTrigger(transcript, triggers: config.triggers) self.updateHeardBeyondTrigger(with: transcript) + let snapshot = self.capturedTranscript await MainActor.run { - VoiceWakeOverlayController.shared.showPartial(transcript: transcript) + VoiceWakeOverlayController.shared.showPartial(transcript: snapshot) } } } @@ -175,13 +176,14 @@ actor VoiceWakeRuntime { private func beginCapture(transcript: String, config: RuntimeConfig) async { self.isCapturing = true - self.capturedTranscript = transcript + self.capturedTranscript = Self.trimmedAfterTrigger(transcript, triggers: config.triggers) self.captureStartedAt = Date() self.cooldownUntil = nil self.heardBeyondTrigger = self.textHasBeyondTriggerContent(transcript) + let snapshot = self.capturedTranscript await MainActor.run { - VoiceWakeOverlayController.shared.showPartial(transcript: transcript) + VoiceWakeOverlayController.shared.showPartial(transcript: snapshot) } await MainActor.run { AppStateStore.shared.triggerVoiceEars(ttl: nil) } @@ -274,6 +276,18 @@ actor VoiceWakeRuntime { } } + private static func trimmedAfterTrigger(_ text: String, triggers: [String]) -> String { + let lower = text.lowercased() + for trigger in triggers { + let token = trigger.lowercased().trimmingCharacters(in: .whitespacesAndNewlines) + guard !token.isEmpty, let range = lower.range(of: token) else { continue } + let after = range.upperBound + let trimmed = text[after...].trimmingCharacters(in: .whitespacesAndNewlines) + return String(trimmed) + } + return text + } + #if DEBUG static func _testMatches(text: String, triggers: [String]) -> Bool { self.matches(text: text, triggers: triggers)