@beastmode-develeap/beastmode 0.1.199 → 0.1.201

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.
@@ -15,7 +15,7 @@
15
15
  }
16
16
  </script>
17
17
  <!--BOARD_DATA-->
18
- <script>window.__BUILD_STAMP__ = "20260508-203604-050dbd8";</script>
18
+ <script>window.__BUILD_STAMP__ = "20260509-083434-01c320b";</script>
19
19
  <link rel="preconnect" href="https://fonts.googleapis.com">
20
20
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
21
21
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
@@ -585,6 +585,18 @@ body {
585
585
  font-weight: 500;
586
586
  }
587
587
 
588
+ .stat-badge--warning {
589
+ display: inline-block;
590
+ margin-top: 6px;
591
+ padding: 2px 8px;
592
+ font-size: 11px;
593
+ font-weight: 600;
594
+ color: #ff6b35;
595
+ background: rgba(255, 107, 53, 0.12);
596
+ border-radius: 4px;
597
+ letter-spacing: 0.3px;
598
+ }
599
+
588
600
  .stat-dot {
589
601
  display: inline-block;
590
602
  width: 6px;
@@ -3980,7 +3992,7 @@ function DashboardPage({ selectedProject, onProjectChange }) {
3980
3992
  const [recentItems, setRecentItems] = useState([]);
3981
3993
  const [runs, setRuns] = useState([]);
3982
3994
  const [projects, setProjects] = useState([]);
3983
- const [runnerCount, setRunnerCount] = useState(0);
3995
+ const [runnerData, setRunnerData] = useState({ count: 0, offline: 0 });
3984
3996
  const [loading, setLoading] = useState(true);
3985
3997
  const [error, setError] = useState(null);
3986
3998
 
@@ -4004,9 +4016,17 @@ function DashboardPage({ selectedProject, onProjectChange }) {
4004
4016
  .finally(() => setLoading(false));
4005
4017
  }
4006
4018
  fetchDashboard();
4007
- api('GET', '/api/debug/runner')
4008
- .then(data => setRunnerCount(data && typeof data.count === 'number' ? data.count : 0))
4009
- .catch(() => setRunnerCount(0));
4019
+ Promise.all([
4020
+ api('GET', '/api/debug/runner'),
4021
+ api('GET', '/api/daemon/runner-health').catch(() => ({ offline_count: 0, total_count: 0 })),
4022
+ ]).then(([meta, health]) => {
4023
+ const metaCount = meta && typeof meta.count === 'number' ? meta.count : 0;
4024
+ const ghTotal = health && typeof health.total_count === 'number' ? health.total_count : 0;
4025
+ setRunnerData({
4026
+ count: Math.max(metaCount, ghTotal),
4027
+ offline: health && typeof health.offline_count === 'number' ? health.offline_count : 0,
4028
+ });
4029
+ }).catch(() => setRunnerData({ count: 0, offline: 0 }));
4010
4030
  const interval = setInterval(fetchDashboard, 30000);
4011
4031
  return () => clearInterval(interval);
4012
4032
  }, [selectedProject]);
@@ -4061,8 +4081,13 @@ function DashboardPage({ selectedProject, onProjectChange }) {
4061
4081
  <div class="stat-dot"></div>
4062
4082
  </div>
4063
4083
  <div class="stat-card" data-testid="stat-runners">
4064
- <div class="stat-value">${runnerCount}</div>
4084
+ <div class="stat-value">${runnerData.count}</div>
4065
4085
  <div class="stat-label">Runners</div>
4086
+ ${runnerData.offline > 0 ? html`
4087
+ <div class="stat-badge stat-badge--warning" data-testid="runner-offline-warning">
4088
+ ${runnerData.offline} offline
4089
+ </div>
4090
+ ` : null}
4066
4091
  <div class="stat-dot"></div>
4067
4092
  </div>
4068
4093
  </div>
@@ -1 +1 @@
1
- 050dbd8be4c8edbe14ce439a59ba00a0439a3583
1
+ 01c320b6c2262682e1d5dc285e69388445d6f790
@@ -1 +1 @@
1
- 20260508-203604-050dbd8
1
+ 20260509-083434-01c320b
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.199",
3
+ "version": "0.1.201",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {