bullswarm 0.18.3 → 0.18.4

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.18.4 — reliable auto-follow tail
4
+
5
+ - Timestamp-aligned mobile auto-follow now preserves the newest workflow
6
+ milestone instead of replacing it with a spurious newer-rows marker.
7
+
3
8
  ## 0.18.3 — mobile timeline polish
4
9
 
5
10
  - Auto-follow now begins at a timestamped milestone instead of exposing an
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bullswarm",
3
- "version": "0.18.3",
3
+ "version": "0.18.4",
4
4
  "description": "Route work across coding-agent CLI subscriptions — paced by live quota meters, verified by content, never trusting exit codes.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -559,18 +559,20 @@ function renderWorkflowOverviewPanel(model, width, height, spinnerFrame, timelin
559
559
  const timelineRows = Math.max(1, contentRows - liveRows - nextRows);
560
560
  const maxTimelineScroll = Math.max(0, timeline.lines.length - timelineRows);
561
561
  const scroll = clamp(timelineScroll, 0, maxTimelineScroll);
562
- let start = Math.max(0, timeline.lines.length - timelineRows - scroll);
562
+ const end = Math.max(0, timeline.lines.length - scroll);
563
+ let start = Math.max(0, end - timelineRows);
563
564
  if (start > 0) {
564
- while (start < timeline.lines.length && !/^\d{2}:\d{2}\s/.test(timeline.lines[start])) start += 1;
565
+ start = Math.max(0, end - Math.max(0, timelineRows - 1));
566
+ while (start < end && !/^\d{2}:\d{2}\s/.test(timeline.lines[start])) start += 1;
565
567
  }
566
- const historyRows = start > 0 ? Math.max(0, timelineRows - 1) : timelineRows;
567
- let visibleTimeline = timeline.lines.slice(start, start + historyRows);
568
+ let visibleTimeline = timeline.lines.slice(start, end);
568
569
  if (start > 0) {
569
570
  visibleTimeline.unshift(dimText(`↑ ${start} earlier timeline rows`, inner));
570
571
  }
571
- const end = start + historyRows;
572
572
  if (end < timeline.lines.length && visibleTimeline.length) {
573
- visibleTimeline[visibleTimeline.length - 1] = dimText(`↓ ${timeline.lines.length - end} newer timeline rows`, inner);
573
+ const marker = dimText(`↓ ${timeline.lines.length - end} newer timeline rows`, inner);
574
+ if (visibleTimeline.length >= timelineRows) visibleTimeline[visibleTimeline.length - 1] = marker;
575
+ else visibleTimeline.push(marker);
574
576
  }
575
577
  const visibleLive = live.lines.slice(0, liveRows);
576
578
  const visibleNext = next.slice(0, nextRows);