pphua
|
d3183dbbd2
|
feat(tasks): add templates findings workflows and batch controls
|
2026-08-21 21:01:39 +08:00 |
|
pphua
|
b7e0b93023
|
init
|
2026-08-21 11:16:19 +08:00 |
|
pphua
|
9793b522d9
|
feat(tasks): add inherited context and resilient LLM execution
Add read-only task context inheritance, ordered task-level LLM failover, live Worker controls, cascading task cleanup, FIFO task concurrency, cancellation diagnostics, UI updates, tests, build script, and changelog.
|
2026-08-20 18:34:24 +08:00 |
|
Autumn-27
|
7090b034f8
|
refactor(ui): LLM 页改为配置卡片列表 + 抽屉编辑,新增轮询配置入口
原来是「上边轮询卡片 + 下边左列表右详情」的分栏布局,详情区常驻占掉三分之二
版面。改为:
- 页面主体 = 模型配置卡片网格,点卡片打开右侧抽屉编辑/测试/保存
- 卡片右上角显示该配置是否正常:未配置 Key / 正常 / 异常·失败 N 次 /
已熔断·冷却 xx,悬停出具体错误
- 工具栏「新建」左边加「轮询配置」入口,抽屉里放开关、兜底开关、实际链路
顺序、熔断状态与恢复操作;开启时按钮上带「已开启」徽章
新建与编辑合用同一个抽屉(profile === null 即新建)。原先新建是 Dialog、编辑
是常驻表单,两份几乎完全相同的表单代码约 150 行,加字段得改两处——现在只有
一份 ProfileSheet。
抽屉的开关状态与内容状态分开存(editOpen / editing):否则关闭动画那 200ms
里标题会从「编辑 XX」闪成「新建模型配置」。
卡片上的优先级/不参与轮询只在轮询开启时才显示——关着时这两个字段没有意义,
不占版面。
注:卡片的「正常」是排除法得出的弱信号(填了 Key 且轮询没记录到它失败过),
不是主动探测——从未被调用过的错误配置也会显示正常。
|
2026-08-19 11:25:45 -04:00 |
|
Autumn-27
|
c436b9d7d8
|
fix(update): Docker 更新只拉 artex 镜像,不动 postgres
postgres 固定 16-alpine 无需跟着升级,pull/up 带上服务名即可;artex 声明了
depends_on postgres,pg 没起会自动拉起,已在跑的不重建。
|
2026-08-19 11:12:26 -04:00 |
|
Autumn-27
|
ca2c5e45a9
|
feat(ui): 对话输入框 Enter 换行,Ctrl/Cmd+Enter 发送
会话界面共享 Composer 与任务详情主 Agent 输入框统一改为回车换行,避免长消息
误发。任务详情原本是单行 Input(根本无法换行),换成 Textarea 并对齐 Composer
的自动增高样式(rows=1 + max-h-40)。
|
2026-08-19 11:12:21 -04:00 |
|
Autumn-27
|
0c653a2135
|
feat(llm): LLM 配置轮询(故障转移),某个配置没额度/失效时自动切下一个
默认关闭。开启后「未指定模型」的 agent 在当前配置不可用(402 余额不足 /
401 key 失效 / 429 限流 / 5xx)时自动切到下一个配置;agent 绑定或任务 pin
了配置的默认不轮询(绑定即独占,可由 llm_pool_bind_fallback 打开兜底)。
链序 = 激活配置 + 其余按 priority DESC,排除 pool_exclude 的。只给
llm_profiles 加两列,不引入关联表,所以 agents/tasks/conversations 对
llm_profile_id 的四处引用一行未改。
核心约束:只在本次调用尚未 yield 出任何事件时切换成员。已经吐出
text_delta / tool_use_start 后中途断流一律原样上抛(交给 agentcore 的
resume),否则重发同一 request 会重复输出、污染会话历史。SDK 的 doStream
保证 4xx/5xx 在读 body 前返回,所以目标场景都落在这个安全窗口内。
context.Canceled / DeadlineExceeded 绝不触发切换——那是用户取消或任务
超时,误判会白烧备用 key 并污染 a6bd180 的终止原因诊断。400 也不切
(请求本身有问题,换模型结果一样)。
熔断:402/401/403/404 一次即熔断,429/5xx/网络错误连续 3 次;冷却
60s→5min→30min 退避,到期半开试探,成功清零。Registry 是进程级的,独立
于 provider 缓存,重建链路不丢状态,且全进程共享(A 任务撞见的 402,B 任务
立刻知道)。状态旁路落库,重启只恢复尚未到期的冷却窗口。
上下文窗口装不下当前请求的成员直接跳过(必然 400),不把主力模型的窗口
压到全链最小值。全员熔断时仍探链首,不让引擎停摆。
Pool 包在 llmrec 外面、每个成员自带 recorder,失败调用会以 status=error
+ 正确的 profile 名进 llm_records;切换/熔断走 log.Printf,自动出现在
系统日志页。
顺带修两个既有问题:
- DecomposeGoals 原本自己 NewProvider(),绕过限速器/录制/轮询,且每个
任务新建一个实例——改为由 server 传入共享 provider
- saveLLMConfig 会把 priority/pool_exclude 重置为零值
前端:LLM 页新增轮询卡片(总开关/兜底开关/实际链路顺序/健康徽章/冷却
倒计时/立即恢复),配置编辑区加优先级与「不参与轮询」。
只有一个配置时链长度为 1,poolChain 返回 nil 走裸 provider,行为与开关
打开前完全一致。设计见 docs/LLM轮询设计.md。
|
2026-08-19 11:07:53 -04:00 |
|
Autumn-27
|
89c5e9b26f
|
fix(mock): intentsPage 返回分页格式,修复 worker 列表为空
handler 对 /exploration/intents 只返回裸数组,intentsPage 带
?page= 参数时期望 {items, has_more} 形状,r.items 取到 undefined
导致 mock 模式下 worker 会话列表始终为空。
|
2026-08-19 11:05:09 -04:00 |
|
Autumn-27
|
4f7c1a199d
|
feat(tasks): 删除任务可选连带删除资产/漏洞/流量/文件(默认不选)
删除弹窗新增四个默认不勾的复选框:
- 删除关联的资产:仅删本任务独有资产,与其他任务共享的仅解除关联(保留)。
- 删除发现的漏洞:删本任务全部 findings。
- 删除测试的流量:按本任务资产的 host 清录制流量(host 无任务标签,会连带清
其他任务命中同一 host 的流量)。
- 删除测试过程中写的文件:删 <workDir>/tasks/<id> 目录(worker 产物 + 上传)。
- db: AssetStore.DeleteByTaskID(独有删+共享解关联)/HostsByTask;DeleteFindingsByTask。
- server: pgDeleteTask 读可选 JSON body {assets,findings,traffic,files},先按 host
清流量(需在删资产前取 host)→删漏洞→删资产→删任务→删文件目录;空 body=只删任务。
- web: api.deleteTask(id,opts);删除弹窗四复选框(默认不选)+说明。
go build/vet、tsc 通过;新增 TestDeleteByTaskID(独有删/共享解关联/host 反查)。
|
2026-08-19 10:40:19 -04:00 |
|
Autumn-27
|
2aeb2e49da
|
fix(ui): 删除确认弹窗长文本溢出(break-words + break-all)
任务/漏洞名称含长 URL、路径等无空格断点的长串时,弹窗描述不换行撑出边界。
给 AlertDialogDescription 加 break-words,用户内容包 span break-all 强制断行。
覆盖任务删除 + 三处漏洞删除弹窗。
|
2026-08-19 10:30:56 -04:00 |
|
Autumn-27
|
90030051ce
|
feat(findings): 漏洞删除功能(二次确认)
- db: DeleteFinding(id) 删 findings 行 + 来源探索节点(kind='finding'),
级联清理 edges/node_assets、置空 activity 引用;返回受影响行数。
- server: DELETE /api/exploration/findings/{id}。
- web: api.deleteFinding;三处均可删且带 AlertDialog 二次确认——
发现列表页独立「操作」列(每行垃圾桶按钮)、漏洞详情页头部删除按钮、
任务详情·发现 Tab 展开区删除按钮。两处列表同源,删一次全部消失。
- 测试 TestDeleteFinding:findings 行 + 来源节点均被删,重复删返回(0,nil)。
go build/vet、tsc 通过。
|
2026-08-19 10:28:06 -04:00 |
|
Autumn-27
|
8047bb7aca
|
feat(tasks): 任务并发上限(可选,超限排队自动补位)
任务页新建任务左侧加「并发设置」齿轮:开关(默认关) + 并发数量(开启默认5)。
开启后新建任务若「运行中」数已达上限,进入「排队中」不启动;有空位时后台
每 5s 自动把最早排队的任务补位启动。
- db: tasks 加持久化 queued 列(schema + ALTER 补旧库);Task.Queued/SetQueued。
- manager: ConcurrencyLimit/SetConcurrency(settings KV);SetTaskQueued(落库+同步内存)。
- 准入与促进器(goals.go):launchTask 统一准入,满则挂起排队;抽出 startTaskEngine
复用;occupiesSlot/runningTaskCount/queueIfAtCapacity;reconcileConcurrency 每
scheduler tick 补位(关闭则放行全部排队),concMu 串行化防超发;启动重载/setActive/
reviveTask 三处'排队则不启动'门。
- settings: /api/settings 增 task_concurrency_enabled/limit;PUT 后立即协调一次。
- web: 齿轮 Dialog(Switch+数量);新增 queued/「排队中」状态(类型/状态色/筛选)。
- 超限只排队新任务,不打断在跑的;排队任务不消耗 LLM(目标拆解推迟到出队)。
go build/vet、tsc 通过;DB queued 往返测试通过。
|
2026-08-19 10:05:01 -04:00 |
|
Autumn-27
|
a6bd18050c
|
feat(agent): 诊断 run 取消/终止原因,取代笼统的中断提示
- 新增 AbortCause(cancelcause.go):各取消点用 WithCancelCause/WithTimeoutCause
附上原因(暂停/删除/kill_work/目标达成/drain 兜底/聊天停止/进程关闭/硬超时…),
captureRun 用 context.Cause 还原出到底是谁、为何取消。
- 新增 terminalreason.go:把终端状态转成可读的一行摘要 + 多行详情(取消原因、
终止 reason、轮数、卡住的工具),替换原来固定那句猜测式提示。
- engine/worker/planner/capture 及 conversations/orchestration/server 接入;
cmd/artex/main.go、前端 llm/main-content 相应调整。
- 配套测试 terminalreason_test.go / engine_cancelcause_test.go。
|
2026-08-19 09:20:10 -04:00 |
|
Autumn-27
|
8e9b126972
|
feat(assets): 任务/企业资产列表改服务端分页,去掉 50 条上限
- db: QueryByTask/QueryByCompany 加 offset 参数,limit<=0 不再兜底成
50/200 而是不限量;新增 CountByTask/CountByCompany/CountsByTypeForTask;
抽出共享 pageClause 与 scanTypeCounts。
- server: /assets 的 task_id/company_id 分支改用真实 total(不再是
len(assets));/assets/counts 支持 ?task_id= 返回按类型计数。
- web: taskAssets(taskId,type,limit,offset) 返回 {assets,total};
assetCounts(taskId?);assets-tab 改为只取当前分类当前页,分类徽章走
counts 接口,分页器 100/200 真正可用,轮询变轻。
- 补 TestQueryByTaskPaging/TestQueryByCompanyPaging 回归(60 条 25/页翻页
不重不漏)。
|
2026-08-19 09:17:13 -04:00 |
|
Autumn-27
|
5244500fee
|
fix(scheduler): 事件水位每 tick 都推进,避免新建触发器回放历史
原来 fire{Findings,Goals,TaskTimeouts,TaskCreates,ToolCalls} 在没有
对应触发器时直接 return,不推进水位。于是水位会一直停在旧值;等用户
新建/启用触发器(如预置的 reporter on_tool_call),下一个 tick 就把
水位之后的全部历史事件当成新事件触发一遍(逐条唤起 reporter 写报告)。
改为:即便当前没有对应触发器,也照常把水位推进到最新(静默消费),
触发动作只在存在触发器时执行。这样触发器只对启用之后出现的事件生效,
不再回放历史。goal 用 fired-set 同理:无触发器时也标记为已消费。
|
2026-08-19 09:17:04 -04:00 |
|
Autumn-27
|
e67ff26e90
|
fix(mock): 补全发现页今日改动的 demo 数据
- findingStats 返回 tasks(按任务筛选下拉);findingsPage 支持 task_id 过滤
- PATCH finding 支持改 name/vulnclass(行内编辑)
- 给 f-1/f-17 补详细报告 Markdown,行内看报告在 demo 里可见(3 条)
|
2026-08-18 13:33:04 -04:00 |
|
Autumn-27
|
d9474814b5
|
feat: 发现页支持按任务筛选/行内看报告与改名称类别严重度;任务列表输入去卡顿
- 发现列表新增「按任务」下拉(有漏洞的任务+条数),task_id 下推 SQL 筛选
- 展开行懒加载并渲染详细报告(Markdown),修 table 溢出:table-fixed +
whitespace-normal + break-words + pre 换行
- 展开行前置「名称/类别/严重等级」可编辑并保存:patchFinding 增 name/vulnclass,
DB 抽 setFindingCol 同步节点 payload
- 详情页状态区加「漏洞 ID」,列表证据行去掉裸 id
- 任务新建表单拆出独立组件消除输入卡顿;轮询 3s→10s+去重,时长 tick 仅 running 时跑
|
2026-08-18 13:27:46 -04:00 |
|
Autumn-27
|
24a94cf8e5
|
perf: 探索图减少卡顿(数据未变不重建 + 只渲染可见节点)
- graph-tab:轮询按签名判重,图数据无变化时跳过 setState,避免整图重建;
拖动不再被 20s 轮询打断
- ExplorationGraph:ReactFlow 加 onlyRenderVisibleElements,屏幕外节点不渲染
|
2026-08-18 13:18:32 -04:00 |
|
Autumn-27
|
08cdac2362
|
tweak: 任务图谱轮询间隔 3s → 20s
|
2026-08-18 13:16:32 -04:00 |
|
Autumn-27
|
fcc1e75a85
|
refactor: 抽出共享 ExplorationGraph 画布,漏洞链路图改用 React Flow
- 新增 components/exploration-graph.tsx:把任务图谱 Tab 的 React Flow 渲染
(节点卡片/自动分层布局/连线/小地图/图例/点击抽屉)整体抽成 <ExplorationGraph
nodes edges> 复用组件,取 {nodes,edges} 作为 props
- graph-tab.tsx 精简为纯取数(轮询 explorationGraph)+ 复用该画布
- 漏洞详情「链路图」Tab 改用同一画布渲染 lineage 子图(从初始节点到漏洞节点),
与任务攻击链路图完全一致的观感;之前的纵向卡片版删除
纯前端重构,后端 lineage 接口不变。tsc 通过(tasks/page.tsx 的既有报错与本次无关)。
|
2026-08-18 13:13:48 -04:00 |
|
Autumn-27
|
b741ee176c
|
feat: 漏洞详情页删除证据/元数据 Tab,新增「链路图」
链路图展示该漏洞所属任务探索图里,从初始节点(任务根)追溯到本漏洞节点的
那条链路:漏洞节点 + 其全部祖先(沿边反向可达)+ 之间的关系边。
- db.ExplorationStore.FindingLineage(nodeID):递归 CTE 取祖先子图(节点+边),
下游(如 finding→proves→goal)与无关节点不纳入
- GET /api/exploration/findings/{id}/lineage:解析 finding 的 node_id/task_id →
返回 {nodes,edges};无节点/任务已删 → 空图
- 前端 api.findingLineage;详情页 Tab 改为「概览 / 链路图」
- lineage.tsx:按深度拓扑排序,自根到漏洞纵向展示节点卡片 + 入边关系标注,
漏洞节点高亮
- db 测试补 FindingLineage 断言(含祖先/排除下游 goal/排除无关意图)
go build / db / server 测试通过。
|
2026-08-18 13:08:03 -04:00 |
|
Autumn-27
|
33714a5ff0
|
feat: 任务发现 Tab 的漏洞行支持跳转到漏洞详情页
每条发现行(finding_id 存在时)加「详情」链接 → /function/findings/detail?id=<finding_id>。
finding_id 由 per-task DTO 经 node_id 关联独立 findings 行填充。
|
2026-08-18 12:50:36 -04:00 |
|
Autumn-27
|
57114a2994
|
feat: 触发器支持编辑(前端补齐,后端早已支持 PATCH)
触发器 Tab 之前只能新增/删除/启停。改造「新增」表单为「新增/编辑」双模式:
- 每条触发器加「编辑」按钮 → 灌入表单进入编辑态(高亮该行),改完点「保存修改」
调 api.updateTrigger;可「取消编辑」
- 编辑时保留该触发器原有启用状态;删除正在编辑的触发器会自动退出编辑态
后端 PATCH /api/triggers/{id} 与 api.updateTrigger 早已存在,本次仅补前端 UI。
|
2026-08-18 12:38:14 -04:00 |
|
Autumn-27
|
87221be586
|
tweak: reporter 触发运行策略默认改为 parallel + merge=none
一漏洞一报告:多个 finding 并发各写各的,避免串行排队积压。
merge 设 none(而非默认 all)——否则一波 finding 会被合并成一次运行,并行失效;
maxParallel=5 限制同时的报告会话数。
|
2026-08-18 12:27:26 -04:00 |
|
Autumn-27
|
05874da129
|
tweak: reporter 报告模板将「证据」与「PoC」拆成两节
- 证据:证明漏洞真实存在的请求/响应/命令输出/回显,贴原文
- PoC:可运行/复用的利用代码或 payload,通常以代码块给出完整代码 + 运行说明
|
2026-08-18 12:20:53 -04:00 |
|
Autumn-27
|
6cad678699
|
feat: 预置「报告撰写」自定义 agent,发现漏洞时自动写详细报告
- 新增 host 工具 update_finding_report(finding_id, report):按 node_id 写
findings.report(任务无关,无需 task 上下文);get_task_node_detail(task_id, id)
读取漏洞完整证据/PoC。均注册进 orchestrationTools。
- promptcatalog 新增 ReporterDefaultPrompt:详述报告应含的结构(概述/影响/
受影响范围/复现步骤/证据PoC/根因/修复建议)与只据实证撰写的纪律。
- seedReporterAgent(一次性,flag 守卫):预置 builtin=false 的自定义 agent
「报告撰写」(reporter),UI 可编辑/删除;绑定 update_finding_report + 任务
查询工具(node_detail/worker_trace/findings/graph);建 on_tool_call 触发器
(tool_names=[report_finding]) —— 每登记漏洞即唤起它写报告并回写。
- 移除上一提交里绑到 worker/planner/mainagent 的 in-task update_finding_report
工具及 ExplorationStore 包装(触发态是会话上下文,须用 host 工具);保留
db.SetFindingReportByNodeID;新增 ToolSet.NodeDetailTool 访问器。
go build / agent / server 测试通过。reporter 为自定义 agent,不影响内置 agent 计数。
|
2026-08-18 12:19:14 -04:00 |
|
Autumn-27
|
c0ac501c4b
|
feat: 新增 update_finding_report 工具,写入漏洞 report 字段
- 新增 agent 写工具 update_finding_report(finding_id + report[Markdown]),
整段覆盖该漏洞的详细报告;finding_id 传 report_finding 返回的 id
- 绑定 worker / planner / mainagent 三个 agent,经 BuiltinToolSeeds 自动入
tools 目录(首插不覆盖,旧库升级重启即出现,可在 UI 管理/勾选)
- db.SetFindingReportByNodeID / ExplorationStore.SetFindingReport:按 finding
节点 id 更新独立 findings 行的 report
- 详情页概览已渲染 report,写入后即可展示
go build / agent / server 测试通过。
|
2026-08-18 11:56:43 -04:00 |
|
Autumn-27
|
8092167ae5
|
feat: finding 增加详细报告字段 report(Markdown),详情页证据下方渲染
- findings 表加 report 列(TEXT 默认空,schema + ALTER 补旧库)
- 仅 GetFinding 查 report,列表/分页不带以免 payload 膨胀;FindingDTO.report omitempty
- 详情页「概览」证据卡下方新增「详细报告」卡,复用 <Markdown> 组件渲染,空时占位提示
- 前端 Finding.report? 类型;mock 单条 GET 返回 report、列表剥掉,并给 f-12 加示例报告
- 字段先留空,后续由写入方填充;db 测试补 report 往返断言
next build 通过。
|
2026-08-18 11:52:34 -04:00 |
|
Autumn-27
|
64d9c66f6a
|
feat: 新增发现详情页(多 Tab + 状态区可改严重度/处置状态)
详情页 /function/findings/detail?id=<finding_id>:
- 概览 Tab:左栏摘要 + 证据/PoC,右栏状态区(严重等级、漏洞类型、涉及资产、处理状态、所属任务、发现时间)
- 严重等级与处理状态用下拉,选择后直接调后端接口即时修正
- 另有「证据/PoC」「元数据」两个 Tab
- 发现列表页漏洞名称改为链接进入详情
后端:
- GET /api/exploration/findings/{id} 取单条(含资产解析)
- PATCH /api/exploration/findings/{id} 扩展为部分更新 {status?, severity?}
- db.GetFinding / db.SetFindingSeverity(同步探索节点 payload,保持任务内视图一致)
- db.ValidSeverity 白名单;api 增加 getFinding / setFindingSeverity
- mock 支持单条 GET / PATCH,并回填 finding_id 供 demo 链接
db 测试补充 GetFinding / SetFindingSeverity 往返断言;next build 通过。
|
2026-08-18 11:43:50 -04:00 |
|
Autumn-27
|
c69534e09b
|
tweak: 引擎停滞判定阈值 60s → 120s
stalled 判据(在跑、无在执行意图、planner/worker 静默)的静默时长从 60 秒放宽到 120 秒。
|
2026-08-18 11:31:42 -04:00 |
|
Autumn-27
|
82c6d4a06b
|
feat: 顶栏显示后端应用版本号
后端 /api/health 返回 BuildVersion(由 ldflags 注入的 main.version),
前端顶栏设置按钮左侧展示 v<版本>。
|
2026-08-18 11:27:01 -04:00 |
|
Autumn-27
|
ff3d41ea35
|
feat: 漏洞新增 severity=critical(严重) 与 name(漏洞名称)字段
severity 严重级:
- report_finding 工具 severity 说明改为 critical|high|medium|low
- DB 排序 CASE、report 报告 sevRank、FindingStats 增加 critical
- 前端 Severity 类型、status.ts 新增 rose 色调(实心高强调,视觉高于高危)、
发现页严重度筛选/统计卡、任务发现 Tab 排序、dashboard 汇总均加入严重
name 漏洞名称:
- findings 表加 name 列(schema + ALTER TABLE ADD COLUMN IF NOT EXISTS 补旧库)
- report_finding 工具新增 name 入参(非必填),写入 node payload 与独立 findings 行
- DBFinding/AddFinding/AddStandaloneFinding、FindingDTO、findingPayload、report 全链路透传
- 发现列表页与任务发现 Tab 展示 name,为空时回退 vulnclass;vulnclass 移到展开详情「类型」
- report 报告标题优先 name,回退 vulnclass
无 CHECK 约束,旧库仅需补 name 列;critical/name 均向后兼容。
db 测试补充 critical 排序/统计与 name 往返断言。
|
2026-08-18 11:21:08 -04:00 |
|
Autumn-27
|
7b3eec2166
|
feat: 发现处置状态扩展为 8 个
在 待处理/误报/忽略/已处理 基础上新增:
- in_progress 处理中(已受理、修复/验证中)
- confirmed 已确认(真实漏洞未修复)
- duplicate 重复
- risk_accepted 风险接受(确认存在但业务接受)
改动:db 常量 + ValidFindingStatus 白名单、schema 注释、status.ts 色板/文案、
types.ts 联合类型、两处下拉的 FINDING_STATUSES(下拉与状态筛选自动带出)。
状态无 CHECK 约束,旧库无需迁移。
|
2026-08-18 10:37:13 -04:00 |
|
Autumn-27
|
58a277e2d1
|
fix: 发现状态下拉点不动(item-aligned 快速点击即闭合)
行内状态 Select 用组件默认 position="item-aligned",会把当前选中项铺在触发器上,
在 h-7 小触发器上按下即打开、抬起时正好落在当前项 → 瞬间又选中同值并关闭,表现为点不动。
改用 position="popper" align="end",下拉浮在触发器下方,不覆盖触发器。
|
2026-08-18 10:11:23 -04:00 |
|
Autumn-27
|
30dc09ae08
|
feat: 发现列表改为服务端分页 + 全表聚合(去掉 500 上限)
- db.ListFindingsPage:WHERE(严重度/状态/类型)+ ORDER BY(严重度 CASE 或时间)+ LIMIT/OFFSET,返回当前页与匹配总数
- db.FindingStats:全表 COUNT FILTER 聚合(总数/待处理/高/中/低)+ DISTINCT 漏洞类型,供统计卡与类型下拉,不受分页影响
- GET /api/exploration/findings 带 page/limit → 分页对象{items,total,page,page_size};不带 → 保留裸数组(dashboard 汇总,与 intents 端点兼容策略一致)
- 新增 GET /api/exploration/findings/stats
- 筛选/排序全部下推到 SQL,前端不再一次拉全量再本地切片
- 资产按当前页所需批量解析;per-task 视图经 node_id 关联独立行,复用同一状态并补齐绑定资产
- 前端:发现页改为服务端驱动分页/筛选/排序,统计卡与类型下拉走 stats 接口
- db 层加 findings 分页/筛选/聚合测试(隔离标记 vulnclass,自清理)
|
2026-08-18 10:05:18 -04:00 |
|
Autumn-27
|
05f0b69469
|
feat: finding 增加处置状态(待处理/误报/忽略/已处理)+ 发现列表页改版
- findings 表新增 status 列(默认 pending),schema.sql 同步 ALTER TABLE 补旧库
- 新增 PATCH /api/exploration/findings/{id} 更新处置状态,server 侧白名单校验
- FindingDTO 增加 status/finding_id/assets(后端预渲染资产 label)
- 任务内发现节点通过 node_id 关联独立 findings 行,复用同一处置状态
- 发现列表页:漏洞名称(类型主 + 摘要小字)、新增资产列与状态列(可下拉修改)、状态筛选与待处理统计
- 任务详情发现 Tab 同步展示/编辑处置状态与绑定资产
|
2026-08-18 09:46:46 -04:00 |
|
Autumn-27
|
c588dd67ae
|
feat: 删除任务增加二次确认弹窗
任务列表的删除按钮改为 AlertDialog 二次确认(与对话删除交互一致),
确认后才调用 api.deleteTask。
|
2026-08-18 09:30:13 -04:00 |
|
Autumn-27
|
d901543aba
|
fix: 修复覆盖图谱卸载竞态导致的 g6 崩溃(getTransformInstance)
d3-force 力导向布局是异步多帧模拟。布局未跑完就切走图谱标签→组件卸载
graph.destroy() 把 context 清空,飞行中的布局落地时 transformDataAfterLayout
读 context.transform.getTransformInstance() → undefined 崩溃。
- applyData 渲染前判 graph.destroyed;render() 挂 .catch 吞掉 teardown 竞态的
拒绝(已销毁静默,未销毁仍打日志),不再冒泡成运行时错误。
- 卸载先 stopLayout() 再 destroy(),缩短竞态窗口。
|
2026-08-18 09:15:42 -04:00 |
|
Autumn-27
|
3633ae78f4
|
feat: 任务总览页顶部展示原始任务描述与目标
创建时填写的描述/目标此前在总览页看不到,加一张置顶卡片左右两栏展示
(whitespace-pre-wrap 保留换行,空值显示 —),数据复用已有 task 状态。
|
2026-08-18 09:15:42 -04:00 |
|
Autumn-27
|
6a5e7c1b84
|
feat: 新建任务改为右侧抽屉(45%宽)+ 支持上传文件写入描述
- 表单从居中弹窗(Dialog)换成右侧 Sheet,宽 45vw(窄屏全宽),整屏高度可
滚动,长表单不再受弹窗高度限制;头/脚固定、中间字段区独立滚动。
- 高级参数(超时/心跳/首个意图)收进「高级设置」Collapsible 折叠,常用路径
只露 描述/目标/LLM;描述与目标 textarea 加高(min-h-32)。
- 描述下方加「上传文件」组件(可多选):建任务前任务无 ID,新增上传
scope=staging,文件落到 <workDir>/drafts/<draftId>/uploads/,后端返回绝对
路径(chatAttachment.Abs),前端把绝对路径以提示词形式追加到描述末尾,供
worker 用 Read/Bash 打开;再次上传追加到同一标记块。draftId 用
crypto.randomUUID(非安全上下文降级),创建成功后清空。
|
2026-08-18 09:01:56 -04:00 |
|
Autumn-27
|
683f5ee684
|
feat: 独立对话(ChatAgent)也支持文件上传(方式1:落盘 + Read/Bash 读取)
补齐上次只做了任务主 Agent 的遗留:独立对话面此前只共用了 transcript 渲染,
后端注入 + Composer 上传缺失,现补上。
- 后端(pgSendConversationMessage):收 attachments;用 userActivityWithAttachments
存 {text,attachments} JSON 供卡片渲染(无附件仍存全文 Detail 供懒加载);用
composeAgentMessage 把【绝对路径】清单拼进发给 ChatAgent 的消息,baseDir=
<workDir>/sessions/conv-<id>/,与 chatUpload 落盘、chat.go 的 sessionWorkDir 对齐;
纯附件无文本也可发,首条会话名兜底"附件消息"。
- 前端(chat/page.tsx):Composer 加回形针上传按钮 + 附件 chip 预览(可移除);
ChatView 上传到 scope=session&id=conv-<id> 并带附件发送;DraftChat 草稿态没有
会话 id,点回形针先懒创建会话再上传,交接文本+附件给 ChatView 发送。
- api.sendConversationMessage 增加 attachments 参数。
|
2026-08-18 07:55:18 -04:00 |
|
Autumn-27
|
071414063e
|
feat: 主 Agent 对话支持文件上传(方式1:落盘 + Read/Bash 读取)
- 前置:task 工作目录 <workDir>/<taskID> → <workDir>/tasks/<taskID>(改中心
ensureRunDir,与 sessions/<id> 对称;三 agent 全走它)。
- 上传接口(方案B,一个/两 scope):POST /api/chat/upload?scope=task|session&id=X,
落到 tasks|sessions/<id>/uploads/,路径安全化 + 同名加序号,返回 {name,path,size}。
- 后端注入(task main agent):chat handler 收 attachments;user 活动 Detail 存
{text,attachments} JSON 供消息渲染;发给 agent 的清单用【绝对路径】(baseDir+相对,
与落盘/CWD 完全对齐)保证一定 Read 得到。
- 前端(会话与任务共用 transcript 渲染):
· api.chatUpload + chat(attachments) + ChatAttachment 类型;
· transcript UserRow 解析 Detail JSON,气泡上方渲染附件卡片(乐观回显内联 detail);
· sessions-tab 输入区加回形针上传按钮 + 发送前 chip 预览(可移除)+ 带附件发送。
- 说明:文本/代码/二进制经 Read/Bash 处理;图片视觉不支持(norma 无 image block)。
会话(ChatAgent)面暂只共用了渲染,后端注入 + Composer 上传待后续补。
|
2026-08-17 11:10:03 -04:00 |
|
Autumn-27
|
6348ec9d21
|
feat: 拦截规则 allow/deny 命中也进审批记录(三种 action 全可观测)
此前只有 ask 命中会写 intercept_pending(审批记录);deny 直接拦下、allow 直接放行,
历史里查不到。现让三种 action 命中都留痕,便于观测:
- db: CreateDecidedIntercept —— 一条 insert 直接以最终状态(allowed/denied)落库并盖
decided_at(复用 intercept_pending 现有合法状态,无需 schema 迁移)。
- intercept: Interceptor.Log —— 非阻塞、best-effort 记录一次规则命中(DB 出错不影响
工具调用结果)。
- guard: deny 分支记 denied、显式 allow 规则命中记 allowed;无规则命中的放行不记,
避免全量刷屏。
前端零改动:审批记录/历史页(interceptHistory=全状态、interceptTask=全状态)本就渲染
allowed/denied/pending;pending 过滤仅用于审批按钮区。
|
2026-08-17 10:03:56 -04:00 |
|
Autumn-27
|
05eb7d2174
|
feat: 出错(blocked)意图可一键重跑 + 概览页按钮
worker 因 LLM 网络/连接等错误 model_error 收场、耗尽引擎层 2 次自动重试后意图标
blocked,此前无手动恢复入口。现支持一键重跑:置回 open→worker 重新认领、从头再跑
(已写回图谱的 fact/finding/asset 保留);任务若已终态/暂停会自动复活。
- db: ReopenIntent(blocked/exhausted/stopped→open)、ReopenBlockedIntents(批量 blocked→open)。
- server: resumeTaskForGoal 泛化为 reviveTask(set_goals 与重跑复用同一复活逻辑);
新增 POST /tasks/{id}/intents/{iid}/rerun 与 /tasks/{id}/intents/rerun-blocked,
reopen 后 reviveTask 确保 worker 循环存活并重认领。
- web: api.rerunIntent/rerunBlocked;概览页新增「被拦/出错意图」卡片,每条「重跑」+
顶部「全部重跑」,乐观更新 + 3s 轮询兜底。
|
2026-08-17 09:56:59 -04:00 |
|
Autumn-27
|
d9f28de704
|
feat: Preferences 默认 Page Layout 改为 Full Width、Sidebar Style 改为 Floating
|
2026-08-17 09:55:39 -04:00 |
|
Autumn-27
|
d9fd9de1d5
|
feat: 收尾默认轮数统一改为 10
|
2026-08-17 09:54:04 -04:00 |
|
Autumn-27
|
bf2410baee
|
feat: goal_met 默认不绑任何 agent + 去掉 planner 相关提示词
- goal_met 绕过逐个 prove_goal 直接宣布整个任务完成,权重大、有误判风险,又与
「prove_goal 标记最后一个目标→自动收官」重复,故默认不给任何 agent(仍入目录、
web 可见、可手动按需绑)。
- toolcatalog 新增 defaultUnbound 集合:goal_met seed 时绑定强制为空 [](保留在
PlannerTools base 里,手动绑回后运行时仍可用)。
- db 新增 RemoveAgentFromTool(agentKey,toolKey);server 新增一次性迁移
unbindGoalMetDefault(flag goal_met_unbind_default_v1)剥掉旧库 goal_met 的
planner 绑定,只剥 planner、不动用户手动加的其它绑定,flag 守卫故重启不重复。
- planner 提示词去掉两处 goal_met 引导(system 模板 + 每轮 input 结尾),保留
prove_goal 与自动收官说明。任务收官不受影响(prove_goal 自动置 GoalMet)。
|
2026-08-17 09:26:59 -04:00 |
|
Autumn-27
|
8e03043548
|
feat: 主 agent set_goals 加目标时给 planner 记「人新增了目标」触发(批量感知)
- 新增 TriggerEvent{Kind:"goal", Goals:[]string} + Task.NotifyGoal([]string):
一次 set_goals(不论单条/数组)合并成一条触发,planner 下轮开头据 len 渲染
「人新增了一个目标:X」或「人新增了 N 个目标:A;B;C」,不再靠翻 goals 列表发现。
- set_goals 工具:addOneGoal 退化为纯落库;唤醒/触发/复活挪到整批写完后统一做
(notifyGoal(addedTexts) 一次 + resumeTask 一次)。仅 mainagent 接 notifyGoal;
拆解器/worker 退回纯 notify,round-0 不受影响。
- 复活场景顺序仍成立:goal 触发先入队(终态门在 drain 之前不会吞),resumeTask
置 running 后那一轮才 drain 渲染。mainagent.Chat 加 notifyGoal 入参。
|
2026-08-17 09:12:25 -04:00 |
|
Autumn-27
|
3c81d3d248
|
feat(mock): 扩展攻击链路图 mock 数据——外网→DMZ→内网纵深完整杀伤链
探索图从 2 目标/5 意图扩展到 4 目标/14 意图/11 事实/9 漏洞,
覆盖 .git 泄露→Fastjson RCE→提权→内网发现→Jenkins 未授权→
Kerberoasting→psexec 域控 DC01 的完整多层攻击路径。
配套补齐 findings/activity/planner 复盘/mainagent 对话/
tokenWorkers/内网资产/流量/审计/拦截历史等数据。
|
2026-08-17 09:03:15 -04:00 |
|
Autumn-27
|
2ac176b96a
|
feat: set_goals 升级为受管领域工具(可 web 管理,默认绑 goals+mainagent)+ 主 agent 加目标复活任务
- set_goals 从目标拆解器内联提交工具,改为入 tools 目录的领域工具:直接写 goal 节点、
连任务根(RelSpawns)、notify 唤醒 planner;支持单条/批量;origin 按来源区分
(拆解器=goals、主 agent 运行时=human)。新 key 走 SeedTool 首插入,旧库无需迁移。
- 默认绑定 goals + mainagent:目录 seed 新增 goals 项并入 order,MainAgentTools 纳入;
DecomposeGoals 统一改用同一受管工具直接落库,createGoals 只保留无产出兜底。
- 主 agent 通过 set_goals 新增目标时,把终态(done/failed/timeout)/暂停的任务拉回
running 继续跑:新增 ToolSet.resumeTask 回调(仅 mainagent 接线),经 resumeTaskForGoal
置 running + engine.Run(幂等/重启后重起循环)+ 解除暂停。拆解器/worker 不触发。
- mainagent 提示词补充 set_goals 用法。
|
2026-08-17 09:01:19 -04:00 |
|