- Engine discovery (#73): get_engine() now falls back to any healthy
engine when the explicitly-requested key fails, instead of returning
None. Fixes LM Studio (and other non-default engines) not being found
when deploying agents.
- FTS5 case sensitivity & scoring (#67): Add explicit unicode61 tokenizer
to the FTS5 virtual table for case-insensitive search. Replace ambiguous
`rank` column with explicit `bm25()` call with column weights (id=0,
content=1, source=0.5) to produce correct positive scores. Includes
auto-migration for existing databases.
- Interactive engine selection (#72): `jarvis init` now detects running
engines and presents an interactive picker. Also accepts `--engine`
flag to skip the prompt. Engine choice flows through to config
generation.
- Windows desktop support (#68): Add RAM detection via wmic, Windows
binary paths (LOCALAPPDATA, ProgramFiles, cargo), port cleanup via
netstat+taskkill, and USERPROFILE fallback for HOME env var.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Tauri commands: save_cloud_key writes keys to ~/.openjarvis/cloud-keys.env
(chmod 600), get_cloud_key_status reports which providers are configured.
- Server spawn: reads cloud-keys.env and injects keys as env vars into
the jarvis serve process, so CloudEngine picks them up automatically.
- Frontend: Cloud Models tab saves keys through Tauri invoke (desktop)
in addition to localStorage (web), so keys persist across restarts.
- Flow: user enters key in Cloud tab → saved to disk → next server
start picks it up → cloud models appear in the model list.
- Check that uv is actually installed before trying to spawn
- Kill any leftover server on port 8222 from a previous run
- Pipe stderr so error details are captured and shown to user
- Show the project root path in status and error messages
- Actionable error messages: tell user exactly what to install/clone
Pull just qwen3.5:2b (~2.7GB) during the SetupScreen so the app opens
quickly. Remaining Qwen3.5 models that fit in RAM download in the
background after the server is running — they appear in the model
list as each one finishes.
- Boot sequence: Phase 2 now pulls ALL Qwen3.5 models that fit in RAM
before the server starts. SetupScreen blocks until every model is
downloaded, showing per-model progress. No more background Phase 4.
- Default model: third-largest fitting model (qwen3.5:9b on 64GB).
- Download button: added pull_ollama_model and delete_ollama_model Tauri
commands. Frontend uses Tauri invoke in desktop mode, fixing the
"Load failed!" CORS/timeout issue with fetch().
* feat: model catalogue with download/delete and auto-pull Qwen3.5
- Desktop boot: start server immediately with fallback model (qwen3:0.6b),
then pull preferred model (qwen3.5:4b) and remaining Qwen3.5 variants
that fit in RAM in the background. No more broken "Select model" state.
- Backend: add POST /v1/models/pull and DELETE /v1/models/{name} endpoints
so the frontend can trigger model downloads and deletions via Ollama.
- Frontend: redesign CommandPalette (Cmd+K) with two tabs — "Installed"
shows pulled models with select/delete, "Download Models" shows a
catalogue of popular models plus a custom model input field.
- Fix ollama_has_model() to use exact tag matching instead of prefix
matching, preventing false positives.
* fix: streaming, model switching, second-largest default, and tests
- Streaming: use direct engine streaming for non-tool requests so tokens
arrive in real-time instead of being batched by the agent bridge.
Add error handling to _handle_stream so engine errors surface as
content chunks instead of silent failures.
- Model selection: pick the second-largest Qwen3.5 model that fits
(leaves headroom for OS/apps) instead of the absolute largest.
- Model switching: abort in-flight stream when the user changes models
mid-generation, preventing stale-model errors. Improve error messages
in catch blocks.
- Tests: add tests/server/test_model_management.py with 11 tests
covering model pull/delete endpoints, streaming error resilience,
direct-engine streaming bypass, and model listing. All 100 server
tests pass.
Detect system RAM at startup and automatically pull all Qwen3.5 model
variants (0.8b through 122b) that can run on the user's machine. The
smallest model is pulled first so the app is usable immediately, then
remaining models download in the background. The server starts with the
largest fitting model as default.
Also fixes ollama_has_model() to use exact tag matching instead of
prefix matching, which previously caused false positives (e.g. qwen3:0.6b
matching qwen3.5 queries).
Three issues fixed:
1. The desktop-latest release accumulated stale artifacts across builds
because tauri-action adds new files without removing old ones. Users
could download an outdated DMG. Added a clean-release job that wipes
all existing assets before the build matrix runs.
2. The frontend hardcoded DESKTOP_API to port 8000 but the Tauri backend
starts the server on port 8222. Added a get_api_base Tauri command so
the frontend fetches the port from the Rust backend at startup,
keeping JARVIS_PORT as the single source of truth.
3. frontend/package.json version was 1.0.0 while desktop and pyproject
are 0.1.0, causing duplicate artifact names in the release.
The desktop app's find_project_root() only checked 4 hardcoded paths
when the .app bundle couldn't walk up to a pyproject.toml. Users who
cloned OpenJarvis into non-standard locations (e.g. ~/Documents/work/
OpenJarvis) would see "Jarvis server did not become healthy in time"
after a 120-second timeout with no actionable guidance.
Three improvements:
- Check OPENJARVIS_ROOT env var first for explicit override
- Expand direct path checks and add shallow scan of common parent
directories (~/Documents/*/OpenJarvis, ~/Desktop/*/OpenJarvis, etc.)
- Fail fast with a clear error message when the project root cannot be
found, instead of spawning a doomed server and timing out silently