front/xhs-agent-desktop/app/agent_worker.py
zzh 5a26ae0048 feat: 小红书模块迁移、登录重构与 xhs-agent-desktop 桌面 Agent
- 新增小红书前端模块(启动服务、内容分析、爆款创作、发布记录、技能卡片、拟人设置、AI 助手)

- 新增 xhs-agent-desktop 独立桌面 Agent,对接 OMS 任务调度

- 登录页重构,整合微信登录与 OMS JWT 认证

- 订单、渠道、用户中心等页面与 API 增强

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 16:13:13 +08:00

93 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""后台 Agent 主循环(QThread)。"""
from __future__ import annotations
import logging
import threading
from PyQt6.QtCore import QThread, pyqtSignal
from app.config_store import AgentSettings
from app.engine_path import ensure_runtime_importable
from app.oms_agent_runner import run_agent_loop
from app.oms_client import OmsAgentClient
logger = logging.getLogger(__name__)
class AgentWorker(QThread):
log_line = pyqtSignal(str)
status_changed = pyqtSignal(dict)
started_ok = pyqtSignal(dict)
stopped = pyqtSignal()
failed = pyqtSignal(str)
def __init__(self, settings: AgentSettings, parent=None) -> None:
super().__init__(parent)
self._settings = settings
self._stop_event = threading.Event()
def request_stop(self) -> None:
self._stop_event.set()
def run(self) -> None:
try:
ensure_runtime_importable()
from xhs_bridge.service import XhsBridgeService
svc = XhsBridgeService()
device_id = svc.license.device_id
client = OmsAgentClient(
self._settings.oms_url.strip(),
self._settings.token.strip(),
device_id,
)
self.started_ok.emit(
{
"device_id": device_id,
"agent_id": client.agent_id,
"bridge_port": self._settings.bridge_port,
}
)
self.log_line.emit(f"已连接 OMS:{self._settings.oms_url}")
self.log_line.emit(f"设备 ID:{device_id}")
def stop_flag() -> bool:
return self._stop_event.is_set()
import app.oms_agent_runner as runner
orig_heartbeat = runner._heartbeat
def wrapped_heartbeat(c, s):
orig_heartbeat(c, s)
try:
st = s.status()
self.status_changed.emit(
{
"engine_running": bool(st.get("bridge_running")),
"extension_connected": bool(st.get("extension_connected")),
"xhs_logged_in": bool(st.get("login_ok")),
}
)
except Exception:
pass
self.log_line.emit("心跳 OK")
runner._heartbeat = wrapped_heartbeat
run_agent_loop(
client,
svc,
device_name=self._settings.device_name or None,
bridge_port=self._settings.bridge_port,
stop_flag=stop_flag,
)
except Exception as exc:
logger.exception("Agent 线程异常")
self.failed.emit(str(exc))
finally:
self.stopped.emit()