Files
ARTEX/CHANGELOG.md
T
榆木 25b6018818 fix(llm): 一次性 LLM 调用补挂 session id,让自定义会话头真正生效 (#175)
自定义会话头(profile 的 session_header_key)的头值取自请求 context 上的
session id,而该 id 由 agentcore 仅在挂载 transcript store 时才写入 context
(agentcore.Prompt 中 `if s.writer != nil` 那一行)。

目标拆解(第 0 轮,DecomposeGoalsWithProvider)与冷节点压缩(§4 body 调用)
都是不挂 store 的一次性调用,context 上没有 session id,quotaAwareTransport
因此跳过该头。对 opencode zen 这类「缺 x-opencode-session 直接 400
MissingSessionID」的端点,表现为「第 0 轮目标拆解 400 失败、后续 planner
轮次却完全正常」;压缩失败则只留一行日志,极难关联到本设置。

改为在这两条路径显式挂上按探索稳定的 session id(exp<N>-goals /
exp<N>-compactor),与旁路问答、连接测试已有的做法一致。附带修好用量归因:
这两个 id 能被 llmrec.parseSession 正确解析,此前这两条路径的 token 完全
记不进 llm_usage。
2026-09-29 18:21:30 +08:00

806 lines
64 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 更新日志
本项目的重要变更记录在此文件中,格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
## [Unreleased]
### LLM
#### 修复的问题
- **修复自定义会话头在「一次性 LLM 调用」路径上不生效**:会话头的头值取自请求 context 上的 session id,而该 id 由 agentcore 仅在挂载了 transcript store 时才写入 context。目标拆解(第 0 轮)与冷节点压缩(§4 body 调用)都是不挂 store 的一次性调用,context 上没有 session id,网关侧读不到该头——对 opencode zen 这类「缺 `x-opencode-session` 直接 400 MissingSessionID」的端点,表现为「第 0 轮目标拆解 400 失败、后续 planner 轮次却完全正常」,且压缩失败只留一行日志、极难关联。现为这两条路径显式挂上按探索稳定的 session id(`exp<N>-goals` / `exp<N>-compactor`):既能正常带上该头,也让 llmrec 能把这两条路径的 token 用量正确归因到对应探索(此前完全记不到)。
## [0.3.14] - 2026-09-24
### 任务列表
#### 新增的功能
- **任务列表新增「漏洞」列**:按严重度分档显示 严 / 高 / 中 / 低 的数量,非零档位按严重度着色,一眼看清每个任务的漏洞规模与分布。
#### 修改的功能
- **「描述 / 目标」两列宽度收窄**:超长内容省略显示,鼠标悬浮可查看全文,减少长文本挤占列表横向空间。
### 探索图与规划态势概览
#### 修改的功能
- **精简规划态势概览(graph_overview)并为各列表设定数量上限**:最近事实、已结束意图、待办意图、冷区摘要与确认漏洞明细均改为「最新一窗 + 计数兜底」,未展示的可按需查询;显著降低每轮 LLM 上下文体积、避免长任务上下文膨胀(关联任务概览的冷区一并限流)。
#### 修复的问题
- **折叠冷节点后消除探索图中 digest 与 finding 之间的反向重复边**。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
## [0.3.13] - 2026-09-19
### 资产拦截
#### 新增的功能
- **新增全局资产拦截规则(黑名单)**:支持录入全等与模糊匹配的域名 / IP / URL 以及 CIDR 网段,提供规则的增删改查与启用/停用,管理页位于「系统 → 资产拦截」;默认内置模糊拦截政府(`.gov` / `.gov.cn`)与教育(`.edu` / `.edu.cn`)网站。
- **资产拦截接入执行链**:Agent 在下发意图(`add_intent`)与插入资产(`insert_assets`)前先对目标资产做拦截判定——命中拦截的意图不下发、命中拦截的资产不插入,并向 Agent 返回资产信息与拦截原因。
- **新增任务级拦截 / 允许(白名单)规则**:独立于全局规则、仅对本任务生效,判定顺序为「先拦截后允许」——命中拦截即禁止;未命中拦截但本任务配置了允许规则且都不命中,则「不允许测试」;未配置允许规则时不启用白名单。可在创建任务时录入,也可在任务详情「总览」中增删改与启用/停用。
- **任务模板支持预设分类与任务级拦截/允许规则**:模板可保存任务分类与一组任务级规则,应用模板时一并带入新任务表单。
### 操作审查
#### 修复的问题
- **收紧模型裁判输出协议,减少截断导致的误放行**:将裁决说明(comment)上限由 500 汉字下调至 120 汉字并强制「只输出 JSON、不带前言或代码块」,避免裁决被 `MaxTokens` 截断后无法解析、进而按模型失败策略放行(fail-open)。
### 任务归档
#### 修复的问题
- **归档遇到符号链接时跳过而非整包失败**:归档格式端到端仅支持普通文件与目录,此前工作目录中出现任意符号链接都会导致整个任务归档失败;现改为跳过该符号链接并记录日志,其余文件正常归档(不跟随链接、不越出目录树)。
### 账户与合规
#### 新增的功能
- **登录前新增「使用须知与免责声明」弹窗**:需勾选同意后方可登录。
### 许可与依赖
#### 修改的功能
- **项目采用 AGPL-3.0 开源协议**,并完善 README 的许可与免责声明说明。
- **升级 norma 至 v0.4.1**。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
## [0.3.12] - 2026-09-17
### 探索链路播报板
#### 新增的功能
- **任务详情页新增「探索链路播报板」**(#144):以时间轴流水视角呈现任务的探索节点(起点/目标/意图/事实/漏洞/提示/压缩),支持按类型筛选、关键字搜索、正序/倒序、分页与自动刷新;处于「最新在前的第一页」时为直播位、每轮刷新,离开该位时只累计未读计数、不打扰当前阅读,并以「N 条新播报 · 回到最新」一键返回。按天分组,长任务翻页也能认出「这是哪天的事」。
- **播报板每行显示节点 id**(#145),便于对照探索链路图与定位具体节点。
- **播报板节点详情展开显示上下游与锚定资产**(#147):展开一条播报可见该节点的上游(由此而来)/下游(由此产生)关系,鼠标悬停关联条目弹出对应节点的名片(类型/状态/来源/时间/摘要/payload 片段);并顺带列出该节点锚定的资产(类型标签 + 可辨识文本)。相关数据随播报页一并下发,展开不额外发请求。
- **播报板搜索支持按节点 id 筛选**(#150):搜索框在「内容 / 来源」之外新增节点 id 匹配,输入纯数字或界面展示的「#41」形式即可精确定位对应节点。
### 意图管理
#### 新增的功能
- **意图删除支持「假删除 / 真删除」两种模式**(#149):待领、运行中、已暂停的意图均可删除,删除需填写原因;删除模式在确认弹窗中选择。
- **假删除(默认)**:意图置为「已删除」并把原因记入独立字段,保留意图节点与其全部产出、血缘。
- **真删除**:物理移除该意图,以及「仅由它支撑」的独占子孙节点(沿产出 / 意图链级联到叶子),避免留下孤立数据;被删意图的 Token 计量按原始日期归档保留;共享节点(还被其它意图引用)、目标与任务根事实一律保留,真删除弹窗会展示预计级联影响的节点数。
两种模式都会通知规划者「该意图由用户删除 + 原因」并据此重新规划。
### 操作审查
#### 新增的功能
- **审批记录支持按状态与判定来源筛选**(#139):可按审批状态、判定来源过滤审批记录,快速定位目标记录。
#### 修复的问题
- **待处理审批请求独立于历史分页加载**(#133):待处理请求不再受历史列表分页影响,翻阅历史记录时仍完整可见。
### Agent
#### 修改的功能
- **Worker 角色描述改为通用网络安全平台表述**(#138)。
#### 修复的问题
- **修复冷节点压缩从不触发**:给按任务运行的规划器接上 Compactor,冷节点压缩(cold-digest)此前因未接入而从不执行,现已恢复。
### 聊天
#### 新增的功能
- **聊天支持多类型记录的 @ 引用及滚动分页**(#135):可在聊天中 @ 引用多种类型的记录,引用候选支持滚动分页加载。
#### 修复的问题
- **长消息气泡约束在会话面板内**(#137):过长的消息气泡不再溢出会话区域。
- **修复新对话未创建时上传文件报「缺少上传文件」**:Composer 的文件选择在清空 input 之前先把 `FileList` 快照为数组再回调;此前草稿态需先异步创建会话,恢复执行时与 input 活绑定的 `FileList` 已被清空,导致上传缺少文件字段、后端返回 400。
### 流量
#### 修复的问题
- **流量录制代理默认只监听 127.0.0.1**(#129、#130):避免默认配置下开放代理暴露在其它网络接口。
### Web
#### 修复的问题
- **修复静态导出版任务列表页丢失全局头部**。
- **补齐 demo 漏洞详情页关联流量 mock,修复白屏**。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@RuoJi6](https://github.com/RuoJi6)
- [@dingpotian](https://github.com/dingpotian)
## [0.3.11] - 2026-09-15
### 操作审查
#### 新增的功能
- **审批记录支持来源定位**(#125):点审批记录的「来源」可跳回触发该次审批的那一次工具执行——打开原始完整会话、自动分页加载到目标位置、就地展开命令与结果并在滚动区居中高亮,前后消息保持可读;用户手动滚动时停止自动校正。跨普通对话、任务 Worker、规划器与主 Agent 分段会话,均通过持久化的 `tool_use_id` 与任务映射精确定位(新增作用域内调用 ID 索引),缺失、重复或关联不明确时显式提示而非跳到其他执行。会话被删除或任务归档/记录缺失时给出明确提示。
- **审批记录支持翻页**(#115)。
#### 修改的功能
- **精简模型审查输入**(#124、#125):模型审查(规则未命中后的 LLM 裁判)输入收敛为「当前这一次完整工具调用 + 明确选定的简短背景 + 本机工作目录」的版本化 JSON。背景只取真实用户消息(聊天/任务主 Agent 的当前用户消息),Worker 不再附带意图摘要、也清除从上级 Agent 继承的背景;规划器与自动触发会话不补造用户消息。不再附带任务描述、目标、操作约束、全局探索态势、历史调用或 Worker 完整意图——这些仍按原逻辑用于 Agent 执行与独立会话审计,只是不进入操作审查。所有裁决要求输出 JSON 的 `decision`/`comment`,说明必须包含「实际操作、成功后的后果、命中规则」;参数或背景中的指令不能改变审查策略。保存实际发送给模型的输入快照及指纹,旧版快照保留并标注版本,不用当前数据补造旧输入。
#### 修复的问题
- **模型裁决被代码块包裹时不再静默放行**(#126):模型返回的裁决 JSON 若被 ``` 代码块包裹,此前解析失败会经模型失败策略被静默放行;现在先剥离代码块围栏再解析,解析仍失败才按已配置的失败策略处理。
### Agent
#### 新增的功能
- **新增实验性 noa 上下文压缩**(norma 升级至 v0.4.0):系统设置中可开启的实验功能,默认关闭。开启后由 noa(模型驱动的上下文压缩)接管主 Agent、规划器、Worker、聊天四类 Agent 的上下文压缩,替代内置压缩;压缩原文持久化归档,集中落在 `<workDir>/noa/<会话ID>/` 下(不分散在各任务目录内),按会话 ID 全局唯一分目录。接入失败自动回退内置压缩,不中断真实任务;开关每次运行读取一次,切换只影响之后启动的运行。
#### 修复的问题
- **探索图工具在无任务上下文时拒绝而非 nil 崩溃**:非任务上下文调用探索图相关工具时返回明确错误,不再因空存储解引用崩溃。
### MCP
#### 新增的功能
- **支持旧版 SSE MCP 服务**(#117):兼容仅提供旧式 SSE 传输的 MCP 服务端。
### 流量
#### 修复的问题
- **流量检索按端口感知匹配记录的主机**(#114):`traffic_search` 的主机匹配纳入端口,避免不同端口的同主机记录相互串扰。
- **`traffic_search` 描述迁移出错不再中断后续 reporter 迁移**:单条迁移失败被隔离,不影响后续迁移执行。
### Web
#### 修改的功能
- **任务复测漏洞选项增加分割线**(#122):复测漏洞选择项之间增加分隔,视觉更清晰。
#### 修复的问题
- **修复 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` 非数组一律兜成 `[]`)作为防御纵深。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@RuoJi6](https://github.com/RuoJi6)
## [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(`\u0000`) 转义,避免含该字符的内容写入报错。
### 触发器
#### 修复的问题
- **合并触发会话按任务去重任务描述/目标**:多任务合并触发时,同一任务的任务描述/目标不再重复拼进消息,避免长目标反复堆叠把上下文撑爆。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
## [0.3.9] - 2026-09-11
### Agent
#### 新增的功能
- 任务内主 Agent 支持**多会话**:可新建、切换、独立重置上下文,每个会话都能交互。
- 支持持久化的 `/btw` **旁路提问**:不打断主线追问,问答落库,重启后仍在。
- `spawn_task` 新增 `source_task_ids`,新任务可**只读继承**来源任务的资产与发现。
#### 修改的功能
- 关闭 worker 的跨 engagement 记忆并收敛其默认工具面:读上下文、跨 work 复盘属规划职责,worker 只管单条意图的执行与写回。
- 精简 worker 默认提示词;`get_worker_output` 移除 `terminated` 与 `worker_name` 字段;精简 `insert_assets` / `list_assets` 的描述。
#### 修复的问题
- 修复 work 因**空转回合**提前中断的问题:模型有时会用一整轮只输出思考,既不给正文也不调工具,此时 harness 看到的是一次自然结束(`end_turn` 且无 `tool_use`),直接以 `completed` + 空总结收场——一条还没做完的意图就断在半路,表现为「任务正常结束但没有任何文字总结」。五层 LLM 重试一层都够不着它:它不是错误,同 provider 安全窗口重试的入口是"流失败",熔断在 `err == nil` 时直接判成功,意图重跑只认 `model_error`;SDK 的空响应重试也够不着,因为那层以"有没有 yield 过事件"判空,而思考增量本身就是事件。现在 work 的 Stop 钩子会识别这种回合并注入一条续跑指令,让模型带着已经产出的思考继续执行下一步——刻意不选"原样重发",因为这类空转通常由提示词与上下文形状决定,是稳定行为而非随机抽风,重发只会让模型再想一遍。
- 次数复用 LLM 页「重试与退避」里的**空响应重试次数**(两者都在回答"模型完成了却没产出实质内容",只是判据与手段不同),默认 2 次,填 `-1` 即关掉、退回原先"空转即收场"的行为。它是一条意图的**总量**上限而非连续次数:harness 自身已限死连续空转只推一次,只有真正发生过工具回合配额才刷新,所以这个数挡的是「工具 → 空转 → 推 → 工具 → 空转」这类循环把意图预算耗光。触发时日志记 `[work <worker> · #<意图>] 空转回合…注入续跑指令 (n/N)`。设计见 `docs/LLM重试设计.md` §1.1。
- 修复长对话下 `/btw` 的上下文预算与输入布局;非安全上下文(非 HTTPS 访问)降级生成旁路请求 ID。
### 流量
#### 新增的功能
- 漏洞支持**关联多条流量证据**,可排序、加备注、按角色区分(请求/响应/佐证)。
- 报告 Agent 会在写报告前**自动关联**相关流量证据。
- 新增 Agent **流量绑定开关**,并补齐证据在 Agent 之间的交接。
### 任务
#### 新增的功能
- 支持**会话级漏洞复测**:复测跑在独立 Agent 会话里,列表与详情显示运行状态。
### 拦截
#### 新增的功能
- 审批记录新增**详情与执行审计**:可查看工具请求上下文、模型/规则初判、执行输出与参数指纹。
### 资产
#### 新增的功能
- 任务测试资产支持 **DSL 搜索**。
### LLM
#### 修复的问题
- 修复测试连接未补发自定义会话头,导致 opencode zen 返回 400 的问题。
### 网络
#### 新增的功能
- MCP 的 HTTP 传输支持**跳过 TLS 证书校验**,便于接入自签证书的服务。
### UI
#### 新增的功能
- 会话列表按 Agent 分组,支持展开收起与独立置顶;对话支持按 Agent 筛选。
- 攻击链路图渲染压缩(digest)节点,并收缩其成员。
#### 修复的问题
- 修复登录凭据不同步导致的白屏。
- 拦截提示文案改为明确标示「平台管控」,避免被误读成目标侧的防御。
### 部署与更新
#### 新增的功能
- 支持**页面一键更新**:系统配置页新增「版本与更新」卡片,顶栏在有新版时亮出提示。流程为下载发布包 → 校验 `SHA256SUMS` → 冒烟测试 → 暂存 → 退出由守护脚本重新拉起完成换装,页面自动刷新。
- 新增守护启动脚本 `start.sh` / `start.bat` 作为正式启动入口(发布包与 Docker 镜像均已带上,`install.sh` 不变),按退出码决定是否重新拉起,并负责把 SIGTERM 转发给 artex。校验与换装逻辑都在 Go 里,脚本保持傻瓜化。
- 失败自动兜底:校验或冒烟不通过就丢弃、继续跑当前版本;新版连续 3 次启动失败则回滚上一版本。设置页另有手动回滚(注意数据库结构不会回退)。
- 更新只认 GitHub 域名且强制 HTTPS,发布源不可配置;开发构建禁用一键更新。GitHub 查询结果缓存 30 分钟,避免顶栏提示耗尽 API 配额。
#### 已知限制
- Docker 下只换程序、不换镜像:工具链不会跟着升级,且重建容器会退回镜像自带版本,需要时仍用 `docker compose pull artex`。
- 不同步发布包里的 `skills/`,新版新增的内置 skill 不会自动生效。
- 更新即重启,会中断正在运行的任务。
### 依赖
#### 修改的功能
- 升级 norma 至 v0.3.7。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@RuoJi6](https://github.com/RuoJi6)
## [0.3.8] - 2026-09-09
### LLM
#### 新增的功能
- LLM 页新增「重试与退避」标签页:五层重试的**次数**与**间隔**都可以配。一次模型调用的失败由内到外经过建连重试(SDK,流开始前的连接重置 / 超时 / 429 / 5xx)、空响应重试(SDK,正常结束却没有任何内容,仅 openai 格式)、同 provider 安全窗口重试(未向调用方交付任何输出前的断流重放)、轮询熔断(连续失败到阈值就冷却跳过)、意图重跑(worker 以 model_error 收场后整条意图重跑)五层,内层用尽才轮到外层。每层两个旋钮,语义统一:留空 = 用原本的默认次数与指数退避;填次数就用该次数;填间隔就把指数退避换成固定间隔;填 -1 = 关掉这层重试。前三层跟着端点走,可在每个模型配置里逐字段覆盖全局默认(只钉间隔的仍继承全局次数);熔断与意图重跑是进程级语义,只有全局一份。保存后热生效,不需要重启。全部留空即当前行为,旧库升级后逐字节不变(新列默认 0、settings 键不存在即全默认)。连接测试刻意不带这些参数——它有 30s 硬超时,叠上用户配的重试只会把能用的端点测成超时失败。设计见 `docs/LLM重试设计.md`。
- 每个 LLM 配置支持自定义**会话头**(`session_header_key`):非空时每次 LLM 请求都会带上该 HTTP 头,头值为当前运行的 session id(chat 会话为 `conv-<id>`、worker 为 `exp<x>-worker-i<intent>` 等),用于某些按 session-id 头做提示缓存 / 粘性路由的网关。实现上从请求 context 里读取 session id 注入,无需改 norma,同一共享 provider 也能按会话发出不同头值。旧库带迁移,前端 LLM 配置弹窗新增输入框。
#### 修复的问题
- 修复保存 LLM 配置时因会话头字段为空直接报 `23502` 的问题:该列是 `NOT NULL DEFAULT ''`,此前误套 `NULLIF($n,'')` 把未填写的会话头写成 NULL 触发非空约束,现按空串语义直接传参。
### Agent
#### 新增的功能
- 墙钟超时改为**就地收尾**:依赖 norma v0.3.6,`MaxDuration` 到点会打断正在跑的工具并在活 ctx 上按收尾轮数续跑(写回已识别内容 + 总结,终态为 timeout),不再依赖 worker/planner 各自的 `maxDur+90s` 外部硬 ctx 把卡住的 run 直接杀成 `aborted_tools`。chat 走同一 harness 自动获得同样行为,mainagent 无 `MaxDuration` 不受影响。
- 停摆兜底:planner 在心跳 / 无变动唤醒且全图已无任何 open 或 running 意图时,开场白改为停摆告警,明确告知无 worker 在跑、无排队方向,本轮必须产出一个或多个互不重复的新意图(不得产出 0 意图)。
#### 修改的功能
- worker 提示词重构:意图 / 启动指令 / 锚定资产原始 JSON 移入 system prompt,每轮重拼、绝不被 compaction 压掉,续跑也不依赖 transcript 首消息留存;启动 user 消息瘦身为仅全局态势 overview(可降级、容忍 stale)。代价是 system 混入 per-intent 数据、失去跨意图缓存复用,是「不丢意图」的刻意取舍。
- 精简 planner / worker 默认正文并修正若干实战问题:planner 对 `recent_done` 按状态区分(blocked/exhausted 先查 trace 再决定,不当死路也不无脑重跑)、否定结论改为「观察 / 存疑、非定论」且采信前看 evidence、目标未达成且无 open/running 意图必须产出(硬底线)、深度优先于覆盖度;worker 否定类结论只写「观察 + 试探性读法」、判决权归 planner,跨意图线索写进 fact 的 summary 交规划者、不自己追。reseed 会把新默认作为新版本追加并切过去,用户自定义 / 旧版本保留在历史可回滚。
- 收敛 work agent 默认工具集与资产写回提示:worker 只负责单条意图的执行与写回,读上下文 / 跨 work 复盘属规划职责,故从其默认工具移除 `list_facts` / `node_detail` / `list_companies` 及跨 work 检索(`search_all_worker_traces` / `list_worker_traces` / `get_worker_trace`),只留 `list_findings`(报漏洞前查重)+ `add_finding` / `record_fact` + `insert_assets` / `list_assets`;提示词删掉与 `insert_assets` schema 冲突的陈旧字段说明(`type=tech`/`on_url`/`props`)。旧库带一次性迁移剥离对应绑定,planner/main 的同名绑定不动。
### 探索图
#### 新增的功能
- **探索图冷节点压缩(cold-digest)**:把老且长期不活跃的意图 / 事实折叠成 digest 节点在 `graph_overview` 里展示,原始节点永久保留、按 id 可完整还原(存储无损、只压呈现、折叠可逆)。冷热判定按逆向可达 + 任一活分支即热,配 R=6 轮防抖与连通分量分组;后台压缩(minor 折未覆盖冷块、major 回源重压合并碎片)带活跃度复核与冷却互斥,绝不上热路径也绝不覆盖已复活节点。概览侧提供 `cold_digests` 与按资产索引的 `cold_index`,`expand_digest` / `expand_index` 负责还原。关联 / 继承任务的概览同样复用其自身折叠视图,`expand_digest` 支持跨任务只读还原。`expand_digest` / `expand_index` 只给 planner 与 main agent,不给 worker。均带旧库迁移。
- `graph_overview` 全量输出 `finding_list`:findings 是任务最高价值产物且单任务通常不多,改为在概览里全量带出(不像 facts 只给最近窗口),planner/worker 每轮即可一眼看全所有确认漏洞,无需再调 `list_findings`。每条精简为 `{id, summary, evidence?, from_intent?, assets?}`,其中受影响资产直接给可读内容(url / 域名 / ip:port)而非裸 id。
#### 修改的功能
- `graph_overview` 不再平铺 `hosts`:coverage 块移除 host 列表(大范围任务里每轮最多携带 500 个 host 字符串,对规划决策价值有限),只保留 `host_count`,具体主机按需 `list_assets` 查。新增顶层 `done_intents_total`(已结束意图总数),与被截断到 ≤15 的 `recent_done_intents` 平行,让 planner 去重时知道有无被截。
### 工具
#### 修改的功能
- `add_company_scope` 默认绑定由 worker 改为 planner:定义企业资产范围属规划 / 主控 / Auto 的职责,worker 只执行探索。新库 seed 默认绑定为 mainagent/planner/auto,老库带一次性迁移。
- planner 默认绑定 `list_assets`:现同时具备 `list_assets`(DSL 全库检索)与 `list_untested_assets`(范围内未测),老库一次性回填、不覆盖用户解绑。
### 任务
#### 新增的功能
- 任务列表新增「运行中 Worker」列:统计该任务下 `state='running'` 的意图节点数,口径与任务详情页概览的「运行中 Worker」完全一致,无运行中 Worker 时显示 0。
### 网络
#### 新增的功能
- 新增**全局出口代理**配置:所有目标流量可经统一的全局代理出网(http/https/socks5,支持 `user:pass`)。开启流量捕获时作为 MITM 记录代理的上游(流量照录再经代理出网,拦截与透传两条路径都走上游、不泄露源 IP);关闭捕获时直接注入 agent 的 bash 环境与 WebFetch(`proxyEnv` 增加 `ALL_PROXY` 支持 socks5)。配置存于 settings KV 表(无需迁移),前端系统配置页新增「全局代理」卡片,与网络搜索代理、LLM 代理相互独立。
### UI
#### 修复的问题
- 修正意图状态标签的语义错误:`exhausted`「已穷尽」→「预算耗尽」(实为达步数 / 时间预算被中途掐断、只写回部分结果,并非该方向已探尽)、`blocked`「被拦截」→「执行出错」(实为模型 / API / 网络故障重试用尽、意图基本没真正探成,并非目标 / WAF 拦截),并补上此前缺失的 `stopped`「已停止」(用户手动停止的 work)。
### 依赖
#### 修改的功能
- 升级 norma 至 v0.3.4:MCP 工具输出增加截断与落盘(见 `651b961`),后续 v0.3.6 支撑墙钟就地收尾。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
## [0.3.7] - 2026-08-31
### LLM
#### 新增的功能
- 模型配置新增「输出上限」,并可选择上限用哪个请求字段名:上限限制单次回复最多生成多少 token,随每次请求发出,0(默认)= 不发送该字段、由服务端默认值决定;它与「上下文窗口」是两回事——后者是模型总容量,只在本地用来算压缩阈值,不出现在请求里。字段名开关仅对 `openai`(Chat Completions)格式有意义:空(默认)发 `max_tokens`,绝大多数兼容网关只认它;OpenAI 官方推理模型(o 系列 / GPT-5)反过来只认 `max_completion_tokens`,收到 `max_tokens` 会直接报 `unsupported_parameter`,这类端点需手动切到新字段。两种格式各自定死了字段名(Anthropic 为 `max_tokens`、Responses API 为 `max_output_tokens`),故非 openai 格式该开关置灰并在保存时清空。同时补上一条此前从未接通的链路:planner / worker / chat / 主 Agent / 目标拆解五处都没设过输出上限,openai 系压根不发、Anthropic 走 SDK 的 8192 兜底,光加配置项而不接这条线,填了数字也不会生效;现在取值与「流式输出」一样按配置每轮解析,故障转移切换后下一轮即生效。旧库升级后行为完全不变(新列默认 0 与空字段名)。
- 后台点「测试」时把每次 HTTP 尝试的状态码与网关原始响应体打进服务端日志(响应体裁到 4K),便于诊断 401、额度文案、空帧、返回 HTML 页面等情况,不再只能看到 UI 折叠后的 ok / err。该日志不依赖「LLM 记录」开关。
#### 修改的功能
- 任务 LLM 配置链改为任何状态都可修改,不再限制「运行中 / 暂停 / 配置链耗尽」:任务结束(done / failed / timeout)后主 Agent 对话仍走这条链,链上模型出问题时原先既不能改也就没法继续交互。后端 HTTP 与 DB 事务两处终态拦截一并去掉,前端弹窗对终态任务也开放编辑与保存。终态任务保存时不再重开额度阻塞意图(那些意图会被挪到 open,既没有 worker 执行、也不再满足「重跑意图」的条件),想继续跑仍走重跑意图 / 新增目标,由它们把任务重新拉回运行态。
### Agent
#### 修改的功能
- 「给运行中的 Worker 发消息调方向」改为复用已有的暂停 / 恢复 + transcript resume 机制,行为与主 Agent 对话一致:此前走的是一套自建的介入持久化协议,牵动调度屏障、恢复流程与十余处活动查询过滤。现在消息经下一轮输入注入,意图在专属 goroutine 里直接跑,不受 3 槽 worker 池限制、随发随跑;前端保留消息框并恢复「直接继续」按钮,发送改由 SSE 承载。无 DB schema 改动。取舍:消息仅存内存、不做崩溃恢复,且发消息时该任务可能瞬时超并发一个 worker(低频场景,可接受)。
### 任务
#### 修复的问题
- 修复归档大型任务时内存耗尽(OOM)崩溃的问题:归档改为流式写入快照,不再把整个任务一次性读进内存;同时补齐冷归档路径上的三处恢复缺口——现代安装的流量只存在 SQLite 里,此前在 PostgreSQL 提交与 SQLite 提交之间崩溃会让已归档任务的流量滞留在热存储且无从恢复,现在无论有无历史目录都会写暂存日志,缺失的 `journal.json` 也按可丢弃处理。
- 修复任务较多时系统卡顿的问题:加载对话与加载界面存在明显延迟。任务列表、任务上下文与探索记录的查询一并优化,前端的仪表盘、对话页与任务详情页同步减少了重复请求。
### 资产
#### 修改的功能
- 去掉企业资产范围「最多 256 条规则」的限制:逐个 IP / 域名录入范围的企业很容易撞上这个上限,撞上之后只能拆成多个企业,而范围本身并不因为条数多就更慢。前后端与 demo mock 三处上限一并移除,单条规则仍限 1024 字符,请求正文 2 MiB 的上限保留作兜底(约合四五万条规则)。
### 技能
#### 修复的问题
- 修复上传技能压缩包报「上传失败:zip: unsupported compression」的问题:Go 标准库只内置 Store / Deflate 两种解压器,压缩软件在非默认档位下写出的 bzip2、Zstandard 包一律解不开。现在补上这两种解压器(纯 Go 实现,不引新的外部依赖);Deflate64 / LZMA / XZ / PPMd 等确实解不了的方式,以及加密压缩包,改为在解压前就报出中文提示,直接点名是哪个文件用了哪种压缩方式、该怎么重新打包,不再把底层英文错误甩给用户。
- 修复技能内文件名校验把中文文件名判为非法的问题:路径校验原先是 `[A-Za-z0-9-_./]` 的 ASCII 白名单,压缩包里只要有一个中文命名的文件(`参考/说明.md` 之类),整包上传就会以「压缩包含非法路径」失败。改为 Unicode 黑名单:允许各种语言的文件名与空格,仍然拒绝控制字符、非法 UTF-8、零宽与双向控制字符(RLO 文件名伪装)、`\ % # ? * : " < > |` 以及 `..` / 绝对路径 / 空路径段,防目录穿越的行为不变。技能名同样放开——ASCII 仍限小写字母、数字与连字符(agentskills.io 规范),中文等非 ASCII 字母可直接作技能名,但不接受空格、点和路径分隔符。
- 修复 Windows 压缩软件打出的中文包解压后文件名乱码或整包被拒的问题:这类 zip 不置 UTF-8 标志位、按 GBK 写文件名,现在按 GBK 兜底解码后再做路径校验。同时 `name: "中文技能"` 这种带引号的 frontmatter 也能正确取到技能名。
### UI
#### 新增的功能
- 发现页新增「全部发现」平铺视图并设为默认,与原「按任务分组」视图通过页头 Tab 切换:分组视图要逐个任务展开才看得到漏洞,只想跨任务扫一眼列表时反而绕路。平铺视图是一张跨任务大表(每页 10/20/50/100 条),行为与分组视图完全一致——勾选导出、行内展开看证据与详细报告、行内改名称/类别/严重度、改处置状态、深入、删除。两个视图共用统计卡片与筛选条,切换不丢筛选,当前视图与筛选项一并记在本地;轮询只打当前视图,行内改动会同步写两边缓存,切过去不会看到过期数据。
- 发现页新增「按资产」视图:左侧资产树(企业 → 根域名 / IP → 子域名 → 服务 → 接口,企业层只在资产确实有归属时才出现),右侧是选中节点整棵子树下的发现,与另外两个视图共用同一张表和同一批筛选条件。树只收有发现的资产,祖先链按需补齐(发现只挂在最深的接口上时,上面几层照样能拼出来),节点上的计数是子树聚合并按发现去重的;资产已删除或本就没关联资产的发现进「未关联资产」桶。与另外两个视图不同,资产视图不轮询——进入视图、改筛选、页内增删改发现、或点树上的刷新按钮时才查询,左树是导航结构,没必要每 5 秒重算。树上每层只显示相对上一层的增量(子域名去掉根域名后缀、服务显示 `https :443`、接口只显示路径),完整值在悬停提示与面包屑里;节点过多时整层丢弃接口/服务层级并给出提示,计数仍计入上层。
#### 修复的问题
- 修复手机端会话详情里会话记录被挤压看不全的问题:窄屏下折叠会话列表,把宽度让给记录本身。
### 依赖
#### 修改的功能
- 升级 norma v0.3.2 → v0.3.3:新增 `Config.MaxTokensField`,让 OpenAI Chat Completions 的输出上限可以改发 `max_completion_tokens`(推理模型只认这个键)。两个键互斥、只发其中一个,默认仍是 `max_tokens`。
- 升级 `golang.org/x/mod` v0.37.0 → v0.40.0,修复两处依赖安全告警。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@neouks](https://github.com/neouks)
- [@begininvoke](https://github.com/begininvoke)
## [0.3.6] - 2026-08-27
### LLM
#### 修复的问题
- 修复「非流式」开关保存后重新打开又变回「流式」的问题(#69):配置列表接口的 DTO 漏了 `streaming` 字段,响应从不返回它,前端读到 `undefined` 后一律回落成默认流式;实际写入与 DB 存储本无问题,只是读不回来。DTO 补回该字段(不加 `omitempty`,`false` 也必须出现在响应里)。
- 测试连接改为校验模型确有回复、并按该配置真实的收发模式来测(#65):此前只判 HTTP 是否成功,请求通但模型零回复(思考烧光预算 / 正文被安全策略吞掉 / 兼容层丢 `content`)也报「连接成功」,与会话里「不回话」的表现割裂;且测试恒走流式,非流式配置测的其实是另一条通道。现在空回复直接判失败、成功时在提示里展示模型回复,并把当前流式开关一并带入测试,让「测试通过」与「会话跑得通」保持一致。
### Agent
#### 修改的功能
- `list_facts` 改为分页 + 关键词过滤,避免事实多时单次调用撑爆上下文(#74):默认返回最新 20 条,支持 `limit`(上限 100)/ `before` 游标 / `q` 摘要关键词,返回 `{facts, total, has_more, next_before}`;单条 summary 过长按字数截断(全文仍走 `node_detail`)。worker / planner 提示词同步为分页语义。旧库通过一次性迁移把新参数 schema 刷进工具目录表(`SeedTool` 首插入only,否则工具管理页显示「无参数」)。
### 工具
#### 新增的功能
- 「工具执行」页新增工具调用次数统计(#72):工具栏「统计」按钮打开弹窗,按工具展示调用次数、占比与失败次数(次数降序);沿用列表的任务 / 关键词筛选,统计整个结果集而非当前页,弹窗打开时才拉取。
### 依赖
#### 修改的功能
- 升级 norma v0.3.1 → v0.3.2:修复 OpenAI 系响应里被静默丢弃的 reasoning/refusal(Responses 补 `reasoning_text`)、reasoning 字段三名去重、空响应(零内容块)有界重试、压缩边界切断工具配对导致的网关 400(同时修复已烤进 transcript 的存量孤儿)。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
## [0.3.5] - 2026-08-25
### LLM
#### 新增的功能
- 每个 LLM 配置支持流式/非流式切换(默认流式):开走流式 SSE;关走真·非流式(`stream:false`、一次性返回完整 JSON),可绕开部分网关糟糕的 SSE 实现(空帧、思考字段丢帧),代价是失去运行中的实时进度与实时 Token 计数。worker / planner / mainagent / chat / goals 均按当前激活配置动态取值;`llmpool` / `llmrec` / 任务运行时三层 Provider 包装均兼容非流式;`llm_profiles` 新增 `streaming` 列并 `ALTER` 补旧库(默认 `true`,旧配置无感)。
- 支持 OpenAI Responses API 格式的 LLM 配置:每个配置新增第三种格式 `openai-responses`(打 `POST /v1/responses`),与 Chat Completions / Anthropic 并列;`BaseURL` 归一化、默认模型 `gpt-5`;`llm_profiles` 的 `format` 约束加入 `openai-responses` 并幂等迁移补旧库;前端格式下拉新增「OpenAI (Responses API)」。依赖升级 norma v0.3.1(含 `reasoning_content` 回传修复)。
- 录制 LLM 请求/响应 HTTP 原文:在 HTTP transport 层捕获真实 wire body,保留归一化视图看不到的工具 schema、`tool_use` 块与原始 SSE 帧;norma 内部重试的多次尝试逐次保留;`llm_records` 新增 `raw_request` / `raw_response` 两列并 `ALTER` 补旧库;录制页详情面板增加「原文」视图切换与请求/响应复制按钮(兼容非安全上下文的 `execCommand` 回退)。
### 对话
#### 修改的功能
- 会话列表多选改为「多选」模式开关:默认列表不再常驻每行勾选框(观感更干净),表头改为「共 N 个 + 多选」按钮;点「多选」进入选择模式(勾选框、全选、批量删除),「完成」退出并清空选择,批量删除全部成功后自动退出(有失败则留在选择模式便于重试);单条重命名 / 置顶 / 删除仍走每行 ⋯ 菜单。
### UI
#### 修改的功能
- 任务管理、会话操作与流量查看体验增强(#57):任务列表列排序偏好可持久化记忆、行内重命名改用图标直接触发(不再经菜单)、抽屉(sheet)交互与流量查看细节优化。
#### 修复的问题
- Worker 资产标签只显示域名与 IP,并正确处理空标签的场景。
### Agent
#### 新增的功能
- planner 判目标时新增「量化验收核对」:目标含可量化验收条件(资产测试覆盖度达到 X%、拿到 N 个 flag、获得某权限)时,`prove_goal` 前必须核对 `graph_overview` 的实测值(`coverage.pct`、findings 计数等),实测未达标则禁止 `prove_goal`、改为派意图补足差距,不得以「主要部分已完成/大体达成」为由提前标 met。修复了目标要求覆盖度 100%、实测仅 40% 却被判完成的问题。
#### 修改的功能
- 重写 planner 提示词中「本轮 0 意图」的判定依据:原文将 0 意图描述为「最常见、最重要的原则」,会让规划者在目标未达成、范围内仍有未测面时过早收手。现改为只在两种具体情况下才应产出 0 意图——① 想到的方向都已被 open/running/recent_done 意图覆盖;② 下一步依赖当前正在运行的 work 的产出、而产出尚未出现(应等其跑完、图更新后的下一次唤醒再规划)。并补充反向约束:确有未被覆盖且不依赖在跑 work 的新方向、或目标未达成且仍有未测面时,不要因「0 意图常见」而收手。
- 强化 worker 提示词中「否定结论的证据门槛」:对「不可注入/端口关闭/无登录入口」等可能让规划者放弃一整条方向的否定结论,要求下结论前先穷尽该意图内的合理手段(换编码/参数/路径/方法);手段未走完或证据偏弱一律标 `confidence=inferred`,避免用轻率的 `observed` 否定把整条路线焊死(任务早期的错误否定尤其会把方向带偏且难以自愈)。
- 上述 planner / worker 默认提示词变更通过一次性迁移(`reseedPlannerPrompt` / `reseedWorkerPrompt`,各带 settings flag 守卫)追加为新版本并切为当前版本;旧版本保留在版本历史中,自定义过提示词的用户可在版本记录里恢复。
### 运维
#### 新增的功能
- 新增 `reset-password.sh` 重置管理员(用户名固定 `ARTEX`)密码:支持 local / docker 两种部署,连接信息可显式指定或自动从 `--dsn`/`$ARTEX_PG_DSN`/`config.json` 读取;在库内用 `pgcrypto` 生成与后端登录兼容的 bcrypt 哈希并写回 `settings.auth.password_hash`,重置后无需重启服务。密码经环境变量传入、不进入进程 argv,并做转义防注入。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@neouks](https://github.com/neouks)
## [0.3.4] - 2026-08-24
### UI
#### 新增的功能
- 任务列表勾选多个任务后可批量修改分类,目标分类支持「未分类」以将任务移出当前分类;整批写入在一个事务内完成,失败项只会是勾选后已被删除的任务。
#### 修改的功能
- 新建任务的「任务分类」由下拉选择改为可搜索输入框:输入即过滤已有分类,库里没有的名称回车(或点下拉里的「创建」)即时新建并选中,选中项以可移除的 tag 展示;仍限单个分类。
### 对话
#### 修复的问题
- 修复会话已选定 LLM 配置、但全局无激活配置时,发送消息被「LLM 未配置,无法对话」拦截的问题。发送前的检查原本只看全局激活配置,而实际执行会优先用会话所选配置,两处解析逻辑不一致;现统一为同一套(会话/Agent 绑定优先,全局兜底)。
- 无法对话时的提示按状态细分:完全没有配置提示「添加配置」,有配置但未激活提示「激活或为本会话指定一个配置」,不再一律显示「未配置」,便于定位。
### Agent
#### 新增的功能
- 目标已全部达成的任务,主 Agent 经 `add_intent` 下发的意图可被 Worker 直接领取执行、跑完即止:此时 Planner 不再运行(任务无 open 目标即不进规划),避免其重判目标达成而取消刚下发的意图;frontier 抽干后任务回到已完成。主 Agent 下发意图前会依据意图内容反问用户是否将其登记为正式目标,登记则任务恢复常规自主规划。
#### 修改的功能
- `get_worker_trace` / `get_task_worker_trace` 的 `step_ids` 超过一次上限(5 个)时不再直接报错,改为返回前 5 步的完整内容,并在结果中通过 `returned_step_ids` / `omitted_step_ids` / `notice` 告知本次取了哪些、还有哪些未取,并提示「若已足够则无需再取」。传入的重复与非法 id 会先去重、剔除后再计数。
#### 修复的问题
- 任务列表改为按任务 id 降序(最新创建在最前),替换原先的按创建时间排序。同一时刻创建的多个任务时间戳相同、排序不稳定,配合每 10 秒轮询和内存 map 的随机遍历,会导致它们在列表里频繁互换位置。
### 资产
#### 修复的问题
- 修复企业归属重算被单行脏数据打挂:`assets.ip` 存了主机名(Agent 或资产 API 写入)时,`a.ip::inet` 会抛 `22P02`,导致新增/修改企业资产范围和删除企业全部失败并回滚。改用安全转换 `try_inet()`,非法值跳过而不是中断整条语句。
- 无法解析的 `ip` 不再静默跳过:企业范围保存后会明确提示有多少条资产的 `ip` 不是合法 IP(含具体 id 和取值),提醒这些资产不会被 IP/CIDR 规则归属;同一信息也写入服务端日志,覆盖没有前端响应的路径(删除企业、scopesentry 同步、Agent 写入)。
- 任务测试范围的 IP/CIDR 匹配同步改用 `try_inet()`,替换原先只检查字符集的正则守卫(`abc.def` 这类全 hex 字母的主机名此前仍会漏过并触发同样的报错)。
#### 修改的功能
- `ip`、`service`、`endpoint` 资产的 `ip` 字段不再接受主机名:`insert_assets` 和资产 API 会逐条返回带 `index` 的错误,并直接给出改正方法(改用 `type=subdomain` 填 `domain`,或先解析 A/AAAA 记录),Agent 可据此自行修正后重插。同批次中的其他资产不受影响,照常入库。
### 贡献者
- [@neouks](https://github.com/neouks)
## [0.3.3] - 2026-08-23
### Worker
#### 新增的功能
- 运行中的 Worker 支持单项暂停、恢复和取消;暂停保留意图、事实与漏洞,取消会在执行退出后事务性清理当前意图及其直接产物。
- 增加 `paused` 意图状态、执行栅栏和具名终止原因,防止暂停、取消或任务删除后出现迟到黑板写入。
- 增加可选任务并发上限;新建、恢复、漏洞深入和队列补位统一通过持久化 FIFO 准入路径。
#### 修改的功能
- Worker 单次运行墙钟默认时长由 600 秒调整为 1200 秒;超时任务复活后在下一次真实执行时重新计时。
- Worker、Planner 和主 Agent 的真实执行状态统一驱动任务状态徽标,修复 Worker 运行时仍显示“空闲”的问题。
- Worker 会话保留单项控制和当前会话 Token 汇总,模型名称移动到当前会话标题右侧展示。
#### 删除的功能
- 删除 Worker 多选、全选及批量暂停/继续界面,同时移除 Worker 批量控制 API 和 Mock 契约。
- 删除 Worker 列表行中的 Token 徽标与 Tooltip,底层完整 Token 账本和任务聚合接口继续保留。
### LLM
#### 新增的功能
- 任务支持有序 LLM 配置链;明确识别供应商额度不足时自动切换下一配置,并持久化当前配置、耗尽状态和错误摘要。
- 运行中和暂停任务支持编辑完整配置链、调整顺序和手动切换当前配置,从下一次 LLM 调用生效。
- 自动切换、手动切换和全链耗尽写入结构化系统活动,并通过任务活动流弹出可去重提醒。
- 增加任务角色模型解析接口,统一解析 Main Agent、Planner 和 Worker 下一次调用使用的配置与模型。
- 增加可选的全局 LLM Pool,支持配置调用顺序、指定模型失败兜底、健康状态、冷却恢复和手动重置。
- 增加始终开启的 LLM 用量账本,按任务、会话、模型和配置聚合输入、输出及缓存 Token。
#### 修改的功能
- 目标拆解、Planner、Worker 和主 Agent 共享任务级 LLM runtime(解析优先级见下)。
- 故障转移只响应明确的额度、余额或账单错误;普通限流、鉴权、网络、服务端和上下文错误不会错误切换。
- LLM 配置页改为配置卡片列表和右侧抽屉编辑,并提供 Pool 轮询顺序、优先级、排除项、健康状态和恢复操作。
- 配置链耗尽信息支持窄屏换行;当前模型由会话列表图标改为当前会话标题旁的文字标签和完整 Tooltip。
- 任务内各角色解析 LLM 的顺序调整为「Agent 绑定 → 任务配置链 → 全局」:显式绑定模型的角色始终跑在该模型上,未绑定角色才落到任务链,任务链为空时再落到全局。
- 出站代理留空即直连,不再回退 `HTTP_PROXY`/`HTTPS_PROXY` 环境变量(显式 `ARTEX_LLM_PROXY` 不受影响);代理输入支持带账号密码的 `socks5://user:pass@host:port`。
#### 修复的问题
- 提交前(尚未产出任何输出)的瞬时流式失败在同一 provider 上安全退避重试,显著减少「只跑了一两个工具就中断、无总结、终态 `model_error`」的情况;额度耗尽、上下文过长和 4xx 确定性错误不重试,仍分别交由故障转移与压缩恢复处理。
#### 删除的功能
- 删除会话列表中的 LLM 图标式标识,避免与 Worker 状态图标混淆。
### UI
#### 新增的功能
- 任务支持全局分类的创建、重命名、删除和筛选;新建任务可直接选择分类。
- 增加全局任务模板 CRUD 和右侧管理抽屉;新建任务可加载预设描述与目标,也可将当前内容另存为模板。
- 新建任务支持关联多个来源任务和多个企业资产范围;企业范围通过单个多行文本框自动识别域名、URL、IP、CIDR、ICP 和企业关键词。
- 任务测试资产支持实时新增和删除,记录人工、企业、继承或 Agent 发现等来源;Worker 会话标题旁显示当前测试资产及来源摘要。
- 发现页按任务分组并提供组内独立分页,支持为漏洞填写描述并创建高优先级深入意图。
- 对话支持重命名、置顶、取消置顶和删除;任务列表支持当前页批量暂停与继续。
- 流量详情和工具执行详情改为右侧抽屉;HTTP 报文补齐 `Host` 并高亮请求行、状态码、Header、JSON 和标记语言正文。
- 任务列表操作列新增「详情」与「暂停/继续」按钮;会话发送键位可在系统设置中配置(`Enter` / `Cmd+Enter` 等),Web 搜索区新增代理输入框。
- 会话标题右侧徽标改为显示 LLM 配置名称,模型 ID 移至 hover Tooltip;任务可设置可选名称,任务列表新增名称列与搜索(空则回退到描述)。
- 技能页增加使用次数、最近使用时间和缺失依赖统计,便于定位未生效或未安装的技能。
#### 修改的功能
- 任务标题改为可聚焦详情链接;任务资产、企业资产、发现任务组和组内漏洞使用服务端真实分页、稳定排序与精确总数。
- 新增企业改用右侧抽屉,范围录入统一为多行文本并提供实时识别、校验和类型预览。
- 主 Agent 输入框支持自动增长、`Enter` 发送、`Shift+Enter` 换行,并避免中文输入法组合态误发送。
- Agent 预览、任务报告和相关详情统一使用共享 Markdown 渲染;删除确认、长错误和移动端抽屉宽度统一修复。
- 任务模板选择框以模板名称显示和搜索、以模板 ID 提交;恢复系统原始字体尺寸,应用版本统一显示为 `0.3.3`。
- 任务总计和当前会话 Token 只高亮输入、缓存读取和输出数值;发送按钮使用更简洁的上箭头图标。
- 任务总览的测试范围显示企业名称而非 ID。
#### 修复的问题
- 含点号的普通文本不再被误判为 ICP 备案号。
- 修复变量目录中与全局运行时变量(如 `{{.Now}}`)撞名,导致 Agent 编辑器变量列表渲染出重复 key 的问题。
#### 删除的功能
- 删除任务卡片独立“进入”按钮,统一点击任务标题进入详情。
- 删除仪表盘“新建任务”按钮、新增企业的 Logo URL 输入项,以及发现页顶部和任务分组中的漏洞数量 Badge。
- 撤销全局字体增大 10% 的样式,并删除会话列表中的 Worker 选择框、模型图标和行级 Token 统计。
### Agent
#### 新增的功能
- 新任务可直接关联多个已有任务,实时只读继承直接来源任务的目标、事实、漏洞、已完成意图、资产范围和黑板上下文。
- 黑板读取工具支持按需查询来源任务节点、事实、漏洞和执行轨迹;继承节点带来源标记且所有写工具拒绝修改。
- 企业范围工具支持域名、URL、IP、CIDR、ICP 和企业关键词;关键词仅作为 Agent 范围提示,不参与资产自动归属。
- 漏洞深入操作会在原任务创建带资产锚点和 `derived_from` 边的高优先级人工 Worker 意图。
- 总览新增「目标管理」卡片,支持人工查看、新增、修改和删除目标;新增或修改会通知 Planner 并复活任务,删除硬删目标节点(级联删边与锚点)但不复活。
- 主 Agent 默认获得 `steer_work` 工具,可对运行中的 Worker 实时注入纠偏指令而不打断、不丢失进展(仍校验意图归属本任务)。
#### 修改的功能
- 来源任务意图不进入新任务 frontier,新任务继续使用独立 exploration、执行队列、工作目录和对话历史。
- 删除运行中的意图不再销毁数据:改为停到 `stopped`、要求填写删除原因、把原因作为事实挂到该意图并写入 payload,规划者按 `cancelled` 触发感知(保留意图内容与原因)。
- 主 Agent 对话改为服务端活动流驱动,发送失败可恢复输入;打开会话时自动贴底并在详情懒加载后保持最后回复可见。
- 任务暂停会终止当前 Main Agent、Planner 和 Worker 调用,但不阻止暂停期间用户主动发起新的主 Agent 编排会话。
- 取消、关闭和流式中断统一保留真实终止原因、已生成内容、运行轮数、耗时、Token 与未返回工具调用。
#### 删除的功能
- 删除主 Agent 客户端乐观消息回显,避免暂停、失败或并发活动下出现重复消息和跨会话串流。
### 约束
#### 新增的功能
- 目标拆解阶段先抽取操作约束(allow/deny)再拆目标,主 Agent 运行时可补充;约束按最高优先级注入 Planner 与 Worker 系统提示,去偏后多样性与拓面探索显式服从约束。
- 总览新增「约束管理」卡片与增删改接口;约束注入范围可按 Planner / Worker 分别开关(默认都开,每轮读取、即时生效)。新表 `task_constraints` 使用 `CREATE TABLE IF NOT EXISTS`,旧库自动补建。
### 拦截
#### 新增的功能
- 命令拦截在正则/字符串规则之外新增模型兜底审批:一条规则都未命中时由模型做 `ALLOW`/`ASK`/`DENY` 语义判定,失败回退动作与审批超时动作可配置;拦截页拆分「拦截规则 / 模型配置」两个 Tab,模型判定结果标注 `[模型]` 前缀与理由。
#### 修复的问题
- 加固裁判输出解析,避免正确的 `DENY` 判定被误当作放行。
### 流量
#### 修改的功能
- 流量录制改为整条 exchange 落 SQLite(大正文溢出到按 hash 去重的 blob 桶),文本正文建 trigram 全文索引,支持任意子串与中文搜索;删除退化为单条 SQL 事务,从数小时降到毫秒级且期间不再停摆录制。新增大 body 流式下载与 `traffic_search` 全文参数;旧文件树数据免迁移,仍可读、可搜、可删。
### 任务与资产
#### 新增的功能
- 创建任务新增「资产覆盖度功能」开关(默认开):关闭后不计算与展示覆盖度、态势图只显示资产、不自动累积 `task_scope`,相关工具从 Planner / 主 Agent 剔除;企业关联不受此开关影响。
- `insert_assets` 每条资产新增 `related` 标记(默认 `true`):仅在开启覆盖度时生效,`false` 只入共享资产库、不计入本任务覆盖度(如顺带发现的旁站或无关资产)。
- 企业范围和任务测试资产统一支持域名、URL、IP、CIDR、ICP 与关键词文本识别;域名/IP 可创建或复用全局资产,CIDR/ICP/关键词保留为任务范围上下文。
### 构建
- `build.sh --release` 支持一次构建 Linux amd64/arm64、macOS amd64/arm64 和 Windows amd64,并生成带 `skills/`、配置示例和 README 的 zip 发布包。
- 使用 Go linker 去除调试信息并生成 zip 发布包;UPX 改为显式可选,避免其自解压 ELF 在部分 Linux 环境启动时发生段错误。
- Release Workflow 对 Linux amd64 二进制执行启动冒烟测试,并随发布包提供 `SHA256SUMS`。
### 贡献者
- [@neouks](https://github.com/neouks)
## [0.3.2] - 2026-08-20
### Added
- 新建任务支持关联多个已有任务,实时、只读继承直接来源任务的事实、漏洞、已完成意图、资产范围和黑板上下文;新任务仍使用独立的执行队列、工作目录和会话历史。
- 任务支持有序 LLM 配置链。明确识别到供应商额度不足时自动切换到下一配置,并持久化当前配置、耗尽状态和结构化审计活动。
- 运行中和暂停任务支持编辑 LLM 配置链、调整顺序及手动切换当前配置;自动切换、手动切换和全链耗尽会在任务详情页提示。
- 运行中的 Worker 支持暂停、恢复和取消。暂停保留黑板数据,取消会在 Worker 停止写入后事务性清理该意图及其直接产出的事实、漏洞和执行记录。
- 删除任务可选择同时清理关联资产、流量、漏洞和任务落地文件,并增加删除屏障、并发保护和可审计的删除统计。
- 增加可选的任务并发上限;达到上限的新任务按 FIFO 排队,并在运行槽位释放后自动启动。
- 增加任务资产分页、公司资产分页、任务分类统计及分页意图 Mock 契约。
- 增加 `build.sh` 单二进制构建脚本,支持静态前端导出、资源嵌入、跨平台目标和构建版本注入。
### Changed
- 任务级显式 LLM 配置链与现有全局 LLM Pool 并存;显式链继续采用严格的额度故障转移语义,无显式链时沿用 Agent 绑定和全局配置规则。
- 主 Agent 输入框支持自动增长的多行输入,`Enter` 发送、`Shift+Enter` 换行,并避免中文输入法组合态误发送。
- Planner、Worker 和主 Agent 共享任务级 LLM runtime;任务链使用候选模型中最小上下文窗口作为安全压缩阈值。
- 任务详情页按真实 LLM 调用状态展示运行、空闲和暂停状态;来源任务的事实、漏洞、意图、资产引用和图谱节点统一标记来源并保持只读。
- Agent 预览、任务报告和相关详情视图统一使用共享 Markdown 渲染组件。
- LLM 模型配置采用卡片和抽屉交互,模型列表在抽屉内支持独立滚动。
- 任务暂停不再拦截主 Agent 对话:主 Agent 编排会话独立于任务暂停,暂停中仍可继续发送新消息(暂停只终止当前进行中的那一轮)。
- Worker 单次 run 的墙钟默认时长由 600 秒调整为 1200 秒。
### Fixed
- 移除主 Agent 控制台的乐观回显,改为纯服务端数据渲染,修复暂停或发送失败等场景下消息错乱、串入其他会话内容的问题。
- 打开主 Agent 会话默认滚动到底并完整显示最后一条回复:最后一条回复的完整内容懒加载展开后自动贴底,不再被顶出屏幕。
- 修复暂停任务后主 Agent 会话仍继续运行,以及编排 Agent 暂停任务时未同步停止主 Agent 的问题。
- 修复任务完成、Planner、Worker 或主 Agent 实际运行时,任务状态徽标与操作按钮状态不同步的问题。
- 修复 Worker 取消、任务删除和并发写入之间可能产生迟到黑板写入或残留文件的问题。
- 修复 Markdown 预览失效、删除确认长文本溢出、移动端宽度和部分任务详情按钮未对齐的问题。
- 为所有 Agent 取消路径增加具名终止原因,活动详情可显示取消方、终态、运行轮数、耗时、Token 使用量和未返回的工具调用。
- 修复后端关闭时父 context 可能抢先覆盖具名 `shutdown` 原因的竞态,以及中文活动摘要按字节截断导致乱码的问题。
- 修复带部分流式输出的取消事件丢失真实终止原因的问题,同时保留取消前已生成的内容。
### 贡献者
- [@Autumn-27](https://github.com/Autumn-27)
- [@neouks](https://github.com/neouks)
[Unreleased]: https://github.com/Autumn-27/ARTEX/compare/v0.3.10...HEAD
[0.3.10]: https://github.com/Autumn-27/ARTEX/compare/v0.3.9...v0.3.10
[0.3.9]: https://github.com/Autumn-27/ARTEX/compare/v0.3.8...v0.3.9
[0.3.8]: https://github.com/Autumn-27/ARTEX/compare/v0.3.7...v0.3.8
[0.3.7]: https://github.com/Autumn-27/ARTEX/compare/v0.3.6...v0.3.7
[0.3.6]: https://github.com/Autumn-27/ARTEX/compare/v0.3.5...v0.3.6
[0.3.5]: https://github.com/Autumn-27/ARTEX/compare/v0.3.4...v0.3.5
[0.3.4]: https://github.com/Autumn-27/ARTEX/compare/v0.3.3...v0.3.4
[0.3.3]: https://github.com/Autumn-27/ARTEX/compare/v0.3.2...v0.3.3
[0.3.2]: https://github.com/Autumn-27/ARTEX/compare/v0.3.1...v0.3.2