77// ghost text as a CATextLayer overlay on the text view.
88//
99
10- import AppKit
10+ @ preconcurrency import AppKit
1111import CodeEditSourceEditor
1212import CodeEditTextView
1313import os
@@ -374,35 +374,38 @@ final class InlineSuggestionManager {
374374
375375 private func installKeyEventMonitor( ) {
376376 removeKeyEventMonitor ( )
377- _keyEventMonitor. withLock { $0 = NSEvent . addLocalMonitorForEvents ( matching: . keyDown) { [ weak self] event in
378- guard let self, self . isEditorFocused else { return event }
377+ _keyEventMonitor. withLock { $0 = NSEvent . addLocalMonitorForEvents ( matching: . keyDown) { [ weak self] nsEvent in
378+ nonisolated ( unsafe) let event = nsEvent
379+ return MainActor . assumeIsolated {
380+ guard let self, self . isEditorFocused else { return event }
379381
380- guard AppSettingsManager . shared. ai. inlineSuggestEnabled else { return event }
382+ guard AppSettingsManager . shared. ai. inlineSuggestEnabled else { return event }
381383
382- guard self . currentSuggestion != nil else { return event }
384+ guard self . currentSuggestion != nil else { return event }
383385
384- guard let textView = self . controller? . textView,
385- event. window === textView. window,
386- textView. window? . firstResponder === textView else { return event }
386+ guard let textView = self . controller? . textView,
387+ event. window === textView. window,
388+ textView. window? . firstResponder === textView else { return event }
387389
388- switch event. keyCode {
389- case 48 : // Tab — accept suggestion
390- Task { @MainActor [ weak self] in
391- self ? . acceptSuggestion ( )
392- }
393- return nil
390+ switch event. keyCode {
391+ case 48 : // Tab — accept suggestion
392+ Task { @MainActor [ weak self] in
393+ self ? . acceptSuggestion ( )
394+ }
395+ return nil
394396
395- case 53 : // Escape — dismiss suggestion
396- Task { @MainActor [ weak self] in
397- self ? . dismissSuggestion ( )
398- }
399- return nil
397+ case 53 : // Escape — dismiss suggestion
398+ Task { @MainActor [ weak self] in
399+ self ? . dismissSuggestion ( )
400+ }
401+ return nil
400402
401- default :
402- Task { @MainActor [ weak self] in
403- self ? . dismissSuggestion ( )
403+ default :
404+ Task { @MainActor [ weak self] in
405+ self ? . dismissSuggestion ( )
406+ }
407+ return event
404408 }
405- return event
406409 }
407410 }
408411 }
@@ -419,11 +422,12 @@ final class InlineSuggestionManager {
419422
420423 private func installScrollObserver( ) {
421424 guard let scrollView = controller? . scrollView else { return }
425+ let contentView = scrollView. contentView
422426
423427 _scrollObserver. withLock {
424428 $0 = NotificationCenter . default. addObserver (
425429 forName: NSView . boundsDidChangeNotification,
426- object: scrollView . contentView,
430+ object: contentView,
427431 queue: . main
428432 ) { [ weak self] _ in
429433 Task { @MainActor [ weak self] in
0 commit comments