diff --git a/static/src/components/chat/quickdock/FileWindow.vue b/static/src/components/chat/quickdock/FileWindow.vue
index 1169f4e1..393f75b3 100644
--- a/static/src/components/chat/quickdock/FileWindow.vue
+++ b/static/src/components/chat/quickdock/FileWindow.vue
@@ -146,11 +146,19 @@ async function playEnter(row: Row, delay = 0) {
}, 380);
}
+// 首次(重)挂载的水合渲染一律静态:移动端↔桌面端切换时组件随 QuickDock
+// 整体 v-if 卸载重挂,immediate watch 立即以现有数据触发;此时 editedFilesLive
+// 可能是任务期 socket 事件残留的 true(socket 是最后一个写入者,之后没有
+// REST 回填重置它,与待办不同),不拦截会把全部行误判为「运行期新增」重播
+// 进入动画。只有挂载后 store 的新更新才允许走 live 动画路径。
+let hydrated = false;
+
watch(
editedFiles,
(list) => {
// live=true 来自任务期实时事件(播动画);false 来自加载/bootstrap(静态呈现)
- const live = quickDock.editedFilesLive;
+ const live = quickDock.editedFilesLive && hydrated;
+ hydrated = true;
const byPath = new Map(list.map((item) => [item.path, item]));
// 移除已消失的行(文件被删除 / 对话切换清空)
diff --git a/static/src/components/chat/quickdock/RunnerDetailPanel.vue b/static/src/components/chat/quickdock/RunnerDetailPanel.vue
index 5f8eed93..257e1afe 100644
--- a/static/src/components/chat/quickdock/RunnerDetailPanel.vue
+++ b/static/src/components/chat/quickdock/RunnerDetailPanel.vue
@@ -8,6 +8,7 @@
{{ title }}
{{ statusText }}
+ {{ tokensText }}