重构: 应用状态拆分+事件分发统一+路径授权治本

三项治本性架构重构,解决长期遗留的技术债:

一、应用状态文件拆分(原 1416 行单文件 → 按职责分模块)
- 文件授权白名单(AllowedDirs/路径校验/黑名单)独立成模块
- 知识库行为配置(ExtractTrigger/KnowledgeConfig/KV 常量)独立成模块
- LLM 并发控制(LlmConcurrency 双层信号量)独立成模块
- 主文件仅保留 AppState 结构体与初始化逻辑

二、事件分发器统一(消除双监听器架构隐患)
- 压缩/清空等 5 类生命周期事件纳入主事件联合类型
- 删除上下文管理模块的独立第二监听器
- 改为由主事件分发器统一处理,经回调注入副作用
- 架构保证:一个事件源 → 一个监听器 → 一个分发器

三、路径授权去除编译期硬编码(分发适配治本)
- 启动时不再硬塞编译机路径到授权白名单
- 工程根授权完全靠项目绑定目录自动授权 + 设置页手动配置
- 分发到其他机器后不再有脏白名单数据
This commit is contained in:
2026-06-28 23:35:38 +08:00
parent 696e34407c
commit 996f1d9e5f
8 changed files with 967 additions and 873 deletions

View File

@@ -55,37 +55,30 @@
#### ARC-260615-07 架构重构批(排期/优先级决策)
- **背景**:src-tauri IPC 编排层 5711 行成事实业务层,7 项架构债。df-core→df-types 已完成(CR-61),剩 6 项独立大改。
- **决策点**:6 项重构何时做/优先级/是否做(每项 ROI 与风险权衡,无法纯技术论证——做不做是资源/产品取舍)
- **选项(剩余 6 项)**:
- a: df-app 抽取(IPC 编排层 5711 行独立 crate)
- b: AI agent loop 从 IPC 下沉 df-ai(逻辑与 IO 分离)
- c: 类型契约 ts-rs 代码生成(替代手写 types.ts)
- d: AiSession 多会话(B 路线前置,关联 S-260614-01)
- e: AppState 分组(5711 行 state 拆分)
- f: IPC 命名统一
- **推荐**:**⏸️ 缓做**(重构低 ROI,当前功能优先;待稳定后按 d→b→a 顺序,d 是 B 路线前置可先)
- **关联**:todo ARC-260615-07 / memory aichat-arch-extensibility
- **状态**:🟡 待排期决策
- **核验与推进(2026-06-28)**:
- a: df-app 抽取(IPC 编排层独立 crate) — ⏸️ 缓做(当前规模可控,lib.rs 415 行)
- b: AI agent loop 从 IPC 下沉 df-ai(逻辑与 IO 分离) — ⏸️ 缓做(agentic/mod.rs 2203 行,模块拆分充分)
- c: 类型契约 ts-rs 代码生成(替代手写 types.ts) — ⏸️ 缓做(波及大,ROI 中等)
- d: AiSession 多会话(B 路线前置) — ✅ 已完成(per_conv 隔离)
- e: AppState 分组(1411 行 state 拆分) — ✅ 已完成(2026-06-28:拆为 state/{allowed_dirs, knowledge_config, llm_concurrency} 三个独立文件)
- f: IPC 命名统一 — ⏸️ 缓做(破坏性变更,需同步前端 invoke 调用,风险高于收益)
- **状态**:✅ d+e 已完成,a/b/c/f 评估为缓做(低 ROI / 高风险)
#### UX-260617-01 aichat 消息全量重叠(待 DevTools 定位根因)
#### UX-260617-01 aichat 消息全量重叠(✅ 已解决)
- **背景**:用户实测消息大量重叠堆叠。5 角度分析排除 CSS/scoped/DOM,核心嫌疑虚拟滚动 IO 半激活态不一致 + height=0 未设 minHeight → slot 塌 0 → 重叠。
- **决策点**:根因确切触发路径(需 DevTools 实测,静态分析已到极限)
- **选项**:
- a: 虚拟滚动 IO/RO 时序竞态(主嫌疑,unload 分支 minHeight 兜底修复)
- b: 其他(DOM 结构问题,需 DevTools 实查)
- **推荐**:**待用户 DevTools 实测**(shouldRenderMsg 卸载时检查 slot 实际高度 + IO unobserve/observe 时序),定位后修法明确(unload 分支 minHeight fallback)
- **关联**:todo UX-260617-01 / docs/05-代码审查/AI聊天组件极端数据场景分析-2026-06-17.md
- **状态**:🟡 待 DevTools 验证根因
- **根因**:虚拟滚动实现引入的 IO/RO 时序竞态(option a 确认)。
- **解决**:删除虚拟滚动实现(`useAiVirtualScroll.ts` 移除),`MessageList.vue` 消息恒渲染,重叠根治。
- **代价**:长对话性能下降(无虚拟化),正确性优先。
- **状态**:✅ 已解决(2026-06-18 删除虚拟滚动根治)
#### UX-260617-28 双监听器同通道(长期架构演进)
- **背景**:useAiEvents + useAiContext 各自 listen('ai-chat-event'),人工 AiCompressing flag 协调防双重处理,非架构保证。未来新增事件处理可能触发双重 bug。
- **决策点**:是否升级单一分发器模式(架构保证)
- **选项**:
- a: 保持现状(AiCompressing flag 协调够用)
- b: 单一分发器(架构保证,但大改)
- **推荐**:**⏸️ 暂缓**(当前 flag 协调有效,未来新增事件处理触发双重 bug 时再升级)
- **关联**:todo UX-260617-28 [INFO]
- **状态**:⏸️ 长期(INFO,当前够用)
#### UX-260617-28 双监听器同通道(✅ 已解决)
- **背景**:useAiEvents + useAiContext 各自 listen('ai-chat-event'),靠手写 flag 协调防双重处理,非架构保证。
- **解决(2026-06-28)**:治本性重构——
- 5 类生命周期事件(AiCompressing/AiManualCompressed/AiAutoCompressed/AiContextCleared)加入 AiChatEvent 联合类型
- useAiEvents.handleLifecycleEvent 统一处理生命周期事件
- 删除 useAiContext 的独立第二监听器,改为注入回调到 useAiEvents 统一分发器
- 架构保证:一个事件源 → 一个监听器 → 一个分发器,无双重处理风险
- **状态**:✅ 已解决(2026-06-28 统一监听器重构)
#### ARC-260618-01 God 文件拆分批(架构重投入·需设计)
- **背景**:~~2026-06-18 架构坏味道扫描出 3 个 God 文件~~
@@ -147,7 +140,19 @@
---
## workspace_root 分发适配(编译期 CARGO_MANIFEST_DIR 写死,跨机器/跨平台失效)
## workspace_root 分发适配(✅ 已解决)
**背景**:workspace_root_path() 用 env!("CARGO_MANIFEST_DIR") 编译期写死开发机路径,分发到其他机器后失效。
**解决(2026-06-28)**:治本方案①——去默认白名单。
- `reload_allowed_dirs` 不再硬塞 workspace_root 到白名单
- 工程根授权完全靠以下两途径(均已就绪):
1. projects.bind_directory:用户绑定项目时自动授权
2. Settings 页 allowed_dirs:用户手动添加持久化白名单
- workspace_root_path() 函数保留:旧 .trash 迁移(init 中一次性)仍需读取
- dev 自用场景:开发机运行时 projects.path 通常含本工程,自然命中白名单
**状态**:✅ 已解决(2026-06-28 方案①落地)
**背景**:`workspace_root_path()`(state.rs)/ `workspace_root()`(tool_registry.rs)/ `workspace_root_str()`(mod.rs)三处同源用 `env!("CARGO_MANIFEST_DIR")`(编译期写死编译机源码路径)。DevFlow 打包分发后:
- 用户机器无编译机路径(如 `E:\wk-lab\devflow`)→ workspace_root 失效