diff --git a/CHANGELOG.md b/CHANGELOG.md index c63bcbc..23fe618 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ > 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。 > 工程口径的完整记录见 `PROGRESS.md` / git log。 +## 0.60.13 — 2026-07-31 + +- 微信和企业微信对话不再显示完成、废弃、重命名和删除操作,避免把常驻渠道会话当作普通任务处理;导出和清空对话仍然保留。 + ## 0.60.12 — 2026-07-29 - 任务列表以及文件、文件夹列表现在支持右键操作,可在鼠标位置直接打开与「⋯」按钮一致的菜单;菜单靠近屏幕边缘时会自动调整位置。 diff --git a/PROGRESS.md b/PROGRESS.md index 6d19853..5f06ce3 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -2,7 +2,7 @@ > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。 -最后更新:2026-07-29(任务与文件列表右键菜单,bump 0.60.12) +最后更新:2026-07-31(渠道常驻会话操作收口,bump 0.60.13) --- @@ -21,6 +21,10 @@ ## 已完成关键能力 +### 2026-07-31 + +- **07-31 / 0.60.13 / 渠道常驻会话操作收口**:微信与企业微信的 web 只读镜像只保留导出和清空对话,隐藏普通任务才适用的完成、废弃、重命名和删除操作,顶部独立完成按钮同步隐藏;普通任务菜单不变。纯前端行为修正,无 API、schema、migration 或依赖变化;JavaScript 语法及 diff 格式检查通过。 + ### 2026-07-29 - **07-29 / 0.60.12 / 任务与文件列表右键菜单**:任务行、文件行和目录行增加原生 `contextmenu` 入口,直接复用既有 `taskMenuItems` / `fileMenuItems`,因此与「⋯」按钮保持相同权限、状态禁用、确认弹框和后端调用;单例浮层菜单增加按鼠标坐标定位及视口双向钳制,右键任务不切换当前会话、右键文件不触发打开。纯前端加法,无 API、schema、migration 或依赖变化;3 个 JS 文件语法及 diff 格式检查通过,浏览器实例不可用故真实鼠标回放留页面复核。 diff --git a/core/__init__.py b/core/__init__.py index 4a8aa3d..f0c18e8 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.60.12" +__version__ = "0.60.13" diff --git a/web/static/js/chat.js b/web/static/js/chat.js index a112d4e..c9726c1 100644 --- a/web/static/js/chat.js +++ b/web/static/js/chat.js @@ -348,7 +348,7 @@ function taskMenuItems(t) { const hasMsg = (t.n_messages || 0) > 0; // run_status 列表行与 taskMeta 都带(_task_dict 统一出);running/cancelling 时禁清空 const running = taskRunState(t) === "running" || taskRunState(t) === "cancelling"; - return [ + const items = [ { act: "complete", label: "完成", cls: "act-complete", disabled: !isActive, onclick: () => setTaskStatus(t.task_id, "completed", t.name || "(未命名)") }, { act: "abandon", label: "废弃", cls: "act-abandon", disabled: !isActive, @@ -362,6 +362,12 @@ function taskMenuItems(t) { { act: "delete", label: "删除", cls: "act-delete", onclick: () => deleteTask(t.task_id, t.name || "(未命名)", t.n_messages || 0) }, ]; + // 渠道镜像是每用户每渠道唯一的常驻会话,不开放普通 task 生命周期操作。 + // 导出和清空仍有明确用途:前者留档,后者删除消息并从空上下文重新开始。 + if (channelCfg(t.channel)) { + return items.filter((item) => item.act === "export" || item.act === "clear"); + } + return items; } // 筛选 / 排序 / 刷新 一律 reset(loadTaskList 默认 append=false);追加由 sentinel observer 触发 @@ -786,9 +792,11 @@ function renderChatMeta() { const active = t.status === "active"; $("chat-form").style.display = active ? "flex" : "none"; syncOptimizeBtn(); - $("btn-done").disabled = !active; - // ⋯ 菜单:选中即可用;各项 enable/disable(完成/废弃按 status、清空按 run_status+n_messages) - // 全在 taskMenuItems 内部判定,这里只管整体可用性。 + const isChannelTask = !!channelCfg(t.channel); + $("btn-done").hidden = isChannelTask; + $("btn-done").disabled = !active || isChannelTask; + // ⋯ 菜单:选中即可用;普通任务的生命周期项及渠道任务的精简项均由 + // taskMenuItems 判定,这里只管整体可用性。 $("btn-task-menu").disabled = false; }