70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
"""Qt worker objects for non-blocking model generation and approval."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import threading
|
|
|
|
from PySide6.QtCore import QObject, Signal, Slot
|
|
|
|
from javis.core.provider_router import ApprovalChoice
|
|
from javis.security.privacy import PrivacyDecision
|
|
from javis.ui.chat_controller import DesktopController
|
|
|
|
|
|
class ApprovalBridge(QObject):
|
|
approval_requested = Signal(object)
|
|
notice_received = Signal(str)
|
|
|
|
def __init__(self) -> None:
|
|
super().__init__()
|
|
self._lock = threading.Lock()
|
|
self._event: threading.Event | None = None
|
|
self._result = ApprovalChoice.CANCEL
|
|
|
|
def request(self, decision: PrivacyDecision) -> ApprovalChoice:
|
|
event = threading.Event()
|
|
with self._lock:
|
|
self._event = event
|
|
self._result = ApprovalChoice.CANCEL
|
|
self.approval_requested.emit(decision)
|
|
event.wait()
|
|
with self._lock:
|
|
result = self._result
|
|
self._event = None
|
|
return result
|
|
|
|
def resolve(self, choice: ApprovalChoice) -> None:
|
|
with self._lock:
|
|
self._result = choice
|
|
event = self._event
|
|
if event is not None:
|
|
event.set()
|
|
|
|
def cancel_pending(self) -> None:
|
|
self.resolve(ApprovalChoice.CANCEL)
|
|
|
|
|
|
class StreamWorker(QObject):
|
|
event_received = Signal(object)
|
|
completed = Signal()
|
|
|
|
def __init__(self, controller: DesktopController, text: str) -> None:
|
|
super().__init__()
|
|
self._controller = controller
|
|
self._text = text
|
|
self._cancel_event = threading.Event()
|
|
|
|
@Slot()
|
|
def run(self) -> None:
|
|
try:
|
|
for event in self._controller.stream_message(
|
|
self._text,
|
|
self._cancel_event,
|
|
):
|
|
self.event_received.emit(event)
|
|
finally:
|
|
self.completed.emit()
|
|
|
|
def request_cancel(self) -> None:
|
|
self._cancel_event.set()
|