groove-dev 0.25.15 → 0.25.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
7
  <title>Groove GUI</title>
8
- <script type="module" crossorigin src="/assets/index-Cg1mJi9s.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-BjUplOVu.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/vendor-C0HXlhrU.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/reactflow-BQPfi37R.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/codemirror-BBL3i_JW.js">
@@ -294,18 +294,29 @@ function ActivityLine({ entry }) {
294
294
  );
295
295
  }
296
296
 
297
- function ActivityGroup({ entries }) {
297
+ function ActivityGroup({ entries, isLive }) {
298
298
  const [cycleIdx, setCycleIdx] = useState(0);
299
299
 
300
- // Cycle through entries every 1.5s
301
300
  useEffect(() => {
302
- if (entries.length <= 1) return;
301
+ if (!isLive || entries.length <= 1) return;
303
302
  const timer = setInterval(() => setCycleIdx((i) => (i + 1) % entries.length), 1500);
304
303
  return () => clearInterval(timer);
305
- }, [entries.length]);
304
+ }, [entries.length, isLive]);
305
+
306
+ if (!isLive) {
307
+ // Collapsed static summary for completed groups
308
+ const last = entries[entries.length - 1];
309
+ const meta = activityMeta(last.text);
310
+ const Icon = meta.icon;
311
+ return (
312
+ <div className="ml-7 flex items-center gap-2 px-3 py-1 text-[10px] text-text-4 font-mono">
313
+ <Icon size={10} className="opacity-50" />
314
+ <span className="truncate">{entries.length} tool call{entries.length !== 1 ? 's' : ''}</span>
315
+ </div>
316
+ );
317
+ }
306
318
 
307
319
  const current = entries[Math.min(cycleIdx, entries.length - 1)];
308
- const meta = activityMeta(current.text);
309
320
  const display = current.text?.length > 60 ? current.text.slice(0, 60) + '...' : current.text;
310
321
 
311
322
  return (
@@ -584,7 +595,9 @@ export function AgentFeed({ agent }) {
584
595
  )}
585
596
  {timeline.map((item, i) => {
586
597
  if (item.kind === 'activity-group') {
587
- return <ActivityGroup key={`grp-${i}`} entries={item.entries} />;
598
+ // Only the last activity group is "live" if agent is still running
599
+ const isLastGroup = !timeline.slice(i + 1).some((t) => t.kind === 'activity-group' || t.from === 'agent');
600
+ return <ActivityGroup key={`grp-${i}`} entries={item.entries} isLive={isAlive && isLastGroup} />;
588
601
  }
589
602
  if (item.from === 'user') return <UserMessage key={`msg-${i}`} msg={item} />;
590
603
  if (item.from === 'system') return <SystemMessage key={`msg-${i}`} msg={item} />;