Commit Graph
587 Commits
Author SHA1 Message Date
Andrew ParkandGitHub 64d0f7ab02 feat(frontend): cleaner UI pass — consistent layout, tokens, skeleton loading (#258) 2026-04-17 12:33:29 -07:00
Andrew ParkandGitHub 30d4d45a7d refactor(system): decompose JarvisSystem god-object into system/ package (#257) 2026-04-17 11:02:56 -07:00
Andrew ParkandGitHub 88a7ebcaa3 test: add live marker, CI coverage gate, rust bridge boundary tests (#256) 2026-04-17 11:02:21 -07:00
Andrew ParkandGitHub 28e913f706 fix(agents): bind built-in tools, live tool-call UI, Markdown streaming (#255) 2026-04-17 11:01:50 -07:00
Andrew ParkandGitHub 48c23d87df perf: replace agents polling with WebSocket, fix workbox prod mode (#254) 2026-04-17 11:00:50 -07:00
github-actions[bot] 7108be9aec chore: update clone traffic data [skip ci] 2026-04-17 07:43:25 +00:00
github-actions[bot] e868445b74 chore: update clone traffic data [skip ci] 2026-04-16 07:43:10 +00:00
github-actions[bot] 00cd93e472 chore: update clone traffic data [skip ci] 2026-04-15 07:28:35 +00:00
f339c1c2d6 feat: memory UI, settings, and API fixes (#247)
* refactor: merge desktop/ into frontend/, eliminate duplicate Tauri scaffolding

The project had two overlapping directories: desktop/ (Tauri Rust backend +
stale React components) and frontend/ (real React app + dead Tauri stub).
This consolidates everything under frontend/:

- Move desktop/src-tauri/ → frontend/src-tauri/ (the real 1,720-line Rust
  backend with Ollama sidecar, backend lifecycle, cloud keys, overlay, etc.)
- Preserve 9 old desktop React components in frontend/src/components/Desktop/
  (excluded from TS build — APIs have drifted, kept for future integration)
- Delete the old frontend/src-tauri/ stub (246 lines, never compiled)
- Delete desktop/ entirely
- Fix tauri.conf.json frontendDist path (../../frontend/dist → ../dist)
- Update CI workflow, bump script, .gitignore, and docs paths
- Rename setup/ → Setup/ for consistent PascalCase component directories

* feat: add memory UI, settings, and fix memory API routes

- Add Memory tab to Data Sources page with stats, search, index path,
  and manual store functionality
- Add Memory section to Settings page with backend picker, context
  injection toggle, and parameter sliders (top_k, min_score, max_tokens)
- Add memory API functions to frontend (getMemoryStats, searchMemory,
  storeMemory, indexMemoryPath, getMemoryConfig)
- Fix backend /v1/memory/* routes to use app-level memory backend
  instead of creating fresh SQLiteMemory instances per request
- Add GET /v1/memory/config and POST /v1/memory/index endpoints
- Gracefully handle missing Rust backend (return defaults instead of 500)
- Fix nested scroll in Agents Interact tab (use viewport-relative height)

* fix: memory API routes, dialog plugin, and UI polish

- Fix memory API: use backend.retrieve() not .search(), .count() not
  .stats() to match actual SQLiteMemory interface
- Handle None backend gracefully in index endpoint (503 instead of crash)
- Expand ~ in index path (expanduser + resolve)
- Install @tauri-apps/plugin-dialog for native folder picker in Tauri
- Browse button only shows in Tauri (browser can't get absolute paths)
- Redesign Memory tab: proper cards, color-coded search scores, two-column
  layout for index/store, loading spinners, accent gradient on stats card

---------

Co-authored-by: Jon Saad-Falcon <41205309+jonsaadfalcon@users.noreply.github.com>
2026-04-14 09:53:14 -07:00
Andrew ParkandGitHub 54d79ef235 feat: add Apple Contacts connector (macOS AddressBook) (#248)
* feat: add Apple Contacts connector (macOS AddressBook)

Reads directly from ~/Library/Application Support/AddressBook/AddressBook-v22.abcddb
in read-only mode. Extracts names, phone numbers, emails, postal addresses, URLs,
social profiles, and notes for each contact. Requires Full Disk Access like
iMessage and Apple Notes connectors.

- New connector: src/openjarvis/connectors/apple_contacts.py
- Registered in connectors/__init__.py
- Added frontend catalog entry (PIM category) and icon mapping
- MCP tools: contacts_search, contacts_get_contact

* test: add comprehensive tests for Apple Contacts connector

15 tests covering: is_connected (exists/missing), sync yields all real
contacts (skips system rows), extracts all field types (phone, email,
address, URL, social, notes), cleans Apple label markup, org-only
contacts, minimal contacts, since filter, sync_status tracking,
structured metadata, disconnect, mcp_tools, registry, empty DB,
missing DB. Uses fake SQLite database — no real Contacts DB needed.

* fix: scan iCloud/Exchange source databases for all contacts

The main AddressBook database only contains locally-created contacts.
Synced contacts (iCloud, Exchange, etc.) live under
Sources/<UUID>/AddressBook-v22.abcddb. Now scans all source databases
and deduplicates by ZUNIQUEID across sources.

Adds tests for multi-source scanning and cross-source deduplication.
2026-04-14 09:49:08 -07:00
Andrew ParkandGitHub 55662fc426 refactor: merge desktop/ into frontend/, eliminate duplicate Tauri scaffolding (#246)
The project had two overlapping directories: desktop/ (Tauri Rust backend +
stale React components) and frontend/ (real React app + dead Tauri stub).
This consolidates everything under frontend/:

- Move desktop/src-tauri/ → frontend/src-tauri/ (the real 1,720-line Rust
  backend with Ollama sidecar, backend lifecycle, cloud keys, overlay, etc.)
- Preserve 9 old desktop React components in frontend/src/components/Desktop/
  (excluded from TS build — APIs have drifted, kept for future integration)
- Delete the old frontend/src-tauri/ stub (246 lines, never compiled)
- Delete desktop/ entirely
- Fix tauri.conf.json frontendDist path (../../frontend/dist → ../dist)
- Update CI workflow, bump script, .gitignore, and docs paths
- Rename setup/ → Setup/ for consistent PascalCase component directories
2026-04-14 09:48:12 -07:00
github-actions[bot] 4613b1ff2f chore: update clone traffic data [skip ci] 2026-04-14 07:28:38 +00:00
Andrew ParkandGitHub ed2acf1895 fix(skills): implement skill remove and search CLI commands (#240) 2026-04-13 15:03:39 -07:00
Avanika NarayanandGitHub a3789212ec refactor: remove dead shims, stale files, and test duplication (#243) 2026-04-13 15:03:03 -07:00
Tanvir BhathalandGitHub 171e78be5d remove inline (#244) 2026-04-13 14:45:46 -07:00
Tanvir BhathalandGitHub 9c15b25f90 [FEAT] New Interaction Interface UI (#237) 2026-04-13 14:23:15 -07:00
Avanika NarayanandGitHub f9fcb39601 Merge pull request #242 from open-jarvis/fix/deepresearch-naming
fix: rename DeepResearchBench references across codebase
2026-04-13 12:33:02 -07:00
Jon Saad-FalconandClaude Opus 4.6 db4b031c45 fix: rename DeepResearchBench references in docs, configs, and tests
Update all human-readable strings (docstrings, comments, descriptions,
log messages, TOML config descriptions) to correctly say
"DeepResearchBench" instead of "LiveResearchBench" for the
deep_research_bench benchmark. Class names and file paths are
unchanged for backward compatibility.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:59:24 +00:00
Avanika NarayanandGitHub d1e7a7bbe5 Merge pull request #241 from open-jarvis/feat/liveresearchbench-and-deepresearch-alias
feat: add Salesforce LiveResearchBench + deepresearch alias
2026-04-13 11:48:00 -07:00
Jon Saad-FalconandClaude Opus 4.6 9d5c3372a6 feat: add Salesforce LiveResearchBench + deepresearch alias
Add Salesforce LiveResearchBench (liveresearchbench) as a new benchmark:
- Dataset provider loading 80 expert-curated research tasks with 543
  checklist items from HuggingFace (Salesforce/LiveResearchBench)
- Checklist-based scorer evaluating coverage + quality dimensions
- Groups multiple checklist rows per question into single EvalRecords

Also add "deepresearch" as a CLI alias for the existing DeepResearchBench
benchmark (previously only available as "liveresearch").

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:41:41 +00:00
github-actions[bot] b5995eb483 chore: update clone traffic data [skip ci] 2026-04-13 08:00:20 +00:00
Jon Saad-FalconandGitHub 2d868163cc Update README.md (#239) 2026-04-12 08:21:47 -07:00
github-actions[bot] 5ab8ccca87 chore: update clone traffic data [skip ci] 2026-04-12 07:11:41 +00:00
Jon Saad-FalconandClaude Opus 4.6 85089dbb30 chore(ci): bump Node-20 GHA actions to Node-24 majors
Ahead of the 2026-06-02 forced-Node-24 deadline, upgrade the remaining
javascript actions flagged in the workflow annotations:

- actions/setup-python  v5 → v6
- actions/setup-node    v4 → v6 (skipping v5)
- actions/cache         v4 → v5
- actions/deploy-pages  v4 → v5
- actions/upload-pages-artifact v3 → v5.0.0

upload-pages-artifact has no rolling @v5 major tag — only the specific
v5.0.0 release — so it gets an explicit pin, same as astral-sh/setup-uv.

Not touched: swatinem/rust-cache@v2 (still on v2 majors, not flagged),
dtolnay/rust-toolchain@stable (composite), tauri-apps/tauri-action@v0
(composite), anthropics/claude-code-action@v1 (still latest major).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 14:41:16 -07:00
Jon Saad-FalconandClaude Opus 4.6 48673ac45a fix(ci): pin setup-uv to v8.0.0 (no rolling v8 major tag exists)
astral-sh/setup-uv does not publish a rolling @v8 major tag — only the
specific v8.0.0 release. Previous commit's @v8 reference failed to
resolve and broke CI/Docs/PyPI-publish runs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:27:27 -07:00
Jon Saad-FalconandClaude Opus 4.6 70cbda8a73 chore: derive __version__ from metadata, bump GHA action versions
- openjarvis.__version__ now comes from importlib.metadata.version("openjarvis")
  instead of a hardcoded string, so it stays in sync with pyproject.toml on every
  release. Tests assert against openjarvis.__version__ rather than a literal.
- Bump actions/checkout@v4 → @v6 and astral-sh/setup-uv@v4 → @v8 across every
  workflow ahead of the 2026-06-02 Node.js 20 deprecation on GitHub Actions runners.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:19:19 -07:00
Jon Saad-FalconandClaude Opus 4.6 0b516deea1 chore: rename PyPI distribution to OpenJarvis (0.1.1)
Now that the `openjarvis` name is available on PyPI, rename the
distribution from `OpenJarvisAI` to `OpenJarvis` so `pip install
openjarvis` matches the import name and the in-code install hints
(e.g. `pip install openjarvis[channel-gmail]`).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.1.1
2026-04-11 11:49:52 -07:00
github-actions[bot] c0201eb181 chore: update clone traffic data [skip ci] 2026-04-11 06:59:12 +00:00
89c5414af0 fix(doctor): respect preferred_engine/engine.default when reporting default model (#204)
* fix(cloud-router): prevent local HF org models from being misrouted to OpenRouter

get_provider() previously routed any "/" model to OpenRouter, which caused
locally-served models (e.g. mlx-community/Qwen3.5-27B-4bit-DWQ) to be sent
to the cloud instead of localhost:8080.

Adds _LOCAL_HF_ORGS module-level allowlist covering mlx-community/,
bartowski/, unsloth/, and lmstudio-community/. Returns None early for
these before the openrouter "/" check.

* fix(doctor): respect preferred_engine/engine.default when reporting default model

_check_default_model() iterated engines in sorted alphabetical order,
causing engines like 'lemonade' to be reported as the host for the
default model even when 'mlx' was configured as preferred_engine and
engine.default. Now checks the configured engine first, then falls back
to alphabetical scan.

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 15:30:30 -07:00
github-actions[bot] f0eacb7980 chore: update clone traffic data [skip ci] 2026-04-10 21:50:52 +00:00
Jon Saad-FalconandClaude Opus 4.6 6fcb6c5115 fix: use TRAFFIC_TOKEN for checkout to bypass branch protection
The clone tracking workflow needs to push directly to main, but branch
protection rules block GITHUB_TOKEN pushes. Using the PAT for checkout
allows the push to succeed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:49:08 -07:00
Tanvir BhathalandGitHub 0e122cd776 DGX Spark Fix (#231) 2026-04-10 11:40:03 -07:00
186e50fa4f split telegram messages based on 4k char limit (#211)
* feat: add eval configs for NeurIPS 2026 baseline sweep (#208)

* split telegram messages based on 4k char limit

---------

Co-authored-by: Avanika Narayan <gostanfordtennis@gmail.com>
2026-04-10 09:57:52 -07:00
5208c7f994 fix(connectors): prevent Apple Music connector from launching Music.app (#229)
AppleScript's `tell application "X"` is an implicit launch directive —
macOS starts the app if it is not running. Both scripts in apple_music.py
used this pattern unconditionally, causing Music.app to open on every
connector status poll (frontend load, SyncScheduler ticks) for all macOS
users regardless of whether they use the Apple Music connector.

Guard both scripts with `application "Music" is running` so that
is_connected() returns False gracefully when Music is closed, without
ever launching it unsolicited.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 09:57:21 -07:00
Ali ShahkarandGitHub 4beb762885 fix(cloud-router): prevent local HF org models from being misrouted to OpenRouter (#213)
get_provider() previously routed any "/" model to OpenRouter, which caused
locally-served models (e.g. mlx-community/Qwen3.5-27B-4bit-DWQ) to be sent
to the cloud instead of localhost:8080.

Adds _LOCAL_HF_ORGS module-level allowlist covering mlx-community/,
bartowski/, unsloth/, and lmstudio-community/. Returns None early for
these before the openrouter "/" check.
2026-04-10 09:57:10 -07:00
Jon Saad-FalconandClaude Opus 4.6 9ab097c8df chore: remove download/clone/star badges from README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:38:25 -07:00
Jon Saad-FalconandClaude Opus 4.6 65ff68d47d fix: move badges to README and fix clone tracking auth
- Move download/clone/star badges from docs/index.md to README.md
- Use TRAFFIC_TOKEN secret instead of GITHUB_TOKEN for Traffic API
  (requires admin-level access that GITHUB_TOKEN doesn't provide)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:37:30 -07:00
Jon Saad-FalconandClaude Opus 4.6 f1494a970c fix: use OpenJarvisAI as PyPI package name
openjarvis was already taken on PyPI, so the package is registered as
OpenJarvisAI. Update pyproject.toml and docs badges to match.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.1.0
2026-04-09 20:20:03 -07:00
Jon Saad-FalconandClaude Opus 4.6 84582ff64f feat: add download/clone tracking and PyPI publishing
- Add shields.io badges to docs front page (desktop downloads, PyPI
  installs, git clones, GitHub stars)
- Add daily GitHub Action to accumulate git clone traffic data
- Add PyPI publish workflow triggered on tags and releases
- Add PyPI metadata (license, authors, classifiers, URLs) to pyproject.toml

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:14:20 -07:00
Jon Saad-FalconandGitHub 3c34ad47ab feat: add skills system with import, learning loop, and benchmark harness (#230) 2026-04-09 14:43:04 -07:00
5388b9b75a feat(evals): per-config max_turns + Phase 2 config bumps (#215)
Per-config max_turns:
- Add `max_turns` field to ExecutionConfig and RunConfig dataclasses
- Parse `[run] max_turns` from eval TOML configs
- Plumb through `_build_backend` to JarvisAgentBackend, which sets
  `builder._config.agent.max_turns` before building the system
- Default `None` falls back to `JarvisConfig.agent.max_turns` (10) so
  existing configs are unaffected

Why: Trinity-Large is a "thinking" model that consumes agent-loop turns
producing intermediate reasoning, not just tool calls. With the default
max_turns=10 it hit the cap on 25/50 GAIA tasks (50%) and 39/50
LiveResearchBench tasks (78%) before producing a final answer. With
max_turns=50 (set per-config in this commit's gaia-trinity-large.toml
and liveresearch-trinity-large.toml updates), Trinity LR jumped from
12.0% to 72.0% — equal to Qwen-27B. Without this field the only
workaround was a runtime `OPENJARVIS_CONFIG` TOML hack.

Misc config bumps:
- `gaia-qwen-2b.toml`, `liveresearch-qwen-2b.toml`,
  `taubench-telecom-qwen2b.toml`: max_workers 1 -> 8 to use the
  parallel runner from #207
- `gaia-trinity-large.toml`, `liveresearch-trinity-large.toml`:
  add `max_turns = 50` (using the new field)

Co-authored-by: Jon Saad-Falcon <jonsaadfalcon@gpu-dp-vg94q-lccz2.t-f6a9b26f-56c0-4f98-88fc-705e5d9b1714.svc.cluster.local>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:38:23 -07:00
Avanika NarayanandJon Saad-Falcon 41ddab9099 add eval configs (#208) 2026-04-08 15:53:52 -07:00
Jon Saad-FalconandGitHub 30a29d64f5 feat(evals): parallel TauBench execution + Phase 2 local-model configs (#207) 2026-04-07 19:57:53 -07:00
Robby ManihaniandGitHub cff83a93a0 fix: recommend Qwen3.5 MoE models instead of Qwen3 dense (#189)
Qwen3.5 MoE models provide better quality per GB of memory since only
a fraction of parameters are active per token. Updates the tier table:

  ≤8 GB  → qwen3.5:2b
  8-16GB → qwen3.5:4b
 16-32GB → qwen3.5:9b
  32GB+  → qwen3.5:27b
2026-04-04 11:14:41 -07:00
Robby ManihaniandGitHub 35b8991cc2 feat: hardware-aware model recommendation in jarvis init (#188)
Closes #132 — jarvis init now recommends a Qwen3 dense model based on
available memory using an explicit tier table:

  ≤8 GB  → qwen3:1.7b  (~1.1 GB)
  8-16GB → qwen3:4b    (~2.5 GB)
 16-32GB → qwen3:8b    (~5.2 GB)
  32GB+  → qwen3:14b   (~9.3 GB)

Adds qwen3:0.6b, 1.7b, 4b, 14b, 30b to the model catalog. Falls back
to scanning all compatible models if the tiered pick doesn't support
the selected engine. Shows the user why the model was chosen and how
to download later if declined.
2026-04-03 22:19:27 -07:00
e0dccd1b8d Update Dockerfile.gpu.rocm with ROCm 7.2 (#117)
* Update Dockerfile.gpu.rocm with ROCm 7.2

* fix: update ROCm 6.2 references in knowledge_base.py to 7.2

Matches the Dockerfile.gpu.rocm base image bump.

---------

Co-authored-by: robbym-dev <manihani@stanford.edu>
2026-04-03 22:01:00 -07:00
Robby ManihaniandGitHub 82ed761784 fix: pass github_token to Claude workflows to bypass OIDC (#186)
Closes #182 — the claude-code-action attempts OIDC token exchange when
no github_token is provided, which fails without the Anthropic GitHub
App installed. Passing secrets.GITHUB_TOKEN skips the OIDC flow.
2026-04-03 22:00:34 -07:00
Robby ManihaniandGitHub 4b47c5d435 fix: wire TraceStore to event bus and pass to AgentExecutor (#187)
Closes #179 — traces were never persisted in the serve path because:
1. TraceStore.subscribe_to_bus() was never called in app.py
2. AgentExecutor was constructed without trace_store in serve.py and
   agent_manager_routes.py
3. The /v1/traces API returned raw dataclass fields instead of the
   frontend-expected format

Fixes all three: wires bus subscription, passes trace_store to all
executor instantiation sites, and adds _serialise_trace() for proper
API response formatting.
2026-04-03 22:00:14 -07:00
Robby ManihaniandGitHub bcab7f926d fix: remove invalid trim() from take-assign workflow (#185)
Closes #181 — trim() is not a valid GitHub Actions expression function,
causing the job to fail on every trigger. Use the raw comment body
instead.
2026-04-03 21:59:54 -07:00
Robby ManihaniandGitHub cef64450bd fix: inject default system prompt to ground locally-hosted models (#184)
Closes #164 — Qwen and other models with baked-in corporate identities
would claim to be cloud services when running locally. Adds a
configurable default_system_prompt to AgentConfig that is injected as a
fallback when no other system prompt is provided. The default tells the
model it is running locally through OpenJarvis. Users can override or
clear it via config.toml.
2026-04-03 21:59:33 -07:00