diff --git a/src/renderer/src/components/AgentStateDot.test.ts b/src/renderer/src/components/AgentStateDot.test.ts index a767a61ccf4b..e4c901ee108b 100644 --- a/src/renderer/src/components/AgentStateDot.test.ts +++ b/src/renderer/src/components/AgentStateDot.test.ts @@ -96,6 +96,15 @@ describe('AgentStateDot', () => { expect(markup).not.toContain('data-agent-spinner') }) + it('renders unreported as a muted dashed ring, never the amber lost-contact ring', () => { + const markup = renderMarkup('unreported') + + expect(markup).toContain('lucide-circle-dashed') + expect(markup).toContain('text-muted-foreground') + expect(markup).not.toContain('text-amber-500') + expect(markup).toContain('aria-label="No status reported"') + }) + it.each(['blocked', 'interrupted'] satisfies AgentDotState[])( 'renders %s as a red attention dot', (state) => { @@ -116,6 +125,7 @@ describe('AgentStateDot', () => { 'done', 'idle', 'unverifiable', + 'unreported', 'permission' ] satisfies AgentDotState[] diff --git a/src/renderer/src/components/AgentStateDot.tsx b/src/renderer/src/components/AgentStateDot.tsx index af8ac4efd843..928ffef01dbe 100644 --- a/src/renderer/src/components/AgentStateDot.tsx +++ b/src/renderer/src/components/AgentStateDot.tsx @@ -3,6 +3,7 @@ import { Activity, CircleCheck, CircleDashed } from 'lucide-react' import { cn } from '@/lib/utils' import { AgentQuestionIcon } from '@/components/AgentQuestionIcon' import { AgentWorkingSpinner } from '@/components/AgentWorkingSpinner' +import { agentNoStatusReportedLabel } from '@/lib/agent-row-decay-state' import { StateIndicatorTooltip, type StateIndicatorTooltipSide @@ -35,6 +36,9 @@ export type AgentDotState = // held there, and never rendered as 'done' or 'working' — it asserts nothing about // the agent, only about what Orca last heard. | 'unverifiable' + // Why: the title names the agent and nothing says what it is doing. Not 'idle' (no rest + // evidence) and not 'unverifiable' (Orca never heard a status, so none went quiet). + | 'unreported' // Why: the sidebar's title-based status flow (StatusIndicator/WorktreeCard) // collapses blocked + waiting into a single "needs attention" state. Keep // this as a distinct member so that flow can render without inventing a new @@ -63,6 +67,8 @@ export function agentStateLabel(state: AgentDotState): string { return 'Idle' case 'unverifiable': return 'No recent update' + case 'unreported': + return agentNoStatusReportedLabel() case 'permission': return 'Needs attention' } @@ -134,6 +140,16 @@ export const AgentStateDot = React.memo(function AgentStateDot({