Commit Graph
51 Commits
Author SHA1 Message Date
Jon Saad-Falcon 1a148debe2 feat: seamless cloud API key flow — save once, works automatically
- 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.
2026-03-14 14:32:46 -07:00
Gabriel Bo 93344a787f adding asterisk to focus on local models 2026-03-14 14:32:29 -07:00
Jon Saad-Falcon 7a1584aac3 feat: Cloud Models tab, prevent duplicate empty chats, rename to Installed Models
1. Cloud Models tab: third tab in Cmd+K palette with API key management
   for OpenAI, Anthropic, Google, and OpenRouter. Keys stored in
   localStorage (never sent externally). Top-3 models per provider
   shown when key is configured. Connected status indicator.

2. New chat button: skip creating a new chat if the current one is
   empty (no messages). Prevents stacking empty conversations.

3. Tab label: "Installed" renamed to "Installed Models (N)" for clarity.
2026-03-14 14:18:56 -07:00
Jon Saad-Falcon 7b0fcfa607 fix: rounded icons, setup text overflow, new chat on model switch, token counts
1. Desktop icon: bake rounded corners into the PNG/ICNS/ICO so the icon
   looks consistent on Desktop and in Applications.
2. SetupScreen: truncate long status text with ellipsis, word-break
   error messages so they don't overflow the block.
3. Model switching: create a new chat session when changing models,
   preventing stale context errors with the new model.
4. X-Ray footer: show input/output token counts in the collapsed
   summary (e.g. "42 in · 128 out") alongside engine, model, latency.
2026-03-14 14:05:49 -07:00
e240fde74a feat(ui): Raycast-inspired visual refresh with System Pulse and X-Ray footers (#57)
* feat(ui): update design tokens — system-ui font, warmer palette, accent triad

- Remove Merriweather serif font, switch to system-ui font stack
- Warmer dark mode neutrals (#161618 bg instead of #09090b)
- Add amber/purple accent tokens for signature color triad
- Update borders to rgba for softer feel
- Tighter line-height (1.5) and letter-spacing (-0.01em)
- Update PWA theme_color to match new palette

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ui): frosted glass sidebar with backdrop-blur

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ui): initialize shadcn/ui with button, dialog, input, select, tooltip, sonner

Set up shadcn/ui (v4) for Tailwind CSS v4 with CSS-first config. Added
path aliases (@/) to tsconfig.json and vite.config.ts. Installed six
components (button, dialog, input, select, tooltip, sonner) and wired
Sonner's <Toaster> into App.tsx for toast notifications. Removed the
next-themes dependency since this is a Vite/React project, not Next.js.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ui): disable create agent when unavailable, replace errors with toasts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ui): add System Pulse bar and health check banner

- 3px gradient bar at top reflecting system state (idle/inferencing/agent)
- Health check banner when backend is unreachable
- Pulse colors: blue (inference), purple (agents), dim blue (idle)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(ui): add X-Ray message footers with collapsible telemetry

- MessageTelemetry type on ChatMessage (engine, model, speed, TTFT, timing)
- Capture timing data during SSE streaming in InputArea
- XRayFooter component: collapsed one-liner + expandable trace grid
- Integrated into MessageBubble, replacing old token count display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(ui): resolve shadcn/ui CSS token conflicts with design system

- Namespace shadcn @theme inline variables (--color-cn-*) to avoid
  overriding project's --color-border, --color-accent, --radius-* tokens
- Remove @apply border-border, bg-background, text-foreground, font-sans
  that conflicted with our explicit CSS custom properties
- Remove dead Geist font import (we use system-ui)
- Remove ---break--- comment artifacts from shadcn CLI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:38:07 -07:00
Jon Saad-Falcon 0dac51c649 feat: cloud model support — OpenAI, Anthropic, Google, OpenRouter in dropdown
- MultiEngine: wraps multiple engines and routes by model name, so local
  Ollama models and cloud models appear together in the model selector.
- CloudEngine: added OpenRouter support (openrouter/ prefix) with popular
  models from OpenAI, Anthropic, Google, Meta, Mistral, DeepSeek, Qwen.
- Server auto-detects API keys at startup and enables cloud alongside
  local models when keys are present. No config changes needed.
- Streaming works for all cloud providers.

Set env vars to enable: OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY,
OPENROUTER_API_KEY. Models appear automatically in the Cmd+K dropdown.
2026-03-14 13:09:03 -07:00
Jon Saad-Falcon dc54555158 feat: emit log entries from chat streaming and model operations 2026-03-14 12:54:59 -07:00
Jon Saad-Falcon df91835165 feat: add Logs route and nav item 2026-03-14 12:52:35 -07:00
Jon Saad-Falcon ae4556bbd1 feat: create LogsPage component 2026-03-14 12:50:05 -07:00
Jon Saad-Falcon fb993fc6a1 feat: model switching shows loading spinner, disables input until ready 2026-03-14 12:48:41 -07:00
Jon Saad-Falcon bc7ef2dd51 feat: add theme toggle icon in sidebar header 2026-03-14 12:46:52 -07:00
Jon Saad-Falcon 60c0374f9f fix: update streaming labels to Connecting/Calling 2026-03-14 12:46:49 -07:00
Jon Saad-Falcon d37b75fbf6 feat: replace Energy section with Device (temps, power, energy), remove server-reported 2026-03-14 12:46:46 -07:00
Jon Saad-Falcon 20eca893b0 feat: add preloadModel API function for model warm-up 2026-03-14 12:45:21 -07:00
Jon Saad-Falcon 8622373af8 feat: add LogEntry type, log store, and modelLoading state 2026-03-14 12:45:17 -07:00
Jon Saad-Falcon 3d48d3fc01 feat: include cpu/gpu temp fields in telemetry energy endpoint 2026-03-14 12:45:00 -07:00
Jon Saad-Falcon 2a1acf74da feat: replace app icons with arc reactor logo 2026-03-14 12:44:04 -07:00
Jon Saad-Falcon 46fcd5bab4 docs: add desktop UX improvements spec and implementation plan 2026-03-14 12:37:19 -07:00
Jon Saad-Falcon e09d70dbc7 fix: auto-run uv sync before starting server (handles fresh clones) 2026-03-14 11:44:08 -07:00
Jon Saad-FalconandGitHub 4d20d64090 Remove citation note from README
Removed note from the citation in the README.
2026-03-14 11:17:00 -07:00
Jon Saad-FalconandGitHub 909548a179 Add citation section to README
Added citation section with BibTeX reference for OpenJarvis.
2026-03-14 11:16:32 -07:00
Jon Saad-Falcon 8f667796da fix: increase server health timeout to 10 minutes 2026-03-13 23:33:13 -07:00
Jon Saad-Falcon 26e99c78fb fix: increase server health timeout from 120s to 300s 2026-03-13 23:32:29 -07:00
Jon Saad-Falcon 0971916542 fix: better error messages and port cleanup for server boot
- 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
2026-03-13 23:31:37 -07:00
Jon Saad-Falcon 36b9d75a66 fix: clear data button broken in Tauri webview
Replace confirm() dialog (blocked by Tauri webview) with a
double-click confirmation pattern: first click turns the button
red with "Click again to confirm", second click clears data.
Resets after 3 seconds if not confirmed.
2026-03-13 22:58:03 -07:00
Jon Saad-Falcon d3155bd526 fix: only pull qwen3.5:2b at startup, download rest in background
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.
2026-03-13 22:38:56 -07:00
Jon Saad-Falcon f5c0d412fc fix: pull all fitting Qwen3.5 models before app opens, fix download button
- 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().
2026-03-13 22:24:21 -07:00
Jon Saad-FalconandGitHub 5fdd7d0e75 feat: model catalogue with download/delete and Qwen3.5 auto-pull (#54)
* 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.
2026-03-13 21:42:26 -07:00
Jon Saad-Falcon 549a81f679 Revert "feat: auto-pull all Qwen3.5 models that fit on user's hardware"
This reverts commit dfb66625a7.
2026-03-13 21:15:38 -07:00
Jon Saad-Falcon dfb66625a7 feat: auto-pull all Qwen3.5 models that fit on user's hardware
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).
2026-03-13 21:01:03 -07:00
Jon Saad-FalconandGitHub 3f257f58aa fix: security middleware blocks CORS preflight, breaking desktop chat (#53)
The SecurityHeadersMiddleware ran before CORSMiddleware (Starlette
executes middleware in LIFO order) and added headers to OPTIONS
preflight requests. The Content-Security-Policy: default-src 'self'
header told the browser to reject cross-origin connections, so fetch()
from the Tauri webview (https://tauri.localhost) to the API server
(http://127.0.0.1) was blocked — causing "Failed to get response" on
every chat message in the desktop app.

Two fixes:
- Skip security headers on OPTIONS requests so CORS preflight works
- Remove Content-Security-Policy from API responses — it is a
  document-level browser policy irrelevant to JSON API responses and
  breaks any cross-origin API consumer
2026-03-13 20:14:32 -07:00
Jon Saad-FalconandGitHub bca60b5706 fix: clean stale desktop release artifacts and fix frontend port mismatch (#52)
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.
2026-03-13 19:11:39 -07:00
Jon Saad-FalconandGitHub 6b0efc3b92 fix: desktop app fails to find project root when installed from DMG (#51)
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
2026-03-13 17:21:09 -07:00
Gabriel BoandGitHub d291c264f5 Merge pull request #50 from open-jarvis/add-discord-badge
chore: add discord badge
2026-03-13 15:24:36 -07:00
ANarayanandClaude Opus 4.6 e1959327f0 fix: use static discord badge
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:18:23 -07:00
Gabriel Bo f077adc11f feat: add required email field to leaderboard opt-in 2026-03-13 15:17:13 -07:00
ANarayanandClaude Opus 4.6 da509921d9 chore: add discord badge
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:15:09 -07:00
Gabriel Bo 90ea7c90b0 Revert "adding email requirement for opt in"
This reverts commit 898099e771.
2026-03-13 15:11:34 -07:00
Gabriel Bo 898099e771 adding email requirement for opt in 2026-03-13 14:23:41 -07:00
07ec747c8f fix: frontend now uses settings API URL for all backend requests (#49)
getBase() reads settings.apiUrl from localStorage so the API URL
configured in the Settings page is actually used by api.ts and sse.ts.
Previously hardcoded to localhost:8000, causing "Failed to get response"
when the backend ran on a different port.

Co-authored-by: robbym-dev <robbym-dev@users.noreply.github.com>
2026-03-13 13:51:56 -07:00
AbhayandGitHub 4b29ce5372 Improve onboarding CLI resilience and diagnostics (#45)
* Improve onboarding CLI resilience and diagnostics

* chore: update version to 1.0.0
2026-03-13 12:25:06 -07:00
8de28bdf1e fix: update project links from intelligence-per-watt.ai to OpenJarvis (#47)
Co-authored-by: robbym-dev <robbym-dev@users.noreply.github.com>
2026-03-13 12:16:32 -07:00
05f2c02131 feat: Algolia DocSearch + learning subsystem reorganization (#43)
* chore: create learning subdirectory structure (routing, agents, intelligence)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: extract classify_query to routing/_utils.py

Move the classify_query() function and its regex patterns into a shared
utility module so multiple routing policies can import it without
depending on the full trace_policy module.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: move routing files to learning/routing/ subdirectory

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: create LearnedRouterPolicy merging trace-driven + SFT routing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add conditional Algolia DocSearch integration

Add Algolia DocSearch as an optional search upgrade — native lunr.js
search remains the default until credentials are configured. Includes
CDN assets, Jinja2 conditional config injection, init script with
graceful fallback, light/dark theme CSS, improved search tokenization
for snake_case/dotted identifiers, and search boosts for key pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: move agent_evolver and skill_discovery to learning/agents/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: move learning/orchestrator to learning/intelligence/orchestrator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: delete removed learning policies, rewrite __init__.py, clean up api_routes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add SFT/GRPO/DSPy/GEPA config dataclasses, update LearningConfig

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add general-purpose SFT trainer (intelligence/sft_trainer.py)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: update stale imports in multi_model_router example

Update imports to use new learning/routing/ paths after the
subdirectory reorganization. Replace BanditRouterPolicy with
LearnedRouterPolicy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add general-purpose GRPO trainer (intelligence/grpo_trainer.py)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add DSPy agent optimizer (agents/dspy_optimizer.py)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add GEPA agent optimizer (agents/gepa_optimizer.py)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add learning-dspy and learning-gepa optional dependency extras

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: update integration test to check for learned policy instead of grpo

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: clean up stale APIs and unused params in examples

- deep_research: remove system_prompt and max_turns params not accepted
  by Jarvis.ask(), inline system prompt into the query instead
- doc_qa: remove unused --top-k CLI arg that was never passed to the API
- multi_model_router: fix select_model() call to match single-arg signature

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: import SFT/GRPO trainers in intelligence/__init__.py for registry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove .md file changes from PR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: restore search boost frontmatter for key docs pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 21:34:31 -07:00
Jon Saad-FalconandGitHub 2f553afb21 Merge pull request #46 from open-jarvis/fix/ollama-host-config-override
fix: respect config.toml ollama host instead of env var override
2026-03-12 16:26:34 -07:00
robbym-dev fb19b5345c fix: respect config.toml ollama host instead of env var override
OLLAMA_HOST env var was unconditionally overriding the host parameter
in OllamaEngine.__init__, even when explicitly set via config.toml.
Priority is now: config.toml > OLLAMA_HOST env var > hardcoded default.
2026-03-12 23:13:26 +00:00
Jon Saad-FalconandGitHub 8e4046f147 Merge pull request #41 from open-jarvis/fix/frontend-minor-bugs
fix: minor frontend bugs — leaderboard energy/FLOPs and literal \n
2026-03-12 13:42:19 -07:00
Jon Saad-FalconandClaude Opus 4.6 5317f5b7fc fix: leaderboard energy/FLOPs and GetStartedPage literal \n
Two minor frontend bugs:

- App.tsx: browser app hardcoded energy_wh_saved and flops_saved to 0
  when submitting to the leaderboard instead of computing them from
  per_provider data (desktop app was already correct)
- GetStartedPage.tsx: CodeBlock code props used JSX string attributes
  (code="...\n...") which render \n literally; switched to JS
  expressions (code={"...\n..."}) so newlines render correctly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:36:14 +00:00
Gabriel Bo 592c35dced tauri config: 2026-03-12 10:54:52 -07:00
Gabriel Bo a2b743d286 docs: update download links to v1.0.0 2026-03-12 10:54:38 -07:00
Gabriel Bo 8cc7a7d644 docs: update download links to v1.0.0 2026-03-12 10:46:42 -07:00