ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
web / web (push) Waiting to run
docs / links (push) Canceled after 0s
detections / detections (push) Canceled after 0s
870 lines
79 KiB
Markdown
870 lines
79 KiB
Markdown
# 更新日志
|
||
|
||
本项目的重要变更记录在此文件中,格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
|
||
|
||
## [Unreleased]
|
||
|
||
### 拦截
|
||
|
||
#### 新增的功能
|
||
|
||
- **新增内置拦截规则「删除类接口路径」**:此前内置的 HTTP 破坏性规则只认 DELETE **方法**(`curl -X DELETE`、`requests.delete(`、`method:'DELETE'`),路径类规则的词表又只有 `/clear /wipe /flush /purge /truncate /drop /destroy /factory-reset /reset-all`——而多数应用的删除接口用 GET/POST 就能触发,于是 `curl 'http://t/api/user/delete?id=1'` 这类调用不命中任何内置规则,会真实删掉目标数据。现补一条 `deny` 规则覆盖 `/delete /del /remove /unlink /erase /destroy`(允许 `/deleteAll`、`/delete_user`、`/delete-user` 这类后缀形式),动词后必须跟分隔符,`/delivery`、`/details`、`/delta`、`/delegate` 不会被误拦。规则走独立的种子标记位,**已有实例升级后也会拿到**;和其余内置规则一样可在「系统 → 命令拦截」里停用或删除。
|
||
### 漏洞推送
|
||
|
||
#### 新增的功能
|
||
|
||
- **漏洞发现支持推送到 IM**:新增「系统 → 通知推送」页,可把扫描发现推送到**钉钉、飞书、企业微信、通用 Webhook、Telegram、邮件**六种渠道。同一类型可配任意多个机器人实例(如「应急响应群」「日常播报群」各一个钉钉机器人),每个实例独立设启停、限流与过滤规则。
|
||
- **推送时机分实时与汇总两种模式**:实时模式命中即逐条发送;汇总模式按全局周期(默认 30 分钟)把一批漏洞合并成一条消息,开头给出「近 N 分钟新增 M 个漏洞」及级别分布,便于一眼判断是否需要立刻处理。想做「高危实时、其余汇总」就建两个渠道分别配置,策略不写死在代码里。
|
||
- **过滤规则支持四个维度**:最低严重级别、限定任务 / 资产范围、漏洞类型关键词包含与排除(排除优先)、以及是否接收处置状态变更(默认关,因为多数人说的「推送」指发现新漏洞,而不是状态流水账)。单条消息带回「查看详情」按钮跳转漏洞详情,目标地址由全局「回链地址」配置,留空则不带按钮。
|
||
- **投递历史与手动重发**:通知页列出每条投递的状态、尝试次数、失败原因与所属渠道,可按渠道与状态筛选;失败项可一键重发(重发会清零重试计数,因为人工点重发意味着失败原因已被处理)。
|
||
- **渠道凭据掩码回显**:Webhook 地址、加签密钥、Bot Token、SMTP 密码等由各渠道自行声明(`SecretKeys()`),接口只回显带尾号提示的掩码值;提交时原样回传即表示「不修改」,清空输入框则删除该字段。
|
||
|
||
#### 修复的问题
|
||
|
||
> 本节记录的是功能初版完成后一轮安全审计的结论。每条都是先复现、再修、再补回归测试。
|
||
|
||
- **修复掩码可被「改目标地址、保留凭据」绕过(严重)**:掩码机制的目的是「凭据不回显给浏览器」,但目标地址与凭据是两套独立字段,而配置合并对「未提及的键」一律保留库中原值。于是**只改地址、对凭据避而不谈**就能让服务端把库里的真凭据发到任意地址——通用 Webhook 的 `Authorization` 头、Telegram 的 Bot Token(进请求路径)、邮件渠道的 SMTP 密码(STARTTLS 后交给对端)全部泄露,且完全静默、不依赖重定向。这条路径实测可行,四个渠道逐一复现过。现在规定:**只要目标地址发生变化,调用方就必须对每一个凭据字段显式表态**(给新值,或显式留空表示不再需要)——原样回传掩码值等于「沿用旧凭据」,恰恰是攻击形状,一并拒绝。刻意不做「自动丢弃凭据」,因为对可选凭据字段(如 `headers`)那会变成「鉴权静默没了但接口返回成功」,比报错更难排查。
|
||
- **修复 markdown 系渠道对不可信内容零转义**:钉钉、企业微信、飞书三个渠道此前完全不做转义(Telegram 与邮件都做了)。漏洞标题与摘要来自模型输出(模型读的是被测目标的响应),资产的 `url` 则是扫描得到的、含目标可控查询串的完整 URL。一条标题为 `登录口 SQL 注入\n[紧急:点此验证账号](http://attacker.tld)` 的漏洞,会在安全工程师的钉钉/飞书里渲染成**可点击外链**;`` 则会在渲染时被客户端拉取——等于通报「这条漏洞已被看过」并泄露阅读者 IP。现统一做单行化 + markdown 元字符转义。同时修正了一处相关的设计错误:转义必须发生在各自的渲染出口,不能放进被四种语境共用的标题函数(markdown 转义泄漏到 Telegram 的 HTML 里会留下可见反斜杠)。
|
||
- **修复投递地址的 SSRF 面**:此前只校验 scheme 与 host,`169.254.169.254`(云元数据,可读出实例凭据)、环回地址、内网地址一律可投递;而投递失败时响应体前 200 字节会进 `last_error` 并被投递历史接口回显,构成一条半盲读原语(可读任意内网 HTTP 端点响应的前 200 字节)。现在在**拨号阶段**设防(而非只在保存配置时校验)——那里才是最终生效点,同时覆盖 DNS 重绑定与同主机重定向,并拒绝跨主机重定向(这几家的凭据就在 URL 里,跟随跳转等于交给跳转目标)。环回与链路本地地址需要显式设置 `ARTEX_NOTIFY_ALLOW_LOCAL=1` 才放行(本机 SMTP 中继是合法配置,不能一刀切);**RFC1918 私网刻意放行**,因为内网自建 Mattermost / SMTP 中继很常见,把防护做到那个程度会把正常部署一起废掉。
|
||
- **修复推送凭据经错误信息外泄**:投递失败时 `http.Client.Do` 返回的 `*url.Error` 会把**完整 URL** 打进错误文本,而钉钉的 `access_token`、企业微信的 `key`、飞书的 hook id、Telegram 的 `/bot<token>/` 都**就在 URL 里**。该串因此流入四个出口:`notification_deliveries.last_error` 明文落库、投递历史接口的原样回显(绕过了渠道配置的掩码)、服务端日志、以及测试发送接口回给前端的错误提示。现统一脱敏——错误信息只保留 `scheme://host` 与底层原因(足够定位 DNS / 连通性 / 证书问题),路径与查询一律丢弃。地址校验自身(`url.Parse` 失败)的错误文本同样带完整地址,与上面同一处理;**上一轮只修了前者、漏了后者,且当时的回归用例全都走的是 scheme 分支、根本没覆盖到解析失败路径,属于假保证**——现已补上真正覆盖该分支的用例。
|
||
- **修复汇总消息被截断后整批标记已送达导致的静默丢失**:渠道都有长度上限(企微 4096 字节最紧),一批装不下时消息会被截断,而发送成功后整批投递都被标记为已送达——被截掉的那些**既不在消息里、也不在失败列表里**,投递历史还显示成功,漏洞就这么消失。现在改为按**整条**打包:装进本条的那些才标记已送达,其余回到队列等下一条继续发,且消息头部如实写明「本条显示前 N 条,其余 M 条将在下一条消息继续」。被推迟的条目**不消耗重试次数**(领取时乐观 +1 的那次会减回去),否则一个 500 条的积压会在第三段就把尾部条目判成失败——而它们从未出过任何错。
|
||
- **修复最低级别门槛打错字会让过滤器静默失效**:`min_severity` 写成 `hgih` 这类笔误时,未知级别在序数表里为 0,判定退化成 `rank >= 0` 恒真——用户以为限制了「仅高危」,实际把全部漏洞灌进群里,且界面上与配置正确完全无法区分。现于写入路径校验取值,错误信息列出可选值(读取路径仍保持宽容:库里已有的坏值不会让渠道整个读不出来)。
|
||
- **修复 `rate_per_min = 0`(不限流)不可达**:文档、界面提示与令牌桶都把 0 解释为「不限流」,唯独写库这一层写了 `if RatePerMin <= 0 { 取默认值 }`,把显式 0 悄悄改成 20(钉钉/企微/Telegram)或 100(飞书)——操作者以为放开了限流、实际被卡着且没有任何提示。「未指定」与「显式 0」的区别只有请求体能表达,默认值因此改到接口层在字段缺省时填。
|
||
- **修复汇总渠道完全绕过令牌桶**:`allow` 被 `takeTokens` 扣掉却没人用,`rate_per_min` 对 digest 模式没有任何作用。现在领取条数同时受「本轮额度」与内存上界两个约束。
|
||
- **修复失败处置按整批最大尝试次数判断,让老投递连坐新投递**:批次内各条的尝试次数并不相同,一个已重试两次的老投递会把同批里全新的投递一起拖进 failed——新漏洞一次重试都没用上就永久丢失,与「不让老行拖新行下水」的初衷正好相反。现在逐条决定:永久失败立即判死、各自重试次数耗尽的判死、其余按各自的退避档位重排。
|
||
- **修复汇总批次中快照无法解析的投递被静默标记成功**:这类条目会被渲染阶段跳过(不拖垮整批),但随后整批标记已送达把它们一起算作成功。现在它们被显式判失败并给出原因,投递历史里能查到。
|
||
- **修复单渠道每轮投递条数可能超出租约时长**:租约 3 分钟,而一轮可串行投递的条数若多到最坏耗时超过租约,多实例部署时对端会把租约过期的行重新领走、重复发送并双份递增尝试次数。现在按「租约 / 单次超时」倒推出每轮上限,并有一条断言把这三个常量的关系钉死(写这条断言时立刻发现原取值 6 恰好用满租约、零余量,已调整为 5)。
|
||
- **修复 Telegram 截断可能切断 HTML 实体**:截断只避开了半截标签,没避开被切断的 `&` 之类的实体残片,而解析器可能因此拒收**整条**消息——超长汇总消息本来就常见,代价太大。现在同时回避未闭合标签与实体残片。
|
||
- **修复邮件渠道把临时性 SMTP 失败判成永久失败**:SMTP 的 4xx(如灰名单 `450`)是临时拒绝、正规做法是稍后重试,而此前一律判永久失败——一个启用灰名单的邮件服务器会让**每条**推送都在第一次尝试后落入失败,而这恰恰是自动重试最该起作用的场景。现按应答码首位区分:4xx 可重试、5xx 永久失败,取不到码时按可重试处理。
|
||
- **修复提交嵌套结构时会真的把掩码字面量写进库**:像 `webhook.headers` 这种对象字段只能整体掩码或整体提交;把掩码哨兵塞进对象内部既表达不了「保持不变」,又会被当真实值存下去,导致后续鉴权静默失效且没有任何报错。现在这种提交被显式拒绝。
|
||
|
||
#### 设计说明
|
||
|
||
- **写漏洞的事务只做一次盲 INSERT**:`notification_events` 由 `RecordFindingTx` 在**同一事务**内写入,提交即保证「漏洞落库」与「推送任务存在」原子一致。这条 INSERT 刻意不读渠道表、不跑用户的过滤规则——否则一条配错的过滤条件就能污染甚至中止事务,让高危漏洞存不进库。为把失败隔离在这一条语句上(PostgreSQL 中事务内任一语句报错会让整个事务作废、连 `COMMIT` 都失败),它被 `SAVEPOINT` 包住,失败时只记日志、不影响漏洞写入。
|
||
- **投递用租约领取而非长事务**:`FOR UPDATE SKIP LOCKED` 领取后把行置为 `sending` 并把 `next_attempt_at` 推到未来作为租约,提交事务后再做网络投递,因此投递期间不持有数据库锁;进程崩溃留下的 `sending` 行会在租约到期后被下一轮重新领取,自愈且不会造成无限重试。
|
||
- **限流不消耗重试预算**:引擎先按渠道令牌桶算出本轮还能发几条,再按这个数量去领取。顺序反过来(先领后弃)会让被限流挡下的投递白计一次尝试次数,三次预算被纯粹的等待耗光后落入失败。超限不会丢消息,只把投递推迟到下一个 tick。
|
||
|
||
### 测试基础设施
|
||
|
||
#### 修复的问题
|
||
|
||
- **修复公司 ICP 归属用例的清理顺序导致的资产永久残留**:该用例的清理注册在 `t.Cleanup` 里,但连接关闭用的是 `defer d.Close()`——`defer` 在函数返回时先执行、`t.Cleanup` 在其后,于是清理语句全部落在**已关闭的连接**上,错误又被 `_, _ =` 丢弃,测试资产与公司永久残留在库里。它用 `MAX(companies.id)+1` 当假 TaskID 给资产打标,一旦该数字与其他用例的任务 id 相撞,那个按「恰好 N 个资产」断言的用例就会莫名失败且极难定位。现改为关闭连接也走 `t.Cleanup` 并注册在前(后进先出,保证清理先跑),同时让清理失败显形而不是被吞掉。同一模式(`defer d.Close()` + 在 `t.Cleanup` 里写库)在 `db` 包另有十余处,本次只修了被实证触发的那一处。
|
||
|
||
### 流量
|
||
|
||
#### 新增的功能
|
||
|
||
- **流量列表新增「清空全部」**:一次删除全部流量记录,忽略当前筛选条件,并额外清理索引已不再记录的历史 host 目录,不留残余。清空后顺带做一次全量压实(`optimize` + `VACUUM` + `wal_checkpoint(TRUNCATE)`),把索引占用的磁盘空间还给系统,完成后提示实际释放了多少。已绑定到漏洞的流量证据保存在独立的证据库中,不受影响。空库上的 `VACUUM` 几乎没有成本,因此这同时是**已有实例把索引库转成增量回收模式的途径**——清空一次之后,日常按 host 删除就能自行回收空间了。
|
||
|
||
#### 修复的问题
|
||
|
||
- **修复删除流量后磁盘空间不被释放**:删除只让数据不可见,空间一直留在索引文件里。SQLite 删行仅把页挂到 freelist,而索引库建库时没有启用 `auto_vacuum`,文件永不收缩;同时 `ex_fts` 是 `contentless_delete` 全文索引,`DELETE` 只写 tombstone 而不回收原 postings,不合并就永久累积——删流量反而让索引变大。由于 256KB 以下的正文全部内联在这个库里,加上 trigram 索引约为正文体积的 2 倍,抓包量大的实例会为早已删掉的流量长期占用数倍磁盘(实测抓 6MB 正文 → 索引 16MB,删光后仍是 16MB)。现在新建索引库直接启用 `auto_vacuum=incremental`,每次删除提交后在后台分块执行「全文索引增量合并 + `incremental_vacuum` + `wal_checkpoint(TRUNCATE)`」,逐步把空间还给操作系统(同一场景删除后回落到 104KB)。回收分块进行并在块间释放写锁,不阻塞流量录制;进程退出时立即让出,剩余工作在下次删除时续做。
|
||
|
||
> 升级说明:`auto_vacuum` 只能在建库时设定,因此**已有实例的索引库仍是旧模式**,`incremental_vacuum` 在其上是空操作——启动时会打印一行提示。这类库升级后 tombstone 的持续增长已经止住(全文索引合并照常执行),而已占用的体积用流量列表的「清空全部」回收一次即可——那一步会把库转成增量回收模式,此后日常删除自行生效。
|
||
|
||
### 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 用量正确归因到对应探索(此前完全记不到)。
|
||
|
||
### 发现
|
||
|
||
#### 修复的问题
|
||
|
||
- **修复「按资产」视图资产列表溢出后没有滚动条**:左侧资产树本已套了滚动容器,但外层卡片只给了 `max-height` 而没有确定高度,滚动视口靠 `height:100%` 解析不出高度(CSS 中只设 `max-height`、`height` 仍为 `auto` 时百分比高度不生效),于是资产多时列表要么撑破卡片、要么被截断且无法滚动。现将高度上限直接落到资产树的原生滚动容器上(`overflow-y-auto` + `max-h`,随窗口高度自适应),资产少时卡片随内容收缩、资产多时封顶并出滚动条。
|
||
|
||
## [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
|