From a0787f85de8f39720f48a14cbfe24d0268c69398 Mon Sep 17 00:00:00 2001 From: zenchantlive Date: Sun, 1 Mar 2026 18:20:49 -0800 Subject: [PATCH] fix(ux): remove dup Signal btn, add minimize to all feeds, strip shows recent events MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove duplicate Signal (telemetry) button from DAG nodes - Add minimize (ChevronLeft) button to Epic Command Feed view, not just global feed - TelemetryStrip now shows 8 most recently updated tasks as status-colored dots instead of static status counts — reflects live activity like the full feed does - Each dot is colored by task status (blocked=red, active=amber, ready=green) with hover tooltip showing task id, title, and status Co-Authored-By: Oz --- .beads/dolt-server.log | 32 +++++++++ .../activity/contextual-right-panel.tsx | 28 ++++++-- src/components/graph/graph-node-card.tsx | 10 --- src/components/shared/telemetry-strip.tsx | 68 +++++++++---------- 4 files changed, 89 insertions(+), 49 deletions(-) diff --git a/.beads/dolt-server.log b/.beads/dolt-server.log index f8a1e50..6c62b98 100644 --- a/.beads/dolt-server.log +++ b/.beads/dolt-server.log @@ -3002,3 +3002,35 @@ time="2026-03-01T18:17:37-08:00" level=info msg=NewConnection DisableClientMulti time="2026-03-01T18:17:37-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1183 time="2026-03-01T18:17:37-08:00" level=info msg=ConnectionClosed connectionID=1182 time="2026-03-01T18:17:38-08:00" level=info msg=ConnectionClosed connectionID=1183 +time="2026-03-01T18:18:37-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1184 +time="2026-03-01T18:18:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1185 +time="2026-03-01T18:18:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1186 +time="2026-03-01T18:18:39-08:00" level=warning msg="Cannot read client handshake response from client 1186 (127.0.0.1:62203): read tcp 127.0.0.1:3307->127.0.0.1:62203: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed, it may not be a valid MySQL client" +time="2026-03-01T18:18:39-08:00" level=info msg=ConnectionClosed connectionID=1186 +time="2026-03-01T18:18:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1187 +time="2026-03-01T18:18:39-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1188 +time="2026-03-01T18:18:39-08:00" level=info msg=ConnectionClosed connectionID=1187 +time="2026-03-01T18:18:39-08:00" level=info msg=ConnectionClosed connectionID=1188 +time="2026-03-01T18:18:40-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1189 +time="2026-03-01T18:18:40-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1190 +time="2026-03-01T18:18:40-08:00" level=info msg=ConnectionClosed connectionID=1190 +time="2026-03-01T18:18:40-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1191 +time="2026-03-01T18:18:40-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1192 +time="2026-03-01T18:18:40-08:00" level=info msg=ConnectionClosed connectionID=1191 +time="2026-03-01T18:18:40-08:00" level=info msg=ConnectionClosed connectionID=1192 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1193 +time="2026-03-01T18:18:43-08:00" level=warning msg="Cannot read client handshake response from client 1193 (127.0.0.1:51203): read tcp 127.0.0.1:3307->127.0.0.1:51203: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed, it may not be a valid MySQL client" +time="2026-03-01T18:18:43-08:00" level=info msg=ConnectionClosed connectionID=1193 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1194 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1195 +time="2026-03-01T18:18:43-08:00" level=info msg=ConnectionClosed connectionID=1194 +time="2026-03-01T18:18:43-08:00" level=info msg=ConnectionClosed connectionID=1195 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1196 +time="2026-03-01T18:18:43-08:00" level=warning msg="Cannot read client handshake response from client 1196 (127.0.0.1:51207): read tcp 127.0.0.1:3307->127.0.0.1:51207: wsarecv: An existing connection was forcibly closed by the remote host.\nio.ReadFull(header size) failed, it may not be a valid MySQL client" +time="2026-03-01T18:18:43-08:00" level=info msg=ConnectionClosed connectionID=1196 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1197 +time="2026-03-01T18:18:43-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1198 +time="2026-03-01T18:18:43-08:00" level=info msg=ConnectionClosed connectionID=1197 +time="2026-03-01T18:18:44-08:00" level=info msg=ConnectionClosed connectionID=1198 +time="2026-03-01T18:20:06-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1199 +time="2026-03-01T18:20:29-08:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1200 diff --git a/src/components/activity/contextual-right-panel.tsx b/src/components/activity/contextual-right-panel.tsx index 5b7d1f9..2108555 100644 --- a/src/components/activity/contextual-right-panel.tsx +++ b/src/components/activity/contextual-right-panel.tsx @@ -43,11 +43,29 @@ export function ContextualRightPanel({ epicId, taskId, swarmId, issues, projectR if (epicId) { return ( - +
+ {onMinimize && ( +
+ Epic Command Feed + +
+ )} +
+ +
+
); } diff --git a/src/components/graph/graph-node-card.tsx b/src/components/graph/graph-node-card.tsx index 9935590..b22b2ca 100644 --- a/src/components/graph/graph-node-card.tsx +++ b/src/components/graph/graph-node-card.tsx @@ -294,16 +294,6 @@ export function GraphNodeCard({ id, data, selected }: NodeProps ) : null} - {onViewTelemetry ? ( - - ) : null}
{assignedArchetypes.map((archetype) => ( diff --git a/src/components/shared/telemetry-strip.tsx b/src/components/shared/telemetry-strip.tsx index b7a8b3c..d88f678 100644 --- a/src/components/shared/telemetry-strip.tsx +++ b/src/components/shared/telemetry-strip.tsx @@ -1,6 +1,7 @@ 'use client'; -import { ChevronRight } from 'lucide-react'; +import { useMemo } from 'react'; +import { Signal } from 'lucide-react'; import type { BeadIssue } from '../../lib/types'; interface TelemetryStripProps { @@ -8,53 +9,52 @@ interface TelemetryStripProps { onMaximize: () => void; } -interface Dot { - color: string; - glow: string; - count: number; - label: string; +function dotColor(status: BeadIssue['status']): { bg: string; glow: string } { + switch (status) { + case 'blocked': return { bg: 'var(--accent-danger)', glow: 'rgba(255,76,114,0.4)' }; + case 'in_progress': return { bg: 'var(--accent-warning)', glow: 'rgba(255,178,74,0.4)' }; + case 'open': return { bg: 'var(--accent-success)', glow: 'rgba(53,217,143,0.4)' }; + case 'closed': return { bg: 'var(--text-tertiary)', glow: 'transparent' }; + default: return { bg: 'var(--accent-info)', glow: 'rgba(125,211,252,0.3)' }; + } } export function TelemetryStrip({ issues, onMaximize }: TelemetryStripProps) { - const tasks = issues.filter((i) => i.issue_type !== 'epic'); - const blocked = tasks.filter((i) => i.status === 'blocked').length; - const active = tasks.filter((i) => i.status === 'in_progress').length; - const ready = tasks.filter((i) => i.status === 'open').length; - const done = tasks.filter((i) => i.status === 'closed').length; - - const dots: Dot[] = [ - { color: 'var(--accent-danger)', glow: 'rgba(255,76,114,0.4)', count: blocked, label: 'blocked' }, - { color: 'var(--accent-warning)', glow: 'rgba(255,178,74,0.4)', count: active, label: 'active' }, - { color: 'var(--accent-success)', glow: 'rgba(53,217,143,0.4)', count: ready, label: 'ready' }, - { color: 'var(--text-tertiary)', glow: 'transparent', count: done, label: 'done' }, - ]; + // Show the 8 most recently updated tasks as live dots + const recentTasks = useMemo(() => { + return [...issues] + .filter((i) => i.issue_type !== 'epic') + .sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()) + .slice(0, 8); + }, [issues]); return (
-
- {dots.map((dot) => ( -
- 0 ? `0 0 6px 1px ${dot.glow}` : 'none', - opacity: dot.count > 0 ? 1 : 0.25, - }} - /> - {dot.count} -
- ))} +
+ {recentTasks.map((task) => { + const { bg, glow } = dotColor(task.status); + return ( +
+ +
+ ); + })}
);