@beastmode-develeap/beastmode 0.1.109 → 0.1.110

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__ = "20260418-075248-39e5267";</script>
18
+ <script>window.__BUILD_STAMP__ = "20260418-082837-7de1d16";</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">
@@ -5585,6 +5585,79 @@ function HelpPage() {
5585
5585
  // Settings Page
5586
5586
  // ================================================================
5587
5587
 
5588
+ // Gap 15: opt-in anonymous telemetry status surface. Reads
5589
+ // /api/telemetry/status (proxied to the board, which reads the daemon's
5590
+ // last heartbeat). Always renders — shows "Disabled" with a red dot
5591
+ // when telemetry is off, full metrics when on. See docs/telemetry.md.
5592
+ function TelemetrySettings() {
5593
+ const [status, setStatus] = useState(null);
5594
+ const [loading, setLoading] = useState(true);
5595
+ const [loadError, setLoadError] = useState(null);
5596
+
5597
+ useEffect(() => {
5598
+ api('GET', '/api/telemetry/status')
5599
+ .then(data => { setStatus(data); setLoading(false); })
5600
+ .catch(e => { setLoadError(e && e.message ? e.message : String(e)); setLoading(false); });
5601
+ }, []);
5602
+
5603
+ const enabled = !!(status && status.enabled);
5604
+ const dotColor = enabled ? 'var(--success)' : 'var(--danger)';
5605
+ const eventTypes = (status && Array.isArray(status.collect_events)) ? status.collect_events : [];
5606
+
5607
+ return html`
5608
+ <div class="settings-section">
5609
+ <h3>Telemetry</h3>
5610
+ ${loading ? html`<p style="font-size:13px;color:var(--text-muted);">Loading telemetry status...</p>` : null}
5611
+ ${loadError ? html`<p style="font-size:13px;color:var(--danger);">Telemetry status unavailable: ${loadError}</p>` : null}
5612
+ ${!loading && !loadError ? html`
5613
+ <div class="setting-row">
5614
+ <div>
5615
+ <div class="setting-label">Status</div>
5616
+ <div class="setting-desc">Anonymous pipeline metrics (no code, no PII)</div>
5617
+ </div>
5618
+ <div class="setting-control">
5619
+ <span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${dotColor};" />
5620
+ <span class="mono" style="font-weight:600;color:${enabled ? 'var(--success)' : 'var(--danger)'};">${enabled ? 'Enabled' : 'Disabled'}</span>
5621
+ </div>
5622
+ </div>
5623
+ ${enabled ? html`
5624
+ <div class="setting-row">
5625
+ <div><div class="setting-label">Anonymous ID</div></div>
5626
+ <div class="setting-control"><span class="mono">${(status && status.anonymous_id_prefix) || ''}</span></div>
5627
+ </div>
5628
+ <div class="setting-row">
5629
+ <div>
5630
+ <div class="setting-label">Sentry</div>
5631
+ <div class="setting-desc">Error reporting SDK</div>
5632
+ </div>
5633
+ <div class="setting-control"><span class="mono">${status && status.sentry_configured ? 'Configured' : 'Not configured'}</span></div>
5634
+ </div>
5635
+ <div class="setting-row">
5636
+ <div><div class="setting-label">Events buffered</div></div>
5637
+ <div class="setting-control"><span class="mono">${status && status.events_buffered != null ? status.events_buffered : 0}</span></div>
5638
+ </div>
5639
+ <div class="setting-row">
5640
+ <div><div class="setting-label">Events collected</div></div>
5641
+ <div class="setting-control"><span class="mono">${status && status.events_total != null ? status.events_total : 0}</span></div>
5642
+ </div>
5643
+ <div class="setting-row">
5644
+ <div><div class="setting-label">Last flush</div></div>
5645
+ <div class="setting-control"><span class="mono">${(status && status.last_flush_at) || 'Never'}</span></div>
5646
+ </div>
5647
+ <div class="setting-row">
5648
+ <div><div class="setting-label">Event types</div></div>
5649
+ <div class="setting-control"><span class="mono" style="text-align:right;">${eventTypes.length > 0 ? eventTypes.join(', ') : '—'}</span></div>
5650
+ </div>
5651
+ ` : null}
5652
+ ` : null}
5653
+ <p style="font-size:12px;color:var(--text-muted);margin-top:12px;">
5654
+ Configure via <span class="mono">config/beastmode.daemon.json</span> (<span class="mono">telemetry</span> section) or
5655
+ the <span class="mono">BEASTMODE_TELEMETRY_ENABLED</span> env var. See <span class="mono">docs/telemetry.md</span>.
5656
+ </p>
5657
+ </div>
5658
+ `;
5659
+ }
5660
+
5588
5661
  function SettingsPage() {
5589
5662
  const [config, setConfig] = useState(null);
5590
5663
  const [loading, setLoading] = useState(true);
@@ -6031,6 +6104,9 @@ function SettingsPage() {
6031
6104
  </div>
6032
6105
  </div>
6033
6106
  </div>
6107
+
6108
+ <!-- Telemetry Section (Gap 15) -->
6109
+ <${TelemetrySettings} />
6034
6110
  </div>
6035
6111
  </div>
6036
6112
  `;
@@ -1 +1 @@
1
- 20260418-075248-39e5267
1
+ 20260418-082837-7de1d16
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beastmode-develeap/beastmode",
3
- "version": "0.1.109",
3
+ "version": "0.1.110",
4
4
  "description": "BeastMode Dark Factory — turn intent into verified software",
5
5
  "type": "module",
6
6
  "bin": {