Autumn-27
|
ca7300ad52
|
feat(ui): 任务列表操作列增加详情与暂停/继续按钮
操作列此前只有删除,暂停/继续必须先勾选再点批量控制,进详情页只能点标题。
- 详情按钮用 Button asChild 包 Link,渲染为真正的 <a>,中键新开标签、
右键复制链接都可用
- 暂停/继续按钮按状态自动切换形态,调已有的 controlTask 接口,无需改后端;
终态任务渲染为 disabled 而非隐藏,各行操作列宽度才不会随状态跳动
- 状态门控与后端 applyTaskControlWithCause 对齐:非终态且未暂停可暂停
(即 created/queued/running),paused 可继续,不会给出后端会拒绝的动作
- 控制后清空 lastRef 再 load:列表轮询按负载去重,不清会把状态回写挡掉,
看起来像点了没反应;放在 finally 里是因为失败多为状态已变化,更需要重拉
- 批量控制原本自己写了一遍状态列表,改为与行内按钮共用 taskControlAction(),
避免将来新增状态时两边判断分歧
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:51:39 -04:00 |
|
Autumn-27
|
76c648d36d
|
fix(ui): 任务总览的测试范围显示企业名称而非 ID
/api/tasks/{id}/scope 只返回 company_id,前端无从解析名称,测试范围里的
企业行只能渲染成 "company #4"。
- TaskScope 增加 company_name,ListTaskScope 与 ListTaskScopeWithSources
都 LEFT JOIN companies 带出名称(LEFT 而非 INNER:域名/IP/网段行的
company_id 为 NULL,内连接会把它们全过滤掉)
- 两个查询函数都改,避免结构体字段"一个填一个不填"的不一致
- 前端优先显示名称,公司被删后的残留行仍以「企业 #N」兜底
覆盖图谱的企业节点本就查名显示(task_scope.go 的 BuildCoverageGraph),
不受影响。
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:43:08 -04:00 |
|
Autumn-27
|
f0c2b43802
|
Merge PR #42: 0.3.3 Worker/LLM/Agent/UI 增强
来自 @neouks 的 PR #42,外加本地的三个后续修改:
- fix(llm): Agent 绑定优先于任务 LLM 配置链
- feat(ui): 会话徽标改显示 LLM 配置名
- fix(scope): 含点号的文本不再被误判为 ICP 备案号
已知遗留(code review 确认,评估影响可控,后续单独处理):
- db/exploration.go CancelIntent 先数后删的并发竞态,会回滚并向用户报
"intent cleanup changed concurrently",不损坏数据
- db/assets.go company_source 优先级 CASE 在 8 处手写重复,改动易漏
- server/goals.go reconcileConcurrency 第二个 if 是死代码
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:26:43 -04:00 |
|
Autumn-27
|
fbddf1cfb5
|
fix(scope): 含点号的文本不再被误判为 ICP 备案号
单文本框自动分类只要文本里出现 "icp" 或 "备案" 子串就判定为 ICP 规则。
备案号本身不含点号(京ICP备12345678号-1),而 ICP 归属走的是精确相等比较
(companies.go 的 kind='icp' 归属查询),所以掺了域名或版本号的描述性文字
一旦被判成 ICP,就会存成一条永远匹配不上任何资产的死规则,且无任何提示。
分类条件增加"不含点号",半角 . 之外一并覆盖全角 .和中文句号 。——粘贴
中文内容时容易出现这两个,真实备案号里同样不会有。
已有的 "京 ICP备 123号"、"沪网备案 9988" 仍判定为 ICP,不受影响。
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:26:07 -04:00 |
|
Autumn-27
|
9b75afe9f1
|
feat(ui): 会话徽标改显示 LLM 配置名
会话标题右侧的徽标原本显示模型 ID,改为显示配置名称;模型 ID 移到 hover
的 tooltip 里,并去掉其中的协议名(openai/anthropic 等)。
- 抽出 resolutionLabel(),徽标、aria-label、tooltip 共用一处取名逻辑;
environment 来源的配置可能没有 name,按 name → model → 未命名配置 降级,
避免渲染出空徽标
- 去掉 font-mono:等宽字体是为模型 ID 准备的,配置名多为中文
- tooltip 用 filter(Boolean).join(" / ") 拼接,模型名缺失时不留孤立斜杠
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:18:07 -04:00 |
|
Autumn-27
|
adc8e3521d
|
fix(llm): Agent 绑定优先于任务 LLM 配置链
任务内各角色解析 LLM 的顺序由「任务链 → Agent 绑定 → 全局」改为
「Agent 绑定 → 任务链 → 全局」:显式绑定了模型的角色始终跑在该模型上,
未绑定的角色才落到任务链,任务链为空时再落到全局配置。
- 拆分 fallbackProviderForAgent 为 agentBindingProvider / globalProvider,
让三个层级可按新顺序自由组合
- current()、CompactionWindow()、taskRuntimeAvailable() 统一按新顺序解析;
taskRuntimeAvailable 改为逐角色判断,有可用绑定的角色在任务链耗尽时仍可运行
- resolveTaskRoleLLM(UI 展示)与前端 mock 同步对调,避免显示与实际调用不一致
保留两处既有语义:绑定/全局路径仍返回 profileID=0,不推进任务链故障转移
(绑定自身的转移仍由 poolForBinding + llm_pool_bind_fallback 负责);未绑定
角色遇到任务链耗尽仍是硬停止,不静默降级到全局。
Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
|
2026-08-22 06:14:18 -04:00 |
|
pphua
|
476a44577c
|
fix(build): avoid UPX Linux startup crashes
|
2026-08-22 14:52:01 +08:00 |
|
pphua
|
dfcf33f9f5
|
build: add compressed cross-platform release artifacts
|
2026-08-22 13:33:34 +08:00 |
|
pphua
|
d06047a937
|
Merge remote-tracking branch 'upstream/main' into codex/task-context-llm-worker-control
# Conflicts:
# CHANGELOG.md
# db/findings.go
# server/engine.go
# server/server.go
# web/src/app/(main)/chat/page.tsx
# web/src/app/(main)/dashboard/page.tsx
# web/src/app/(main)/function/findings/page.tsx
# web/src/app/(main)/function/tasks/detail/_tabs/sessions-tab.tsx
# web/src/app/(main)/function/tasks/page.tsx
# web/src/lib/api.ts
# web/src/lib/mock/data.ts
# web/src/lib/mock/handler.ts
# web/src/lib/types.ts
|
2026-08-22 00:06:21 +08:00 |
|
pphua
|
1bebdce7f1
|
feat: prepare 0.3.3 worker llm agent and ui enhancements
|
2026-08-21 23:55:43 +08:00 |
|
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 |
|
Autumn-27
|
63859faf3d
|
docs(changelog): 修正 0.3.2 贡献者为 @neouks
上一条把贡献者误写成 git 本地作者名 pphua;该提交经 PR 合入,
GitHub 作者实为 @neouks,更正之。
Claude-Session: https://claude.ai/code/session_01RVrPtpngE9T9DRJHosf6MB
|
2026-08-20 13:22:42 -04:00 |
|
Autumn-27
|
12de72354e
|
docs(changelog): 定版 0.3.2 + 贡献者
Claude-Session: https://claude.ai/code/session_01RVrPtpngE9T9DRJHosf6MB
|
2026-08-20 13:21:15 -04:00 |
|
Autumn-27
|
0a55c144ea
|
fix(skills): 补提交漏 add 的 server/skill_usage.go
834e945 在 assembly.go 引入了 meterSkillTool 调用,却漏 add 定义它的新文件,
导致此后 origin/main 从干净 checkout 编译失败(undefined: meterSkillTool)。
补上该文件修复构建。
Claude-Session: https://claude.ai/code/session_01RVrPtpngE9T9DRJHosf6MB
|
2026-08-20 13:17:38 -04:00 |
|
Autumn-27
|
39c540edfc
|
fix(chat): 打开主 Agent 会话默认贴底并完整显示最后一条
最后一条 final answer 的完整内容是懒加载(AnswerBlock useInView+fetchDetail),
在 activity 数组稳定后才撑开高度,而滚动 layout effect 只依赖 activity 引用、
不会因高度变化重触发,导致打开后最后一条被顶到屏幕外。新增 ResizeObserver 观测
transcript 容器:用户仍贴底时,任何高度变化(transcript 挂载/详情展开/markdown 撑高)
都重新贴底;手动上滚则不再拽回。planner/worker 会话同样受益。
Claude-Session: https://claude.ai/code/session_01RVrPtpngE9T9DRJHosf6MB
|
2026-08-20 13:17:38 -04:00 |
|
Autumn-27
|
a98081eea9
|
feat(agent): worker 单次 run 墙钟默认 600→1200
改默认不动存量行:CREATE 列默认 + 幂等 ALTER COLUMN SET DEFAULT
补旧库列默认(仅影响将来新插入)、seedBuiltins 种子默认、运行时兜底同步 1200。
旧库存量 agent 行保持原值不变。
Claude-Session: https://claude.ai/code/session_01Qx86izpr6f5R53DW864bPB
|
2026-08-20 13:17:24 -04:00 |
|
Autumn-27
|
0fc63ad94e
|
fix(chat): 任务暂停不再拦截主 Agent 对话 + 移除乐观回显消除消息错乱
- 后端 chat 处理器去掉 IsPaused 的 409 拒绝(保留 IsDeleting):主 Agent
编排会话独立于任务暂停,暂停中仍可继续对话;暂停只终止当前进行的那一轮。
- 前端 sessions-tab 删除 chatExtra 乐观回显:主 Agent 控制台改为纯服务端
数据渲染。根治伪造 seq 撞全局 DB id 导致的 React key 冲突/跨会话内容渗漏,
以及发送失败不回滚的幽灵气泡。发送失败改为回滚输入框内容 + toast 报错。
Claude-Session: https://claude.ai/code/session_01RVrPtpngE9T9DRJHosf6MB
|
2026-08-20 13:09:29 -04:00 |
|
Autumn-27
|
28c1be735b
|
fix(chat): 会话输入框改为 Enter 发送、Shift+Enter 换行
原先 Enter 换行、Ctrl+Enter 发送,不符合直觉。改为单独 Enter 发送、Shift+Enter
换行,并加 isComposing 保护避免中文输入法选字时误发(与 sessions-tab 一致)。
Claude-Session: https://claude.ai/code/session_01Bs2rrsVHUBTxRusm9espwB
|
2026-08-20 12:40:01 -04:00 |
|
Autumn-27
|
9103ff838a
|
feat(llmrec): 录制请求体补记实际发出的思考参数
Recorder 携带配置级 thinking_type/reasoning_effort(这些在 norma buildBody 里从
provider 配置注入 HTTP body,不在 CompletionRequest 上,故录制原先完全看不到)。
序列化时写入 thinking:{type,effort},type 取有效值——每请求 req.Thinking 覆盖优先
于配置级(如 compaction 摘要强制 disabled),与 buildBody 判定一致。前端录制查看页
原样美化 JSON,自动展示该字段。
Claude-Session: https://claude.ai/code/session_01Bs2rrsVHUBTxRusm9espwB
|
2026-08-20 12:35:12 -04:00 |
|
Autumn-27
|
863e44ec24
|
feat(llm): 思考开关与思考强度拆成两个独立可配置参数
- thinking_type(''/disabled/enabled) 与 reasoning_effort(''/low/medium/high/xhigh/max)
彻底解耦,可任意组合:支持「不发 thinking 字段、只靠强度激活思考」的接口
- agent.Config 拆为 ThinkingType + ReasoningEffort 两字段,NewProvider 直接透传
- db/schema.sql 加 thinking_type 列 + 一次性 DO 块迁移(仅列不存在时回填旧语义)
- 前端 LLM 配置页改为两个独立下拉,强度新增 xhigh 档
Claude-Session: https://claude.ai/code/session_01Bs2rrsVHUBTxRusm9espwB
|
2026-08-20 12:31:20 -04:00 |
|
Autumn-27
|
834e94535a
|
feat(skills): 新增 Skill 调用统计(账本 + 页面总览/详情)
后端:
- 新表 skill_usage(无外键,任务/会话删除后统计保留),一次 Skill()
调用记一行,只记维度不记 args 正文;含 found 标记未命中调用
- 用 RunInfo 经 ctx 把 task/exploration/intent/session 传到工具装配层,
在 Skill meta-tool 外包一层做埋点(可记 args 长度与不存在的 skill)
- fsListSkills 返回附带调用次数/覆盖任务/最近调用;新增
GET /api/skills/missing 与 GET /api/skills/{name}/usage
前端(/system/skills):
- 树节点显示调用次数 badge;目录优先排序 + 子项缩进错开一级
- 空态改为技能库总览(指标卡 + 调用排行 + 最近/未使用)
- 选中 skill 的详情面板改为响应式左右分栏(配置在左、统计在右,
窄屏回落上下),含最近调用明细与未命中缺口清单
Claude-Session: https://claude.ai/code/session_01BNN7npEJs4X6LfTtgniMd8
|
2026-08-20 12:30:01 -04:00 |
|
Autumn-27
|
43f40dd74f
|
feat(findings): 发现页支持导出(Markdown 单文件/分文件zip、CSV、JSON,按筛选/全部/勾选)
- 后端新增 GET /exploration/findings/export:按 scope(filtered|all|selected) ×
format(md-single|md-zip|csv|json) 导出,md-zip 用 archive/zip 后端打包
- db.ListFindingsForExport:带完整 report、不分页,按严重等级+时间排序
- report/findings.go:汇总/单条 Markdown、安全文件名、带 BOM 的 CSV 渲染
- 前端发现页加行勾选 + 导出弹窗(范围×格式);复用 lib/utils.copyText
- 顺带修复报告复制在 HTTP 非安全上下文失效(execCommand 降级)+ 复用 CopyButton
Claude-Session: https://claude.ai/code/session_01Bs2rrsVHUBTxRusm9espwB
|
2026-08-20 12:06:46 -04:00 |
|
Autumn-27
|
ed96f256a4
|
fix(ui): 报告复制在 HTTP 非安全上下文下失效,增加 execCommand 降级
Claude-Session: https://claude.ai/code/session_01Bs2rrsVHUBTxRusm9espwB
|
2026-08-20 11:21:07 -04:00 |
|
Autumn-27
|
d14ce4d9f4
|
feat(ui): skill 树修复长文件名与删除确认,任务列表支持多选删除
Skill 管理:
- 长文件名把行撑出侧栏导致操作按钮不可见,约束 ScrollArea viewport
内层并把按钮组改为绝对定位固定在右侧
- Skill / 文件夹 / 文件三处删除补上二次确认对话框
任务列表:
- 表格新增多选列(本页全选 + 跨页保留选择)
- 批量删除复用单任务的关联数据清理选项,串行执行并显示进度,
结果按成功/失败聚合提示
Claude-Session: https://claude.ai/code/session_01BNN7npEJs4X6LfTtgniMd8
|
2026-08-20 11:18:24 -04:00 |
|
Autumn-27
|
def7649baa
|
feat(tokens): 新增 llm_usage 计量账本,按模型统计 token + 仪表盘新旧版切换
- llmrec: 拆分轻量计量与重量 body 录制——token+model+task+worker 永远写入
新表 llm_usage(不含 body,不受 llm_record 开关控制),body 仍受开关控制
- 修复 token 累加 bug:usage 从覆盖改为 Add(Anthropic 把 input/output 拆到
message_start/message_delta 两个事件,覆盖会把 input 冲成 0;OpenAI 不受影响)
- 任务总览新增「LLM Token 用量」卡片:按模型统计 + 缓存命中率(缓存读/输入)
- 仪表盘 Token 卡片加「新版/旧版」开关:新版走 llm_usage(逐次精确、含中断消耗、
真实每日消耗),旧版沿用 activity 统计
- llm_usage 随任务删除保留(历史计量账本)
Claude-Session: https://claude.ai/code/session_014TfZWeVGhjXqZD3vcj44mz
|
2026-08-20 11:16:48 -04:00 |
|
Autumn-27
|
6b79043d82
|
feat(tasks): 总览页支持任务测试范围的查看/增删
- db: 新增 DeleteTaskScope;AddAgentScope 加 source 参数区分 agent/manual
- server: 新增 POST/DELETE /api/tasks/{id}/scope 端点
- web: 总览页新增「测试范围」卡片,可按类型手动增删,继承范围只读
Claude-Session: https://claude.ai/code/session_014TfZWeVGhjXqZD3vcj44mz
|
2026-08-20 09:36:28 -04:00 |
|
Autumn-27
|
56101b46e8
|
feat(worker): 暂停/重跑续接先前 LLM 对话,不再从头开始
Worker 的 Execute 在创建 session 后尝试 Resume 先前的 transcript,
如果存在则续接对话而非重建全新会话,避免浪费已积累的 LLM 上下文。
Claude-Session: https://claude.ai/code/session_014TfZWeVGhjXqZD3vcj44mz
|
2026-08-20 09:15:53 -04:00 |
|
Autumn-27
|
06a8f64b5e
|
fix(ui): 任务列表并发设置按钮紧靠新建任务按钮
|
2026-08-20 08:42:12 -04:00 |
|
Autumn
|
7b673f2e4b
|
Merge pull request #31 from neouks/codex/task-context-llm-worker-control
feat(tasks): add inherited context and resilient LLM execution
|
2026-08-20 20:30:30 +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 |
|