Autumn-27
|
01760aa345
|
refactor(agent): 精简 worker 默认提示词
- 边界①收敛为「只做领到的这一条意图」,去掉指纹意图的冗长举例
- report_finding 去掉流量绑定的细节段落(traffic_refs 用法另在 [B] 段)
- 删除可选流量绑定说明与结尾的措辞冗余,收尾一句话总结保留
|
2026-09-10 11:08:06 -04:00 |
|
Autumn-27
|
066681a71d
|
Merge feat/chat-session-grouping: 会话列表按 Agent 分组
|
2026-09-10 11:04:58 -04:00 |
|
Autumn-27
|
97e67df158
|
feat(chat): 会话列表按 Agent 分组,支持展开收起与置顶独立
左侧会话列表原先所有 Agent 的会话混在一起平铺,现按 Agent 分组:
- 分组头可点击展开/收起,收起状态存 localStorage 刷新后保持
- 分组顺序按会话活跃度排(后端已 updated_at DESC,首次出现即最近活跃)
- 置顶会话仍独立平铺在所有分组之上
- 分组头吸顶,带运行中标记与会话数;收起时若当前会话在组内提示圆点
- 分组内行不再重复显示 Agent 名
|
2026-09-10 11:02:36 -04:00 |
|
Autumn-27
|
a90f6e67a3
|
feat(web): 攻击链路图渲染压缩(digest)节点并收缩其成员
- ExploreKind/ExploreRel 增加 digest/covers 类型
- digest 节点独立样式(青色 Layers)、图例与摘要(body)
- collapseDigestGraph:active digest 覆盖的 fact/intent 成员从图中隐藏,
触及成员的边端点改接到 digest,成员内部边丢弃并去重,covers 边不渲染
- 详情抽屉展示压缩结论与被压缩成员列表,成员可点击下钻
|
2026-09-10 11:02:33 -04:00 |
|
Autumn-27
|
3c2a60fba7
|
fix(agent): 空转回合注入续跑指令,复用空响应重试次数
模型有时一整轮只输出思考、既不给正文也不调工具,harness 视为自然结束
(end_turn 且无 tool_use),直接以 completed + 空总结收场,一条未完成的意图
断在半路,表现为「任务正常结束但没有文字总结」。五层 LLM 重试均够不着它
(非错误路径),SDK 空响应重试也够不着(以是否 yield 过事件判空,而思考增量
本身就是事件)。
work 的 Stop 钩子现识别这种回合并注入一条续跑指令,让模型带着已有思考继续
执行下一步——不选原样重发,因这类空转由提示词与上下文形状决定,是稳定行为
而非随机抽风。次数复用 LLM 页「空响应重试次数」(默认 2、-1 关闭),是一条
意图的总量闸而非连续次数(harness 已限死连续空转只推一次)。
|
2026-09-10 10:49:11 -04:00 |
|
Autumn-27
|
eb5290039a
|
refactor: 升级 norma v0.3.7 并精简 insert_assets/list_assets 描述
- go.mod/go.sum: norma v0.3.6 -> v0.3.7(含 shell_* 工具描述精简)。
- insert_assets: 顶层描述去掉与字段 schema 重复的逐类型字段罗列,
仅保留各类型条件必填字段、非 HTTP service 的 ip/domain 约束、
append 合并语义与返回结构。
- list_assets: 字段清单合并、示例保留 2 条覆盖全部语法,去掉多处
重复的 dsl 必填约束与示例。语义不变。
|
2026-09-10 10:46:47 -04:00 |
|
Autumn-27
|
97ce284c98
|
refactor(worker): 关闭跨 engagement 记忆,收敛默认工具面
- 移除 worker 的 memory 挂载:删掉两处 SetMemory 调用及 worker.go
里的 mem 字段/SetMemory 方法/opts.Memory 装配,RecallMemory、
RecordMemory 两个工具及每轮记忆自动注入不再启用。
- worker 默认工具集剔除 MultiEdit/Glob/Grep:新增 defaultToolsExcept
按名过滤 SDK 默认工具;文件精改用 Edit、检索走 Bash(grep/find)。
planner/mainagent 不受影响。
|
2026-09-10 10:29:35 -04:00 |
|
Autumn-27
|
ae22e456ce
|
refactor(tools): get_worker_output 移除 terminated 与 worker_name 字段
terminated 仅凭有无 result 记录推断,会把运行中(尚无最终结论)的 work
误报为 terminated=true,语义不可靠;worker_name 对调用方也无实际用途。
两字段一并从返回中删除,并同步更新工具描述。
|
2026-09-10 10:19:19 -04:00 |
|
Autumn-27
|
72a52e9202
|
fix: 修复合并后审查发现的 6 个中/高问题
#102 高:证据正文下载在全局 advisory lock 事务内 io.Copy 给 HTTP 客户端,
verifyFile 又要整读一遍算 SHA-256 —— 一次大文件下载或慢客户端就会挂住
全进程的证据写入。改为事务内只解析绑定元数据(Store.Binding),出锁后再校验
与串流;blob 内容寻址且 GC 有 24h 宽限,已打开的 fd 也不受 unlink 影响。
#102 高:traffic_evidence_snapshots 的 url/req_head/resp_head 直接来自目标
原始报文,未清洗就写 PG TEXT。目标返回非 UTF-8 头(GBK filename)或 NUL 会让
RecordFindingTx 整个事务回滚,已确认的漏洞完全不落库。新增
TrafficEvidenceSnapshot.Normalize(),在算 ID 之前套用仓库既有的 utf8Clean,
保证哈希与入库字节一致。
#102 中:自动绑定默认关闭,reporter 便不会传 evidence_version,
SetFindingReportVersionByNodeID 按 legacy 语义写 -1,报告永久显示「待更新」
且 UI 无处清除;老库还因 reporter_agent_seed_v1 守卫拿不到新触发文案。
触发消息改为无条件先读 get_finding_traffic(只读工具,不依赖捕获开关)并回传
版本,并加一次性迁移刷新老库中未被用户改动的默认文案。
#102 中:开关关闭时 report_finding 只要收到 traffic_refs/evidence_hint_id
就在写入前报错,模型幻觉出多余字段即丢掉一个真实漏洞。改为忽略这两个参数
照常登记,由既有的 evidence_status=not_bound 说明未绑定。
#101 中:删掉 RuleID!=0 判断后,每次模型放行都写一行带完整审计快照的
intercept_pending(单行最坏 24×8KiB 上下文 + 32KiB 输入)。开启兜底裁判的
渗透任务会灌入数百 MB,并经 task_archives 的 SELECT * 进入归档。放行行改为
只留决策元数据与执行结果,丢掉重放快照;ask/deny 路径不变。
#103 中:FindingRetestForConversation 出错时在收尾 defer 注册前就 return,
复测行永远停在 pending —— 漏洞列表常驻「复测中」,后续发起复测被去重拦下,
只有重启才能清。新增 FailPendingRetestForConversation 按会话 ID 收尾。
|
2026-09-10 10:15:24 -04:00 |
|
Autumn-27
|
e8efce605c
|
Merge PR #102: feat: 支持漏洞关联多条流量证据
冲突解决:
- db/schema.sql: 复测表(#103)与流量证据表(#102)均为追加,两者保留
- server/server.go: 启动序列同时保留 seedFindingRetester 与 evidence GC
- web/src/lib/types.ts: InterceptAudit/InterceptDetail(#101) 与流量证据类型(#102)并存
- findings/detail/page.tsx: 去掉 #103 带入的重复 import,仅保留 FindingRetestPanel
- chat/page.tsx: 保留 #103 的 Spinner import
|
2026-09-10 10:04:53 -04:00 |
|
Autumn-27
|
071d87896d
|
Merge PR #103: feat: 支持会话级漏洞复测与运行状态展示
|
2026-09-10 10:02:39 -04:00 |
|
Autumn-27
|
29fa64cdbe
|
Merge PR #101: feat(intercept): 增加审批记录详情与执行审计
|
2026-09-10 10:02:29 -04:00 |
|
ji ruo
|
82c1ed9cbb
|
feat: 支持会话级漏洞复测与运行状态展示
|
2026-09-10 16:06:08 +08:00 |
|
ji ruo
|
9ad323dc4c
|
feat(intercept): 增加审批记录详情与执行审计
|
2026-09-10 15:10:50 +08:00 |
|
ji ruo
|
076146fa81
|
feat: 支持按 Agent 筛选对话
|
2026-09-10 15:10:47 +08:00 |
|
ji ruo
|
52e0b0dbb4
|
fix: 修复登录凭据不同步导致的白屏
|
2026-09-10 15:10:47 +08:00 |
|
ji ruo
|
dbd00b846e
|
feat: 由报告 Agent 自动关联流量证据
|
2026-09-10 14:26:15 +08:00 |
|
ji ruo
|
a3bb2c7959
|
feat: 增加 Agent 流量绑定开关并补齐证据交接
|
2026-09-10 14:08:40 +08:00 |
|
ji ruo
|
ec4ef35fff
|
feat: 支持漏洞关联多条流量证据
|
2026-09-10 13:03:20 +08:00 |
|
Autumn-27
|
8dae851b9b
|
docs(changelog): 发布 0.3.8
|
2026-09-09 14:10:07 -04:00 |
|
Autumn-27
|
c585b196b5
|
docs(changelog): 补全 v0.3.7 以来的未记录变更到 [Unreleased]
把 v0.3.7 之后除五层重试外的 25 个 commit 归类补入 [Unreleased]:
cold-digest 冷节点压缩、全局出口代理、自定义会话头、墙钟就地收尾、
worker/planner 提示词与工具集调整、graph_overview 改动、意图状态标签
语义修正等。新增「探索图」「网络」两个章节。
|
2026-09-09 14:08:48 -04:00 |
|
Autumn-27
|
5327f88ebc
|
refactor(worker): 收敛 work agent 默认工具集与资产写回提示
work agent 只负责单条意图的执行与写回,读上下文/跨 work 复盘属规划职责:
- 从 WorkerTools() 移除 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。
- 旧库迁移 seedWorkerReadToolsUnbind(flag worker_readtools_unbind_v1):逐个
RemoveAgentFromTool 把上述工具从 worker 默认绑定剥离,planner/main 同名绑定不动。
- worker 提示词「查上下文」段收敛为 list_assets/list_findings;insert_assets 段删掉
与工具 schema 冲突的陈旧字段(type=tech/on_url/props/props.http),字段填法交回工具
自身说明,只留路由与边界。reseedWorkerPrompt 版本 bump v3→v4 下发旧库。
|
2026-09-09 13:59:47 -04:00 |
|
Autumn-27
|
64b08f518f
|
feat(agent): 墙钟超时改为就地收尾,移除外部硬 ctx 兜底
依赖 norma v0.3.6:MaxDuration 到点会打断在跑工具并就地进收尾(在活 ctx
上按收尾轮数续跑落库+总结,终态 timeout),不再依赖 worker/planner 各自
的 maxDur+90s 外部硬 ctx 把卡住的 run 直接杀成 aborted_tools。
- worker/planner: 删除 WithTimeoutCause 硬 ctx 与 settleHardGrace 常量,
run 直接用 ctx(仅承载 pause/kill/shutdown)。
- chat 走同一 harness 自动获得同样行为;mainagent 无 MaxDuration 不受影响。
- terminalreason: 更新 ReasonTimeout 文案。
|
2026-09-09 13:49:59 -04:00 |
|
Autumn-27
|
aa12706ed1
|
docs(llm): 重试配置每层写清「什么错误会走到这层」
原来每层只有一句泛泛的说明,用户填了旋钮看不到效果时无从判断是配错了还是
这类错误压根不落在这层。现在每层固定给两句:
触发 具体到状态码——建连是 408/429/5xx 与网络层错误,空响应是 200+
正常 stop 却无内容块,安全窗口是拿到 200 之后的断流/overloaded/
流内 429,熔断区分瞬时(429/5xx)与确定性(401/402/403/404),
意图重跑是前面几层都没兜住的 model_error
不走这层 长得像但走别处的:max_tokens 截断、额度耗尽(402)、上下文过长
(413)、4xx 确定性拒绝
模型配置抽屉里的紧凑版只显示「触发」这一句,全局页两句都给。纯文案,无逻辑改动。
|
2026-09-09 13:39:44 -04:00 |
|
Autumn-27
|
a50bf02428
|
feat(llm): 五层重试的次数与间隔可配
一次模型调用的失败由内到外经过五层重试:建连(SDK)、空响应(SDK)、同 provider
安全窗口、轮询熔断、意图重跑。此前五层的次数与间隔全是写死的常量,遇到脾气各异
的中转站只能改代码。现在都能在 LLM 页配置,不配就是原来的默认值。
配置语义五层统一(db.RetryRule):次数 0=内置默认 / -1=关掉这层 / >0=该值;
间隔 0=原本的指数退避 / >0=改用固定间隔。0 被"未配置"占用,故关闭用 -1。
写库前夹紧到 次数 [-1,20]、间隔 [0,1h],DB 另有 CHECK 兜底。
粒度按层的性质分:前三层跟着端点走,可在每个模型配置里逐字段覆盖全局默认(只钉
间隔的仍继承全局次数);熔断与意图重跑是进程级语义,只有全局一份。
生效路径:①②是 provider 构建参数,保存后重建缓存;③随每次 hooks.current()
解析,故障转移换配置时重试节奏跟着换;④在失败路径上每次都要读,由 applyRetryPolicy
推给 llmpool.Registry;⑤每条意图收尾读一次。全部热生效,无需重启。
连接测试刻意不带这些参数——它有 30s 硬超时,叠上用户配的重试只会把本来能用的
端点测成超时失败。
norma 升 v0.3.5(llm.Config 新增 RetryInterval / EmptyResponseRetries /
EmptyResponseInterval)。旧库升级后行为逐字节不变:新列默认 0,settings 键不
存在即全默认。设计见 docs/LLM重试设计.md。
|
2026-09-09 13:35:04 -04:00 |
|
Autumn-27
|
377ccc7e5a
|
fix(web): 修正意图状态标签 exhausted/blocked 语义错误
- exhausted「已穷尽」→「预算耗尽」:实为达步数/时间预算被中途掐断、只写回部分结果,
并非该方向已探尽(易被误读为无需再探)。
- blocked「被拦截」→「执行出错」:实为模型/API/网络故障重试用尽、意图基本没真正探成,
并非目标/WAF 拦截。
- 补上缺失的 stopped「已停止」(用户手动停止的 work)。
|
2026-09-09 12:59:48 -04:00 |
|
Autumn-27
|
ae29b6714e
|
Merge feat/cold-digest: 探索图冷节点压缩(cold-digest)
冷节点折叠成 digest 进 graph_overview,原节点保留、按 id 可还原(无损、可逆)。
含 §3.1 同父归组、后台 minor/major 压缩、按资产索引、related_tasks 只读折叠、
expand_digest/expand_index 工具(仅 planner/main agent)。经 20 项对抗式评审修正。
|
2026-09-09 12:54:27 -04:00 |
|
Autumn-27
|
67787b5be8
|
chore(digest): expand_digest/expand_index 只给 planner 与 main agent,不给 worker
worker 不读 graph_overview、不需要按 digest 列成员;命中折叠成员 id 时用 node_detail
(直接取原节点、非折叠感知)即可还原。故从 WorkerTools 移除这两个工具,只保留在
PlannerTools 与 MainAgentTools。
|
2026-09-09 12:28:39 -04:00 |
|
Autumn-27
|
775189d916
|
feat(digest): related_tasks 只读折叠(§2 跨任务)
关联/继承任务的概览现在复用其【自身的折叠视图】,与当前任务同逻辑:
- relatedTaskOverviews 按 source 任务自己的 covered/hot 折出已折成员(recent_facts /
recent_intent_results 跳过已折且仍冷的成员),并把该任务的 cold_digests(body)只读带出,
统一 inherited=true / source_task_id 标记。
- expand_digest 支持跨任务:先查本任务,再查直接关联任务(read-only),返回成员紧凑列表并
标继承;node_detail 已有的 GetNodeWithSources 负责成员完整还原。
- 复活检查同样生效:source 任务里已复活(转热)的被覆盖成员照常显示,不被折出。
至此设计文档 §2 跨任务折叠全部落地;仅 §2.3 墙钟兜底(任务停摆判稳)按既定作为后续。
|
2026-09-09 12:09:01 -04:00 |
|
Autumn-27
|
eefd5ee2f2
|
fix(digest): 多智能体评审修正 — 资产索引收敛 + 60cap 保 hot + 文档同步
对照 cold-digest-spec 的对抗式评审(20 项发现)逐条核对实现,两处真实代码问题已修:
- 资产索引膨胀(评审 §6.2 高危):早前把一个 digest 落进它成员命中的【每个】asset 桶,
跨资产 digest 会复制进几十个桶、顶层条目不降反升(真实图 asset_ids 约 144 个)。改为
每个 digest 只归一个【代表资产】桶(成员锚定众数、并列取最小 id;无锚定 → 0 号兜底桶),
条目数 ≤ digest 数。
- 60 兜底截断误砍活跃上下文(评审 §6.3 高危):hot(live 前沿祖先链 / live 意图下新事实)
是活跃推理上下文,绝不能截。改为 hot 全保、60-cap 只约束【冷但未折】残余;冷区两侧
均衡保留。graph_overview 每轮计算 render 期 hot 集(兼用于复活检查)。
其余 16 项评审发现经核对,本实现已由设计选择规避/处理:全量扫描维护(静默变冷/传递翻转
盖章)、签名含锚节点、minor+major 统一走同一 group()(§3.1 在两处都生效、major 不会拆散
同父组)、提交时活跃度复核(不折入复活成员)、content_version 列+状态变更 bump、渲染期索引
(无 KindIndex 陈旧)、cold_digests 与索引并列(body 仍在顶层)、singleton 只进 recent。
文档 §6.2 同步上述解决口径(body 归属、一 digest 一桶、singleton 归 recent)。
|
2026-09-09 12:04:17 -04:00 |
|
Autumn-27
|
4f088e519b
|
feat(digest): 探索图冷节点压缩(cold-digest)
把老且长期不活跃的意图/事实折叠成 digest 节点进 graph_overview 展示,
原始节点永久保留、按 id 可完整还原(存储无损、只压呈现、折叠可逆)。
- 数据模型:KindDigest 节点 + RelCovers 边(真相源);新列 content_version、
cold_since_round(节点级)、round_no(任务级 planner 轮次);均带旧库迁移。
- 纯算法(coldgraph.go):冷热判定(逆向可达 + 任一活分支即热) + R=6 轮防抖 +
连通分量分组(§3) + §3.1 同父兄弟归组(救"热 hub+扁平死叶") + §5.3 签名。
- 后台压缩(compaction.go):minor 折未覆盖冷块(tiered)、major 回源重压合并碎片;
签名幂等复用 body;提交时活跃度复核(绝不覆盖已复活节点);60s 冷却 + 互斥。
- 概览折叠(§6):recent_* 剔除已折成员 + 渲染时复活检查;cold_digests + 按资产
索引 cold_index(§6.2);expand_digest/expand_index 还原;covered_members 反查
悬空血缘 id;60 兜底截断均衡保 live。
- planner 每轮 OnPlannerRound 维护戳记并触发后台压缩,绝不上热路径。
纯算法单测覆盖 §附/§3.1/§2.3/§5.3;已对 437 节点真实图验证:热 86、冷候选 324、
§3.1 分组 47 块 + 14 孤立冷点(对齐设计文档实测校验)。
|
2026-09-09 11:52:15 -04:00 |
|
Autumn-27
|
801160930b
|
feat(planner): 心跳唤醒时若无 open/running 意图则强制补出新意图
停摆兜底:心跳/无变动唤醒且全图已无任何 open 或 running 意图时,
开场白改为停摆告警,明确告知 planner 无 worker 在跑、无排队方向,
本轮必须产出一个或多个与既有意图互不重复的新意图(不得产出 0 意图)。
|
2026-09-09 10:45:20 -04:00 |
|
Autumn-27
|
d728e509dc
|
feat(overview): graph_overview 全量输出 finding_list
findings 是任务最高价值产物且单任务通常不多,改为在 graph_overview
里全量带出 finding_list(不像 facts 只给最近窗口),planner/worker 每轮
即可一眼看全所有确认漏洞,无需再调 list_findings。
每条精简为 {id, summary, evidence?, from_intent?, assets?}:
- evidence 取 finding payload 的 evidence.poc
- from_intent 为产生该漏洞的意图(yields 边)
- assets 直接给受影响资产的可读内容(url/域名/ip:port 等,不再是裸 id),
经 FindingMetaByNodeID 反查锚定资产、批量 GetByIDs 解析
- vulnclass/severity/state 等仍走 list_findings / node_detail
新增 AssetStore.FindingMetaByNodeID 薄封装,让只持有 AssetStore 的
ToolSet 能拿到 node_id→资产映射(读 anchors 表,覆盖新旧漏洞)。
|
2026-09-09 09:24:13 -04:00 |
|
Autumn-27
|
f270ca66bc
|
feat(tasks): 任务列表新增「运行中 Worker」列
TaskListMetricsAll 增加一个 LATERAL 子查询统计 kind='intent' 且
state='running' 的节点数,随 TaskDTO.in_flight 一并返回,口径与任务
详情页概览的「运行中 Worker」完全一致。列表页在「目标进度」后新增该
列,无运行中 Worker 时显示 0。
|
2026-09-08 14:25:49 -04:00 |
|
Autumn-27
|
4fba36b73d
|
refactor(worker): 意图/启动指令/锚定资产移入 system prompt,user 只留全局态势
意图是 worker 贯穿整个 run 的唯一职责,放 system 每 run 重拼、绝不被
compaction 压掉,续跑也不依赖 transcript 首消息留存;意图锚定资产原始
JSON 与启动指令一并随意图进 system。启动 user 消息瘦身为仅全局态势
overview(可降级、容忍 stale),空时回退一句启动词避免空首轮。
代价:system 混入 per-intent 数据、失去跨意图缓存复用,为不丢意图的
刻意取舍;与 planner 态势块放 user turn 有意分叉(planner 无单一 mandate)。
|
2026-09-08 13:51:24 -04:00 |
|
Autumn-27
|
7d4223c535
|
refactor(worker): record_fact 删否定结论段、confidence 与穷尽解耦、facts 分条收紧
worker 默认提示词的 record_fact 段易误导规划者:
- 删掉「否定类结论只写观察+试探性读法」整句,worker 不再被引导写“看不出/放弃”式判断
- confidence(observed/inferred) 与「是否穷尽本意图手段」解耦,回归“直接看到 vs 据现象推断”
- facts 数组分条收紧为「彼此完全独立、无法归并」的极少数例外,默认写一条并进 detail
reseedWorkerPrompt flag bump v2→v3,存量库再刷一次新默认。
|
2026-09-08 12:39:40 -04:00 |
|
Autumn-27
|
01f223aaa1
|
feat(planner): done 触发块列出本意图新产生的 fact id
worker 结束触发规划时,除输出结论外,追加该意图经 yields 边产生的
fact id 列表,让规划者聚焦本轮增量、可直接 node_detail 查详情。
新增 ExplorationStore.FactsYielded 查询。
|
2026-09-08 12:15:48 -04:00 |
|
Autumn-27
|
dc4645753c
|
Merge branch 'graph-overview/trim-hosts-add-done-total'
|
2026-09-08 11:19:23 -04:00 |
|
Autumn-27
|
b39284f1c6
|
refactor(overview): graph_overview 不再平铺 hosts,新增 done_intents_total
- coverage 块移除 hosts 列表(大范围任务里每轮携带最多 500 个 host 字符串,
对规划决策价值有限),只保留 host_count;具体主机按需 list_assets 查
- 新增顶层 done_intents_total:已结束意图(done/blocked/exhausted)总数,与
recent_done_intents(≤15 截断视图)平行命名,让 planner 去重时知道有无被截,
key 即自描述、无需写进提示词
- db: 新增 ExplorationStore.CountFinishedIntents
- 测试:blackboard 继承用例改用 host_count 断言,移除随之无用的 containsString
|
2026-09-08 11:19:18 -04:00 |
|
Autumn-27
|
6b18845939
|
Merge branch 'prompt/planner-worker-refactor'
|
2026-09-08 10:42:06 -04:00 |
|
Autumn-27
|
1dffe05728
|
refactor(prompts): 精简 planner/worker 正文并修正实战问题,reseed 推送存量库
- planner/worker 默认正文精简(合并重复复述,逻辑无损)
- planner: recent_done 按 state 区分处理(blocked/exhausted 先查 trace 再决定,
不当死路也不无脑重跑);否定结论改为“观察/存疑、非定论”、采信前看 evidence、
inferred 默认派复核意图且至多一次;目标未达成且无 open/running 意图必须产出(硬底线);
“克制”降级为仅去重;深度优先于覆盖度
- worker: 否定类结论只写“观察+试探性读法”、判决权归 planner;
跨意图线索写进 fact 的 summary 交规划者、不自己追
- terminalreason: 修正 blocked 描述(传输层故障、需查执行过程,非“此路不通”)
- reseed flag 均 bump 至 v2:存量旧库启动时把新默认追加为新版本并切过去,
旧版本/用户自定义保留在历史可回滚
|
2026-09-08 10:32:43 -04:00 |
|
Autumn-27
|
3d71196774
|
feat(tools): planner 默认绑定 list_assets
新库经 PlannerTools() 并入 list_assets 绑定;老库由
seedPlannerListAssetsBinding() 一次性回填(flag 幂等,不覆盖用户解绑)。
planner 现同时具备 list_assets(DSL 全库检索)与 list_untested_assets(范围内未测)。
|
2026-09-08 08:53:50 -04:00 |
|
Autumn-27
|
f29b37c5b1
|
fix(db): session_header_key 空值不再写入 NULL
SaveProfile 对 session_header_key 套了 NULLIF($n,''),未填写会话头时会写
NULL,而该列是 NOT NULL DEFAULT '',保存 LLM 配置直接报 23502。NULLIF 是
从可空的 base_url/proxy/api_key 抄来的,这列跟 max_tokens_field 一样是空
串语义,去掉 NULLIF 直接传参。
|
2026-09-08 07:33:30 -04:00 |
|
Autumn-27
|
1e7fe8550e
|
feat(tools): add_company_scope 默认绑定由 worker 改为 planner
- WorkerTools 移除 add_company_scope,PlannerTools 新增
- 新库 seed 默认绑定变为 mainagent/planner/auto
- 老库加一次性迁移 seedCompanyScopeRebind:加 planner、去 worker
|
2026-09-07 11:35:07 -04:00 |
|
Autumn-27
|
4319fe413f
|
feat(llm): 每个 LLM 配置支持自定义会话头
新增 session_header_key:非空时每次 LLM 请求带上该 HTTP 头,头值为当前
运行的 session id(chat 会话=conv-<id>,worker=exp<x>-worker-i<intent>
等)。用于某些按 session-id 头做提示缓存/粘性路由的网关。
实现:在已有的 quotaAwareTransport 里从请求 context 读取 session id
(transcript.WithSessionID 挂上的)并注入,无需改 norma;同一共享 provider
也能按会话发出不同头值。DB 加 session_header_key 列(带旧库迁移),前端
LLM 配置弹窗新增输入框。
|
2026-09-07 11:21:50 -04:00 |
|
Autumn-27
|
b513b656aa
|
feat(proxy): 新增全局出口代理配置
所有目标流量可经统一的全局代理出网(http/https/socks5,支持 user:pass):
- 开启流量捕获时,作为 MITM 记录代理的上游(流量照录再经代理出网);
拦截与透传两条路径都走上游,不泄露源 IP。
- 关闭捕获时,直接注入 agent 的 bash 环境与 WebFetch;proxyEnv 增加
ALL_PROXY 以支持 socks5。
配置存于 settings KV 表(无需迁移),前端系统配置页新增「全局代理」卡片。
与网络搜索代理、LLM 代理相互独立。
|
2026-09-07 10:43:38 -04:00 |
|
Autumn-27
|
651b961ffc
|
fix(mcp): 升级 norma v0.3.4,MCP 工具输出增加截断与落盘
MCP 工具之前无输出大小限制,现在统一走 tool.Capture:
超过 30000 字符时落盘到 cmd-output/ 并返回 head + 文件指针。
|
2026-09-07 10:18:41 -04:00 |
|
Autumn-27
|
f66ac54fd6
|
docs(changelog): 发布 0.3.7
|
2026-08-31 12:24:38 -04:00 |
|
Autumn-27
|
7cc467c159
|
feat(llm): 模型配置新增输出上限,支持 max_completion_tokens 字段名
llm_profiles 加两列:max_tokens(单次回复输出上限,0=不发送该字段,由服务端
默认值决定)与 max_tokens_field(上限发哪个键)。后者仅对 format=openai 生效:
空(默认)= max_tokens;'max_completion_tokens' = 新键。OpenAI 推理模型
(o 系列/GPT-5)拒收 max_tokens、只认新键,而多数兼容网关反过来只认旧键,
故做成显式开关而非自动推断。anthropic 与 openai-responses 自带字段名,
存下来只会误导,保存时一并清空。
顺带补上一处从未接通的链路:planner/worker/chat/mainagent/goals 五个
agentcore.Options 都没设过 MaxTokens,恒为 0——openai 系因 omitempty 压根
不发上限,anthropic 走 norma 的 8192 兜底。光加配置项而不接这条线,用户在
后台填了数字也不会生效,故本次一并接通,取值与 streaming 一样按 profile
每轮解析,故障转移切换后下一轮即生效。
task_llm.go 里 nonStreaming() 的来源优先级(agent 绑定 → 任务链激活 profile
→ 全局)抽成共用的 activeCfg(),避免 maxTokens() 再抄一份同样的三级回退。
norma 升到 v0.3.3(该版本提供 Config.MaxTokensField)。go.mod 只动 norma 这
一行:仓库此前未 tidy 过,跑 go mod tidy 会顺带升 x/crypto、x/net 等一批无关
依赖,不混进本次改动。
迁移:新列走 ADD COLUMN IF NOT EXISTS + 默认 0/'',旧库升级后行为完全不变;
CHECK 约束限定取值,每次启动先删后建保持幂等。
|
2026-08-31 12:20:31 -04:00 |
|
Autumn-27
|
338e77c064
|
fix(skills): 修复技能压缩包上传失败与中文命名被判非法
- 补上 bzip2 / Zstandard 解压器(标准库 + 已有的 klauspost/compress,不引新依赖),
不再对压缩软件非默认档位打出的包抛 "zip: unsupported compression";
Deflate64/LZMA/XZ/PPMd 等真解不了的方式与加密包改为解压前给出中文提示,
点名文件、压缩方式与重新打包的办法
- 技能内文件路径校验从 [A-Za-z0-9-_./] 的 ASCII 白名单改为 Unicode 黑名单:
放行各语言文件名与空格,仍拒绝控制字符、非法 UTF-8、零宽与双向控制字符、
\ % # ? * : " < > | 及 .. / 绝对路径 / 空路径段,防目录穿越行为不变
- 技能名放开非 ASCII 字母数字(中文可直接作技能名),ASCII 仍守 agentskills.io
规范,空格、点与路径分隔符照旧拒绝
- Windows 压缩软件按 GBK 写的文件名兜底解码后再校验;frontmatter 的
name: "中文技能" 去引号
- 新增 8 个测试:zstd 包、GBK 包、不支持的压缩方式、加密包、目录穿越、名称与
路径校验
|
2026-08-31 11:37:44 -04:00 |
|