From 7925dcef541bfb36b3213d4b95c1fb9c6344a281 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 20 May 2026 08:10:36 +0800 Subject: [PATCH] =?UTF-8?q?files:=20working=5Fdir=20=E8=A7=86=E4=B8=BA?= =?UTF-8?q?=E5=8F=AF=E9=87=8D=E7=94=9F=20FS=20=E8=A7=86=E5=9B=BE(DELETE=20?= =?UTF-8?q?task=20=E9=A1=BA=E6=89=8B=E6=B8=85=E7=A9=BA=E5=AD=A4=E5=84=BF?= =?UTF-8?q?=20+=20delete=5Ffile=20=E5=8E=BB=20task-ref=20=E9=97=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB 是 source of truth,FS working_dir 可独立删 / 用户手删 / 跨机器迁移丢失, 下次 build_agent 自动 mkdir 重建。三处改: - core/agent_builder.py: working_dir.mkdir(exist_ok=True) 从 if not resume: 里挪出,resume 也兜底建目录 - web/app.py DELETE /v1/tasks/{id}: 删完后若同 user 无其他 task 引用 + FS 空 + ROOT 内相对路径 → best-effort rmdir 清孤儿;外部 --working-dir (DB 绝对串)静默跳过 - web/app.py POST /v1/files/delete: 顶层目录去掉"有 task 引用 → 409"闸, 允许独立删空目录,task.working_dir 字段不动 smoke case 4 改 200 + working_dir 不变;新增 case 8(空目录自动清)/ case 9(非空保留),全 9 pass。PROGRESS / RUN 跟着更。 Co-Authored-By: Claude Opus 4.7 (1M context) --- PROGRESS.md | 6 +++- RUN.md | 9 +++--- core/agent_builder.py | 7 +++-- scripts/smoke_files_rename.py | 40 +++++++++++++++++++++++---- web/app.py | 52 +++++++++++++++++------------------ 5 files changed, 74 insertions(+), 40 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 01ba355..7fcfdcd 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -2,7 +2,7 @@ > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 2-4 句:做了啥 + 关键判断 + 没动什么;细节查 `git log` / `git diff`。 -最后更新:2026-05-19(0006 模型切换 + usage_events v2 表:task 级模型 PATCH / `GET /v1/models` / 前端顶栏下拉 + 历史小标 / chat usage 落 messages 双写 + usage_events 一行,A 粒度下条 send 生效) +最后更新:2026-05-20(working_dir 视为可重生 FS 视图:DELETE task 顺手清空孤儿目录;POST /v1/files/delete 顶层目录去掉 task 引用 409 闸;build_agent resume 也兜底 mkdir) --- @@ -21,6 +21,10 @@ ## 已完成关键能力 +### 2026-05-20 + +- **working_dir 视为可重生 FS 视图**:DB 是 source of truth,FS 目录可独立删 / 用户手动 rmtree / 跨机器迁移丢失,**下次跑就自动 mkdir 重建**。三处改:① `DELETE /v1/tasks/{id}` 删完后若同 user 下再无 task 引用此 working_dir 且 FS 目录为空 → best-effort `rmdir` 清孤儿(非空 / 不存在 / 外部 --working-dir 静默跳过)。② `POST /v1/files/delete` 顶层目录去掉「有 task 引用就 409」闸,允许独立删空目录,task.working_dir 字段不动。③ `core/agent_builder.py::build_agent` 把 `working_dir_path.mkdir(parents=True, exist_ok=True)` 从 `if not resume:` 里挪出,resume 也兜底建目录(用户手删 FS 后再 send message 不会炸)。smoke `scripts/smoke_files_rename.py` 增 case 4 (200 + working_dir 不变) / case 8 (DELETE task 空目录自动清) / case 9 (非空目录保留),全 9 pass。**没动**:DB schema、rename 顶层目录的同步 UPDATE 逻辑(rename 是明确改名,和"删后重生"语义不同)、外部 --working-dir(DB 绝对串)的清理(避免误删用户外部项目)。 + ### 2026-05-19 - **0006 模型切换(c 模式 task 级 A 粒度)+ usage_events v2 表**:`tasks.model_profile` 从死字段变 source-of-truth,顶栏下拉 → `PATCH /v1/tasks/{id}` 即换,**A 粒度下条 send 生效**(当前 run 不受影响;running 中切 UI 提示"跑完后生效")。`build_agent` resume 时优先 task.model_profile,新建 task POST body 加可选 `model_profile`(留空 → `cfg["default_model"]`)。`GET /v1/models` 扫 `config/models/*.yaml` 列可选项(含 display_name / thinking_mode / is_default),`ModelCapabilities` 加 `display_name` 字段,deepseek_v4.yaml 两 variant 各填名。**前端**:chat-meta 加下拉(切了 PATCH+提示)、新建对话框 modal 加 `