Files
jarvis-home/internal/ui/static/index.html
2026-08-29 17:02:35 +02:00

190 lines
17 KiB
HTML
Raw Permalink 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" />
<meta name="theme-color" content="#02060a" />
<meta name="color-scheme" content="dark" />
<title>JARVIS // Home Command</title>
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<div class="noise"></div><div class="grid-plane"></div><div class="scan-sweep"></div>
<aside class="clean-sidebar" id="cleanSidebar" aria-label="Clean Navigation">
<div class="clean-brand">
<div class="clean-brand-mark">J</div>
<div><strong>Jarvis Home</strong><span>Local Intelligence</span></div>
</div>
<nav class="clean-nav">
<button class="clean-nav-item active" data-clean-view="home"><span class="clean-nav-icon"></span><span>Home</span></button>
<button class="clean-nav-item" data-clean-view="calendar"><span class="clean-nav-icon"></span><span>Kalender</span></button>
<button class="clean-nav-item" data-clean-view="tasks"><span class="clean-nav-icon"></span><span>Aufgaben</span></button>
<button class="clean-nav-item" data-clean-view="kanban"><span class="clean-nav-icon"></span><span>Kanban</span></button>
<button class="clean-nav-item" data-clean-view="food"><span class="clean-nav-icon"></span><span>Essen & Einkauf</span></button>
<button class="clean-nav-item" data-clean-view="knowledge"><span class="clean-nav-icon"></span><span>Wissen & System</span></button>
</nav>
<div class="clean-sidebar-foot">
<div class="clean-side-status"><i></i><div><span>Lokaler Core</span><strong id="cleanModelStatus">Online</strong></div></div>
<div class="theme-switch clean-theme-switch" aria-label="Design auswählen">
<button type="button" class="theme-option" data-theme="jarvis">HUD</button>
<button type="button" class="theme-option active" data-theme="apple">CLEAN</button>
</div>
</div>
</aside>
<nav class="clean-mobile-nav" aria-label="Clean Navigation mobil">
<button class="clean-nav-item active" data-clean-view="home"><span></span><small>Home</small></button>
<button class="clean-nav-item" data-clean-view="calendar"><span></span><small>Kalender</small></button>
<button class="clean-nav-item" data-clean-view="tasks"><span></span><small>Aufgaben</small></button>
<button class="clean-nav-item" data-clean-view="kanban"><span></span><small>Kanban</small></button>
<button class="clean-nav-item" data-clean-view="food"><span></span><small>Essen</small></button>
<button class="clean-nav-item" data-clean-view="knowledge"><span></span><small>System</small></button>
</nav>
<div class="shell">
<header class="clean-topbar">
<div class="clean-page-title"><span id="cleanViewEyebrow">Übersicht</span><h1 id="cleanViewTitle">Home</h1><p id="cleanViewSubtitle">Dein Zuhause, Termine und Aufgaben auf einen Blick.</p></div>
<div class="clean-top-actions">
<span class="clean-date" id="cleanTopDate"></span>
<button type="button" id="cleanQuickMic" class="clean-round-action" title="Spracheingabe"></button>
<button type="button" id="cleanOpenHome" class="clean-round-action" title="Zur Startseite"></button>
</div>
</header>
<header class="hud-top">
<div class="identity"><div class="sigil">J</div><div><span class="micro-label">LOCAL AUTONOMOUS HOME OS</span><h1>JARVIS <b>// HOME COMMAND</b></h1></div></div>
<div class="system-strip">
<div class="status-chip"><i id="coreDot"></i><span>CORE</span><strong id="coreStatus">BOOT</strong></div>
<div class="status-chip"><i id="ragDot"></i><span>RAG</span><strong id="ragStatus"></strong></div>
<div class="status-chip"><i id="sttDot"></i><span>STT</span><strong id="sttStatus"></strong></div>
<div class="status-chip"><i id="ttsDot"></i><span>TTS</span><strong id="ttsStatus"></strong></div>
</div>
<div class="clock"><strong id="clock">--:--:--</strong><span id="date">--</span></div>
</header>
<section class="command-deck panel">
<div class="command-core" id="coreVisual">
<div class="radar-ring r1"></div><div class="radar-ring r2"></div><div class="radar-ring r3"></div>
<div class="core-orb"><span>J</span></div>
<div class="voice-state"><small>NEURAL VOICE CORE</small><strong id="voiceModeLabel">STANDBY</strong></div>
</div>
<div class="command-main">
<div class="panel-head no-border"><div><span class="micro-label">00 // UNIFIED COMMAND CHANNEL</span><h2>Home Intelligence</h2></div><div class="command-tools"><div class="theme-switch" id="themeSwitch" aria-label="Design auswählen"><button type="button" class="theme-option active" data-theme="jarvis">JARVIS</button><button type="button" class="theme-option" data-theme="apple">CLEAN</button></div><button id="debugExportBtn" class="hud-button ghost debug-export" title="Strukturierten JSON-Debug-Trace exportieren">EXPORT DEBUG</button><button id="clearChatBtn" class="hud-button ghost" title="Alten Chatverlauf leeren">CLEAR CHAT</button><div class="live-tag"><i></i><span id="modelTag">LOCAL ONLY</span></div></div></div>
<div class="conversation" id="conversation"><div class="message assistant"><div class="avatar">J</div><div><small>JARVIS</small><p>Home-System online. Ich kann Kalender, Aufgaben, Einkauf, Rezepte, Essensplan, Erinnerungen und Kanban lokal verwalten.</p></div></div></div>
<form id="commandForm" class="command-bar"><button type="button" id="inlineMic" class="mic-button" aria-label="Spracheingabe"></button><textarea id="commandInput" rows="1" placeholder="z.B. Jarvis, trage morgen 15 Uhr Zahnarzt ein …"></textarea><button type="submit" class="execute">EXECUTE <span></span></button></form>
<div id="sourceRail" class="source-rail"></div>
</div>
<div class="mission-brief">
<span class="micro-label">LIVE HOME MATRIX</span>
<div class="brief-grid"><div><strong id="briefEvents">0</strong><span>TERMINE / 7T</span></div><div><strong id="briefTasks">0</strong><span>OFFENE TASKS</span></div><div><strong id="briefGroceries">0</strong><span>EINKAUF</span></div><div><strong id="briefReminders">0</strong><span>REMINDER</span></div></div>
<button id="automationBtn" class="hud-button wide">RUN HOME AUTOMATION</button>
<button id="scoutBtn" class="hud-button wide secondary">SCAN FOR TASKS</button>
</div>
</section>
<section class="clean-home-overview" id="cleanHomeOverview">
<article class="clean-welcome-card">
<div><span class="clean-eyebrow" id="cleanGreetingLabel">Guten Morgen</span><h2 id="cleanGreeting">Alles im Blick.</h2><p id="cleanHomeSummary">Jarvis synchronisiert gerade deinen lokalen Home-State.</p></div>
<div class="clean-quick-grid">
<button data-clean-jump="calendar"><span></span><strong>Kalender</strong><small id="homeCalendarQuick">0 Termine</small></button>
<button data-clean-jump="tasks"><span></span><strong>Aufgaben</strong><small id="homeTasksQuick">0 offen</small></button>
<button data-clean-jump="food"><span></span><strong>Essen</strong><small id="homeFoodQuick">Nichts geplant</small></button>
<button data-clean-jump="kanban"><span></span><strong>Kanban</strong><small id="homeKanbanQuick">0 Karten</small></button>
</div>
</article>
<article class="clean-home-card clean-next-card">
<header><span>Als Nächstes</span><button data-clean-jump="calendar">Alle anzeigen</button></header>
<div id="cleanNextEvent" class="clean-home-card-body"><strong>Keine Termine</strong><p>Dein Kalender ist frei.</p></div>
</article>
<article class="clean-home-card clean-task-card">
<header><span>Heute erledigen</span><button data-clean-jump="tasks">Aufgaben öffnen</button></header>
<div id="cleanNextTask" class="clean-home-card-body"><strong>Keine offenen Aufgaben</strong><p>Du bist auf dem aktuellen Stand.</p></div>
</article>
<article class="clean-home-card clean-meal-card">
<header><span>Essen</span><button data-clean-jump="food">Plan öffnen</button></header>
<div id="cleanNextMeal" class="clean-home-card-body"><strong>Noch nichts geplant</strong><p>Plane eine Mahlzeit für heute oder morgen.</p></div>
</article>
<article class="clean-home-card clean-system-card">
<header><span>Local AI</span><button data-clean-jump="knowledge">System</button></header>
<div class="clean-system-grid"><div><span>Core</span><strong id="cleanCoreQuick"></strong></div><div><span>RAG</span><strong id="cleanRagQuick"></strong></div><div><span>Voice</span><strong id="cleanVoiceQuick"></strong></div><div><span>Skills</span><strong id="cleanSkillsQuick"></strong></div></div>
</article>
</section>
<main class="dashboard-grid">
<section class="panel calendar-panel">
<header class="panel-head"><div><span class="micro-label">01 // TEMPORAL MATRIX</span><h2>Kalender · 7 Tage</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Kalender" title="Kalender per Sprache"></button><button class="add-button" data-add="event"> TERMIN</button></div></header>
<div class="week-rail" id="weekRail"></div><div class="agenda" id="agenda"></div>
</section>
<section class="panel tasks-panel">
<header class="panel-head"><div><span class="micro-label">02 // ACTION QUEUE</span><h2>Aufgaben</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Aufgaben" title="Aufgaben per Sprache"></button><button class="add-button" data-add="task"> TASK</button></div></header>
<div class="task-kpis"><div><span>OPEN</span><strong id="taskOpen">0</strong></div><div><span>AI FOUND</span><strong id="taskAI">0</strong></div><div><span>HIGH</span><strong id="taskHigh">0</strong></div></div>
<div id="taskList" class="task-list"></div>
</section>
<section class="panel kanban-panel full-span">
<header class="panel-head"><div><span class="micro-label">03 // AUTONOMOUS FLOW ENGINE</span><h2>KI Kanban</h2></div><div class="head-actions"><span class="hint">Drag & Drop · manuelle Karten bleiben geschützt</span><button class="module-mic" data-voice-context="Kanban" title="Kanban per Sprache"></button><button id="kanbanAI" class="hud-button">AI ORGANIZE</button><button class="add-button" data-add="kanban"> CARD</button></div></header>
<div class="kanban-board" id="kanbanBoard"></div>
</section>
<section class="panel grocery-panel">
<header class="panel-head"><div><span class="micro-label">04 // SUPPLY MATRIX</span><h2>Einkaufsliste</h2></div><div class="head-actions"><button id="syncMealGroceriesBtn" class="hud-button ghost" title="Zutaten aus dem Essensplan synchronisieren">↻ AUS PLAN</button><button class="module-mic" data-voice-context="Einkaufsliste" title="Einkauf per Sprache"></button><button class="add-button" data-add="grocery"> ITEM</button></div></header>
<div class="mini-meter"><span>OFFEN</span><strong id="groceryOpen">0</strong><i><b id="groceryBar"></b></i></div><div id="groceryList" class="grocery-list"></div>
</section>
<section class="panel meals-panel">
<header class="panel-head"><div><span class="micro-label">05 // NUTRITION SCHEDULE</span><h2>Essensplanung</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Essensplanung" title="Essensplan per Sprache"></button><button class="add-button" data-add="meal"> PLAN</button></div></header>
<div id="mealTimeline" class="meal-timeline"></div>
</section>
<section class="panel recipes-panel">
<header class="panel-head"><div><span class="micro-label">06 // CULINARY MEMORY</span><h2>Rezepte</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Rezepte" title="Rezepte per Sprache"></button><button class="add-button" data-add="recipe"> RECIPE</button></div></header>
<div id="recipeList" class="recipe-grid"></div>
</section>
<section class="panel reminders-panel">
<header class="panel-head"><div><span class="micro-label">07 // ALERT GRID</span><h2>Erinnerungen</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Erinnerungen" title="Erinnerungen per Sprache"></button><button class="add-button" data-add="reminder"> REMINDER</button></div></header>
<div id="reminderList" class="reminder-list"></div>
</section>
<section class="panel knowledge-panel">
<header class="panel-head"><div><span class="micro-label">08 // KNOWLEDGE VAULT</span><h2>RAG Memory</h2></div><div class="head-actions"><button class="module-mic" data-voice-context="Dokumentwissen" title="Dokumente per Sprache"></button><button id="reindexBtn" class="hud-button">REINDEX</button></div></header>
<label class="dropzone" id="dropzone"><input type="file" id="fileInput" hidden /><div class="hex-upload"></div><div><strong>INGEST DOCUMENT</strong><span>drop file / click to select</span></div></label>
<div class="memory-meter"><span>VECTOR CHUNKS</span><strong id="chunkCount">0</strong><div><i id="memoryBar"></i></div></div><div id="documentList" class="document-list"></div>
</section>
<section class="panel skills-panel">
<header class="panel-head"><div><span class="micro-label">09 // SKILL REGISTRY</span><h2>Skills</h2></div><div class="head-actions"><span id="skillCountTag" class="live-tag"><i></i> 0 ACTIONS</span><button id="reloadSkillsBtn" class="hud-button">RELOAD</button></div></header>
<p class="skill-intro">Core-Skills, lokale Entwicklungsplugins und Remote-Worker teilen sich dieselbe JSON-Schnittstelle. JARVIS kann Skill-Aktionen unabhängig vom Provider auswählen und zu Workflows kombinieren.</p>
<div id="skillList" class="skill-list"></div>
</section>
<section class="panel mesh-panel full-span">
<header class="panel-head"><div><span class="micro-label">10 // DISTRIBUTED SKILL MESH</span><h2>Skill Worker & Container</h2></div><div class="head-actions"><span id="meshCountTag" class="live-tag"><i></i> 0 WORKERS</span><button id="refreshMeshBtn" class="hud-button">REFRESH</button></div></header>
<p class="skill-intro">Remote Worker registrieren ihre Skills per HTTP beim Master. Der Docker-Controller zeigt nur Container mit dem freigegebenen JARVIS-Service-Label und kann ausschließlich Start, Stop und Restart ausführen.</p>
<div class="mesh-layout"><div><h3 class="mesh-subtitle">Enrolled Worker</h3><div id="meshWorkerList" class="mesh-worker-list"></div></div><div><h3 class="mesh-subtitle">Docker Skill Services</h3><div id="dockerSkillList" class="docker-skill-list"></div></div></div>
</section>
<section class="panel voice-panel">
<header class="panel-head"><div><span class="micro-label">11 // VOICE MATRIX</span><h2>Wake Protocol</h2></div><button class="module-mic" data-voice-context="Systemsteuerung" title="System per Sprache"></button></header>
<div class="wake-row"><div class="wake-word"><span>CODEWORD</span><strong id="wakeWord">JARVIS</strong></div><label class="switch"><input type="checkbox" id="wakeToggle"><span></span></label></div>
<p id="wakeHelp">Wake-Word aus. Jeder Modul-Button und der globale Voice-Core starten Push-to-talk.</p>
<div class="voice-diag"><div><span>MIC</span><b id="micDiag">READY</b></div><div><span>WHISPER</span><b id="whisperDiag">CHECK</b></div><div><span>PIPER</span><b id="piperDiag">CHECK</b></div></div>
</section>
<section class="panel telemetry-panel full-span">
<header class="panel-head"><div><span class="micro-label">12 // SYSTEM TELEMETRY</span><h2>Activity Stream</h2></div><div class="head-actions"><span id="debugTraceStatus" class="live-tag"><i></i> DEBUG TRACE</span><button id="debugClearBtn" class="hud-button ghost" title="Nur Debug-Trace löschen">CLEAR TRACE</button></div></header><div id="activityList" class="activity-list"></div>
</section>
</main>
</div>
<button id="globalMic" class="global-mic" aria-label="Globaler Sprachkanal" title="Push-to-talk"><span class="mic-halo"></span><span class="mic-icon"></span><small>VOICE</small></button>
<div id="voiceOverlay" class="voice-overlay" aria-live="polite"><div class="voice-overlay-inner"><span class="micro-label">VOICE CHANNEL <b id="voiceContextLabel">GLOBAL</b></span><strong id="overlayStatus">LISTENING</strong><p id="overlayTranscript">Sprich jetzt …</p></div></div>
<div id="toast" class="toast"></div>
<dialog id="entityDialog" class="entity-dialog"><form method="dialog" id="entityForm"><header><div><span class="micro-label" id="dialogCode">NEW ENTITY</span><h2 id="dialogTitle">Eintrag erstellen</h2></div><button type="button" class="dialog-close" id="dialogClose">×</button></header><div id="dialogFields" class="dialog-fields"></div><footer><button type="button" class="hud-button secondary" id="dialogCancel">CANCEL</button><button type="submit" class="execute">SAVE <span></span></button></footer></form></dialog>
<script src="/app.js"></script>
</body>
</html>