agent-Specialization/server/extensions.py
JOJO d9bd599c1c feat(runtime): Gateway 独立启动与公共协议落地(改造第 0-3 步)
- 闭环修复:审批 task_id 显式化(N2)、通知回退路径门闸 finally 释放(N1)、
  personalization 原子写(S10,公共 atomic_write_json)
- server.tasks 拆解:__init__ 轻量化、Blueprint/路由移至 blueprint.py/web.py,
  app_legacy 装配点惰性挂载;models.py 循环依赖死导入移除
- 执行链 Web 解耦:emit_event/run_background 安全包装(socketio 未绑定静默),
  清除 4 处裸 socketio.emit(含 task_stopped 先写事件流再推送的顺序修复)
- RuntimeService 补建对话下沉:chat 任务无 conversation_id 时服务层装配,
  客户端无需复制 Web 两步流程
- 事件协议:get_task_events 返回 meta.window_start 缺口检测水位
- 验收:test_runtime_standalone_lifecycle 子进程隔离(config import 固化问题),
  独立启动 + 协议全链路 + 审批语义全绿;全量 74 测试失败恰为 4 项存量
2026-09-07 23:00:15 +08:00

36 lines
1.4 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.

"""Flask/SocketIO 扩展实例。"""
import threading
from flask_socketio import SocketIO
# 统一的 SocketIO 实例,使用线程模式以兼容现有逻辑
socketio = SocketIO(cors_allowed_origins="*", async_mode='threading', logger=False, engineio_logger=False)
def emit_event(event, data, room=None, **kwargs):
"""Web 模式下经 socketio 实时推送;独立 Gateway 进程socketio 未绑定 app静默跳过。
事件的权威记录是任务事件流TaskRecord.events_append_event 落盘在前);
socket 推送只是在线客户端的实时增量通道——独立进程没有 socket 客户端,
跳过不丢数据。Web 模式下推送失败也静默(对齐原各调用点的 try/except 语义)。
"""
if socketio.server is None:
return
try:
socketio.emit(event, data, room=room, **kwargs)
except Exception:
pass
def run_background(fn, *args, **kwargs):
"""启动后台任务Web 模式走 socketio.start_background_task兼容其线程模型
独立 Gateway 进程socketio 未初始化)降级为 daemon 线程。"""
if socketio.server is not None:
return socketio.start_background_task(fn, *args, **kwargs)
t = threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True)
t.start()
return t
__all__ = ["socketio", "emit_event", "run_background"]