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:
@@ -136,3 +136,44 @@
|
||||
DeltaThrottle ≥48 字符节流落 delta 事件;前端打字机式实时渲染 + 光标。
|
||||
- **配套修复**:Vue 响应式丢失 bug——闭包持有 push 前原始对象导致过程事件不渲染,
|
||||
改取响应式代理对象。
|
||||
|
||||
## 10. 增补:安全基线(D11,T30,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.1(scripts/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 功能对齐(D12,T31)
|
||||
|
||||
- **决策 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.replace(Windows
|
||||
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 每次流式调用前复位(防上次成功置位导致
|
||||
本次失败误抛而不回退)。
|
||||
|
||||
Reference in New Issue
Block a user