Browse Source

恢复工具执行期间的输入状态提示

LSamien 2 months ago
parent
commit
cb28bcd473

+ 3 - 1
src/client/components/messages/MessageTimeline.vue

@@ -72,7 +72,9 @@ const timelineRows = computed(() => buildMessageTimelineRows(props.messages))
 const showThinkingIndicator = computed(() => {
   if (!props.thinking) return false
   const current = [...props.messages].reverse().find(message => message.role === 'assistant' && message.status === 'streaming')
-  return !current?.content.trim() && !current?.reasoning?.trim() && !current?.tools?.length
+  // A tool trace is progress detail, not assistant prose. Keep the bottom
+  // activity indicator visible while that tool-only stream segment is active.
+  return !current?.content.trim() && !current?.reasoning?.trim()
 })
 let copyResetTimer: number | undefined
 let thinkingTimer: number | undefined

+ 2 - 1
tests/e2e/workspace.spec.ts

@@ -717,8 +717,9 @@ test('keeps streamed text below sealed interim commentary and its tool trace', a
   const current = page.locator('.message--assistant').filter({ hasText: '配置检查完成。' }).last()
   const trace = page.locator('.turn-trace').last()
   await expect(interim).toBeVisible()
-  await expect(current).toBeVisible()
   await expect(trace).toHaveClass(/turn-trace--running/)
+  await expect(page.locator('.thinking-indicator')).toBeVisible()
+  await expect(current).toBeVisible()
 
   const [interimBox, traceBox, currentBox] = await Promise.all([
     interim.boundingBox(), trace.boundingBox(), current.boundingBox(),

+ 2 - 2
tests/fixtures/fake-hermes.mjs

@@ -265,8 +265,8 @@ server.on('upgrade', (request, socket, head) => {
             setTimeout(() => {
               emit('tool.complete', { tool_id: 'fake-tool', name: 'terminal', result: { output: '/tmp' } })
               emit('message.delta', { text: '配置检查完成。' })
-            }, 300)
-            setTimeout(() => emit('message.complete', { text: '配置检查完成。', status: 'complete' }), 2_000)
+            }, 800)
+            setTimeout(() => emit('message.complete', { text: '配置检查完成。', status: 'complete' }), 2_500)
             return
           }
           client.send(JSON.stringify({ jsonrpc: '2.0', method: 'event', params: { type: 'message.start', session_id: requestFrame.params.session_id, profile: 'yaoyao' } }))