// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package review import ( "context" "time" "git.stormux.org/storm/cthulhu/internal/atspi" ) type focusedSnapshotReader interface { ReadFocusedSnapshot(context.Context, atspi.ObjectID) (atspi.DocumentContent, error) } // ReadWhereAmI queues privacy verification without blocking the command loop. // Providers without a focused snapshot operation retain their local-only path. func (worker *Worker) ReadWhereAmI(revision uint64) error { focus := worker.Focus() if !focus.Valid() { return ErrNoCurrent } if _, ok := worker.nativeCapturerFor(focus).(focusedSnapshotReader); !ok { return ErrNoCurrent } select { case worker.requests <- request{whereAmI: true, whereAmIRevision: revision, readFocus: focus, documentEpoch: worker.documentEpoch.Load(), queuedAt: time.Now()}: return nil default: return ErrRequestQueueFull } } func (worker *Worker) read_where_am_i(ctx context.Context, request request) Result { result := Result{WhereAmI: true, WhereAmIRevision: request.whereAmIRevision, DocumentFocus: request.readFocus} if !result.DocumentFocus.Valid() || result.DocumentFocus != worker.Focus() { result.Err = ErrNoCurrent return result } reader, ok := worker.nativeCapturerFor(result.DocumentFocus).(focusedSnapshotReader) if !ok { result.Err = ErrNoCurrent return result } deadline, cancel := context.WithTimeout(ctx, worker.captureTimeout) defer cancel() content, err := reader.ReadFocusedSnapshot(deadline, result.DocumentFocus) result.Err = err result.DocumentPosition.Snapshot = content.Snapshot result.DocumentCaretContext = content.SourceContext return result }