# -*- coding: utf-8 -*- """Web 观测台(形态 A:观测 / 调试台)。 分层: * `events.py` 事件模型(前后端共用同一套 `EVT_*` 类型名) * `runner.py` `SolveJob` / `JobManager` —— 把同步阻塞的 `solve()` 包成 "可观测的后台任务"(工作线程 + 全局串行 + 频控节流 + 事件化) * `app.py` FastAPI 路由(建任务 / SSE / 图片 / 快照 / 取消) * `static/` 零构建单页(原生 JS,不引打包器/框架) **依赖是可选 extra**:`fastapi` + `uvicorn` 装在 `[project.optional-dependencies].web`, 核心包(协议 / 遥测 / 求解器 / CLI)完全不依赖它们 —— 所以本模块的 `__init__` 刻意**不 import app**,避免 `import tcaptcha.web` 就把 fastapi 拉进来。 启动: uv run --extra web python -m tcaptcha.web.app """ __all__: list = []