Commit Graph
42 Commits
Author SHA1 Message Date
Jon Saad-FalconandClaude Opus 4.6 cbabcd4a8f feat: rewrite agent wizard — 2-step flow with smart defaults
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 12:36:07 -07:00
Jon Saad-FalconandClaude Opus 4.6 c807666bd5 fix: cost format $0.0000, compact overview layout
- Remove cent sign from cost display, use $X.XXXX format
- Compact stat cards (horizontal icon+value layout)
- Tighter config grid spacing with bolder labels
- Reduce padding and gaps throughout overview tab

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:00:39 -07:00
Jon Saad-FalconandClaude Opus 4.6 c1e02a236a feat: show model in agent overview, split tokens, editable model
Overview tab:
- Show Intelligence (model name) with click-to-change dropdown
- Split "Total Tokens" into "Input Tokens" and "Output Tokens"
- Model can be switched for existing agents via dropdown

Backend:
- Add input_tokens/output_tokens columns to managed_agents
- Track prompt_tokens and completion_tokens separately in executor
- Disable Ollama thinking by default (think:false) to prevent
  empty responses from token exhaustion

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 18:32:25 -07:00
Jon Saad-FalconandClaude Opus 4.6 11d1643261 feat: live agent progress visibility in Interact tab
Add current_activity field to managed agents that the executor updates
at each phase of a tick (loading model, delivering messages, generating
response, retrying, finalizing). The frontend polls this every 2s and
displays the live status instead of static "Agent is thinking...".

Backend:
- Add current_activity column to managed_agents (migration)
- Add _set_activity helper to AgentExecutor
- Update activity at: start_tick, model load, message delivery,
  generation, retry, finalize
- Clear activity on end_tick

Frontend:
- InteractTab polls both messages and agent status in parallel
- Shows current_activity text with pulsing indicator
- Falls back to "Agent is thinking..." if activity is empty

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 17:54:08 -07:00
Jon Saad-FalconandClaude Opus 4.6 19fe061696 fix: use server's model for agent ticks, add executor logging, simplify send UI
Root cause: _run_tick and _immediate_tick called SystemBuilder().build()
which picks the first model from Ollama (qwen3.5:35b) instead of the
model the server was started with (e.g. qwen3.5:9b). A 0.6B query was
running on a 35B model, causing 5+ minute stalls.

Fix: reuse the server's engine/model from app.state via a lightweight
system facade instead of rebuilding the full JarvisSystem.

Also:
- Add detailed logging to AgentExecutor (model, pending messages,
  timing, content length, errors with tracebacks)
- Add logging to immediate tick lifecycle
- Remove Queue button from Interact tab (single Send button)
- Enter key now sends immediately instead of queueing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 16:03:51 -07:00
Jon Saad-FalconandClaude Opus 4.6 a212652dc0 fix: agent Interact tab UX — immediate messages, ordering, scroll
Backend:
- Immediate-mode messages now trigger a background tick so the agent
  actually processes and responds (previously they were just stored)

Frontend (Interact tab):
- Reverse message order so newest appear at bottom near the input box
- Filter out agent responses with empty content (blank bubbles)
- Add "Agent is thinking..." indicator with pulsing dot while processing
- Show timestamps instead of raw mode/status labels
- Poll for new messages every 3s so responses appear automatically
- Only auto-scroll to bottom on initial tab load, not on every poll
  update (prevents hijacking the user's scroll position)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 15:08:08 -07:00
Jon Saad-Falcon 3777086d3a fix: count full prompt tokens without KV-cache assumption
Ollama's prompt_eval_count may exclude KV-cached tokens (system
prompt, prior conversation turns), under-counting the prompt size
used for cost/FLOPs/energy calculations and leaderboard submissions.

Engine changes:
- Add estimate_prompt_tokens() helper in engine/_base.py that
  computes cache-agnostic token count from message content
- Ollama + OpenAI-compat engines now use max(reported, estimated)
  to ensure system prompt and full context are always counted

Savings/leaderboard changes:
- Add TOKEN_COUNTING_VERSION=2 to savings.py so frontends can
  tag Supabase submissions (old=v1, corrected=v2)
- Desktop + web frontends forward version in leaderboard submissions
- Add POST /v1/telemetry/reset endpoint to clear stale telemetry

Active users auto-correct via upsert on next session; no manual
Supabase migration required.
2026-03-24 16:55:26 -07:00
555e982f51 feat: query complexity analyzer for local/cloud routing (#102)
* feat: add query complexity analyzer with CLI and UI integration

Classify incoming queries by difficulty (trivial→very_complex) to
suggest appropriate token budgets for local vs. cloud routing.

- Add score_complexity() with weighted signals (length, code, math,
  reasoning, multi-step, creative) and token tier mapping
- Wire into `jarvis ask`: auto-suggest max_tokens when not set by user,
  show complexity in --profile output, log at DEBUG level
- Add complexity metadata to /v1/chat/completions API response
- Display complexity tier and score in frontend XRayFooter
- Extend RoutingContext with complexity_score, suggested_max_tokens,
  has_reasoning fields
- Update HeuristicRouter to route on complexity_score instead of
  raw query_length
- Remove duplicated regex patterns from router.py (use complexity
  module as single source of truth)
- Add 30 unit tests for complexity module
- Fix existing router tests for new complexity-based routing

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

* fix: pass temperature and max_tokens from UI settings to backend

The settings page stores temperature and max_tokens in the frontend
store, but these values were never included in the chat API request.
The backend Pydantic model defaults max_tokens to 1024 when the field
is absent, which is too low for thinking models like qwen3.5 — they
consume all tokens on reasoning and return empty content.

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

* fix: pass UI settings to backend and auto-bump max_tokens from complexity

- Pass temperature and max_tokens from frontend Settings store to the
  backend API (cherry-picked from fix/ui-max-tokens-passthrough)
- Server-side: bump max_tokens when the complexity analyzer suggests a
  higher budget (e.g. for thinking models on complex queries), never
  reduce below the client-requested value
- Fixes empty responses with thinking models (e.g. qwen3.5) that
  consumed all tokens on internal reasoning

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

* fix: raise token budget tiers to prevent empty responses on thinking models

Double all tier budgets (trivial: 512→1024, simple: 1024→2048, etc.)
so that thinking models like qwen3.5 have enough headroom for internal
chain-of-thought plus visible output, even on simple queries.

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

* fix: CI lint and test failures

- Break long lines in routes.py to satisfy 88-char limit (E501)
- Add intelligence.max_tokens and temperature to mocked config in
  test_ask_router.py so complexity analyzer can compare against int
  instead of MagicMock

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

* fix: line too long in test_complexity.py (E501)

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-24 15:27:23 -07:00
Jon Saad-FalconandGitHub 51a2b4cceb feat: operatives tab improvements — 9 UX/functionality fixes (#63) 2026-03-14 21:31:38 -07:00
Jon Saad-FalconandClaude Opus 4.6 9083e8c2a8 fix: wrap Info icon in span for title tooltip (TS2322)
lucide-react SVG components don't accept `title` prop directly.
Wrap in a <span> element instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 04:15:14 +00:00
Jon Saad-FalconandClaude Opus 4.6 bc2742d97b fix(agents): crash fix, UX polish for Agents tab
1. Fix "Run Now" crash: handle list-type tools config in
   SystemBuilder._resolve_tools (was calling .split on a list)
2. Recover button: add toast feedback on success/failure
3. Schedule help: add Info icon tooltip explaining Manual/Cron/Interval
4. Interval picker: replace raw text input with h/m/s numeric spinners
5. Budget: add helper text clarifying cloud-only spend
6. Learning technique: add memory extraction strategy dropdown
7. Error logs: show error messages in trace entries, catch Run Now errors
8. handleRun: catch initial API errors instead of silently swallowing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 03:54:06 +00:00
Jon Saad-FalconandClaude Opus 4.6 abd36af6b5 fix(ui): center input text, 2x3 energy grid, remove duplicate savings, unify token counts
- Center "Message OpenJarvis..." placeholder vertically in input area
- Restructure Energy Monitoring to 2x3 grid: promote thermal status and tokens processed to stat cards
- Add truncate to stat card values to prevent overflow
- Remove "Server-reported savings" section from Cost Comparison (redundant)
- Move asterisk disclaimer directly below divider
- Unify token counts: Energy Monitoring now uses savings store (same source as Cost Comparison)
- Round values to 1 decimal (except energy/token at 3 decimals and integer fields)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 00:59:39 +00:00
Jon Saad-FalconandClaude Opus 4.6 2cf67ac551 fix(ui): polish chat and dashboard aesthetics
- Change initial stream phase from "Connecting..." to "Generating..."
- Left-align "Loading model..." text in sidebar model badge
- Fix token count not updating by preferring client-side savings data
- Rename "Tokens" to "Output Tokens" in system panel
- Show input/output tokens in XRay footer with dash separators
- Fix EnergyDashboard to use shared API helpers (getBase) instead of raw env var

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 00:18:45 +00:00
Jon Saad-FalconandGitHub 4557fe2930 feat(security): wire guardrails into all entry points (#60) 2026-03-14 16:33:50 -07:00
Jon Saad-Falcon f458e19301 feat: instruction + model in agent wizard, error toasts, auto-run interval agents 2026-03-14 16:28:15 -07:00
Jon Saad-Falcon 78ffebd5a3 feat: desktop auto-update — download in background, toast to restart 2026-03-14 16:28:15 -07:00
Jon Saad-Falcon 3cf4bbae30 feat: display thinking tokens in X-Ray footer and stream usage data
- Ollama engine: capture eval_count and prompt_eval_count from the
  streaming final chunk (includes thinking/reasoning tokens).
- Routes: include usage data in the SSE finish chunk so the frontend
  gets accurate token counts even in streaming mode.
- X-Ray footer: show estimated thinking tokens when completion_tokens
  significantly exceeds visible output (e.g. "1695 generated · 11 prompt
  · ~1680 thinking").
2026-03-14 14:55:42 -07:00
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 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 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 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-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
Gabriel Bo f077adc11f feat: add required email field to leaderboard opt-in 2026-03-13 15:17:13 -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
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
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
Jon Saad-Falconandkrypticmouse 8798e2ee4f init commit 2026-03-12 17:29:39 +00:00