From 84102630aaefe7b872f2a43b44177c9c5fd8dfb5 Mon Sep 17 00:00:00 2001 From: marcelormendes Date: Fri, 14 Aug 2026 01:56:02 -0400 Subject: [PATCH] Release v0.1.26 --- package-lock.json | 4 +-- package.json | 2 +- ...onversationChatPanel.presentation.test.tsx | 31 +++++++++++++++++++ src/renderer/chat/ConversationChatPanel.tsx | 9 +++++- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f32b77a..6b6bc82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "drover", - "version": "0.1.25", + "version": "0.1.26", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "drover", - "version": "0.1.25", + "version": "0.1.26", "license": "MIT", "dependencies": { "@radix-ui/react-alert-dialog": "1.1.23", diff --git a/package.json b/package.json index ea43bfc..18bf5e1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "drover", "productName": "Drover", - "version": "0.1.25", + "version": "0.1.26", "description": "A native workspace for Herdr-powered agents, terminals, worktrees, and live sessions.", "main": ".vite/build/main.js", "private": true, diff --git a/src/renderer/chat/ConversationChatPanel.presentation.test.tsx b/src/renderer/chat/ConversationChatPanel.presentation.test.tsx index 628cc09..eec03dd 100644 --- a/src/renderer/chat/ConversationChatPanel.presentation.test.tsx +++ b/src/renderer/chat/ConversationChatPanel.presentation.test.tsx @@ -683,6 +683,37 @@ describe('ConversationChatPanel turn projection', () => { expect(document.querySelector('[data-slot="active-plan"]')).toBeNull(); }); + it('settles Working when a settled turn still carries a stale running tool', async () => { + setup( + page([ + { + id: 'completed', + sequence: 1, + provider: 'pi', + session_id: 'session-1', + turn_id: 'turn-1', + type: 'turn_state', + state: 'completed', + duration_ms: 6_000, + }, + { + id: 'stale-tool', + sequence: 2, + provider: 'pi', + session_id: 'session-1', + turn_id: 'turn-1', + type: 'tool_activity', + action: 'bash', + label: 'bash', + status: 'running', + }, + ]), + ); + + await screen.findByText('running'); + expect(screen.queryByRole('status')).not.toBeInTheDocument(); + }); + it('folds settled work while keeping the rendered final answer prominent and visible', async () => { setup( page([ diff --git a/src/renderer/chat/ConversationChatPanel.tsx b/src/renderer/chat/ConversationChatPanel.tsx index ce870a2..7f383ca 100644 --- a/src/renderer/chat/ConversationChatPanel.tsx +++ b/src/renderer/chat/ConversationChatPanel.tsx @@ -793,6 +793,13 @@ function ConversationChatPanelForPane({ const runningTool = store.items.some( (item) => item.type === 'tool_activity' && item.status === 'running', ); + // A provider can leave a tool in `running` when its terminal event is + // missed, so a settled latest turn must not stay pinned on a stale tool. + const latestTurnSettled = + latestState !== undefined && + (latestState.state === 'completed' || + latestState.state === 'interrupted' || + latestState.state === 'failed'); if (latestState?.state === 'started') { let finalAnswerReceived = false; for (let index = latestStateIndex + 1; index < store.items.length; index += 1) { @@ -820,7 +827,7 @@ function ConversationChatPanelForPane({ plan, }; } - if (runningTool) { + if (runningTool && !latestTurnSettled) { return { startedMs: statusStartedMs, plan,