NOVA is a local-first personal AI assistant foundation for Windows.
Implemented phases:
- Phase 0: config, identity/session, event bus, audit logging.
- Phase 1: capabilities, permissions, risk classifier, confirmation flow.
- Phase 2: PySide6 desktop GUI, tray, chat input/history/status.
- Phase 3: LLM providers and
LLMService. - Phase 4: manual voice pipeline with dummy STT/TTS.
- Phase 5: local JSON memory MVP.
- Phase 6: agent runtime with planner, memory, voice, security, and system agents.
- Phase 7: safe allowlist-only system commands.
python -m pip install -e ".[dev]"
python -m pytest
python main.pypython -m apps.desktop.mainPhase 29 adds a long-term Tauri 2 + React desktop shell in apps/desktop_shell.
It connects to the existing local NOVA API at http://127.0.0.1:8000 and keeps privileged actions in the backend.
Phase 30 integrates Dashboard, Runtime, Voice, Chat, Event Stream, and Settings with live local API data plus stable offline fallback.
cd apps/desktop_shell
npm install
npm run tauri devPhase 26 adds optional local system text-to-speech through pyttsx3.
It is not a required dependency; NOVA falls back to dummy TTS when fallback is enabled.
python -m pip install pyttsx3
$env:NOVA_VOICE_RUNTIME_TTS_PROVIDER="system"
$env:NOVA_VOICE_RUNTIME_TTS_FALLBACK_ENABLED="true"If pyttsx3 or an audio device is unavailable, /voice/push-to-talk still returns safely with dummy fallback metadata.
Phase 27 adds optional local whisper.cpp speech-to-text for file/bytes based push-to-talk.
It is still explicit and manual: no wake word, no browser microphone capture, and no background listening.
$env:NOVA_VOICE_RUNTIME_STT_PROVIDER="whisper_cpp"
$env:NOVA_STT_WHISPER_CPP_BINARY_PATH="C:/tools/whisper.cpp/main.exe"
$env:NOVA_STT_WHISPER_CPP_MODEL_PATH="C:/models/ggml-small.bin"
$env:NOVA_STT_WHISPER_CPP_LANGUAGE="ru"For MVP, /voice/push-to-talk can accept an audio_path that points to an existing local audio file.
Phase 28 adds manual browser microphone recording in /web with MediaRecorder.
Recording starts only after pressing Start recording, stops with Stop and send, and uploads a temporary audio blob to /voice/push-to-talk as multipart/form-data.
Safety defaults:
- no wake word
- no background recording
- no streaming audio
- upload limit: 10 MB
- temporary audio is deleted after processing
- supported upload extensions:
.wav,.webm,.mp3,.m4a,.ogg
Desktop input flows through:
GUI -> DesktopRuntime -> AgentRuntime -> Agent
Supported chat commands:
ordinary text
/remember Я работаю над проектом NOVA
/recall
/recall NOVA
/forget memory_xxx
/voice test привет
/security status
/system status
/system list
/system open app notepad
/system open app vscode
/system open url google
/system open url github
System commands are allowlist-only. Arbitrary shell is disabled:
system:
enabled: true
allow_arbitrary_shell: falseAllowed command types:
statuslistappurl
Apps use subprocess.Popen([...], shell=False) with command and args from config only. URLs use webbrowser.open() with URLs from config only. User-provided shell strings are never executed.
The runtime includes:
PlannerAgent: rule-based routing.MemoryAgent: wrapsMemoryService.VoiceAgent: wrapsVoicePipeline.SecurityAgent: safe status placeholder.SystemAgent: wrapsSafeCommandExecutor.
Agent audit logs never store full user input; they store task type, input length, source, selected agent, success, and error category.
No plugin loading, internet search, arbitrary shell, file delete/write commands, software installation, autonomous task chains, vector memory, semantic search, cloud memory sync, or device mesh yet.