feat(v3): T29 收尾 + T31 dsh 功能对齐

T29 流式收尾:
- _stream_partial 每次流式调用前复位(防上次成功置位导致本次失败误抛不回退)

T31 dsh(deepseek-harness)功能对齐:
- OpenAICompatChat 重试退避:传输错误/408/429/5xx 指数退避(max_retries=2),4xx 不重试
- web_fetch 工具:公网 http/https 抓取,SSRF 防护(DNS 后拒绝私网/环回/链路本地/NAT64,
  512KB/15s/12k 上限,二进制嗅探拒绝),agent.allow_net 开关(默认开)
- 原子写入:write_file/edit_file 临时文件 + os.replace(Windows EPERM 退避)
- 慢工具线程卸载:run_command/web_fetch/search_files 独立线程 + asyncio.sleep 轮询
- search_files:os.walk 修剪依赖目录(替代 rglob 全量物化),不跟随符号链接
- run_command:危险命令黑名单独立拦截 + 显式 COMSPEC/sh 解释器执行
- 重复调用提醒:同工具同参数第 3 次起回喂系统提示 + repeat_warning 事件
- 会话重命名:PATCH /agent/sessions/{sid} + 前端 ✎
- 前端:SettingsView 适配密钥打码(留空保留),SPA 重新构建
- 新增 tests/test_agent_features.py(9 项);全量 318 测试通过
This commit is contained in:
tzt
2026-09-02 00:02:24 +08:00
parent ce3ba44de3
commit 747d85c3ba
18 changed files with 356 additions and 26 deletions
@@ -136,3 +136,44 @@
DeltaThrottle ≥48 字符节流落 delta 事件;前端打字机式实时渲染 + 光标。
- **配套修复**:Vue 响应式丢失 bug——闭包持有 push 前原始对象导致过程事件不渲染,
改取响应式代理对象。
## 10. 增补:安全基线(D11T30,Mimosa 深度扫描驱动)
- **决策 D11(默认最小暴露面)**:
- **路径参数 ID 白名单**`/runs|/agent|/agent/sessions` 的路径参数只允许
`[a-zA-Z0-9_-]{1,64}`(系统生成 ID 的字符集),非法一律 404——杀灭 Windows
反斜杠穿越变体(如 `/runs/x/artifacts/..%5C..%5C..%5C.env` 直读 .env)。
- **工件双重关押**:artifacts 端点解析后必须仍在 artifacts 目录内;pipeline
`_save_artifact`/`_read_artifact` 对模型输出的工件名消毒(剥路径成分)。
- **下载关押**`/llama/download` 的 dest 解析后必须位于 models/ 内;URL 协议
白名单 http/https 在 HF 别名转换**之前**判定(防 file:/// 被拼成 HF 地址)。
- **密钥打码**GET /config 的 architect.api_key 只回前 6 位 + api_key_set
PUT 空串/缺省=保留原值(对齐 D2 池条目语义,前端"已设置,留空保留")。
- **Web 信任围栏**TrustedHostMiddleware 默认只信 localhost/127.0.0.1/[::1]
GATEWAY_TRUSTED_HOSTS 可覆盖,"*"=放行全部),防 DNS rebinding 打到本网关;
api.py `__main__` 默认绑定 127.0.0.1scripts/serve.py 本就如此)。
- **独立命令拦截**run_command 危险模式黑名单(format / rd /s / rm -rf / /
shutdown / curl|sh 等)先于审批独立拦截;shell 经显式 `"%COMSPEC%" /c` /
`/bin/sh -c` 执行(语义同 shell=True,但解释器路径受控)。
- **CSPRNG**review 抽样缺省随机源改 random.SystemRandom。
## 11. 增补:dsh 功能对齐(D12T31)
- **决策 D12(对齐 deepseek-harness 的健壮性功能)**
- **重试退避**OpenAICompatChat 非流式路径(含流式失败回退)对传输错误/
408/429/5xx 指数退避重试(max_retries=2、retry_delay_s=1.0);4xx 不重试。
- **web_fetch 工具**:抓公网 http/https 文本,dsh web_fetch 同款 SSRF 防护——
DNS 解析后拒绝私网/环回/链路本地/保留/NAT64 地址;512KB/15s/12k 字符上限、
二进制嗅探拒绝;受 `agent.allow_net` 开关(默认开),归入只读工具集。
- **原子写入**write_file/edit_file 走同目录临时文件 + os.replaceWindows
EPERM 退避一次后降级直写),防崩溃留半截文件。
- **慢工具线程卸载**run_command/web_fetch/search_files 在独立守护线程执行
asyncio.sleep 轮询等完成——补丁版 TestClient 的每请求独立事件循环不推进
run_in_executor 桥接,轮询在生产/测试两端都可靠),快工具保持内联。
- **search 修剪**os.walk 修剪依赖/构建目录(替代 rglob 全量物化),不跟随
符号链接目录,限量行为不变。
- **重复调用提醒**:同工具同参数第 3 次起在回喂结果附系统提示 + repeat_warning
事件(防模型原地打转,dsh repeat-tool-reminder 同款)。
- **会话重命名**`PATCH /agent/sessions/{sid}` + 前端会话列表 ✎ 按钮。
- **D10 收尾修复**_stream_partial 每次流式调用前复位(防上次成功置位导致
本次失败误抛而不回退)。