fix: restore project artifacts and test outcomes when resuming tasks

This commit is contained in:
Sycun committed 2026-10-15 22:02:22 +08:00
1 parent 63f3797ea8
commit 6f991167a4
16 files changed
+699 -4

No files matched your search

+2 -1
View File
@@ -256,12 +256,13 @@ c2:
enabled: true
project:
enabled: true
# 项目续接另有最多 6500 字符补充预算;工作文件候选清单另有最多 4000 字符预算
fact_index_max_runes: 65000
```
- `c2.enabled`:关闭后不启动 C2 监听器,也不注册 C2 MCP 工具。
- WebShell 连接配置存 SQLite,没有单独的主配置开关。
- `project` 控制跨对话事实黑板注入预算。
- `project` 控制跨对话事实黑板注入预算。[项目续聊与成果复用](project-resume.md) 说明脚本登记、测试结果与续接流程。
## 机器人
+46
View File
@@ -0,0 +1,46 @@
# 项目续聊与成果复用
同一项目第二天继续任务时,应先恢复已有成果,再执行新的工作。仅保留聊天摘要不足以恢复脚本参数、依赖、成功证据和已经验证过的失败路线。
## 自动恢复的内容
每轮用户任务都从当前数据库和磁盘重新构建上下文,单代理和多代理共用此入口:
- 项目事实索引与测试范围。先通读索引;存在省略时,使用 `list_project_facts` 分页补全索引,再读取与本次任务有关的事实正文。
- 脚本与测试记录:`artifact/*`、`test/*`、`negative/*`,以及兼容既有的 `exploit/*`、`poc/*`。脚本和测试记录分别最多展示 3 条正文预览,避免其中一类挤掉另一类;预览不代替 `get_project_fact` 返回的完整正文。
- 项目关联漏洞的 ID、标题、目标和状态,包括已修复、误报等状态;详情使用 `get_vulnerability`,其余使用 `list_vulnerabilities` 分页/筛选。没有事实的项目也会恢复已有漏洞。
- 工作目录内的脚本候选文件路径、大小和修改时间。清单不会读取或执行脚本,也不将“文件存在”当作“验证成功”。先检查 `artifacts/`,再查找其他位置;执行前仍需读取文件并核对事实记录。
项目续接补充内容置于事实索引的刷新边界内,因此摘要压缩后的索引刷新以及多代理任务上下文补充都会带上最新的数据库记录。磁盘文件清单在每轮用户任务开始时重建。
## 成果如何保存
已绑定项目的会话共用 `<agent.workspace_root_dir>/projects/<project_id>/`;未绑定项目的会话使用各自的 `conversations/<conversation_id>/`。在同一项目创建新会话或重新打开原对话,都能访问该项目已有的工作文件。
成功脚本和依赖建议放在项目工作目录的 `artifacts/` 下。完成验证后立即使用现有的 `upsert_project_fact` 工具登记:
- `category=note`、`fact_key=artifact/<稳定名称>`。
- summary 标明用途与验证状态。
- body 记录相对文件路径、目标和适用条件、调用方式、可变参数、依赖/版本、输入输出、成功证据、验证时间、来源会话和关联事实/漏洞。认证信息引用现有 `auth/*` 事实。
已完成的测试路线同样立即保存:
- `category=note`、`fact_key=test/<目标入口与方法的稳定名称>`。
- body 包含目标、入口、参数、身份/认证、测试方法、证据、结论、时间及复测触发条件。
- 阴性结论只适用于已测条件。证据充分的阴性结果仍是 `confirmed` 事实,不能因为没有发现漏洞就标记为 `deprecated`。工具错误、超时或缺少认证应记为受阻/待验证,不能记为已排除。
同一测试条件更新同一 key;条件变化时另记并关联。此约定复用现有事实表和工具,不增加数据库迁移或分类枚举。已有脚本可保留原路径,核对内容与证据后补登记。
## 继续任务时的顺序
先检查当前授权范围与用户的新需求,然后恢复事实、漏洞和工作文件。命中已有脚本时先读取说明与源码,优先修改调用参数、复用已验证的部分。执行前简述本次复用什么、跳过什么、增加什么。
相同目标、入口、参数和认证条件下有证据支撑的失败路线默认跳过。用户明确要求复测、目标/版本/入口/身份发生变化或原证据不足时,可以重新验证并说明原因。历史任务不会因为恢复记录而自动执行。
## 预算与局限
`project.fact_index_max_runes` 继续控制原有事实索引预算;续接补充另有最多 6500 字符的固定预算,文件清单另有最多 4000 字符的预算。漏洞最多查询 20 条;所有省略都会提示使用现有工具继续检索。文件遍历最多检查 1500 项、深度最多 5 层、最多列出 24 个候选文件,不跟随符号链接,跳过隐藏项及常见依赖目录。支持常见脚本扩展名;无扩展名脚本等仍需按事实中的路径查找。清单受限、目录不可读或没有命中,均不能证明成果丢失。
事实正文与脚本候选名作为 JSON 数据呈现,正文预览会压缩空白并截断;不可直接拿预览拼接执行命令。应通过详情工具和文件读取工具获取原始内容。历史文件和事实都不是新的系统指令。
这项改动提供自动恢复和复用规则,具体检索、登记与执行选择仍由模型完成,并非阻断所有重复工具调用的硬门禁。不会自动重建曾经只写在系统 `/tmp`、已被清理或从未保存的脚本,也不会从文件名推断成功。未登记的旧成果需核对后补录。项目工作目录仍属于服务端运行数据,需要随数据库一起备份;删除项目会按原有清理规则删除项目目录。