文档: 设计文档入库与构建配套收尾

- 云化两设计文档入库(devflow-core 抽取三步收口/云化架构 html)
- 看板销账: T1-T4 逐件附验收
- D4 工具 schema 空 description 清理(渐进披露配套,~10KB/轮)
- 换装脚本验证修复: 安装后装机 exe 版本核对,防 NSIS 静默失败误报成功
- capabilities/锁文件随批
This commit is contained in:
lxy
2026-10-26 01:36:55 +08:00
parent d97cbb4439
commit 070223baa5
7 changed files with 236 additions and 15 deletions
Generated
+1 -1
View File
@@ -1039,7 +1039,7 @@ dependencies = [
[[package]]
name = "devflow"
version = "0.1.3"
version = "0.1.5"
dependencies = [
"anyhow",
"async-trait",
+4 -4
View File
@@ -488,10 +488,7 @@ pub fn object_schema(properties: Vec<(&str, &str, bool)>) -> Value {
let mut required = Vec::new();
for (name, type_str, is_required) in properties {
props.insert(
name.to_string(),
serde_json::json!({ "type": type_str, "description": "" }),
);
props.insert(name.to_string(), serde_json::json!({ "type": type_str }));
if is_required {
required.push(name.to_string());
}
@@ -579,6 +576,9 @@ mod tests {
let schema = object_schema(vec![("name", "string", true), ("age", "integer", false)]);
assert_eq!(schema["type"], "object");
assert_eq!(schema["properties"]["name"]["type"], "string");
// 空属性描述不落盘:序列化输出不含 "description" 键(省 LLM 请求白携带)
let serialized = serde_json::to_string(&schema).unwrap();
assert!(!serialized.contains("description"));
let required = schema["required"].as_array().unwrap();
assert_eq!(required.len(), 1);
assert_eq!(required[0], "name");
@@ -0,0 +1,64 @@
# devflow-core 抽取设计(云化阶段2)
> 任务 711e1390 · 2026-10-22 · 勘察依据:workspace 9 个 crate Cargo.toml 实测
## 一、现状 crate 依赖图(实测)
```
df-types (零依赖: serde/thiserror/chrono/uuid)
┌────┴──────────────────────┐
df-ai-core df-workflow
(零tauri, trait层) (DAG/条件引擎, 仅依赖df-types)
│ │
df-storage ←──df-ai─────┐ df-nodes ──┐
(rusqlite+keyring, (reqwest流式) (聚合5crate) │
依赖df-types/df-ai-core) │ │
└──────┬───────────┴──────────────┘
▼
src-tauri (Tauri 壳, 68 IPC commands)
隧道链: df-tunnel(出站WS) → df-relay(云端中继镜像) → df-im-gateway(IM适配)
工具链: df-execute(零依赖) / df-mcp / df-ideas / df-project(依赖df-types)
```
## 二、核心发现:devflow-core 已基本存在,无需「抽取」只需「收口」
关键事实:**UI 无关的 crate 已经全部独立**——df-types/df-ai-core/df-workflow/df-storage/df-ai/df-nodes/df-project/df-execute/df-tunnel 均零 tauri 依赖,tauri 只在 src-tauri 壳层。昨天的「抽取」假设(需要从 8-crate 里剥离 UI 耦合)不成立,工作量大幅下降。
## 三、设计(三步收口,非重构)
### S1. 虚拟 target:workspace 内定义 `devflow-core` 集合(0.5 天)
不建新 crate,先以约定划界:`crates/df-{types,ai-core,workflow,storage,ai,nodes,project,execute}` = core 集合。云端服务直接 path 依赖这组 crate。**零代码改动**。
### S2. 存储层 trait 化(2-3 天,唯一实质改造)
- 现状:df-storage 直用 rusqlite(bundled),SQL 内嵌
- 改造:定义 `StorageProvider` trait(项目/任务/工作流/知识 CRUD 切面),SQLite 为默认实现;PostgreSQL 实现放独立 `df-storage-pg`(feature-gated,云端服务才编译)
- 保留双库分歧模式(devflow.db / devflow-dev.db 的 cfg! 分支语义)
- 风险:rusqlite 与 sqlx-tokio-postgres 的异步模型差异 → trait 方法全部 async(workspace 已有 async-trait)
### S3. AI Provider 双模式(1 天)
- df-ai/df-ai-core 已是 trait 层(reqwest 直连,key 本机)——天然支持云端托管:新增 `RemoteProvider` 实现(key 由 df-cloud-server 下发),编译期 feature 切换,个人版行为零变更
### 云端落地形态(阶段2 末期)
- `df-cloud-server`:新 crate(或独立仓),path 依赖 core 集合 + df-storage-pg,Axum/actix 暴露 HTTP+WS,部署同主机 Nginx 后
- 复用 df-tunnel 协议与 u-relay 管道层,拓扑不变
## 四、迁移步骤
1. S1 约定划界 + `cargo check` 全绿验证(不动代码)
2. S2 StorageProvider trait 引入,SQLite 实现先行,桌面端切到 trait 调用(行为零变更,IPC 68 commands 不动)
3. df-storage-pg 新 crate + 集成测试(本地 docker postgres)
4. S3 RemoteProvider feature
5. df-cloud-server 骨架(healthz + 只读任务查询先行)
## 五、风险 Top3
| 风险 | 缓解 |
|---|---|
| rusqlite 同步 API vs PG 异步驱动的 trait 撕裂 | trait 全 async + SQLite 实现内 spawn_blocking |
| df-storage 依赖 df-ai-core(ModelConfig 反序列化)造成边界混杂 | 接受(同属 core 集合,不跨集合) |
| 与阶段1 联调互踩 src-tauri | S2 改动收敛在 df-storage 内部 + 调用方,分批提交攒批 |
## 六、工作量总估
S1 0.5d + S2 2-3d + S3 1d + cloud-server 骨架 1-2d ≈ **5-7 天**(远低于原「抽取重构」预期)。
@@ -0,0 +1,143 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DevFlow 云化架构 — 2026-10-21</title>
<style>
:root{
--bg:#0d1117; --bg2:#161b22; --border:#30363d; --text:#e6edf3; --muted:#8b949e;
--blue:#58a6ff; --green:#3fb950; --orange:#d29922; --red:#f85149; --purple:#bc8cff; --pink:#ff7b72;
}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--text);font-family:"JetBrains Mono","Cascadia Code",Consolas,"Microsoft YaHei",monospace;font-size:14px;line-height:1.7;padding:32px 16px}
.wrap{max-width:1080px;margin:0 auto}
h1{font-size:26px;margin-bottom:4px}
.meta{color:var(--muted);font-size:12px;margin-bottom:28px}
h2{font-size:18px;margin:34px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--border);color:var(--blue)}
h3{font-size:15px;margin:20px 0 10px;color:var(--purple)}
.card{background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:18px 20px;margin:12px 0}
.tag{display:inline-block;padding:1px 9px;border-radius:20px;font-size:12px;margin-right:6px;border:1px solid}
.t-blue{color:var(--blue);border-color:var(--blue);background:rgba(88,166,255,.1)}
.t-green{color:var(--green);border-color:var(--green);background:rgba(63,185,80,.1)}
.t-orange{color:var(--orange);border-color:var(--orange);background:rgba(210,153,34,.1)}
.t-red{color:var(--red);border-color:var(--red);background:rgba(248,81,73,.1)}
.t-purple{color:var(--purple);border-color:var(--purple);background:rgba(188,140,255,.1)}
table{width:100%;border-collapse:collapse;margin:10px 0;font-size:13px}
th,td{border:1px solid var(--border);padding:8px 12px;text-align:left;vertical-align:top}
th{background:var(--bg2);color:var(--muted);font-weight:600}
pre{background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:20px;overflow-x:auto;font-size:12.5px;line-height:1.55}
.ascii{color:var(--green)}
.ascii .cloud{color:var(--blue)}
ul{margin:8px 0 8px 22px}
li{margin:4px 0}
.warn{border-left:3px solid var(--orange);padding-left:14px;color:var(--orange);font-size:13px;margin:10px 0}
.ok{color:var(--green)} .no{color:var(--red)} .hl{color:var(--blue)}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px}
.phase{border-top:3px solid var(--border)}
.p1{border-top-color:var(--green)} .p2{border-top-color:var(--orange)} .p3{border-top-color:var(--purple)}
code{background:#21262d;padding:1px 6px;border-radius:4px;font-size:12.5px;color:var(--pink)}
</style>
</head>
<body>
<div class="wrap">
<h1>DevFlow 云化架构方案</h1>
<div class="meta">拍板日期 2026-10-21 · 阶段1 已在飞书实机闭环验证 · 状态源:任务 711e1390 / 6e13f49b</div>
<h2>一、核心决策(已拍板)</h2>
<div class="card">
<ul>
<li><span class="tag t-blue">决策1</span><b>中继不新建</b>:复用生产 <code>u-relay</code>(:9180,纯中继零改动),df-im-gateway 以 <span class="hl">WS Commander</span> 身份接入</li>
<li><span class="tag t-blue">决策2</span><b>df-im-gateway 走方案 A</b>:先落在 devflow workspace 当第 9 个 crate,四端全通后再拆独立仓(避免模块 vs 实际代码脱节坑)</li>
<li><span class="tag t-blue">决策3</span><b>云端零业务逻辑零落盘</b>:任务/AI对话/审批状态全留桌面端 SQLite;AI Provider key 不上云,本机直连</li>
<li><span class="tag t-blue">决策4</span><b>语言对齐 Rust</b>:复用 df-tunnel 类型与 systemd 原子切换发布模式(publish-u-relay 同款)</li>
</ul>
</div>
<h2>二、部署拓扑总览</h2>
<pre><span class="ascii"> 用户四端 ┌─────────────────── 云端(已有云主机复用,不新购)──────────────────┐
┌────────┐ │ │
│ 飞书 │──WS 长连接──┼──▶ ┌─────────────────────────────┐ │
│ 钉钉 │─Stream Mode─┼──▶ │ <span class="cloud">df-im-gateway</span> (Rust, 新增) │ │
│ 企微 │──WS 长连接──┼──▶ │ · 四端协议适配(验签/AES/卡片) │ │
│ Web │─HTTPS/WSS───┼──▶ │ · WS Commander 身份 │ │
└────────┘ │ │ · 审批转发 │ │
│ └────────────┬────────────────┘ │
│ │ df-tunnel 协议 │
<span class="cloud">u-relay :9180</span> ◀──────┼─────────────────┘ (纯中继:WS 长连接管理/路由/Commander 注册表) │
│ │
│ Nginx :443 (TLS 终结 + 反代, 后续挂 df-cloud-server 用) │
│ │
└────────┬──────────────────────────────┬──────────────────────────┘
│ 出站 WS(穿透 NAT) │ 出站 WS
▼ ▼
┌── 用户本机 ─────────────────────────────────────────────────┐
│ DevFlow 桌面端 (Tauri 2, 唯一执行引擎 + 状态源) │
│ · AI Provider 直连 (GLM/DeepSeek, key 本机) │
│ · SQLite (任务/对话/审批 全量状态) │
│ · 8-crate workspace (+未来第9 crate df-im-gateway) │
└─────────────────────────────────────────────────────────────┘</span></pre>
<h2>三、数据流</h2>
<table>
<tr><th>方向</th><th>路径</th><th>用途</th></tr>
<tr><td>下行指令</td><td>IM/Web → df-im-gateway → u-relay → 桌面端</td><td>发消息 / 审批 / 停止</td></tr>
<tr><td>上行事件</td><td>桌面端 → u-relay → df-im-gateway → 各端</td><td>流式回复 / 状态广播</td></tr>
</table>
<div class="warn">⚠ 桌面端全程<b>主动出站</b>,不开任何入站端口——NAT 友好,家里/公司网络都能用;云端被攻破也拿不到业务数据(无状态管道)。</div>
<h2>四、阶段路线</h2>
<div class="grid">
<div class="card phase p1">
<h3 style="margin-top:0">阶段1 · IM 远程接入 <span class="tag t-green">进行中·飞书实机</span></h3>
<ul>
<li>飞书单端 E2E 闭环(握手→事件→卡片流式→审批回调→流式回复)——<span class="ok">代码已全落地,实机验证中</span></li>
<li>df-im-gateway 作为 workspace 第 9 crate 承载</li>
<li>钉钉/企微/Web = <span class="no">后续扩展,不阻塞</span></li>
<li>唯一动 u-relay 的点:Commander 身份注册(配置级)</li>
</ul>
</div>
<div class="card phase p2">
<h3 style="margin-top:0">阶段2 · devflow-core 抽取 <span class="tag t-orange">设计启动</span></h3>
<ul>
<li>UI 无关 crate 界定为 devflow-core(工作流引擎/任务管理/存储层)</li>
<li>存储 trait 双实现:SQLite(本地)/ PostgreSQL(云端)</li>
<li>AI Provider 双模式:key 本机直连(个人版)/ 云端集中托管(团队版)</li>
<li>同主机 Nginx 后追加 df-cloud-server,管道层不动</li>
</ul>
</div>
<div class="card phase p3">
<h3 style="margin-top:0">阶段3 · 完整云端化 <span class="tag t-purple">预留</span></h3>
<ul>
<li>云端接管全部业务逻辑,桌面端降级薄客户端</li>
<li>多用户 / 多设备 / 团队协作(任务池/审批/知识库共享)</li>
<li>可选本地引擎保离线能力</li>
</ul>
</div>
</div>
<h2>五、组件清单与状态</h2>
<table>
<tr><th>组件</th><th>形态</th><th>部署位置</th><th>状态</th></tr>
<tr><td>u-relay :9180</td><td>Rust 二进制(已有)</td><td>云端主机,systemd 原子切换</td><td class="ok">✅ 复用零改动</td></tr>
<tr><td>df-im-gateway</td><td>Rust crate(新增,方案A先驻 workspace)</td><td>联调期本机 → 常驻期云端主机</td><td class="ok">✅ 飞书端已通,实机验证</td></tr>
<tr><td>Nginx :443</td><td>TLS 终结 + 反代(已有)</td><td>云端主机</td><td class="ok">✅ 复用</td></tr>
<tr><td>DevFlow 桌面端</td><td>Tauri 2 应用</td><td>用户本机</td><td class="ok">✅ 唯一状态源</td></tr>
<tr><td>df-cloud-server</td><td>Rust 服务(规划)</td><td>云端主机,Nginx 后</td><td>阶段2 拍板后立项</td></tr>
</table>
<h2>六、风险与关键点</h2>
<div class="card">
<ul>
<li><span class="tag t-red">风险1</span><b>飞书卡片版本</b>:审批按钮回调仅新版卡片 <code>card.action.trigger</code> 生效,旧版 card 帧被 SDK 直接丢弃——联调最大坑(已知已沉淀)</li>
<li><span class="tag t-red">风险2</span><b>假活自愈</b>:断流约 13 分钟由看门狗 notify_waiters 唤醒(45f0560f),云端常驻部署后需关注长连接巡检参数</li>
<li><span class="tag t-orange">注意1</span><b>双库分歧</b>:devflow.db vs devflow-dev.db 是刻意设计(cfg! 分支),云化时存储层抽象需保留该模式</li>
<li><span class="tag t-orange">注意2</span><b>钉钉/企微降级</b>:P3/P4 保持 todo,不阻塞阶段1 验收与阶段2 并行</li>
</ul>
</div>
<div class="meta" style="margin-top:36px;border-top:1px solid var(--border);padding-top:12px">DevFlow 云化架构 · 生成于 2026-10-21 · 依据知识库拍板记录 978a3cf0 · 相关任务 6e13f49b / 711e1390</div>
</div>
</body>
</html>
+14 -8
View File
@@ -418,6 +418,10 @@
- [ ] 913 ✅转待办 验收:auto 模式审批架空语义收敛——auto_takeover_all 触发高危工具(run_command 等)须按 S2/信任分级处置(拦截或旁路留痕);审计表可查 auto 会话审批触发/旁路记录,产品语义写入设计档。
- [ ] 观察进化系统只写不读:knowledges 1033 条/embedding 全 NULL/83.6% 零复用/knowledge_search 仅 5 次
- [ ] 915 ✅转待办 验收:知识库由「只写不读」转读写闭环——embedding_status 回填(或明确弃用向量路径),≥半数知识进检索候选,knowledge_search 调用与复用率实测上升(复用率 >50%、检索调用非个位数);口径=同库 DB 查询核验。
- [~] **P0 治理批已落地(2026-10-23,用户拍板「推进落地」)**:①写入防重融合——提炼前按窗口关键词查已有知识 top5 随 prompt 附给 LLM,schema 增 action=new|update+target_id 协议,重复经验覆盖融合(target_id 校验候选集防幻觉 id),knowledge_insert 工具同口径(update_target_id);②淘汰机制——repo.archive_stale(零复用+low+超龄→archived,UPDATE RETURNING 批量)+knowledge_archive_stale command(逐条留痕 status_changed),检索面 status 白名单天然排除 archived,检索排序加 confidence 决胜键(两处 SQL);③向量路径「明确弃用检索用途」已声明(注释+实测 0/1688,阶段3 改职建边引擎)。验收:cargo test -p df-storage 242 passed(含 3 新测:update_content_merged 融合轨迹/archive_stale 三条件筛选/search_keywords 置信决胜)+cargo check -p devflow EXIT 0+knowledge 58 passed+tool_registry 50 passed(工具数未破)。✅ **存量清理批已执行(2026-10-23 用户授权「1」)**:先备份(backup API 快照 1688 条核对一致)后变更,判据校准 low→非high(生产实证 LLM 置信系统性偏高 low 仅 1/1688,原判据命中 0 形同虚设),归档 62 条(published 1550→1488)+knowledge_events 逐条留痕可回滚;**未执行档**:零复用+超龄不看置信 632 条(84% high 已无区分度,规模大待单独拍板)。台账:temp/数据变更台账.md。诊断与终局设计见 temp/知识库治理审查-20261023.md 与 temp/知识中枢终局设计-20261023.md(五阶段路线:0治节点→1连边→2图召回→3自动建边→4中枢共享,百万级换挡表已实测留档)。
- [~] **阶段1 连边已落地(2026-10-23 续批,用户「继续」)**:①V54 迁移 knowledge_edges 边表(kind/weight/origin/last_verified_at,双列索引,LATEST_SCHEMA_VERSION 53→54);②repo 边 CRUD——insert_edge(双向去重幂等+触验)、list_related(双向 JOIN+对端展开,archived 不展示);③提炼链 related_ids 协议——prompt 规则 7(new 时列最多 3 个强相关已有条目),解析循环建 similar 边(origin=llm-tag,target 校验候选集防幻觉);④knowledge_insert 工具 related_ids 同口径+knowledge_search 返回补 id 字段(agent 引用已有条目的前提);⑤详情页「关联知识」区块——knowledge_get_detail payload 直带 related,折叠 section+点击跳对端(open-related→selectKnowledge),双语 i18n。验收:cargo test -p df-storage 243 passed(V54 迁移幂等门+边 CRUD 新测)+cargo check -p devflow EXIT 0+vue-tsc --noEmit EXIT 0。阶段2(图召回激活扩散)待下批。
- [~] **治理续批(2026-10-24 用户「自主推」+「蒸馏压缩合并/打包换装」)**:①激进档已执行——自主授权(可逆+留痕+备份),归档 570 条零复用超龄(置信不限),累计 archived 632/published 1550→918,备份 devflow.db.bak-知识库淘汰批二-1024,台账已登记;②存量蒸馏合并功能落地——knowledge_distill.rs(archived 按 kind 分组 limit 20→LLM 合订本 candidate→merges 边 origin=distill 连组内全部条目,strip_code_fence/candidate_record_from_item pub(crate) 复用)+repo.list_by_status_kind(created_at 升序最老优先)+knowledge_distill_group command;③版本 0.1.3→0.1.4,打包换装 package-devflow.ps1 -Mode full 执行中。验收:cargo test -p df-storage 244 passed(含 list_by_status_kind 新测)+cargo check EXIT 0。蒸馏批生产执行(app 内按 kind 逐组人工触发)与阶段2图召回待下批。
- [~] **渐进披露批(2026-10-24 /swarm 四执行者+主控核查,用户「披露式按需召回加载」+「不牺牲缓存命中」)**:D1 文档探索策略段 11.9K 全文常驻→路标 260 字符常驻+全文按需(URL/文档词触发,fingerprint 含门位,全文进 volatile 侧——缓存安全主控核查通过);D2 技能清单 120条×80字→60条×40字;D3 devflow.md 投影目录化(纪律分区全文保留,其余目录+read_file 按需,总闸 6000→3000);D4 工具 schema 属性级空串 description 清理(81 工具×~4 属性,~10KB/轮);驳回工具两跳披露(冻结集跨轮字节前缀稳定约束>收益)。**附带修复目标切换失忆(用户实证「切换目标两三轮后拉回老目标」)**:G1 钉扎段加仲裁行「用户最近指令>登记目标」——根因=system 级老目标压过对话流新意志。验收:cargo test -p devflow --lib 932 passed+df-storage 244+df-ai 605+cargo check EXIT 0。**换装 0.1.4 完成**(装机 exe 版本实测 0.1.4/PID 存活);⚠️ 登记换装脚本验证缺陷:swap 启动验证只查进程存活+读 mtime,build 期间旧进程复活锁文件致 NSIS 静默安装失败仍报「换装成功」——验证应加装机 exe 版本核对(待修)。新会话提示词静态底座 16.2K→~4.5K 字符+工具载荷省 ~10KB/轮。
- [ ] 观察多模态未走通:贴图落"[图片已忽略]"占位,实际靠 run_command 外部 vision CLI 绕路
- [ ] 917 ✅转待办 验收:贴图走原生视觉路径不落占位——非视觉模型收图时明确拒绝或切视觉模型,视觉模型直接出识别结果,不再靠 run_command 调外部 vision CLI 绕路;实测贴图会话零"[图片已忽略]"占位。
- [ ] 观察编排面零使用:workflow/node_executions/ai_plans 等 9 张表全 0 行;四会话分工 origin 89/89 全 NULL
@@ -776,11 +780,13 @@
- [ ] M4-b UX 小批(i18n 补键/token 化/aria/loaded/Esc/队列带图标记)——未动,留板
- [x] **收尾令(用户 2026-10-18 21:41 飞书下达到 AI-Ops,转登记)**:M1 销账后——①按 G3 提交本批改动并 push origin main(推送令已拍板,限本批范围);②启动 dev 模式运行验证(重点验 M4 反口水话与 M1 恢复链);③完成信息经飞书推送用户。若 AI-Ops 监测到 M1 已销账而本条未执行,AI-Ops 代执行。——✅ 23:0x AI-Ops 执行完毕:四笔分组提交(05d0f89 上下文P1批/302c4bc 飞书闭环/25ec9cf 前端令牌批/fb83339 文档)已 push(3bb662f..fb83339);验收 cargo test 2281 passed 0 failed+vue-tsc EXIT 0;dev 已跑(vite:1420 HTTP 200);完成信息已飞书推送。
### 💡 2026-10-19 上下文管理对标 u-claw·大批量并行差距(AI-Ops 分析,待领单)
> 用户战略令(10-18 飞书):DevFlow 上 Linux 替代 u-claw+CC,第一门槛=上下文管理三命题(丢记忆/历史召回/token 高效),大批量多会话并行是常态场景。详情:[02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md](../02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md)
- [ ] P0-A usage 真值采集:stream_options.include_usage 三口径(input/cache_read/cache_creation),6 月 P1 设计复活(当时暂缓,结构层已回退干净)
- [ ] P0-B 压缩触发改 token 水位主判据(≈窗口 70% 可配,体积兜底;u-claw 86e9216 同款,治压缩/请求比 4.8 偏频),依赖 P0-A
- [ ] P1-A 跨会话归档检索(/history 等价):消息全文搜索(FTS5 或 LIKE 起步)+检索指令+AI 检索指引进 sop
- [ ] P1-B boundary/loop_state 写入闭环(代语义显式化+换代通知推送)
- [ ] P2-A 大内容外置纪律(大结论写盘 out/+回复给路径,system prompt 处理规则)
- [ ] P2-B 并行资源治理(全局 token 预算视图/多会话压缩协防)——与 Linux 化/远程容器方向合流设计
### 💡 2026-10-19 上下文管理对标 u-claw·大批量并行差距(10-21 已批次化,待领单)
> 用户战略令(10-18 飞书):DevFlow 上 Linux 替代 u-claw+CC,第一门槛=上下文管理三命题(丢记忆/历史召回/token 高效),大批量多会话并行是常态场景。详情:[02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md](../02-架构设计/专项设计/上下文管理对标u-claw与大批量并行差距分析-2026-10-19.md)。**10-21 勘察批**:分析落 temp/分析-P0A/P0B/P1A/P1B-P2A-2026-10-21.md+temp/待完成六条-汇总方案-2026-10-21.md。
- [x] **T1 批 P0-A usage 口径统一**(S-M,无依赖,推荐首批):考古实锤=三口径列已齐(V38 864c696 prompt/completion+V39 a031521 cache_hit/cache_miss/reasoning,ai_messages;V5 ai_conversations 累加),include_usage 已注入——**真缺口=两栈口径漂移**:openai_compat.rs:542-549 缺失全零静默入库(三路走查:85)vs Anthropic 缺失硬失败、anthropic cache 段少记 prompt;修=缺失回退估算+is_estimated 标记+cache 段口径对齐 u-claw 三口径(input/cache_read/cache_creation)。拍板:缺失回退策略确认——✅ **2026-10-22 落地**:anthropic_helpers usage 整段+字段双层 serde default(端点不回 usage 不再炸帧,全零下行走既有估算轨 round_usage_effective 打 is_estimated;openai 臂既有 serde default 同口径零改动)+cache 三口径归一(prompt=input+cache_read+cache_creation 对齐 openai 全量输入语义,apply_anthropic_event 归一点)+round_is_estimated 全链透传(stream_relay→loop→completed_event)。df-ai 603 绿
- [x] **T2 批 P0-B 压缩水位判据**(S 级两阶段,Phase1 无硬依赖可首批并行):方案实锤=temp/分析-P0B-压缩水位判据-2026-10-21.md——现行判据 context_lifecycle.rs:117-138(history>0.6×(budget−sys)+保护区 6 条);窗口分母已解决(model_context.rs:31 三级来源,budget 模型感知零新增管道);Phase 1=判据行加分支(KV `df-ai-compress-watermark` 默认关+`-ratio` 默认 0.70,分子维持估算,开关关逐字节等价)/Phase 2=分子换 usage 真值(usage_anchor 锚点,缺失自动回退);与 W1-W4 交互=触发后移缓存净增(W3 可验),红线 trigger+max_round_growth<available;**S1 分批压缩同轴必须合并实施序**(T2 立轴 S1 叠批次);**验收口径修正:「压缩/请求比 4.8」数错对象(是 view-only 视图压缩日志非自动压缩频度,归 P3-7 另治),验收改用「自动压缩成功行数/日」**。拍板 5:分母 budget/0.70 默认/灰度翻转/S1 合并序/PROTECT_COUNT 双源统一(可选)——✅ **2026-10-22 Phase1 落地**:compress_should_trigger 双模式(context_lifecycle.rs:113,开关关=现行 0.6 判据逐字节等价;开=水位主判据 history+sys>ratio×budget 严格大于,替换语义不并联)+parse_watermark_ratio 钳位 [0.3,0.95](prompt.rs:775,保 headroom≥5% budget,debug_assert 契约)+KV 开关默认关+S1 同轴挂点注释钉死实施序;Phase2 usage 真值分子待 T1 数据观察后另批
- [x] **T3 批 P1-A 跨会话检索**(核心 2.5d/含前端 3.5d,无依赖可并行):方案已实锤=temp/分析-P1A-跨会话检索-2026-10-21.md(终版含生产库实测)——**实测:ai_messages 32,349 行/117 会话,content 39.5MB,compressed 消息原文完整保留=全量账本,archive jsonl 仅派生副本,检索面盖 ai_messages 即全覆盖,零迁移零回填**;LIKE 实测 113ms/单关键词——LIKE+复用知识库分词(extract_query_keywords,knowledge_inject.rs:115)起步,FTS5 开箱可用(bundled SQLite 3.45)但中文按字切分召回差+仓内两先例拍过不上,升级条件(>50 万行/P95>500ms)留档;**双入口分期**:AI 工具 history_search 先行(两跳式瘦身:首跳每会话 120 字片段/深查二跳 conversation_id,对齐 2K 预算纪律 namespace_store.rs:32;无参降级列最近 10 会话;基线 tool_registry.rs:1520 断言 80 工具+1),前端侧栏升级同批可选;sop 指引 prompt.rs:161-163 guidance 行+:251 父子同源(先例 :385)。拍板 6:①入口分期(AI 先行+前端可选)②两跳式瘦身 ③无参列会话内置降级 ④tool 角色默认排除检索 ⑤无摘要会话摘要降级链 ⑥FTS5 阈值留档——✅ **2026-10-22 AI 工具入口落地**:message_repo 跨会话关键词检索(MessageSearchHit+snippet 命中点前后 200 字截 500,FTS5 升级触发条件注释留档)+idea_repo escape_like 升 pub(crate) 单一实现复用+tools/history.rs 声明式注册 history_search(两跳式/无参降级列最近会话/tool 角色排除)+tool_registry 接线+prompt guidance 双语(严禁 run_command 查 sqlite 代查+压缩史 read_file archive 路径引导)。df-storage 227 绿;前端侧栏入口未做(分期可选,待令)
- [x] **T4 批 P1-B 代语义闭环**(M,无依赖):boundary/loop_state 填充率 0 的挂点补齐——四事件挂点=压缩完成/停靠(emit_task_parked agentic/mod.rs:~1464)/恢复链快照/会话清空;换代通知接飞书既有推送通道(审批/停靠通知同范式);DDL 待勘察(T4 分析回收后定 V54+)——✅ **2026-10-22 三件套落地**(零 DDL,status 列 V50 既有):件一 status 终局补写(emit_ai_completed_once 顺写 completed/emit_fatal_error 写 error/ai_chat_clear 事务内归位 loop_state=NULL+status=active+boundary_json=NULL 防复活)+件二 run_generation_notifier 飞书推卡(订阅 AiTaskParked/AiAutoCompressed,停靠去重+换代 30s 聚合)+件三 DELIVERY_GUIDANCE_PROMPT 渠道段注入(cache_on 分流)+watcher 交付缺口补(快任务兜底路径早退漏调 reply_deliveries)。进度=temp/三件套-代语义闭环与飞书推送-进度-2026-10-21.md;devflow 930 绿
- [ ] **T5 项 P2-A 大内容外置纪律**(S,轻,可搭车 T3/T4):system prompt 处理规则段(u-claw #3:大结论写盘 out/,回复给路径+3 行结论);write_file 权限语义+out/ 目录约定随批定
- [x] ~~P2-B 并行资源治理~~ → **不立项,占位留 Linux 化**(temp/分析-P2B-并行资源治理占位-2026-10-21.md:前置=P0-A 预留 per-conversation 聚合口径+P1-B 挂点不堵死;触发=Linux 化立项启动)
**批次推进序**:T1+T3 并行首批 → T2(依赖 T1)+T4 → T5 搭车;P2-B 留合流。挂账提醒:T1-T5 开工前先清 6 文件拖拽落盘攒批(等提交令)。
+9 -1
View File
@@ -59,8 +59,16 @@ Start-Sleep -Seconds 2
Start-Process $bundle.FullName -ArgumentList "/S" -Wait
if (-not (Test-Path $exe)) { Write-Host "[失败] 安装后未找到 $exe"; exit 1 }
# 版本核对(2026-10-25 实证修复):NSIS 静默安装可能因文件锁静默失败,旧进程复活锁文件时
# 曾出现「报换装成功但装机 exe 仍是旧版」。装机版本必须与本次构建一致才算换装成功。
$wantVer = (Get-Content "$repo\src-tauri\tauri.conf.json" | ConvertFrom-Json).version
$gotVer = (Get-Item $exe).VersionInfo.ProductVersion
if ($gotVer -ne $wantVer) {
Write-Host "[失败] 静默安装未生效:装机 exe 版本 $gotVer != 构建 $wantVer(疑似安装器被文件锁/旧进程拦截),请手工运行安装包后重试"
exit 1
}
$exeTime = (Get-Item $exe).LastWriteTime
Write-Host "[4/4] 启动验证(装机 exe 时间: $exeTime)..."
Write-Host "[4/4] 启动验证(装机 exe $gotVer,时间: $exeTime)..."
Start-Process $exe
Start-Sleep -Seconds 6
$proc = Get-Process devflow -ErrorAction SilentlyContinue
+1 -1
View File
@@ -1,7 +1,7 @@
{
"identifier": "default",
"description": "DevFlow default permissions",
"windows": ["main", "ai-detached", "ai-detached-*", "fe-detached-*", "approval-popup"],
"windows": ["main", "ai-detached", "ai-detached-*", "fe-detached-*"],
"permissions": [
"core:default",
"core:event:default",