Files
glpi-neural-brain/internal/web/static/index.html
2026-08-07 21:54:37 +02:00

200 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>Neural Knowledge Brain</title>
<link rel="stylesheet" href="/app.css">
</head>
<body>
<canvas id="brain" aria-label="Animierter Wissensgraph in 3D-Gehirnform"></canvas>
<div class="vignette"></div>
<header class="topbar glass">
<div class="brand">
<span class="mark"><i></i><i></i><i></i></span>
<div>
<strong>NEURAL KNOWLEDGE BRAIN</strong>
<small>Autonome Hirnaktivität · Agent · Knowledgebase · AI-THINK</small>
</div>
</div>
<div class="mode-status living" id="visualMode" aria-live="polite">
<i></i>
<div><b>LIVING</b><small>ruhige Eigenaktivität</small></div>
</div>
<div class="metrics">
<span><b id="nodeCount">0</b> Nodes</span>
<span><b id="edgeCount">0</b> Edges</span>
<span title="Aktuell gerenderte Knoten"><b id="renderCount">0</b> Render</span>
<span title="Gemessene Renderfrequenz"><b id="fpsCount">0</b> FPS</span>
<span><b id="pulseCount">0</b> Impulse</span>
<span class="state" id="systemState"><i></i> verbindet</span>
</div>
</header>
<aside class="activity glass">
<div class="panel-title">
<span>AKTIVITÄTSFEED</span>
<div class="panel-actions">
<span class="chip">wichtig</span>
<button id="clearLog" title="Aktivitätsprotokoll leeren">×</button>
</div>
</div>
<div class="panel-subtitle">Zeigt relevante Hirnaktivität, Anreicherungen, Recherchen und Suchläufe.</div>
<div id="autonomyStatus" class="autonomy-status" aria-live="polite"><i></i><span>AI-THINK-Status wird geladen …</span></div>
<div id="activityLog" class="activity-log"></div>
</aside>
<nav class="dock glass" aria-label="Ansichtssteuerung">
<button id="viewNeural" class="active" title="Semantischer Wissensgraph mit Edges">NEURAL</button>
<button id="viewHoneycomb" title="Gleichmäßig verteilte 3D-Wabenansicht ohne Edges">HONEYCOMB</button>
<button id="viewConstellation" title="Semantische Themen-Sternbilder mit leichten Clusterpfaden">CONSTELLATION</button>
<span class="dock-separator"></span>
<button id="toggleLearning" class="active" title="Lernen, Reindex und Embeddings aktivieren oder pausieren">LEARNING</button>
<button id="toggleThinking" class="active" title="Autonomes AI-THINK aktivieren oder pausieren">THINKING</button>
<span class="dock-separator"></span>
<button id="toggleLabels" class="active">Labels</button>
<button id="toggleEdges" class="active">Synapsen</button>
<button id="toggleRotate" class="active">Autopilot</button>
<button id="toggleCortex" class="active">Cortex</button>
<button id="toggleLOD" class="active" title="Hierarchische dynamische Verdichtung">LOD</button>
<button id="toggleEco" title="Optimierter Renderpfad für schwächere Systeme">ECO</button>
<button id="resetView">Zentrieren</button>
<button id="openSettings" title="Exakte KB-source-Filter und Laufzeitsteuerung">FILTER</button>
<a class="analysis-dashboard-link" href="/analysis.html" title="Technisches Analyse-Dashboard mit Lauf- und Graphhistorie">ANALYSE</a>
<button id="enrichNow" class="think-action" title="Einen autonomen AI-THINK-Zyklus sofort starten"><span>AI-THINK</span><small>STARTEN</small></button>
</nav>
<div class="legend glass" aria-label="Legende">
<span class="legend-title">STATUS</span>
<span><i class="prod"></i>Produktiv</span>
<span><i class="think"></i>AI-THINK</span>
<span><i class="stage"></i>Staging</span>
<span><i class="external"></i>Recherche</span>
</div>
<div id="settingsBackdrop" class="settings-backdrop hidden"></div>
<aside id="settingsPanel" class="settings-panel glass hidden" aria-label="Brain-Einstellungen">
<div class="settings-header">
<div><strong>BRAIN CONTROL</strong><small>Laufzeitmodi und exakte KB-source-Filter</small></div>
<button id="closeSettings" title="Schließen">×</button>
</div>
<div class="settings-scroll" tabindex="0" aria-label="Scrollbarer Einstellungsinhalt">
<section class="settings-section">
<h2>Betriebsmodi</h2>
<label class="switch-row" for="settingsLearning">
<span><b>Learning</b><small>Ingest, Reindex, GLPI-Sync und Embeddings</small></span>
<input id="settingsLearning" type="checkbox" checked>
</label>
<label class="switch-row" for="settingsThinking">
<span><b>Thinking</b><small>AI-THINK, Verknüpfungsanalyse und Recherche</small></span>
<input id="settingsThinking" type="checkbox" checked>
</label>
<div class="view-selector" aria-label="Standardansicht">
<button id="settingsViewNeural" class="active" type="button">Neural</button>
<button id="settingsViewHoneycomb" type="button">Honeycomb</button>
<button id="settingsViewConstellation" type="button">Constellation</button>
</div>
</section>
<section class="settings-section performance-settings">
<div class="settings-section-title"><h2>Performance</h2><span>Browser-Rendering</span></div>
<label class="switch-row eco-switch" for="settingsLowPower">
<span><b>Eco-Modus</b><small>30 FPS, geringere Pixeldichte und günstigere Glow-Effekte. Aktivität, Rechercheanimationen und Fades bleiben sichtbar.</small></span>
<input id="settingsLowPower" type="checkbox">
</label>
<div class="settings-section-title performance-subtitle"><h2>Brain-Verarbeitung</h2><span>Relationen & Artikel</span></div>
<div class="settings-processing-mode" role="group" aria-label="Verarbeitungsmodus">
<button id="settingsProcessingPrecise" class="active" type="button">PRÄZISE</button>
<button id="settingsProcessingClustered" type="button">CLUSTER / FAST</button>
</div>
<p id="processingModeHint" class="setting-hint">Präzise: vollständige Cosine-Suche. Cluster/Fast: Semantic Hashing + exakte Top-K-Prüfung und kompakterer Artikelreview.</p>
<div class="settings-section-title performance-subtitle"><h2>GPU-Limit</h2><span>0 = unbegrenzt</span></div>
<label class="number-setting" for="settingsMaxDisplayNodes">
<span><b>Maximal angezeigte Nodes</b><small>Begrenzt Neural- und Honeycomb-Ansicht. Aktive Notes werden bei Bedarf temporär eingeblendet und ersetzen inaktive Nodes.</small></span>
<input id="settingsMaxDisplayNodes" type="number" min="0" max="500000" step="100" inputmode="numeric" value="0">
</label>
<div class="node-limit-presets" aria-label="Voreinstellungen für das Node-Limit">
<button type="button" data-node-limit="1000">1.000</button>
<button type="button" data-node-limit="5000">5.000</button>
<button type="button" data-node-limit="10000">10.000</button>
<button type="button" data-node-limit="25000">25.000</button>
<button type="button" data-node-limit="0">Unbegrenzt</button>
</div>
<p id="displayLimitHint" class="setting-hint">Unbegrenzt · Quellenfilter und LOD bestimmen die Renderlast.</p>
</section>
<section class="settings-section research-settings">
<div class="settings-section-title"><h2>SearXNG-Diagnose</h2><span id="researchStatusBadge">nicht geprüft</span></div>
<div id="researchStatus" class="research-status">Konfiguration wird geladen …</div>
<label class="research-test-query" for="researchTestQuery">
<span>Direkte Testanfrage</span>
<input id="researchTestQuery" type="text" value="Btrfs Snapshots und ZFS History Unterschiede Timeline" autocomplete="off">
</label>
<div class="research-test-actions">
<button id="testResearch" type="button">SEARXNG TESTEN</button>
<span id="researchTestFeedback" aria-live="polite"></span>
</div>
</section>
<section class="settings-section autonomous-research-settings">
<div class="settings-section-title"><h2>Autonomous Research</h2><span id="autonomousResearchBadge">pausiert</span></div>
<label class="switch-row" for="settingsAutonomousResearch">
<span><b>Eigenständige Wissensanreicherung</b><small>Erkennt Wissenslücken, plant SearXNG-Recherchen und lernt geprüfte Volltextbelege. Artikel bleiben im Staging.</small></span>
<input id="settingsAutonomousResearch" type="checkbox">
</label>
<label class="switch-row" for="settingsAutonomousIdleOnly">
<span><b>Nur im Leerlauf</b><small>Hintergrundaufgaben werden nur an Ollama übergeben, wenn keine Anfrage oder AI-THINK-Auswertung läuft.</small></span>
<input id="settingsAutonomousIdleOnly" type="checkbox" checked>
</label>
<div class="autonomous-grid">
<label for="settingsAutonomousMinPriority"><span>Mindestpriorität</span><input id="settingsAutonomousMinPriority" type="number" min="0" max="1" step="0.05" value="0.65"></label>
<label for="settingsAutonomousMaxPerDay"><span>Maximal pro Tag</span><input id="settingsAutonomousMaxPerDay" type="number" min="1" max="500" step="1" value="12"></label>
<label for="settingsAutonomousPerCycle"><span>Neue Tasks je Scan</span><input id="settingsAutonomousPerCycle" type="number" min="1" max="8" step="1" value="1"></label>
</div>
<label class="research-test-query" for="autonomousResearchTopic">
<span>Manuelle Rechercheaufgabe</span>
<input id="autonomousResearchTopic" type="text" placeholder="z. B. ZFS-Schlüsselwiederherstellung auf Ersatzsystemen" autocomplete="off">
</label>
<div class="research-test-actions autonomous-actions">
<button id="queueAutonomousResearch" type="button">AUFGABE EINPLANEN</button>
<button id="scanAutonomousResearch" type="button">GRAPH ANALYSIEREN</button>
<button id="runAutonomousResearch" type="button">QUEUE STARTEN</button>
</div>
<p id="autonomousResearchFeedback" class="setting-hint" aria-live="polite">Die Queue wird asynchron und mit niedriger Priorität an Ollama abgearbeitet.</p>
<div class="settings-section-title queue-title"><h2>Research Queue</h2><span id="autonomousQueueCount">0</span></div>
<div id="autonomousResearchQueue" class="autonomous-queue"><span class="empty-filter">Keine Aufgaben geladen</span></div>
</section>
<section class="settings-section source-settings">
<div class="settings-section-title"><h2>KB-source-Filter</h2><span>exakter Treffer auf dem source-Feld</span></div>
<p id="filterScopeSummary" class="setting-hint filter-scope-summary">Quellen werden geladen …</p>
<label class="filter-search"><span>source-Werte durchsuchen</span><input id="sourceSearch" type="search" placeholder="z. B. internal-category oder GLPI Knowledge Base"></label>
<div class="filter-block">
<div class="filter-heading"><div><b>Lernen</b><small>Nur KB-Dokumente mit exakt diesem source-Wert werden eingebettet und bei Abfragen verwendet.</small></div><button type="button" data-clear-source-filter="learning">Alle</button></div>
<div id="learningSourceList" class="source-list"></div>
</div>
<div class="filter-block">
<div class="filter-heading"><div><b>Anzeige</b><small>Nur Dokumente mit exakt passendem source-Wert werden gerendert; direkte Taxonomie bleibt sichtbar.</small></div><button type="button" data-clear-source-filter="display">Alle</button></div>
<div id="displaySourceList" class="source-list"></div>
</div>
<div class="filter-block">
<div class="filter-heading"><div><b>Thinking</b><small>Nur Dokumente und Webbelege mit exakt passendem source-Wert speisen neue Relationen und Artikel.</small></div><button type="button" data-clear-source-filter="thinking">Alle</button></div>
<div id="thinkingSourceList" class="source-list"></div>
</div>
</section>
</div>
<div class="settings-footer">
<span id="settingsFeedback" aria-live="polite"></span>
<button id="saveSettings" type="button">ÜBERNEHMEN</button>
</div>
</aside>
<div id="tooltip" class="tooltip hidden"></div>
<script src="/app.js" defer></script>
</body>
</html>