Commit Graph
78 Commits
Author SHA1 Message Date
Autumn-27 80fcf528dc feat: 提示词新增全局变量 DataDir + 触发合并/种子意图默认值调整
- prompt: 新增全局运行时变量 {{.DataDir}}(服务端数据根目录 s.m.dir),
  与 {{.Now}} 一样对所有 agent(planner/worker/mainagent/goals/chat 及自定义)可用;
  各 Vars 结构体加 DataDir 字段并在渲染时填入根 workDir,globalPromptVars 登记以便
  校验/UI 变量列表/预览识别(纯运行时变量,不入库,无需迁移)。
- trigger_merge_mode 默认 by_task→all(schema/config/后端兜底/前端初值同步)。
- seed_first_intent 默认 true→false(走标准先规划再执行);spawn_task 不再暴露该参数,
  工具建任务一律 false。
2026-08-15 00:19:14 -04:00
Autumn-27 4c33317c6a feat: planner/worker 态势移出 system 入首轮 user + bench 提示词/调度器优化 + plan 心跳前端对齐 10min
- agent: planner/worker 把易变运行期数据(意图/态势/收尾词)从 system 移到本轮 user 输入,
  system 每轮/每 session 稳定更利于缓存;移除 worker 的 cross-trace 工具引导段
- web: plan 心跳前端默认/下限对齐后端 10min(600s),清理 300 旧注释
- bench: challenge_review 经验抽取结构化(区分 confirmed/inferred/negative、限制"已穷尽"、
  结构化 hint 格式);worker.md 补深度挖掘/目录扫描引导;scheduler 加 FAST_POLL 快轮询
- deps: norma v0.2.8 → v0.2.9
2026-08-14 11:46:01 -04:00
Autumn-27 aafab015e7 feat(bench): seed 起始清空全部拦截规则,放开 CTF 渗透操作防误拦 2026-08-13 12:29:01 -04:00
Autumn-27 4c42c70a84 feat(bench): 起题前按 host 清旧资产防跨题污染 + 提示词补 CTF 场景/深挖引导 + v2 基准脚手架
- scheduler: create_task 前调 delete_assets_by_host,清复用 IP 上旧题残留(级联删 service/endpoint)
- planner/worker prompt: 标注 CTF 场景;planner 补否定结论时的深挖自省
- kali_tools: 补预装 python 库说明 + 无网/找命令提示
- server/goals.go: 抽 launchTask 统一 seed+种子意图+异步目标分解
- 新增 v2 基准: Dockerfile.bench.v2 / entrypoint_v2.sh / seed_v2.sh / tec_benchmark_v2.md
2026-08-13 12:24:38 -04:00
Autumn-27 c85b2397e8 chore(plan): planner 心跳默认/下限 300s(5min) → 600s(10min) 2026-08-13 12:23:42 -04:00
Autumn-27 06e714598d fix(bench): scheduler 真实 API 容错——建任务失败回滚/close 确认重试防泄漏名额/token 自动重登/VPN 断冻结补偿/重启重置进度追踪; 模拟器加故障注入 2026-08-12 13:56:48 -04:00
Autumn-27 cff5c21a14 feat(bench): 新增 CWF-DR 确定性调度器(scheduler.py)——算法编排替代 tec_benchmark agent,给难题不中断长窗口 2026-08-12 13:44:09 -04:00
Autumn-27 17c483dfa7 fix(llm): 连接测试对推理模型放足 MaxTokens,避免卡在思考里被截断
TestConnection 原本 MaxTokens=32:推理模型(deepseek-v4-pro)对一句 ping 也会先烧
~2900 思考 token,永远在"思考阶段"就撞输出上限(finish=length)被截断——连接虽算通
但显示成"已中断/length/resume"一团糟。抬到 8192 让它把 OK 干净吐完(finish=stop);
提示词也明确要求别思考。推理耗时不变(思考本就会发生),仅放行最终答案。
2026-08-12 13:36:34 -04:00
Autumn-27 3d0dedc51e feat(bench): seed 双 LLM profile——planner 绑强模型、worker 绑弱模型、默认激活弱模型
原来只建 1 个 benchmark profile 全局共用。现改为:
- 建 plan(LLM_MODEL_PLAN)/work(LLM_MODEL_WORK) 两个 profile,共用同一网关/密钥/格式
- 分别绑定 planner→plan、worker→work(PUT /api/agents/{key}/config llm_profile_id)
- 全局激活默认 = work,未绑定的编排 agent(tec_benchmark/challenge_review)走弱模型
- .env(.example) 新增 LLM_MODEL_PLAN/WORK,缺省回退旧 LLM_MODEL,向后兼容
2026-08-12 12:18:51 -04:00
Autumn-27 678025f850 feat(planner): 触发上下文带实际变动 + 心跳触发改为「定时巡检」措辞
把 planner 每轮的触发信号从「固定一句"图发生了变化"」升级为具体变动:

- 统一 TriggerEvent{Kind,IntentID,Detail} 累加器(替换原 doneIntents):
  worker 结束→{done}, report_finding→{finding,摘要}。Task.NotifyDone/新增
  NotifyFinding 记录, drainTriggers 消费, Plan 参数改为 []TriggerEvent。
- renderTriggers 渲染:worker 结束→哪个意图(摘要)+worker 输出结论(取 result/text
  全文,截断800字);finding→哪个意图+finding 摘要。
- worker 回调 notify()→notifyFinding(intentID,summary),report_finding 落库带上下文。
- 时间/心跳触发(triggers 为空)不再谎称"图发生了变化",开场白改为「定时巡检」并
  提示复查在跑意图(steer_work 纠偏/kill_work 止损),对齐心跳的飞行中监督职责。
2026-08-12 12:18:06 -04:00
Autumn-27 8e31a75263 fix(server): 删掉 seed() 的 t.Notify()——种子任务误触发首轮 planner 的真凶
上一修复(HasActiveIntent)只堵了 Run 里的首轮 Notify,但 s.seed() 在建任务时(早于
Run)也调 t.Notify(),它 buffered 进 notify 通道存着,plannerLoop 一启动就消费掉→跑首轮,
完全绕过 Run 的门控。所以种子任务部署后仍会「目标拆解后立马 edge 触发」。

改法:删掉 seed() 全部三处 t.Notify()(正常路径 + 两个早退)。首轮是否触发统一收敛到
engine.Run 的 HasActiveIntent 一个决策点:种子意图(open/running)存在则跳过首轮。
已确认 createGoals/seedFirstIntent 均不 Notify、不建带 notify 的 ToolSet,路径无其它 buffered 源。
2026-08-12 11:41:43 -04:00
Autumn-27 4835cb57bd fix(engine): 种子意图任务误触发首轮 planner(Frontier 只数 open 与 worker claim 竞态)
Run 里「跳过首轮」依赖种子意图让 frontier 非空,但 Frontier 只数 state='open',
而 Run 先起 worker、后查 frontier——worker 抢先 claim 种子意图(open→running)后,
Frontier(open) 变空 → 误发 t.Notify() → 首轮 planner 立刻触发(日志 "edge 触发")。

改为 HasActiveIntent(open 或 running):种子无论 open 还是已被 claim 成 running 都算
「有活干」,一律跳过首轮。首轮延后到种子 worker 收工(NotifyDone)/出 finding/心跳。
顺带修好重启恢复时只剩 running 意图也会误 kick 的情况。
2026-08-12 11:37:54 -04:00
Autumn-27 47ba58bda6 feat(planner): finding 当场唤醒 + planner N 秒心跳触发(任务参数,默认5min)
触发机制补两条(见 docs/planner-trigger-impl-plan.md):

1) finding 当场唤醒:worker 飞行中 report_finding 落库即唤醒本任务 planner,
   不再等 worker 整趟收工才反应。
   - worker.Execute 加 notify 入参并 SetNotify(补上 worker toolset 之前缺失的接线)
   - addFinding 写 KindFinding 成功后调 notify(只对 finding,不对 fact)
   - engine 两处 worker.Execute 调用传 t.Notify

2) planner N 秒心跳:距上轮规划结束/任务开始满 N 秒且期间无触发 → 触发一轮,
   兜底卡死 + 唤醒去监督飞行中的 worker(steer/kill) + 周期复查。
   - plannerLoop 重构为 runRound 闭包 + 三臂 select(ctx/notify/heartbeat)
   - 心跳在 loop 入口臂 = 从任务 start 计时(覆盖 seed 跳过首轮),每轮结束重臂
   - 新增任务参数 plan_heartbeat_seconds,下限=默认=300(5min),低于自动抬到300
   - DB 迁移:schema.sql 加列 + ALTER ADD COLUMN IF NOT EXISTS 补旧库
   - 全链路接线:db.CreateTask/manager/server HTTP/orchestration spawn_task
   - 前端:api.createTask 传参 + 建任务表单新增"planner 心跳(分钟)"字段
2026-08-12 11:18:07 -04:00
Autumn-27 06c1ac748f fix(bench): 优化编排与规划提示词(深链势头豁免/时间预算重算/推进优先)
tec_benchmark(编排):
- 势头豁免(硬规则):出新flag或建立"打断会丢的贵活状态"即豁免时间窗止损与轮转,推到停滞才停
- 部分完成优先:半成品多flag题(0<correct<total)不进轮次公平队列,最高优先resume续跑
- 时间预算按容量重算:首窗压到均~10min(hard 12),单flag上限2个首窗;多flag改势头治理不硬砍
- 动态放宽:随剩余容量增大(只剩难题时)按"剩余容量÷剩余题数"放宽单题时间
- 多flag深链默认不查hint

planner(规划):
- 推进优先于克制:每个未达成目标都需有在跑意图推进它,否则必须补;去重按"方向"非"资产"
- 新增"看/纠/停"在跑意图:get_worker_output + steer_work/kill_work,并入每轮决策流程
2026-08-12 10:19:37 -04:00
Autumn-27 c84bba477f feat(agent): 支持为每个 agent 绑定 LLM 配置(agent 级默认模型)
按优先级 Agent 绑定 > 任务/会话指定 > 全局激活 解析每个 agent 运行的模型,
使 planner/worker/goals/mainagent/自定义 agent 可各自走不同 profile(如 plan 用
强模型、work 用弱模型)。未绑定时行为与原先完全一致。

- db: Agent 增 llm_profile_id + SetAgentLLMProfile;schema 幂等兜底 ALTER
- server: 新增 effectiveProfileForAgent/providerForProfile/providerForAgent;
  buildPlannerWorker 让 planner/worker 各自解析 provider;provider 按 profile id
  缓存以共享限速器;goals/会话链同步走绑定;绑定变更热重载
- api: agent 配置接口收 llm_profile_id(三态) + 返回可选 profile 列表
- web: agent 编辑器「配置与提示词」页新增「默认模型」下拉
2026-08-11 12:15:38 -04:00
Autumn-27 289cf6a24f fix(security): jwt.key 移出可浏览工作区(存项目根,自动从 data 迁移)
工作空间文件管理器的根目录是 dataDir(s.m.dir),而 jwt.key 原来就存在
dataDir/jwt.key —— 会被列出/下载(签名密钥泄露→可伪造 token)/删除(重启重生
成→全体登出)。

- loadOrCreateJWTKey(keyDir, dataDir):密钥改存 keyDir/jwt.key;若旧 data/jwt.key
  仍在,启动时迁移(保留密钥不登出、删旧文件从工作区消失)
- New() 增加 keyDir 参数;生产传 config.BaseDir()(项目根),在 dataDir 之外,
  wsResolve 的路径限定使其不可列/读/下载/删
- 测试传临时目录,隔离且不触发迁移;.gitignore 忽略根目录 /jwt.key

注:项目根在 Docker 里不持久化,容器重建会重新生成密钥、需重新登录(单人系统可接受)。
2026-08-11 10:56:39 -04:00
Autumn-27 1bc629ce4c chore(bench): tec_benchmark 提示词整改 + seed 注入测评开始时间
提示词(tec_benchmark.md):
- hint 统一为"默认不查、仅满足文末条件才查",去掉"第一版禁用"矛盾表述
- 去掉"使用不同/指定 LLM"(三处),与"默认不指定"一致
- 裸 GET /challenges → 真实 GET {BENCHMARK_BASE_URL}/openapi/v1/challenges
- 新增「测评时间」块:总时长6h / 开始时间 {{BENCHMARK_START_TIME}} / 当前时间 {{.Now}}
  / 判断方法,并在 hint 条件接上"当前−开始≥3h 判最后3小时"

seed.sh:
- 替换 {{BENCHMARK_START_TIME}} 为 seed 运行时刻(≈测评开始),格式对齐 {{.Now}};
  {{.Now}} 带点号不被误替,留给 ARTEX 每轮实时渲染
2026-08-11 10:45:12 -04:00
Autumn-27 7064216188 feat(agent): 新增通用 {{.Now}} 提示词变量(每轮实时渲染)
- 各 agent 渲染路径(chat/worker/mainagent/goals/planner)统一提供 Now(nowStr());
  自定义会话 agent 每次触发都会重新 renderSystem,故 {{.Now}} 每轮实时刷新
- server 端 globalPromptVars + withGlobalVars:在保存校验/变量列表/预览/详情放行
  {{.Now}},否则引用它的自定义提示词会被 validateTemplate 拒绝
- 无 DB 迁移(handler 层注入通用变量,不动 agent_prompt_vars 表)
- 用途:配合固定的开始时间戳相减,判断"已运行多久/是否进入最后N小时"
- 新增 agent/prompt_now_test.go:{{.Now}} 渲染实时时间、未知变量安全回退
2026-08-11 10:45:02 -04:00
Autumn-27 7afff7e5f5 fix(worker): 提示开场别做前置普查,减少 list_facts/findings/traces 的冗余调用 2026-08-11 09:59:23 -04:00
Autumn-27 cb64fdb0e4 docs: 新增 update.sh 更新脚本 + README 更新升级章节
- update.sh:对应 install.sh 的两种模式做升级(① Docker 拉新镜像重建 /
  ② 本地重编内嵌二进制),可选 git pull;DB 迁移靠启动幂等重跑 schema.sql
- README 新增「更新升级」一节(方式一~四),说明数据不丢 + 重启即迁移 + 建议先备份
2026-08-11 09:50:38 -04:00
Autumn-27 052c35a954 Merge PR #18: delete traffic targets and LLM task conversations from UI (laohuan12138)
- Traffic 页:按 host 多选精确批量删 + 子串删 + 删后 _blobs 内容寻址块 GC 回收;新增 GET /api/traffic/hosts
- LLM 记录页:按 task_id 下拉选择 + 按任务删除
- 修复 host 选择器 Popover 高度渲染;.gitignore 加 /dist/
- 新增 traffic/traffic_test.go(DeleteHost/DeleteHostsExact/Hosts/GC 共 4 个测试)

本地已验证:go build/vet、traffic 测试、前端 tsc/build 均通过;与当前 main 无冲突。
2026-08-11 09:38:12 -04:00
Autumn-27 37bb386f97 build(bench): 新增 tsecbench 测评环境
- Dockerfile.bench / docker-compose.bench.yml:tsecbench 测评镜像与编排
- bench/entrypoint.sh、seed.sh:容器入口与任务种子脚本
- bench/prompts/*:测评用 planner/worker/challenge 提示词
- bench/.env.example、kali_tools.txt:配置模板与工具清单(真实 .env 仍被忽略)
2026-08-11 09:20:29 -04:00
Autumn-27 6b1a756a59 chore(deps): 升级 Autumn-27/norma v0.2.7 → v0.2.8 2026-08-11 09:17:14 -04:00
Autumn-27 79493d5a4a feat(activity): 任务会话历史反向分页 + SSE 可靠性整改
后端:
- ActivityPage(会话过滤 main/plan/intent + before 反向分页)、ActivityMaxID
  (任务级快照游标)、ListByKindPage(Intent 列表分页,突破固定 300 上限)
- 新增 GET /api/exploration/activity/history(items/snapshot_cursor/
  earliest_cursor/has_more);snapshot_cursor 为任务级游标
- streamActivity:一次 2000 → 循环补偿追平;输出标准 SSE id 行;支持
  Last-Event-ID;补偿查询错误记录日志并关闭连接
- intents 支持分页形态(?before/?page → {items,has_more}),无参数保持旧裸数组
- 新增 idx_act_worker(exploration_id, worker, id) 支撑 Main/Plan 反向翻页
  (schema.sql 幂等,旧库启动自动补建,无迁移)

前端:
- sessions-tab 单一 allActivity → 分会话缓存;首屏只加载 Main 最新页并据其
  快照游标建唯一任务级 SSE;Plan/Worker 点击懒加载
- 统一 mergeBySeq 合并去重;未激活会话只维护 lastTs/unread;向上滚动分页
  加载旧历史并保持滚动位置;每会话内存上限裁剪
- 按 session_key 写各自缓存 + 每 key 请求令牌防会话切换串数据;SSE 连接状态
  可见、加载失败可重试,异常不再静默为"暂无消息"
- api 新增 activityHistory / intentsPage

测试:db/activity_page_test.go 覆盖多 Agent 过滤、反向翻页无重复无遗漏、
快照游标、Intent 超页分页(已对真实 PostgreSQL 通过)
2026-08-11 09:13:12 -04:00
Autumn-27 95aba396c2 feat(activity): 丢弃记录日志合并为单条 error,带 reason/summary/累计数
- 把「丢弃该记录」与「FK 诊断」合并成一条 error 级日志(含"丢弃"关键字,
  后台只筛 error 也能看到完整信息,不再漏掉 info 级诊断行)
- reason 分类:fk_violation(23503) / unique_violation(23505) / pg_error(code) / write_error
- 带 summary 预览(截断去换行)+ 该任务累计丢弃条数,便于判断丢的是哪条、丢弃规模
- 新增 dropReason/bumpDrop/preview 辅助与 dropCnt 计数
2026-08-11 09:10:35 -04:00
Autumn-27 ea833ad992 feat(activity): 写失败时带 expID,并对外键(23503)现场诊断
- AppendActivity 失败日志补上 store.expID,直观看到写的是哪个 exploration
- 丢弃记录时若为外键违反(SQLSTATE 23503),调用新增的 ExplorationDiag 现场查库:
  exploration 是否存在 / 引用它的 task 数 / 当前 MAX(exploration.id),
  一行日志区分「父行真没了」vs「expID 拿错了」vs「外键未按 RESTRICT 建」
- 系统日志页时间戳补上年月日(原来只有时分秒)
2026-08-11 08:44:55 -04:00
Autumn-27 daee98b33a build: install telnet in runtime image 2026-08-10 11:21:47 -04:00
Autumn-27 f43f2a7c8f fix(mock): update DeepSeek base URL 2026-08-10 11:18:00 -04:00
FileShare Developer c76d0f4c93 feat: delete traffic targets and LLM task conversations from UI
Add delete controls to the Traffic and LLM Records pages so users can
purge recorded data without hand-editing the data volume.

Traffic page:
- Host target picker (Popover with checkboxes + select-all toggle)
- Exact-match batch delete for multiple hosts (DELETE /api/traffic/hosts)
- Substring delete for the host-filter input (DELETE /api/traffic?host=)
- Orphaned content-addressed blob garbage collection after deletes
- Distinct-hosts endpoint (GET /api/traffic/hosts) for the picker

LLM Records page:
- Task picker dropdown (distinct task_id + record counts)
- Per-task delete (DELETE /api/llm/records?task=)

Other:
- Add /dist/ to .gitignore (build artifact)
- Extend traffic_test.go with DeleteHost, DeleteHostsExact, Hosts tests
- Fix Popover render bug (replace ScrollArea that broke height calc)
- Remove fade/zoom animation on the host picker Popover
2026-08-10 11:10:58 +08:00
Autumn-27andClaude Opus 4.8 a121e8967c fix(scope): add_task_scope 支持 host:port 目标,入库前剥端口
ip/root_domain/subdomain 三类范围入库前统一 stripHostPort:
- ip 带端口(如 10.0.188.136:3000)之前直接报"无效 ip/cidr"
- 域名带端口更隐蔽,不报错却存下匹配不到资产的垃圾键

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 09:09:59 -04:00
Autumn-27andClaude Opus 4.8 e00a4a8e72 refactor(asset): delete_assets_by_host 改为平台工具(默认绑 Auto)
之前作为任务域工具挂在 worker/mainagent 列表里;移除绑定后它也从 BuiltinToolSeeds
自动生成的 seed 清单里消失,导致从未写入 tools 表、UI 看不到。改到平台工具层
(platformTools),由 seedOrchestrationTools 每次启动独立 seed 并默认绑内置 Auto agent,
不属于任务 agent。db 层 DeleteByHost 不变。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 04:49:57 -04:00
Autumn-27andClaude Opus 4.8 e30218f948 feat(asset): 新增按 host 精确删除资产的工具 delete_assets_by_host
DeleteByHost(host):DomainKey 归一化后按 domain/root_domain/ip 精确等值删除,
连带该 host 下的 service/endpoint;传根域名会连带其子域名。exploration_anchors
为 ON DELETE CASCADE,删除不被外键阻塞。工具层 delete_assets_by_host 返回按类型
分组的删除计数。硬删除、作用于全局资产库、不可撤销。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 04:18:21 -04:00
Autumn-27andClaude Opus 4.8 aab6b9c948 fix(ui): 抽屉/对话框内 Select 等弹层不再误关抽屉
抽屉内 Radix 弹层(Select 下拉等)portal 到抽屉外,开着弹层时点遮罩,同一次
pointerdown 被 Select 与 Sheet 两个 DismissableLayer 处理:Select 先关闭且是
discrete 事件、React 同步 flush,轮到 Sheet 判断时弹层 data-state 已翻成 closed,
"当下检测弹层是否打开"不可靠,导致抽屉被连带关闭。

改为在 pointerdown 的 capture 阶段(早于 Radix 冒泡监听)先记录"此刻有无弹层开着",
onInteractOutside 据此:开着弹层时点遮罩→只收弹层不关抽屉;无弹层时点遮罩→正常关闭。
下沉到 sheet.tsx/dialog.tsx 基础组件,一次覆盖所有含下拉的抽屉/对话框;移除 agents
页此前重复的 per-callsite 处理。已用无头浏览器验证三种场景(点选项/点遮罩收下拉/
无弹层点遮罩关闭)均正确。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 03:17:49 -04:00
Autumn-27andClaude Opus 4.8 f86885ec3d feat(task): 创建任务可选下发种子意图,worker 免等首轮规划直接开跑
新增 seed_first_intent(默认开启):创建即把"描述+目标"作为一条意图
写入 frontier,worker 轮询领取立即执行,省掉开跑前的首轮 planner LLM;
跑完由 NotifyDone 正常唤醒 planner 判定/补充。CTF 场景常一 work 解决。

- Engine.Run 首轮 kick 改为"frontier 为空才触发",一处覆盖普通/种子/恢复三种情况
- HTTP createTask 与 spawn_task 工具同步支持;bump 工具 schema 刷新 flag 使旧库生效

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 02:19:40 -04:00
Autumn-27andClaude Opus 4.8 4cf622593a feat(trigger): 新增"任务创建"触发机制(on_task_create)
自定义 agent 触发条件从 5 种扩展到 6 种,新增任务被创建时触发。
用 tasks.id 单调水位线 + scheduler_state 防重复,重启不补触发;
触发消息完整分行给出任务ID/描述/目标。DB 加列并带 ALTER 迁移。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 02:19:29 -04:00
Autumn-27andClaude Opus 4.8 5962826f2d feat(mock): 补全工具执行 / LLM 录制的 mock 数据
- data:commandRecords(curl/sqlmap/ffuf/nmap + 超时报错)、llmRecords
  (worker/planner,含一条 429 error) + llmRecordDetail(带 req/resp body)
- handler:/commands、/llm/records、/llm/records/{id} 路由

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 01:33:23 -04:00
Autumn-27andClaude Opus 4.8 de09b1746f docs(readme): 增加资产覆盖图截图
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 01:33:23 -04:00
Autumn-27andClaude Opus 4.8 4c407dc448 feat(mock): 补全新功能的 mock 数据(覆盖度/覆盖图/关联/工作空间)
- data:coverage、coverageGraph(11 节点树)、assetRefsFor、WS_TREE +
  workspaceList/Read 示例文件树
- handler:/tasks/{id}/coverage · coverage-graph · asset-refs +
  /workspace/list · read 路由(写/建/删走 {ok:true} 兜底)
- api:workspaceUpload/Download 加 MOCK 守卫(裸 fetch 绕过 http 助手,
  demo 下改为 no-op/占位下载,不再网络报错)

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 01:23:59 -04:00
Autumn-27andClaude Opus 4.8 75ca97feb1 docs(readme): 新增系统技术架构章节 + Mermaid 架构图
- 双图架构(探索图+资产图)+ 锚点连接、总体分层图与组件表
- 引擎意图闭环时序图、worker 过程级信息交换图、planner 多轮共享
  todolist 稳定攻击链路图(5 张 Mermaid,GitHub 原生渲染,无 emoji)

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 01:23:59 -04:00
Autumn-27andClaude Opus 4.8 6bffd491ee feat(workspace): 新增工作空间文件管理器(针对 workDir)
后端 server/workspace.go(全部在 requireAuth 之后,路径限定在 workDir):
- list/read/write/mkdir/delete/download/upload 七个端点
- wsResolve 用 Clean("/"+rel)+前缀校验防 .. 遍历;上传经 filepath.Base
  再二次校验;读文本 2MB 上限(超限/二进制仅下载);上传 512MB 上限;
  下载文件名过滤 + filename* UTF-8 编码

前端:
- 侧边栏「工作空间」入口(/function/workspace)
- api/types:workspaceList/read/write/mkdir/delete + upload(FormData)
  + download(blob 带 token)
- page:面包屑导航 + 目录表格 + 上传/新建文件夹/刷新 + 每行下载/删除
  + 右侧 Sheet 文本编辑器(二进制/超大仅下载)

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 01:01:19 -04:00
Autumn-27andClaude Opus 4.8 5f0fac33aa feat(agent): 按任务/意图预建 agent 工作目录,worker 免手动建目录
- 新增 ensureRunDir(base,taskID,intentID):os.MkdirAll 建
  <workDir>/<taskID>[/i<intentID>],返回路径;cmdOutDir 助手
- worker:CWD/ToolOutputDir/提示词指到 <workDir>/<taskID>/i<意图id>/
  (引擎预建),删 workerArtifactSubdir,新 workerArtifactSpec 文案
- planner/mainagent:补 WorkingDir=<workDir>/<taskID>/ + ToolOutputDir
  (此前根本没设 WorkingDir);artifactSpec 文案改为「本任务工作目录」

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 00:40:31 -04:00
Autumn-27andClaude Opus 4.8 f7197da988 feat(coverage): graph_overview 注入当前测试范围根资产(scope)
coverage 块新增 scope 字段(ListTaskScope 原始行:root_domain/subdomain/
ip/cidr/company,压缩为 {kind,value/company_id,source}),让 planner 看到
本任务圈定的目标本身而非仅覆盖度数字;note 说明其为范围边界、可用
add_task_scope 增补 / list_untested_assets 看未测资产。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 00:28:20 -04:00
Autumn-27andClaude Opus 4.8 e35c766e6a feat(coverage): 覆盖图节点用 lucide 图标 + 精简 label + 抽屉展示关联意图/事实
- 节点图标 emoji → 平台一致的 lucide 图标(白色 SVG data URI,iconSrc)
- 图内 label:服务显示 端口·标题·状态码(不再完整 URL),端点只显示 path
- 点节点抽屉新增「关联意图/关联事实/关联发现」:按 exploration_anchors
  反查本任务锚定该资产的节点
  - db AssetRefs(assetID);server GET /api/tasks/{id}/asset-refs?asset_id=X
  - types/api taskAssetRefs;抽屉按 node.asset_id 拉取渲染

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-09 00:28:19 -04:00
Autumn-27andClaude Opus 4.8 9c1591ad8e fix(worker): search_all_worker_traces 排除调用者自身的意图 trace
之前走 ActivityTraceSearch(nil) 会把 worker 自己这条意图的步骤也搜出来
(纯噪声,本就在其上下文里)。新增 ActivityTraceSearchExcluding(node_id<>x),
工具传 t.ownerNode:worker=自身意图→排除自己;planner/mainagent 不受影响。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 13:24:35 -04:00
Autumn-27andClaude Opus 4.8 db2e1f9a49 refactor(coverage): 资产覆盖图改用 G6 真力导向布局
- 渲染引擎 xyflow+d3-force(静态坐标) → @antv/g6 d3-force 布局
  + drag-element-force/drag-canvas/zoom-canvas:拖拽实时重排、缩放平移
- 动态 import @antv/g6(避开 SSR/静态导出),顶层仅 import type
- 折叠/分页、点击抽屉、展示更多逻辑与配色语义原样保留
- 轮询改为按需刷新(避免力导布局被反复打断)
- 依赖:声明 @antv/g6,移除不再用的 d3-force/@types/d3-force

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 13:14:49 -04:00
Autumn-27andClaude Opus 4.8 04f40daa5c fix(goals): URL/带子域目标登记为 subdomain,禁止缩成根域
修正目标设定 agent 把带子域的 URL 目标(如 https://xxx.example.net/)
误登记成整个根域 example.net、放大测试范围的问题。goalsScopeTail 明确:
URL/主机名一律取完整主机名 kind=subdomain,禁止归约到 eTLD+1;仅裸根域名
或用户明说「整站/所有子域」才用 root_domain。

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 12:59:58 -04:00
Autumn-27andClaude Opus 4.8 6dce6317e8 feat(worker): 派发意图时按 asset_ids 自动纳入任务测试范围
- Execute 里复用已查出的目标资产,逐个 AddAutoScope(与 insertAssets 同一套
  保守粒度、source=auto)
- 去重由 upsertTaskScope 的 ON CONFLICT DO NOTHING + uq_task_scope 唯一索引
  保证,重跑/重试幂等 no-op

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 12:59:58 -04:00
Autumn-27andClaude Opus 4.8 f80ed0b7fe feat(worker): 意图目标资产原始数据注入 + 覆盖度不再喂给 worker
- Execute 启动指令后附上意图 asset_ids 对应资产的原始 JSON(GetByIDs),
  省去 worker 开场再查一次 list_assets;查不到/为空/无 store 则不加
- 新增 intentAssetIDs 从意图 payload 解析 asset_ids
- renderWorkerGraphOverview 删除 coverage 键:覆盖度是规划者信号,
  与 worker「只做领到那条意图」的边界相悖,不再进 worker 提示词

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 12:40:26 -04:00
Autumn-27andClaude Opus 4.8 e841bc9332 feat(goals): 目标设定 agent 提取并登记测试资产范围
- DecomposeGoals 新增 as/taskID 参数,有效时复用 add_task_scope 工具挂入本次调用
- 追加 code-owned tail(仅工具挂上时):从目标/描述提取明确的
  root_domain/subdomain/ip/cidr 并登记为 task_scope;只登记明确写出的、
  拿不准选更精确的;不处理 company(任务刚建公司通常未入库、名字解析不上,
  留给 plan 阶段)
- MaxTurns 4→6;server createGoals 传入 AssetStore + 数字 taskID

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 12:30:51 -04:00
Autumn-27andClaude Opus 4.8 c396674d2b feat(coverage): 任务新增「资产覆盖图」力导向图 tab
后端(只读,无迁移):
- db BuildCoverageGraph(taskID,expID) 复用 covTargetCTE 拉范围内全部类型资产 +
  tested 标记,补连接节点(缺失根域名/公司,灰),按字段派生 child→parent 边
- server GET /api/tasks/{id}/coverage-graph

前端:
- 新 tab coverage-graph-tab:xyflow 渲染 + d3-force 静态力导向布局
- 已测=实色高亮、范围内未测=灰、范围外连接节点=灰虚线;点节点看详情抽屉
- 折叠/分页:同父同类型子节点默认展示 20(已测优先),超出收进折叠节点,
  抽屉「展示更多(+20)」把下一批拉进图;布局仅在可见集合变化时重算
- types/api + d3-force 依赖声明 + 注册 tab

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-08-08 12:30:41 -04:00