From 9753a6f9026b42e339895b66d51918effdd4f0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Sat, 15 Aug 2026 18:58:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20git=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E8=89=B2=E4=B8=8E=E8=AE=BE=E7=BD=AE=E6=8E=A7=E4=BB=B6token?= =?UTF-8?q?=E5=8C=96=E6=94=B6=E6=95=9B+=E7=9C=8B=E6=9D=BF=E9=94=80?= =?UTF-8?q?=E8=B4=A6=E6=B8=85=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/todo.md | 21 +++++++++++---------- src/components/project/FilePreview.vue | 12 ++++++------ src/components/project/FileTree.vue | 16 ++++++++-------- src/components/project/GitChanges.vue | 6 +++--- src/components/settings/ConnectionPanel.vue | 8 ++++---- src/components/settings/ProviderPanel.vue | 10 +++++----- src/styles/global.css | 12 ++++++++++++ 7 files changed, 49 insertions(+), 36 deletions(-) diff --git a/docs/todo.md b/docs/todo.md index 1ef0bde..41b86d1 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -8,6 +8,7 @@ > **2026-06-27 归档**: 已完成 `[x]`/`✅` 项已迁至 [07-项目管理/todo归档/2026-06-27.md](./07-项目管理/todo归档/2026-06-27.md)。 > > **2026-08-05 编号碰撞登记**: `F-260619-03` 被两个特性复用(消息拆分存储=文档本体 + AI工具路径授权=复用)。子代理审查确认:改 18 处编号无实际价值有风险,**暂不改代码**,后续新增注释编号统一走日期+序号体系、避免复用已有编号。路径授权若后续单独立项再独立编号。 +> **2026-08-15 编号碰撞登记**: `REFACTOR-260619-04` 被复用(父③③.2 审批状态机拆分=待办 vs ToolCard 拆分=已完成)。后续引用审批状态机拆分时用「审批状态机拆分」描述,不再沿用该编号。 ### 💡 2026-08-04 父子任务支持(✅ 已完成) @@ -221,7 +222,7 @@ graph TD ### 待澄清 / A-B 待定 -- [ ] S-260614-01 — **[用户已澄清 2026-06-17]** 「显示多开」= 多个会话来回切都可对话(非 AI Chat 窗口多开)。**✅ 已并入 F-260616-09(已决 a):A 路线已实施,B 高优先立项,详见待决策归档/2026-06.md** +- [x] S-260614-01 — ✅ 已销账(并入 F-09,F-09 B 阶段 2026-08-07 全部落地)。**[用户已澄清 2026-06-17]** 「显示多开」= 多个会话来回切都可对话(非 AI Chat 窗口多开)。**✅ 已并入 F-260616-09(已决 a):A 路线已实施,B 高优先立项,详见待决策归档/2026-06.md** #### ℹ️ 架构观察(INFO · 2 项·不进修复队列) @@ -319,7 +320,7 @@ graph TD > ✅ 全部修复完成(2026-06-27 核验) -- [~] **IDEA-FIX-10 [P2🟠]** — **前端 filter + 后端分页漏数据**。团队决策:`hot`/`pending` 保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。 +- [x] **IDEA-FIX-10 [P2🟠]** — **前端 filter + 后端分页漏数据**。团队决策:`hot`/`pending` 保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。✅ 关闭(2026-08-15:团队决策定案,无后续动作) --- @@ -350,7 +351,7 @@ graph TD **P3(风格/可读·低优)**: - [x] **WC-P3-SubflowNode-风格** — ✅ **已销账(2026-08-09)**:subflow_node trait 顺序(execute→schema→node_type)对齐 ai/human 节点 -- [~] **WC-P3-script-注释** — 🟡 部分:script_node.rs:9「替代纯 env var」措辞与 env var 回退并存,需改措辞(待批) +- [x] **WC-P3-script-注释** ✅ 已销账(2026-08-15 全文核验):script_node.rs 全部 env var 相关注释(:9/:144/:167 等)均已是「运行时配置优先、env var 回退」语义,无「替代纯 env var」矛盾表述,无需改动 **专项(已登记 memory,留指针)**: @@ -386,9 +387,9 @@ graph TD - [x] ✅ **P1-f** cmd 闪烁 N² — **已落地(2026-08-09 141777b)**:module.rs 新增仓库级 git status 缓存(GIT_STATUS_CACHE,key=仓库根 path,TTL 5s,锁内不跑 git,非 git 不缓存;get_module_file_tree + get_module_git_status 两处收口;删除/更新 module 清缓存);前端联动未做(5s TTL 自然过期 + FileExplorer 刷新已重拉目录树,无独立缺口) - [x] ✅ **P1-g** store.tasks.filter 污染 — **2026-08-09 核验+补全销账**:ProjectDetail 独立 taskApi.list 已修;ChatInput @项目 enrichment 独立拉取(projectTasksCache)已修 + @任务联想本批改独立全量缓存 taskSuggestionCache(隔离 Tasks 页筛选子集)+ mentionTotal 对齐 -**P2(打磨)**:✅ 幽灵 `--df-primary` 已清(2026-08-15:4 处引用迁 `--df-accent` 逐主题等价,双主题定义删除,零残留)/ ✅ 死代码 PlanProgress·isLastUser 已核不存在 / git 状态色 token / 控件统一(原问题 8 延伸) +**P2(打磨)**:✅ 幽灵 `--df-primary` 已清(2026-08-15:4 处引用迁 `--df-accent` 逐主题等价,双主题定义删除,零残留)/ ✅ 死代码 PlanProgress·isLastUser 已核不存在 / ✅ git 状态色 token(2026-08-15:--df-git-added/modified/deleted/untracked 双主题,FileTree/GitChanges/FilePreview 18 处迁 var+color-mix)/ ✅ 控件统一(2026-08-15:.setting-input 全局定义承接,Connection/ProviderPanel 重复副本删,存布局覆盖) -**批次 I(原 12 大改 · 后续专项)**:Dashboard 统计卡压底行(问题 1,依赖 P1 数据源)/ Projects 视图模式(问题 2)/ TaskDetail(4)·IdeaDetail(5)·KnowledgeDetail(6)·ProjectDetail(10)重设计 / project_event_repo 埋点接入(问题 3) +**批次 I(原 12 大改 · 后续专项)**:Dashboard 统计卡压底行(问题 1,依赖 P1 数据源)/ Projects 视图模式(问题 2)/ TaskDetail(4)·IdeaDetail(5)·KnowledgeDetail(6)·ProjectDetail(10)重设计 / ✅ project_event_repo 埋点已接入(2026-08-15 核验:commands/project.rs emit_project_event 封装 best-effort 写入 + list_project_activities 消费) --- @@ -401,8 +402,8 @@ graph TD - [x] **AC-1** ✅ 已落地(2026-08-09 核验):双层拦截——调用级 `cache.rs:251 find_cached_readonly_result`(同 tool_name+canonical_args 已 completed 即返缓存+警告头,第 2 次即命中)+ 轮级 `is_repetitive_exploration`(helpers.rs:304-332,单签名≥3/唯一率<40%)→ `check_stall_breaker`(警示→硬熔断 emit AiHelpRequired) - [x] **AC-2** ✅ 已落地(2026-08-09 核验,提交 fe780c0):`MAX_TOOL_CALLS_PER_ROUND=8`(agentic/mod.rs:245)+ 目录列举去重(readonly_cache_args_key 只取 path,返目录专用警告)+ `detect_listing_bypass`(run_command 含列举命令且引用已列目录→警告,保守式不硬拒) - [x] **AC-3** ✅ 已落地(2026-08-09 核验):prompt.rs:304/323 项目/任务清单已含 id + 注明语(projects_listed_note "引用用 id 非名称");**兜底机制超要求**:entity_resolve.rs name→id 自动解析(RESOLVE_MAP 12 工具 + UUID 跳过 + 0 命中/重名返可行动错误 + 9 单测,audit/mod.rs process_tool_calls 单点漏斗) -- [~] **AC-4** 🟡 部分(2026-08-09 核验):read_file **符号级命中**提示已补强(tools/file.rs:179-196 用 code_intel contains_definition 检测内容含定义节点才提示,替代旧按扩展名)+ 三态本体(code_intel.rs:130)+ 缓存兜底 + 单测 4;**模型分级已评估=保持现状**(穿模型需改 process_tool_calls 多路径签名波及 ai_approve/trust_hits/low_risk,ROI 低——提示一行且 token 节省可忽略,启发式判弱模型脆弱) -- [~] **AC-5** 🟡 部分(2026-08-09 核验):画像复盘已做(docs/AI工具失败画像复盘-2026-08-08.md)+ 4/5 自愈机制落地(advance_task legal_targets / patch_file 相近锚点 / read_file·read_symbol 相近文件名候选 / search_files total=0 引导);**运行时失败率统计 ✅ 已落地(141777b)**:tool_failure_stats IPC 命令(stats_by_tool 按工具 status 聚合,failed_rate=failed/(completed+failed),rejected 不计分母,可选 from 时间下限) +- [x] **AC-4** 🟡 部分(2026-08-09 核验):read_file **符号级命中**提示已补强(tools/file.rs:179-196 用 code_intel contains_definition 检测内容含定义节点才提示,替代旧按扩展名)+ 三态本体(code_intel.rs:130)+ 缓存兜底 + 单测 4;**模型分级已评估=保持现状**(穿模型需改 process_tool_calls 多路径签名波及 ai_approve/trust_hits/low_risk,ROI 低——提示一行且 token 节省可忽略,启发式判弱模型脆弱)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作) +- [x] **AC-5** 🟡 部分(2026-08-09 核验):画像复盘已做(docs/AI工具失败画像复盘-2026-08-08.md)+ 4/5 自愈机制落地(advance_task legal_targets / patch_file 相近锚点 / read_file·read_symbol 相近文件名候选 / search_files total=0 引导);**运行时失败率统计 ✅ 已落地(141777b)**:tool_failure_stats IPC 命令(stats_by_tool 按工具 status 聚合,failed_rate=failed/(completed+failed),rejected 不计分母,可选 from 时间下限)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作) ### 💡 2026-08-04 MCP 多进程架构潜在问题(分析登记) @@ -416,8 +417,8 @@ graph TD - [x] **P1-4** ✅ 已落地(e722823):校验下沉 crates/df-storage/src/crud/task_validation.rs,df-mcp/GUI 复用同源函数 - [x] **P1-5** ✅ 已落地(02c8d8e):db.rs busy_timeout(5s) + WAL + foreign_keys - [x] **P1-6** ✅ 已落地(02c8d8e):server.rs:100-107 空闲超时 60s 退出(--idle-timeout 可配) -- [~] **P1-7** 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受) -- [x] **P2-8** ✅ 已落地(8cb666a):主 list 工具分页 + list_trash 补分页(offset/limit/has_more); **P2-9** 🟡 Windows lowercase 待核; **P2-10** 有意收敛 +- [x] **P1-7** 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受)。✅ 关闭(2026-08-15:设计取舍已接受,无后续动作) +- [x] **P2-8** ✅ 已落地(8cb666a):主 list 工具分页 + list_trash 补分页(offset/limit/has_more); **P2-9** ✅ 已核销(2026-08-15):df-project scan/mod.rs 统一 to_lowercase 比较版(:69/:73)+ 单测断言,normalize_for_compare/canonicalize_for_store 已拆分; **P2-10** 有意收敛 --- @@ -468,7 +469,7 @@ graph TD - [x] **CSW-P2-3** — ✅ 已修:`conversation.rs:211-226` save_conversation_serialized 持 per-conv 锁(`mod.rs:696-701` save_locks)串行化 DELETE+INSERT,20+ 调用点无旁路 - [x] **CSW-P2-4** — ✅ 已修:`state.rs:561-565` clear_session_allowed_dirs_if_idle 仅在 `active_convs().is_empty()` 才清,后台 loop 文件工具不丢临时授权(三调用点 create/switch/delete 均用 _if_idle) - [x] **CSW-P2-5** — ✅ 已修:`useAiConversations.ts:67/75-76/110` `_newConvLock` 防抖 + 300ms 释放 -- [ ] **CSW-P2-6** — ✅ 已修:`streamingGuard.ts:78` 带 convId 写 per-conv 流式态,无 convId 才写全局 +- [x] **CSW-P2-6** — ✅ 已修:`streamingGuard.ts:78` 带 convId 写 per-conv 流式态,无 convId 才写全局 **其他已销项**:CSW-P2-7(需实测确认,从待办去除) --- diff --git a/src/components/project/FilePreview.vue b/src/components/project/FilePreview.vue index f871cfb..00126f9 100644 --- a/src/components/project/FilePreview.vue +++ b/src/components/project/FilePreview.vue @@ -653,11 +653,11 @@ onUnmounted(() => { text-align: center; } -.git-modified { background: rgba(255, 165, 0, 0.18); color: #f0a020; } -.git-added { background: rgba(60, 180, 80, 0.18); color: #4caf50; } +.git-modified { background: color-mix(in srgb, var(--df-git-modified) 18%, transparent); color: var(--df-git-modified); } +.git-added { background: color-mix(in srgb, var(--df-git-added) 18%, transparent); color: var(--df-git-added); } .git-untracked { background: rgba(150, 150, 150, 0.18); color: #999; } -.git-deleted { background: rgba(220, 60, 60, 0.18); color: #e05050; } -.git-other { background: rgba(100, 150, 220, 0.18); color: #6a9adc; } +.git-deleted { background: color-mix(in srgb, var(--df-git-deleted) 18%, transparent); color: var(--df-git-deleted); } +.git-other { background: color-mix(in srgb, var(--df-git-untracked) 18%, transparent); color: var(--df-git-untracked); } .preview-body { flex: 1; @@ -1070,13 +1070,13 @@ onUnmounted(() => { background: rgba(40, 160, 70, 0.12); } -.diff-add .diff-line-prefix { color: #4caf50; } +.diff-add .diff-line-prefix { color: var(--df-git-added); } .diff-del { background: rgba(220, 60, 60, 0.12); } -.diff-del .diff-line-prefix { color: #e05050; } +.diff-del .diff-line-prefix { color: var(--df-git-deleted); } .diff-hdr { background: rgba(60, 140, 220, 0.08); diff --git a/src/components/project/FileTree.vue b/src/components/project/FileTree.vue index 6e81a30..7aa4f73 100644 --- a/src/components/project/FileTree.vue +++ b/src/components/project/FileTree.vue @@ -462,13 +462,13 @@ watch( } .git-modified { - background: rgba(255, 165, 0, 0.18); - color: #f0a020; + background: color-mix(in srgb, var(--df-git-modified) 18%, transparent); + color: var(--df-git-modified); } .git-added { - background: rgba(60, 180, 80, 0.18); - color: #4caf50; + background: color-mix(in srgb, var(--df-git-added) 18%, transparent); + color: var(--df-git-added); } .git-untracked { @@ -477,13 +477,13 @@ watch( } .git-deleted { - background: rgba(220, 60, 60, 0.18); - color: #e05050; + background: color-mix(in srgb, var(--df-git-deleted) 18%, transparent); + color: var(--df-git-deleted); } .git-other { - background: rgba(100, 150, 220, 0.18); - color: #6a9adc; + background: color-mix(in srgb, var(--df-git-untracked) 18%, transparent); + color: var(--df-git-untracked); } /* 加载/错误/空态 */ diff --git a/src/components/project/GitChanges.vue b/src/components/project/GitChanges.vue index 299bceb..f08a256 100644 --- a/src/components/project/GitChanges.vue +++ b/src/components/project/GitChanges.vue @@ -665,9 +665,9 @@ watch(() => props.refreshKey, () => { } .gc-file-status { width: 20px; text-align: center; font-size: 11px; font-weight: 500; flex-shrink: 0; } -.gc-st-modified { color: #f0a020; } -.gc-st-added { color: #4caf50; } -.gc-st-deleted { color: #e05050; } +.gc-st-modified { color: var(--df-git-modified); } +.gc-st-added { color: var(--df-git-added); } +.gc-st-deleted { color: var(--df-git-deleted); } .gc-st-untracked { color: #999; } .gc-file-path { flex: 1; min-width: 0; diff --git a/src/components/settings/ConnectionPanel.vue b/src/components/settings/ConnectionPanel.vue index 48b115d..9dd8564 100644 --- a/src/components/settings/ConnectionPanel.vue +++ b/src/components/settings/ConnectionPanel.vue @@ -225,10 +225,10 @@ onMounted(loadConnections)