Commit Graph
294 Commits
Author SHA1 Message Date
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
Autumn 99fb78df1c Merge pull request #78 from begininvoke/redgem/security-fix-a64cefdb
Fix possible fix(deps): 2 vulnerable dependencies in go.mod
2026-08-31 23:23:49 +08:00
Autumn-27 acd1ac29d7 feat(assets): 去掉企业资产范围 256 条规则上限
逐个 IP / 域名录范围的企业很容易撞上这个上限,撞上之后只能拆成多个企业,
而范围本身并不因为条数多就更慢。

- db:删掉 MaxCompanyScopeRules 常量、请求条数校验与
  ensureCompanyScopeCapacityTx(每企业持久化总数的事务内校验)
- 前端:去掉 MAX_COMPANY_SCOPE_RULES 与「剩余额度」计算,追加范围弹窗不再
  按剩余条数报错;demo mock 的两处上限一并移除
- 单条规则仍限 1024 字符;请求正文 2 MiB(maxCompanyMutationBodyBytes)保留
  作兜底,约合四五万条规则

测试:原先断言「超容量被拒」的两个用例翻转为「超过旧上限也能写入」——
db 侧批量写 300 条 + 追加 1 条,server 侧一次创建带 300 条范围的企业。
新用例先注册清理再断言,避免断言失败把企业留在共享开发库里。
2026-08-31 11:22:34 -04:00
Autumn-27 48e14e8cf2 fix(findings): 补齐「按资产」视图的 mock,修两处标签重复
demo 模式(NEXT_PUBLIC_MOCK=1)下资产树接口没有实现,点开是空白。

- mock findings 关联到 fixture 里已有的资产:一条挂两个资产(验证父节点不重复
  计数)、一条不挂(演示「未关联资产」桶)
- mock handler 实现 asset-tree,并在平铺/分组两个列表分支接上 asset_scope。
  父子优先级、祖先补齐、去重计数、企业层出现条件都与 db/finding_assets.go
  一致;顺带把三处重复的筛选链抽成 mockFilterFindings
- 没有 URL 的服务(SMB、非 HTTP 端口)标签回退成裸 IP,与宿主那行显示得一模
  一样 —— 后端与 mock 都改为补端口(10.10.10.20:8080)
- 接口挂在 host:port 形式的服务下时没触发简写,仍显示完整 URL。宿主判断统一
  成解析后的 host,现在显示 /script

跑 mock handler 实测:17 个节点逐个对账「树上 total == 该节点子树查出的条数」,
无不一致。
2026-08-31 11:10:47 -04:00
Autumn-27 23cfb9ed4e feat(findings): 发现页新增「按资产」视图
左侧资产树 + 右侧该子树下的发现,与另外两个视图共用同一张表和同一批筛选。

后端
- db/finding_assets.go:按当前筛选构建资产树。只收有发现的资产,祖先链逐层
  补齐(endpoint→service→subdomain/ip→root_domain),父子优先级与
  BuildCoverageGraph 同源;计数沿祖先链去重累加,一条发现挂多个资产不会让
  父节点重复计数
- FindingFilter 加 AssetScope:选中节点=选中整棵子树,解析成资产 id 集合后
  下推 SQL,列表 / 分组 / 导出三个入口共用,导出「当前筛选」自动带上
- 「未关联资产」同时收 asset_ids 为空与指向已删资产的发现,与树上桶的口径
  一致(只判空数组会让桶上的数字大于点开后的条数)
- findingFilterFromQuery 统一四处的筛选解析;新增 GIN 索引
  idx_findings_asset_ids,按资产反查发现不再全表扫

前端
- 树默认展开一层,支持过滤(匹配项自动展开)、面包屑下钻、手动刷新
- 每层只显示相对上一层的增量:子域名去根域名后缀、服务显示 `https :443`、
  接口只留路径。完整值在 title 与面包屑,搜索仍按完整值匹配
- 不轮询:进入视图 / 改筛选 / 页内改动发现 / 点刷新时才查
- 节点超上限时整层丢弃接口/服务并提示,计数已在上层不会丢
2026-08-31 10:58:32 -04:00
Autumn-27 796dbf5600 docs(readme): 增加微信公众号交流群二维码 2026-08-31 09:59:23 -04:00
Autumn-27 5fa2ff0b46 feat(findings): 发现页新增平铺大表视图并设为默认
分组视图要逐个任务展开才看得到漏洞,跨任务扫列表时反而绕路。新增
「全部发现」平铺视图作为默认视图,与「按任务分组」通过页头 Tab 切换。

- 表格主体抽成 FindingsTable,两个视图共用同一份行渲染,勾选/行内展开/
  行内改名与改状态/深入/删除的行为完全一致
- 平铺视图走 findingsPage(后端本就支持不带 task_id 的跨任务分页),
  页码与每页条数独立 state,筛选变更即重置回第一页
- 两视图共用统计卡片与筛选条,当前视图随筛选项一起持久化到 localStorage
- 轮询只打当前视图;行内改动同步写两边缓存,切换视图不会看到过期数据
- 首个请求推迟到偏好水合之后,避免按默认视图白拉一次
2026-08-31 09:59:15 -04:00
Autumn-27 3ddb0cb808 feat(llm): 连接测试打印网关原始响应(状态码+响应体)
点击后台「测试」时,把每次 HTTP 尝试的状态码与原始 wire body 打进
服务端日志,便于诊断 401/额度文案/空帧/返回 HTML 页面等情况——不再
只看到 UI 折叠后的 ok/err。

- llmrec.Capture 新增 Attempts(),按次返回 {状态码, 响应体}
- TestConnection 自建 Capture 挂到 ctx(不依赖 LLM 记录开关),
  经 quotaAwareTransport 填充后由 logTestConnection 输出,body 裁到 4K
2026-08-31 09:45:01 -04:00
Autumn-27 a2f7ac9747 feat(llm): 任务 LLM 配置链改为任何状态都可修改
任务结束(done/failed/timeout)后主 Agent 对话仍走任务配置链,链上模型出问题时
既不能改配置链、也就没法继续交互。去掉 HTTP 与 DB 事务两处终态拦截,前端弹窗
对终态任务同样开放编辑与保存(顺带修掉 queued 状态也不能编辑的口子)。

终态任务保存时不再重开额度阻塞意图:那些意图会从 blocked 挪到 open,既没有
worker 执行、也不再满足「重跑意图」的可重跑条件,反而变成死状态。终态任务想
继续跑仍走重跑意图/新增目标,由它们把任务重新 admit 回运行态。
2026-08-31 09:26:33 -04:00
Autumn db4f97ee95 Merge pull request #85 from neouks/main
支持 Worker 对话实时调整执行方向
2026-08-31 21:08:28 +08:00
Autumn-27 c9bf534818 重构 worker 对话:复用 resume 机制,改专属 goroutine 运行
把「给运行中 Worker 发消息调方向」从自建的介入持久化协议,改为复用
已有的暂停/恢复 + transcript resume 能力,实现与主 Agent chat 一致。

- 拆 runWorkerStep:抽出 runIntent(执行+善后),池子与消息路径共用一份
  善后逻辑;新增 runDetachedIntent,把意图 paused→running(不经 frontier)
  并在专属 goroutine 里直接跑,用户消息不受 3 槽池限制、随发随跑。
- 精简 sendWorkerMessage handler:校验 + emit 用户活动 + 专属运行;消息经
  ExecuteWithMessage 作为下一轮输入注入,request_id 仅做 transcript 去重。
- 删除介入 DB 协议与 15 处 activity 查询过滤(回退 exploration.go)、
  directedClaims 调度屏障、RecoverWorkerMessages 恢复、workerWake/waitWorker、
  AbortWorkIntervenedByUser。无 DB schema 改动。
- 前端:保留消息框,恢复「直接继续」(resume)按钮;发送改由 SSE 承载,
  去掉乐观插入。
- 取舍(低频可接受):消息仅存内存,不做崩溃恢复;发消息时该任务可能瞬时
  超并发 1 个 worker。

净改动 9 文件 +583/-46(原 PR 15 文件 +1940/-72)。
2026-08-31 09:00:21 -04:00
pphua ff493ae42b merge: consolidate worker conversations on main 2026-08-29 22:18:47 +08:00
pphua 76210b9933 revert: remove cross-agent worker direction synchronization 2026-08-29 22:05:28 +08:00
pphua 7e633b2056 fix: sync worker directions across agents 2026-08-29 21:55:28 +08:00
pphua cb706d3c8c 新增worker直接对话 2026-08-29 21:55:27 +08:00
pphua 4157fa248b 新增worker直接对话 2026-08-29 21:35:15 +08:00
Autumn 98d30b28de Merge pull request #83 from Autumn-27/fix/mobile-session-transcript-height
fix(web): 手机端会话详情折叠会话列表,避免会话记录被挤压看不全
2026-08-29 21:30:55 +08:00
Autumn-27 5f0d91bbb3 fix(web): 手机端会话详情折叠会话列表,避免会话记录被挤压看不全
小屏下会话列表固定占 10~15rem,会话记录只剩标题和输入框。改为 <lg
默认折叠列表(标题栏显示当前会话名+其它会话未读合计,点开选完自动
收起),并把高度预留从 13rem 收到 10rem。桌面端两栏布局不受影响。
2026-08-29 09:08:10 -04:00
Autumn 7ab0c214c9 Merge pull request #82 from Autumn-27/demo/enrich-planner-mock
feat(demo): 丰富 Vercel mock 里的 planner 规划过程
2026-08-29 15:06:25 +08:00
Autumn-27 9534e5e8a8 feat(demo): enrich planner rounds in the Vercel mock dataset
The demo's Plan session showed one line per round with no visible
reasoning, no cross-reference to worker output, and no intent-generation
tool calls, so it looked hollow and unrealistic.

Rebuild all five planner rounds as the full decision chain a real
planner emits: read the situation, pull the relevant worker facts for
detail (node_detail / list_findings), judge goals with prove_goal
(including the quantified-acceptance check that refuses to mark g2 met on
a foothold alone), and derive new directions through add_intent with
asset_ids / parent_ids / priority whose results reference the intent ids
already in the graph. Reasoning now cites the worker facts (fa1–fa10) by
id, so the plan is tied to what the workers actually found.

Also renumber the planner activity seq into a single monotonic range so
the rounds render in chronological order; previously round 4 (seq 4–5)
sorted ahead of rounds 1–3 (seq 300+).

Only the mock dataset changes; this affects the NEXT_PUBLIC_MOCK demo
build only, no backend behaviour.
2026-08-29 02:19:48 -04:00
Autumn 6d4408276c Merge pull request #79 from neouks/codex/sync-v0.3.6
feat: 增加任务冷归档与大任务性能优化
2026-08-29 13:52:05 +08:00
Autumn-27 21656cc2e3 fix: restore changes dropped by the upstream sync merge
The manual v0.3.6 sync (22132a4) was incomplete, and the follow-up merge
(d803ae2) resolved conflicts in favour of that copy, silently reverting three
shipped changes. main is already an ancestor of this branch, so re-merging
cannot bring them back; restore them explicitly.

- schema.sql: re-add the idempotent llm_profiles_format_check migration.
  CREATE TABLE IF NOT EXISTS leaves an existing table alone, so databases
  created before openai-responses kept the old two-value CHECK and rejected
  every openai-responses profile.
- orchestration.go: re-add the reseedPlannerPrompt/reseedWorkerPrompt calls,
  dropped by a comment-alignment hunk while the functions stayed behind as
  dead code. Without them existing installs never receive the quantified
  acceptance check or the negative-conclusion evidence threshold.
- CHANGELOG.md: restore the 0.3.6 entries, the @neouks credit and the correct
  norma version range.

Also close three recovery gaps in the new cold-archive path:

- traffic: write the staging journal even when no legacy host directory
  exists. Modern installs keep traffic in SQLite only, so a crash between the
  PostgreSQL commit and the SQLite commit left the archived task's exclusive
  traffic in the hot store with nothing for recovery to act on.
- recoverTaskArchiveStages: treat a missing journal.json as a discardable
  directory instead of an error, which used to set recoveryFailed and stop the
  archive worker from starting for the rest of the process lifetime.
- stageTaskArchiveFiles: replay the journal's renames when resuming an
  existing staging root. The journal is written before the first rename, so
  its presence did not guarantee a complete payload, and a resumed round could
  package an archive missing transcripts or workspace files.
2026-08-29 01:37:46 -04:00
pphua 0ec45bb45d fix: prevent OOM when archiving large tasks 2026-08-28 15:25:20 +08:00
pphua 01c6d73614 修复归档大型任务导致的崩溃 2026-08-28 15:20:52 +08:00
pphua 1fcc4b0588 fix: stream large task archive snapshots 2026-08-28 14:16:00 +08:00
pphua d803ae2b11 merge: sync official main into PR branch 2026-08-28 14:14:41 +08:00
pphua 22132a4d21 chore: sync upstream v0.3.6 changes 2026-08-28 14:03:07 +08:00
pphua 9da521ee4e 归档 2026-08-28 12:56:29 +08:00