feat!: rebuild EveFlow as a JARVIS-style voice HUD for Hermes Agent (v2.0.0)

Complete rewrite of the application:

- Toolchain: Electron 44, Vite 8, React 19, TypeScript 5.9, Zustand, Vitest;
  main process rewritten in TypeScript (electron/), typed IPC contract (shared/),
  sandboxed renderer with webSecurity on and an HTTP/SSE proxy in the main process.
- Voice: AudioWorklet microphone capture at 16 kHz with adaptive energy VAD and
  auto-stop, WAV encoder, OpenAI-compatible STT, TTS queue with sentence-level
  streaming, prefetch and Web Audio playback feeding an analyser; hands-free mode,
  global push-to-talk hotkey, system-voice fallback.
- Hermes: full API client (capabilities, health, models, skills, toolsets,
  sessions, jobs) with automatic transport selection: runs API (SSE lifecycle,
  approvals, steer, stop) > sessions stream > chat completions with local tools;
  tolerant event normalisation; webhook receiver hardened (secret, size limit).
- UI: JARVIS arc-reactor core on Canvas 2D reacting to the real audio signal,
  holographic HUD layout (transcript, core, Hermes ops panel with tools/crons/
  skills/sessions/link tabs, telemetry), settings drawer, approval modals,
  compact floating widget, four themes, tray icon and global shortcuts.
- Removed the 3D Eve robot, three.js and legacy assets; migrated 1.x settings.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Wn5VX9HNbJ7N54hR24u9Y
This commit is contained in:
Claude committed 2026-09-03 13:40:59 +00:00
1 parent 5217eee53a
commit 127a2083a1
239 files changed
+11351 -86495

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
.compact-root {
height: 100%;
display: flex;
flex-direction: column;
border-radius: 18px;
overflow: hidden;
background: linear-gradient(180deg, rgba(5, 12, 22, var(--compact-opacity, 0.92)), rgba(2, 6, 12, var(--compact-opacity, 0.92)));
border: 1px solid rgba(var(--accent-rgb), 0.3);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6), 0 0 30px rgba(var(--accent-rgb), 0.12);
backdrop-filter: blur(16px);
}
.compact-head {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 8px 8px 14px;
-webkit-app-region: drag;
font-family: var(--font-display);
font-size: 11px;
letter-spacing: 0.3em;
color: var(--ink-0);
}
.compact-head > * {
-webkit-app-region: no-drag;
}
.compact-head .title {
flex: 1;
-webkit-app-region: drag;
}
.compact-core {
position: relative;
height: 220px;
flex-shrink: 0;
}
.compact-core canvas {
width: 100%;
height: 100%;
display: block;
}
.compact-core .core-caption {
bottom: 6px;
}
.compact-body {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
border-top: 1px solid var(--line);
}
.compact-body .command-bar {
padding: 8px 10px 10px;
}
.compact-body .command-input {
min-height: 40px;
font-size: 14px;
padding: 9px 12px;
}
.compact-body .bubble {
font-size: 13px;
padding: 8px 11px;
}