mock 模式下 GET /api/tasks/<id>/side-questions 无路由,被读兜底当集合返回 [],data.items 为 undefined,旁路 hook 的 merge() 迭代抛 TypeError: t is not iterable,异常在 setState updater 中经 render 重抛、catch 接不住,整页被错误 边界接管。mock handler 显式返回空旁路历史,sideAPI.history 同时归一化返回值。
614 lines
52 KiB
Markdown
614 lines
52 KiB
Markdown
# 更新日志
|
||
|
||
本项目的重要变更记录在此文件中,格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
|
||
|
||
## [Unreleased]
|
||
|
||
### Web
|
||
|
||
#### 修复的问题
|
||
|
||
- **修复 demo 任务详情页整页崩溃**:mock 模式下任务详情「会话」标签会去拉 `GET /api/tasks/<id>/side-questions`(旁路提问历史),但 mock handler 没有这条路由,被读兜底按“路径以 s 结尾即集合”返回了 `[]`,导致 `data.items` 为 `undefined`,旁路 hook 的 `merge()` 对其迭代抛 `TypeError: t is not iterable`;该异常发生在 `setItems` 的 updater 里、被 React 推迟到 render 阶段重抛,调用方 `catch` 接不住,整页被错误边界接管显示 “This page couldn't load”。现在 mock handler 显式返回空的旁路历史,`sideAPI.history` 也对返回值做归一化(`items` 非数组一律兜成 `[]`)作为防御纵深。
|
||
|
||
## [0.3.10] - 2026-09-13
|
||
|
||
### 网络
|
||
|
||
#### 新增的功能
|
||
|
||
- **网络搜索新增 DeepSeek 官方来源**:直接复用当前激活的 LLM 配置。它与其余三个来源性质不同——DeepSeek 没有可直接调用的搜索接口,搜索只存在于其 Anthropic 兼容接口内部(`web_search_20250305` 服务端工具),由 DeepSeek 服务端执行。因此它**仅支持 DeepSeek 官方端点 + anthropic 协议**(OpenAI 协议端点会直接拒绝服务端工具),且每次搜索会**额外消耗一次模型调用**、请求**不经过搜索出口代理**、也**不计入流量留痕**,返回结果**只有标题与链接**(无摘要,需正文时由 WebFetch 抓取)。设置页说明上述限制但**不做校验拦截**,是否满足由用户自行确认,可用「测试搜索」按钮实跑一次验证。
|
||
|
||
### Agent
|
||
|
||
#### 新增的功能
|
||
|
||
- **worker 获得跨 work 回看能力**:新增 `search_all_worker_traces`(不必先知道 intent_id,按关键字在本任务所有 work 的执行过程里全局检索命中步骤)与 `get_worker_trace`(锁定某条 work 后列步骤流、就地按关键字搜、按 step_id 取完整内容),用于复用别的 work 见过却没写进 fact 的观察、避免重复劳动。
|
||
- **`node_detail` 下放给 worker**:配合上面的回看工具,worker 拿到 intent_id / 节点 id 后可直接查该节点的完整详情。
|
||
- **`add_hint` 触发的规划轮会被显式播报**:此前新增提示只把 hint 折进态势总览、让规划者自己发现;现在一次 `add_hint` 会给规划者记一条「人新增了 N 条战略提示:…」触发(批量算一条,不逐条刷屏),规划者被明确告知“本轮由新增 hint 触发”并直接看到提示内容。
|
||
|
||
#### 修改的功能
|
||
|
||
- **全局态势提示改为“松绑”口吻**:鼓励探索发散、跨意图线索及时上报,而非过早收敛。
|
||
- **精简 worker 边界措辞**:初次受阻不代表探透,聚焦“把本意图内的绕过手段走完再下结论”。
|
||
- `insert_assets` 移除每条资产的 `related` 入参:它唯一的作用是决定要不要把这条资产加进本任务范围,值又不落库(同一资产被再次登记就作废、界面上也看不出谁被判为无关),实际只是让模型多做一次留不住的判断。
|
||
- **测试范围(`task_scope`)不再受资产覆盖度开关影响**:`insert_assets` 的自动入范围(`source='auto'`)无论覆盖度开启与否都执行,`add_task_scope` 也始终提供给 planner / 任务内主 Agent / 目标拆解 Agent。范围是任务的授权边界、资产查询的过滤基准,覆盖度开关只决定要不要拿它当分母算指标,不该决定要不要累积范围本身。此前关闭覆盖度会让 `auto`/`agent` 两条写入路径同时失效,`task_scope` 只剩界面手工添加的行。`list_untested_assets` 仍随覆盖度关闭而隐藏(它本身就是纯覆盖度视角)。
|
||
|
||
#### 修复的问题
|
||
|
||
- **修复任务间资产互串**(#59):`list_assets` 此前把任务 id 写死为 0、裸查整个共享资产库,模型又无从写出范围过滤条件,于是把别的任务的资产(尤其 IP)当成本任务目标,测试方向被带偏。现在它只返回落在【本任务及直接关联任务】测试范围(`task_scope`)内的资产,按**归属**匹配而非字面值:范围里有某根域即可查到其名下全部子域/服务/接口,有某网段即可查到段内主机及服务;按 id 直取范围外资产同样取不到。非任务上下文(Auto/pentest)无范围可依,仍回退全库。顺带修复 IP 直连主机(如 `http://1.2.3.4/api`)无法被网段范围命中的归属盲区。UI 的「测试资产」视图(按任务生产者过滤)不受影响。
|
||
- **修复 worker 跨 work 回看工具被误删**:`search_all_worker_traces` / `get_worker_trace`(以及 `node_detail`)加进 worker 默认工具集后,被一段“收敛 worker 工具面”的旧迁移在启动时又解绑掉,导致 worker 实际拿不到这些工具。已把它们移出该解绑清单,并对已跑过旧迁移的库一次性补绑回 worker。
|
||
- **修复 `/btw` 旁路提问偶发入库失败**:side_question checkpoint 落库前剥除 JSONB 不支持的 NUL(` |