mirror of
https://github.com/R0m1k3/EveFlow.git
synced 2026-10-12 17:59:48 +02:00
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
33 lines
867 B
TypeScript
33 lines
867 B
TypeScript
import { bridge } from './bridge';
|
|
|
|
/**
|
|
* Persistent key/value storage: Electron userData JSON file when available,
|
|
* localStorage otherwise. Values are JSON-serialisable objects.
|
|
*/
|
|
export async function persistGet<T>(key: string): Promise<T | null> {
|
|
const api = bridge();
|
|
if (api) {
|
|
try {
|
|
const value = await api.store.get<T>(key);
|
|
if (value !== null && value !== undefined) return value;
|
|
} catch {
|
|
/* fall through to localStorage */
|
|
}
|
|
}
|
|
try {
|
|
const raw = window.localStorage.getItem(key);
|
|
return raw ? (JSON.parse(raw) as T) : null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function persistSet(key: string, value: unknown): void {
|
|
try {
|
|
window.localStorage.setItem(key, JSON.stringify(value));
|
|
} catch {
|
|
/* quota or unavailable */
|
|
}
|
|
void bridge()?.store.set(key, value).catch(() => undefined);
|
|
}
|