v0.9.0
v0.9.0 Release Notes
新功能
实例生命周期持久化 (Issue #2)
- 新增
instance_lifecycleSQLite 表,持久化实例状态(启动时间、过期时间、端口、运行路径等) - 服务重启后自动检测 Docker 实际运行状态,恢复/清理实例
- 新增后台 Reaper 线程,按难度自动超时清理过期实例(Easy 1h / Medium 2h / Hard 4h)
- 新增超时配置接口
GET/POST /api/settings/instance_timeout - 前端设置页新增实例超时配置面板
- 前端 Challenge 卡片新增倒计时显示
Per-Challenge Agent 可见性开关 (PR #1)
- 管理员可在 Web UI 中单独控制每道题目是否对 Agent 开放
- 关闭后 Agent 的
list_challenges不返回该题目,相关 API 调用返回 403
Bug 修复
Docker 网络地址池耗尽防护 (Issue #3)
- 启动时自动清理孤儿 Docker 网络(
docker network prune) docker compose up遇到 "non-overlapping IPv4 address pool" 错误时自动清理并重试
平台请求阻塞修复 (Issue #4)
- 所有
docker compose阻塞调用改为asyncio.to_thread,不再阻塞 FastAPI 事件循环 _compose()新增 5 分钟超时控制,防止无限挂起
TCH API 兼容性修复
POST /api/start_challenge返回格式恢复为data: ["host:port"],与 TCH API 文档一致- 错误响应格式改为顶层
{"code": -1, "message": "...", "data": null},不再被 FastAPI 包装{"detail": ...} _find_by_code支持旧 challenge_code 别名查找,解决动态 flag 重新生成 code 后 submit/stop 404 问题get_instance_status/stop_challenge_instance使用 challenge 对象当前 code 而非传入的旧 code- 前端 Challenge 卡片改用稳定的
benchmark_id作为 DOM ID 和局部刷新标识
其他修复
- 修复 Python 3.9 兼容性(
str | None→Optional[str]) - 修复
start_challenge后使用旧 code 获取时间戳导致 500 的问题