Files
DevFlow/temp/二期池第一批-子轨迹落库-进度.md
T
lxy 36bc485112 优化: 界面交互完善与设置体验
- 审批卡尊重滚动意图,等长切换回底,排队超时按钮修活
- 带图编辑提示不静默丢,删除目标回写,切换文案消歧
- 会话键盘可达+搜索态重命名,筛选计数口径对齐
- 子任务提示正名,看板加载态
- 主题跟随系统,表单脏态拦截,密钥显隐留空提示
2026-10-03 16:27:48 +08:00

3.4 KiB
Raw Blame History

二期池第一批:子轨迹落库 + 来源标记(2026-10-03)

指令源:「已确定的 自主推进」。改动已完成并全量验证,未提交(攒批等用户令)。

目标

子代理轨迹从「纯内存零落库、会话结束即蒸发」改为「出口整轨迹落库」,origin=sub_agent 标记使桌面侧栏/miniapp 列表过滤子会话——轨迹可追溯(调试金矿 + 后续轨迹树/TaskDrawer 跳转的数据地基),不污染主会话列表。

已完成(全部验证通过)

项 文件 内容
V44 迁移 crates/df-storage/src/migrations.rs ai_conversations 加 origin TEXT 列(column_exists 幂等守卫,同 V42 模式),steps 43→44,三处版本号断言同步
record 字段 crates/df-storage/src/models.rs AiConversationRecord.origin: Option(不可变列,UPDATE 不写)
落库链路 crates/df-storage/src/crud/conversation_repo.rs from_row 读 origin(unwrap_or(None) 兜底,同 message_id v21 模式)+ INSERT 加列
会话内存标记 src-tauri .../ai/mod.rs AiSession.conv_origins: HashMap<String,String>(与 deleted_convs 对称:init 写入、出口清理回收)
save 透传 src-tauri .../ai/conversation.rs save 快照 lock 段取 conv_origin → record 构建落 origin(主会话恒 None)
列表过滤×2 src-tauri .../commands/conversation.rs + remote_bridge.rs 桌面侧栏 ai_conversation_list 与 miniapp list_conversations 同口径过滤 origin 非空
出口落库 src-tauri .../agentic/sub_agent.rs 统一出口 run_sub_agent_loop:判活(deleted_convs 未重打 且 per_conv 在)→ 摘拦截 → save_conversation 整轨迹持久化 → per_conv/save_locks/conv_origins 三清;启动时 conv_origins 与 deleted_convs 对称写入;模块头文档重写为新语义

验证证据

  • cargo test -p df-storage:182+12 全绿(含 V44 全链幂等两遍测试)
  • cargo check --workspace:0 error(2 个 warning 为工作区遗留改动自带:Emitter 未用导入、evaluate_ideas_batch 死代码,非本批)
  • cargo test -p devflow --lib:624 过 0 失败

顺手修的遗留半成品(同文件明确 bug,主动修原则)

v21 断点续迁改造批(工作区未提交遗留)新增的两个测试从未跑绿:

  1. v21_crash_midway_resumes_missing_convs:模拟 INSERT 3 占位符只绑 2 参数(seq 漏绑)+ 建表缺失 → 补 seq 参数 + execute_batch(V21_SQL) 前置
  2. v21_batch_boundary_crash_resumes_remaining_batch:建表缺失 → 同法修复
  3. test_full_migration_on_fresh_db:版本号断言写死 43 → 44

设计要点(为何这样落)

  • 零新破坏性:运行期仍零落库(deleted_convs 拦截不动),只改出口一次落库;主会话链路只多一次 HashMap get
  • 防空壳复活:出口判活查两处(级联删除会重打 deleted_convs / 父删除会清 per_conv),任一命中放弃落库
  • 过滤双口径:桌面 + miniapp 两处列表同 filter,前端零改动
  • Truncated/Failed 轨迹同样落库(调试价值);usage/model 落 None(宁少,轨迹树批再补)

待办(等用户令)

  • 提交(攒批授权)→ push → 换装(一字令)
  • 后续批:AiAgentFinished 前端展示(前端零消费已确认)→ 子代理审批挂起 → 轨迹调用树 → TaskDrawer 查看会话跳转