fix(chat): 发送消息后关闭文件预览
This commit is contained in:
parent
b96c6d021f
commit
16cfa45f38
|
|
@ -5,6 +5,10 @@
|
||||||
> 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。
|
> 所以不是每个版本号都有条目。条目格式 `## <版本> — <日期>`,新条目加在最上面。
|
||||||
> 工程口径的完整记录见 `PROGRESS.md` / git log。
|
> 工程口径的完整记录见 `PROGRESS.md` / git log。
|
||||||
|
|
||||||
|
## 0.63.10 — 2026-08-11
|
||||||
|
|
||||||
|
- 在文件预览中发送消息后,预览框现在会自动关闭,便于立即查看助手生成的回答。
|
||||||
|
|
||||||
## 0.63.9 — 2026-08-11
|
## 0.63.9 — 2026-08-11
|
||||||
|
|
||||||
- 修复 MCP 外部系统测试连接成功后,可用接口数量错误显示为 0 的问题。
|
- 修复 MCP 外部系统测试连接成功后,可用接口数量错误显示为 0 的问题。
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
> 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。
|
> 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。
|
||||||
|
|
||||||
最后更新:2026-08-11(MCP 测试连接接口计数修复,bump 0.63.9)
|
最后更新:2026-08-11(发送消息后自动关闭预览,bump 0.63.10)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
### 2026-08-11
|
### 2026-08-11
|
||||||
|
|
||||||
|
- **08-11 / 0.63.10 / 发送消息后自动关闭文件预览**:消息通过发送前校验并进入发送流程时,统一关闭文件主预览与粘贴附件小预览,避免遮挡已开始生成的助手回答;空消息、附件上传中和只读渠道等未发送场景保持预览不动。Node 前端预览 11 项、JavaScript 语法及 diff 检查通过;无 schema、migration、HTTP API、依赖或运行方式变化,未连接生产 DB。
|
||||||
|
|
||||||
- **08-11 / 0.63.9 / MCP 测试连接接口计数修复**:MCP 连接探测统一返回与 OpenAPI 相同的 `operation_count`,同时保留 `tool_count` 兼容字段;用户端测试连接兼容读取新旧响应,修复 Server 实际暴露工具时仍显示“可用接口 0 个”的问题。外部系统、无 DB 路由与静态页面共 57 项 unittest、JavaScript 语法及 diff 检查通过;无 schema、migration、依赖或运行方式变化,未连接生产 DB。
|
- **08-11 / 0.63.9 / MCP 测试连接接口计数修复**:MCP 连接探测统一返回与 OpenAPI 相同的 `operation_count`,同时保留 `tool_count` 兼容字段;用户端测试连接兼容读取新旧响应,修复 Server 实际暴露工具时仍显示“可用接口 0 个”的问题。外部系统、无 DB 路由与静态页面共 57 项 unittest、JavaScript 语法及 diff 检查通过;无 schema、migration、依赖或运行方式变化,未连接生产 DB。
|
||||||
|
|
||||||
- **08-11 / 0.63.8 / 外部系统连接弹框 + connector 类型标识**:用户外部系统主页移除状态耦合的内联凭据表单,新建连接与更新凭据统一改为独立弹框;点击已有卡片直接进入编辑,新建弹框只列出尚未连接的 definition,避免重复创建。连接卡片读取既有 `connector` 字段,以不同 SVG、颜色和文字区分 OpenAPI 与 MCP。Web 无 DB 路由与静态资源共 36 项 unittest、JavaScript 语法及 diff 检查通过;本地无安全的 Web 实例可做真实点击,未启动会读取生产 `.env` 的应用,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。
|
- **08-11 / 0.63.8 / 外部系统连接弹框 + connector 类型标识**:用户外部系统主页移除状态耦合的内联凭据表单,新建连接与更新凭据统一改为独立弹框;点击已有卡片直接进入编辑,新建弹框只列出尚未连接的 definition,避免重复创建。连接卡片读取既有 `connector` 字段,以不同 SVG、颜色和文字区分 OpenAPI 与 MCP。Web 无 DB 路由与静态资源共 36 项 unittest、JavaScript 语法及 diff 检查通过;本地无安全的 Web 实例可做真实点击,未启动会读取生产 `.env` 的应用,未连接生产 DB。无 schema、migration、HTTP API、依赖或运行方式变化。
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
|
||||||
# 改版本只动这一行。
|
# 改版本只动这一行。
|
||||||
__version__ = "0.63.9"
|
__version__ = "0.63.10"
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,17 @@ test("artifact chips expose a compact file type and preview affordance", () => {
|
||||||
assert.match(pageHtml, /\.art-chip:focus-visible/);
|
assert.match(pageHtml, /\.art-chip:focus-visible/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("sending a message closes every open file preview", () => {
|
||||||
|
assert.match(previewJs, /export function closeAllPreviews\(\)/);
|
||||||
|
assert.match(previewJs, /closeFilePreview\(\)[\s\S]*closeMiniPreview\(\)/);
|
||||||
|
assert.match(chatJs, /closeAllPreviews,[\s\S]*from "\.\/preview\.js"/);
|
||||||
|
|
||||||
|
const sendMessage = chatJs.indexOf("async function sendMessage");
|
||||||
|
const closePreviews = chatJs.indexOf("closeAllPreviews();", sendMessage);
|
||||||
|
const postMessage = chatJs.indexOf("await postMessageWithRetry", sendMessage);
|
||||||
|
assert.ok(sendMessage >= 0 && closePreviews > sendMessage && closePreviews < postMessage);
|
||||||
|
});
|
||||||
|
|
||||||
test("message actions copy raw content and revise by appending a new message", () => {
|
test("message actions copy raw content and revise by appending a new message", () => {
|
||||||
assert.match(chatJs, /class="msg-action msg-copy"[^>]+aria-label="复制消息"/);
|
assert.match(chatJs, /class="msg-action msg-copy"[^>]+aria-label="复制消息"/);
|
||||||
assert.match(chatJs, /class="msg-action msg-revise"[^>]+aria-label="引用并修改消息"/);
|
assert.match(chatJs, /class="msg-action msg-revise"[^>]+aria-label="引用并修改消息"/);
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,12 @@ const LS_RECENT_WORKING_DIR = "zcbot.recent-working-dir";
|
||||||
function channelCfg(ch) { return CHANNEL_BADGE[ch] || null; }
|
function channelCfg(ch) { return CHANNEL_BADGE[ch] || null; }
|
||||||
import { logout } from "./auth.js";
|
import { logout } from "./auth.js";
|
||||||
import { openWechatModal } from "./wechat.js";
|
import { openWechatModal } from "./wechat.js";
|
||||||
import { openFilePreview, openPasteFilePreview, closePreviewIfShowing } from "./preview.js";
|
import {
|
||||||
|
openFilePreview,
|
||||||
|
openPasteFilePreview,
|
||||||
|
closeAllPreviews,
|
||||||
|
closePreviewIfShowing,
|
||||||
|
} from "./preview.js";
|
||||||
import { loadFiles, scheduleFilesRefresh, uploadFiles, formatUploadProgress } from "./files.js";
|
import { loadFiles, scheduleFilesRefresh, uploadFiles, formatUploadProgress } from "./files.js";
|
||||||
import { toolActivityLabel, _workingDirName, extractMediaBanner, extractArtifactRels, renderArtifactBarHtml, renderArtifactChipContent, upgradeMediaArtifacts, ARTIFACT_PRODUCING_TOOLS, _flushMediaArtifactCache } from "./media.js";
|
import { toolActivityLabel, _workingDirName, extractMediaBanner, extractArtifactRels, renderArtifactBarHtml, renderArtifactChipContent, upgradeMediaArtifacts, ARTIFACT_PRODUCING_TOOLS, _flushMediaArtifactCache } from "./media.js";
|
||||||
import { applyProgressAction, cloneProgressSteps, progressActionsFromToolCalls } from "./progress.js";
|
import { applyProgressAction, cloneProgressSteps, progressActionsFromToolCalls } from "./progress.js";
|
||||||
|
|
@ -2670,6 +2675,7 @@ async function sendMessage(overrideText) {
|
||||||
$("chat-hint").textContent = "发送中…";
|
$("chat-hint").textContent = "发送中…";
|
||||||
const taskId = state.taskId;
|
const taskId = state.taskId;
|
||||||
try {
|
try {
|
||||||
|
closeAllPreviews();
|
||||||
// 立刻渲染 user 消息卡(乐观)
|
// 立刻渲染 user 消息卡(乐观)
|
||||||
const wrap = $("chat-stream");
|
const wrap = $("chat-stream");
|
||||||
const userCard = document.createElement("div");
|
const userCard = document.createElement("div");
|
||||||
|
|
|
||||||
|
|
@ -818,6 +818,12 @@ export function closeMiniPreview() {
|
||||||
_flushMiniBlobUrls();
|
_flushMiniBlobUrls();
|
||||||
_mpCurrentRel = null;
|
_mpCurrentRel = null;
|
||||||
}
|
}
|
||||||
|
// 消息进入发送流程后,预览不应继续遮住正在生成的回答。主预览与粘贴附件的
|
||||||
|
// 次级预览可能同时存在,因此必须一起关闭。
|
||||||
|
export function closeAllPreviews() {
|
||||||
|
if ($("file-preview-modal").classList.contains("show")) closeFilePreview();
|
||||||
|
if ($("mini-preview-modal").classList.contains("show")) closeMiniPreview();
|
||||||
|
}
|
||||||
// 删文件时:若该 rel 正在主/小预览中则关掉(供 main 的 deletePastedFile 等调用,
|
// 删文件时:若该 rel 正在主/小预览中则关掉(供 main 的 deletePastedFile 等调用,
|
||||||
// 不对外暴露内部 current-rel 状态)。
|
// 不对外暴露内部 current-rel 状态)。
|
||||||
export function closePreviewIfShowing(rel) {
|
export function closePreviewIfShowing(rel) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue