File size: 2,416 Bytes
5e0b58b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * Brain-5D Dashboard — IO Flow Visualization
 *
 * @version 1.0.0
 * @license MIT
 */

"use strict";

const $ = (id) => document.getElementById(id);

function formatNumber(value) {
  if (value === null || value === undefined) return '—';
  return Number(value).toLocaleString();
}

function formatFloat(value, decimals = 3) {
  if (value === null || value === undefined) return '—';
  return Number(value).toFixed(decimals);
}

function setText(id, value) {
  const el = $(id);
  if (el) el.textContent = String(value);
}

export async function refreshIOFlow() {
  try {
    const r = await fetch('/api/live/io-flow', { cache: 'no-store' });
    if (!r.ok) throw new Error(`HTTP ${r.status}`);
    const data = await r.json();

    setText('io-input-count', formatNumber(data.input_count));
    setText('io-input-rate', formatFloat(data.input_mean_rate, 4));
    const inputFill = $('io-input-fill');
    if (inputFill) inputFill.style.width = Math.min(100, data.input_mean_rate * 200) + '%';

    setText('io-hidden-count', formatNumber(data.hidden_count));
    setText('io-hidden-rate', formatFloat(data.hidden_mean_rate, 4));
    const hiddenFill = $('io-hidden-fill');
    if (hiddenFill) hiddenFill.style.width = Math.min(100, data.hidden_mean_rate * 200) + '%';

    setText('io-output-count', formatNumber(data.output_count));
    setText('io-output-rate', formatFloat(data.output_mean_rate, 4));
    const outputFill = $('io-output-fill');
    if (outputFill) outputFill.style.width = Math.min(100, data.output_mean_rate * 200) + '%';

    const badge = $('io-flow-badge');
    if (badge) {
      if (data.propagation_active) {
        badge.textContent = '✅ Signalfluss aktiv';
        badge.className = 'gate-badge passed';
      } else {
        badge.textContent = '⏳ Signal abgebrochen';
        badge.className = 'gate-badge pending';
      }
    }

    const meta = $('io-flow-meta');
    if (meta) {
      meta.textContent = `Tick ${data.tick} · Input ${data.input_mean_rate.toFixed(4)} → Hidden ${data.hidden_mean_rate.toFixed(4)} → Output ${data.output_mean_rate.toFixed(4)} · ${data.source}`;
    }
  } catch (e) {
    const badge = $('io-flow-badge');
    if (badge) {
      badge.textContent = '⚠️ offline';
      badge.className = 'gate-badge failed';
    }
    const meta = $('io-flow-meta');
    if (meta) meta.textContent = '⚠️ IO-Fluss nicht verfügbar';
  }
}