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

+42
View File
@@ -0,0 +1,42 @@
import { create } from 'zustand';
import type { TtsState } from '../services/voice/tts';
export type ListenPhase = 'off' | 'arming' | 'listening' | 'speech' | 'transcribing';
interface VoiceStore {
phase: ListenPhase;
inputLevel: number;
tts: TtsState;
handsFree: boolean;
lastTranscript: string;
interim: string;
error: string | null;
micDevices: Array<{ deviceId: string; label: string }>;
setPhase: (phase: ListenPhase) => void;
setInputLevel: (level: number) => void;
setTts: (state: TtsState) => void;
setHandsFree: (on: boolean) => void;
setTranscript: (text: string) => void;
setInterim: (text: string) => void;
setError: (error: string | null) => void;
setMicDevices: (devices: Array<{ deviceId: string; label: string }>) => void;
}
export const useVoice = create<VoiceStore>((set) => ({
phase: 'off',
inputLevel: 0,
tts: 'idle',
handsFree: false,
lastTranscript: '',
interim: '',
error: null,
micDevices: [],
setPhase: (phase) => set({ phase }),
setInputLevel: (inputLevel) => set({ inputLevel }),
setTts: (tts) => set({ tts }),
setHandsFree: (handsFree) => set({ handsFree }),
setTranscript: (lastTranscript) => set({ lastTranscript }),
setInterim: (interim) => set({ interim }),
setError: (error) => set({ error }),
setMicDevices: (micDevices) => set({ micDevices })
}));