Commit Graph
549 Commits
Author SHA1 Message Date
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
Jon Saad-FalconandClaude Opus 4.6 c5c420c1c7 fix: use UTC timestamps in digest tests for CI compatibility
Tests were storing digests with local time but get_today() filters
by UTC date, causing failures when local date != UTC date.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:57:51 -07:00
Jon Saad-FalconandClaude Opus 4.6 fb3b87044c fix: format init_cmd.py
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:46:23 -07:00
Jon Saad-FalconandGitHub d570968dc1 Merge pull request #183 from open-jarvis/feat/morning-digest-v2
feat: Morning Digest v2 — prompt tuning, new connectors, starter configs
2026-04-03 17:39:54 -07:00
Jon Saad-FalconandClaude Opus 4.6 ff9326803a merge: resolve conflict in connect_cmd, keep safe credential unpacking
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:34:17 -07:00
Jon Saad-FalconandClaude Opus 4.6 365a58f57a fix: handle missing OAuth credentials gracefully in jarvis connect
get_client_credentials() returns None when no credentials are stored.
The tuple unpacking crashed with "cannot unpack non-iterable NoneType".
Now safely extracts values with a fallback, then prompts the user.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:29:16 -07:00
Jon Saad-FalconandClaude Opus 4.6 638d8780a0 docs: add user guides for Deep Research, Code Assistant, Monitor, Chat
Four new docs matching the morning-digest.md pattern:
- deep-research.md — multi-hop research with document indexing
- code-assistant.md — orchestrator with code execution + file I/O
- scheduled-monitor.md — persistent operative on cron schedule
- chat-simple.md — lightweight chat, simplest setup

Updated quickstart with tabs for all agent types and expanded
starter configs table from 3 to 7 presets. Updated MkDocs nav
and index page to link all 5 user guides.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:10:10 -07:00
Jon Saad-FalconandClaude Opus 4.6 e466b54881 feat: add 4 starter configs + jarvis init --preset command
New example configs:
- deep-research.toml — multi-hop research with citations
- code-assistant.toml — orchestrator with code execution + file I/O
- scheduled-monitor.toml — persistent operative on cron schedule
- chat-simple.toml — lightweight chat, no tools

CLI:
- `jarvis init --preset <name>` installs any starter config in one command
- Presets: morning-digest-mac, morning-digest-linux, morning-digest-minimal,
  deep-research, code-assistant, scheduled-monitor, chat-simple

All configs tested live on M2 Max with Ollama + Qwen3.5 9B.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:34:53 -07:00
Jon Saad-FalconandClaude Opus 4.6 6ee2665fc7 docs: add Starter Configs + Built-in Agents to README and quickstart
README now shows a table of example configs with copy commands, plus
a full list of built-in agents (morning_digest, deep_research,
monitor_operative, orchestrator, etc.) with descriptions.

Quickstart page adds a "Morning Digest" tab and Starter Configs
table with links to example config files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:24:12 -07:00
Jon Saad-FalconandClaude Opus 4.6 dd29e4945b feat: add --digest flag to jarvis init for one-step setup
`jarvis init --digest` appends the Morning Digest config section
to the generated config.toml, including sensible defaults for
sections, sources, voice, and schedule.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:20:00 -07:00
Jon Saad-FalconandClaude Opus 4.6 45150c48f4 docs: add Morning Digest to MkDocs nav and index page
Link morning-digest.md in the User Guide nav section. Also add
all existing user-guide pages that were missing from the nav.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:17:58 -07:00
Jon Saad-FalconandClaude Opus 4.6 f45f7b426c docs: add Morning Digest quickstart guide + example configs
- docs/user-guide/morning-digest.md — full setup guide with CLI
  commands, config reference, TTS voices, API endpoints, troubleshooting
- configs/openjarvis/examples/morning-digest-mac.toml — Apple Silicon
- configs/openjarvis/examples/morning-digest-linux.toml — Linux/GPU
- configs/openjarvis/examples/morning-digest-minimal.toml — just Gmail

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:16:09 -07:00
Jon Saad-FalconandGitHub a009646071 feat: Morning Digest with Voice Mode + unified OAuth + Apple connectors (#174) 2026-04-03 11:05:41 -07:00
Jon Saad-FalconandClaude Opus 4.6 26f6142107 fix: format merged evals files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:57:01 -07:00
Jon Saad-FalconandClaude Opus 4.6 28afef0778 merge: resolve conflict in toolcall15 scorer, keep main's JSON parser
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:56:51 -07:00
Jon Saad-FalconandClaude Opus 4.6 cbd6cab1d6 fix: remove :memory: artifact, add to .gitignore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:54:26 -07:00
Jon Saad-FalconandClaude Opus 4.6 842086aa54 fix: resolve all ruff lint and format errors for CI
Auto-fixed 21 lint errors (unused imports, unsorted imports) and
reformatted 43 files to pass ruff check + ruff format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:53:57 -07:00
Jon Saad-FalconandClaude Opus 4.6 0977d3bed5 chore: remove Claude planning/spec files from tracking
These were force-added previously but are already in .gitignore.
Files remain on disk but are no longer tracked in git.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:51:35 -07:00
Jon Saad-FalconandClaude Opus 4.6 94a81a22fc fix: update Gmail test assertions for category:primary filter
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:13:02 -07:00
Jon Saad-FalconandClaude Opus 4.6 232a99079f feat: add quality_score and evaluator_feedback fields to DigestStore
Extends DigestArtifact and SQLite schema with quality_score (float)
and evaluator_feedback (str) for future quality tracking. Includes
ALTER TABLE migration for existing databases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:51:40 -07:00
Jon Saad-FalconandClaude Opus 4.6 c970a399c3 feat: tuned digest prompt through 7 iterations for quality
- Priority-first structure with decreasing importance
- Email triage: real people only, skip automated/marketing
- Message triage: key people + replies needed, acknowledge casual
- Health interpreted as trends, not raw numbers
- Strict 200-word limit, honorific 2-3 times only
- Skip disconnected sources silently
- Tested 7 iterations, each improving on the last

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:03:49 -07:00
Jon Saad-FalconandClaude Opus 4.6 dafd6e1f5f fix: acknowledge all connected sources in digest, raise word limit to 300
Prompt now instructs LLM to briefly mention every data source that
returned results (even if nothing urgent) so the user knows it checked.
Disconnected sources are silently skipped.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:37:29 -07:00
Jon Saad-FalconandClaude Opus 4.6 37c224e4b7 feat: priority-first digest prompt, 4 new connectors, honorific config
Prompt rewrite:
- Priority-first briefing structure (deadlines > schedule > messages)
- Interpret health trends, don't list raw numbers
- Connect related items across sections
- Configurable honorific (sir/ma'am/boss) from config.toml
- 250 word limit, no markdown, spoken-aloud format

New connectors:
- Weather (OpenWeatherMap API) — current conditions + 12h forecast
- GitHub Notifications — PR reviews, mentions, assignments
- Hacker News — top 5 stories with scores
- News/RSS — configurable feeds (Arxiv, NYT, WSJ, etc.)

Other:
- Gmail filters to category:primary (no promotions)
- Email body previews in digest data
- iMessage text content included
- WORLD section replaces MUSIC as default
- voice_speed plumbed through full pipeline
- 22 new tests for connectors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:14:21 -07:00
Jon Saad-FalconandClaude Opus 4.6 4de2ffd720 fix: restructure digest data, fix calendar since filter, fix Gmail registration
Data collection:
- Restructure digest_collect output into priority-ordered sections
  (HEALTH > MESSAGES > CALENDAR > MUSIC) with human-readable formatting
- Extract key metrics from Oura (HR, HRV, sleep duration, scores)
- Format Gmail as sender + subject + time ago
- Group music tracks into single lines per source
- Cap 15 items per source, truncate content to 500 chars

Calendar:
- Pass `since` parameter to Google Calendar API as `timeMin`
- Default to 24h lookback instead of dumping all-time events

Gmail:
- Re-enable gmail connector registration in __init__.py

Prompt:
- Add section summary + closing encouragement to Jarvis persona
- Reinforce no-markdown, no-hallucination rules in user message
- Strip markdown artifacts before sending to TTS

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:33:39 -07:00
867a96fd6e fix: add check_same_thread=False to all SQLite connections (#176)
Four SQLite connections were missing check_same_thread=False,
causing thread errors during eval runs with ThreadPoolExecutor.

Fixed: OptimizationStore, AuditLogger, TelemetryAggregator,
KnowledgeGraphMemory. All use WAL mode, making this safe.

Co-authored-by: Jon Saad-Falcon <jonsaadfalcon@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:02:18 -07:00
Jon Saad-FalconandClaude Opus 4.6 bff925a679 fix: wire DigestConfig through SDK and system for end-to-end digest
- Inject DigestConfig (persona, sections, TTS backend, voice_id) into
  MorningDigestAgent from both JarvisSystem._run_agent and Jarvis SDK
- Always inject digest_collect + text_to_speech tools for digest agent
- Fix TTS tool: import speech backends before checking TTSRegistry
- Fix Cartesia: default to British Butler voice when voice_id is empty
- Fix DigestStore: allow cross-thread SQLite access for FastAPI
- Propagate agent metadata (audio_path) through system return dict
- Add music section to default source map in MorningDigestAgent

Tested end-to-end: Qwen3.5 9B (Ollama) + Cartesia TTS + real data
from Oura, Gmail, Calendar, Tasks, Spotify, Apple Music.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:25:55 -07:00
Jon Saad-FalconandGitHub b1266df3a4 Merge pull request #175 from open-jarvis/feat/rich-trace-capture
feat(evals): rich trace capture + TerminalBench V2 native harness
2026-04-02 13:44:19 -07:00
Jon Saad-FalconandClaude Opus 4.6 9fd8a4e79d fix: remove unused imports (LiteLLM, time) to pass ruff lint
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:36:07 +00:00
Jon Saad-FalconandClaude Opus 4.6 58432b5e0d feat: wire TerminalBench V2 native harness into eval CLI
- Add _run_terminalbench_native() to CLI for direct Harness invocation
- Use terminus-2 agent (serializable model_name + api_base kwargs)
- Lowercase Docker compose project names to satisfy validation
- Add terminalbench-native to valid backends in config
- Add eval config for Qwen3.5-122B-A10B-FP8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:25:42 +00:00
Jon Saad-FalconandClaude Opus 4.6 58c0837c46 feat: wire TraceCollector into system._run_agent and JarvisAgentBackend
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:25:08 +00:00
897a816343 fix(evals): TerminalBench scoring + http_request panic + 20 new configs (#173)
Fixes:
- TerminalBench: remove task_id fallback from ground truth answers.
  Was using task name as reference answer, causing judge to always
  score wrong.
- http_request: catch BaseException (not Exception) for Rust panics.
  PyO3 PanicException on binary data now falls through to httpx.

New configs (5 models × 4 benchmarks = 20 files):
- Qwen-27B, Qwen-2B, Gemma4-26B-A4B, Gemma4-E4B, Nemotron-Nano
- ToolCall-15, PinchBench, LiveCodeBench, TauBench

Updated experiment plan with Gemma 4 models and progress matrix.

Co-authored-by: Jon Saad-Falcon <jonsaadfalcon@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:13:06 -07:00
Jon Saad-FalconandClaude Opus 4.6 fd354e229c feat: greeting trigger, audio player, and digest scheduler
- "Good morning" intent detection routes to MorningDigestAgent via
  pattern matching in JarvisSystem.ask() (zero latency, no API cost)
- Inline AudioPlayer component renders play/pause + progress bar in
  chat when digest audio is available
- `jarvis digest --schedule "0 6 * * *"` wires into TaskScheduler for
  daily auto-generation; persists to config.toml
- Server /api/digest/schedule GET+POST endpoints for frontend/desktop
- Chat completion responses include audio metadata when digest produces
  audio, frontend auto-detects via /api/digest endpoint

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:50:34 -07:00
Jon Saad-FalconandClaude Opus 4.6 a5a9171e83 feat: update DigestConfig with typed annotations and apple_health source
Add List[str] type annotations to DigestSectionConfig and DigestConfig
fields. Add apple_health to default health section sources.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:27:34 -07:00
Jon Saad-FalconandClaude Opus 4.6 d73014d6bb feat: Morning Digest pipeline + unified OAuth + Apple connectors
Full morning digest system:
- MorningDigestAgent, DigestStore, digest_collect tool, TTS backends
- Connectors: Oura, Strava, Spotify, Google Tasks, Apple Health, Apple Music
- CLI `jarvis digest` command + FastAPI /api/digest endpoints
- Cartesia, Kokoro, OpenAI TTS backends with persona prompts

Unified OAuth setup across all surfaces:
- Generic OAuthProvider registry for Google, Strava, Spotify
- CLI auto-opens browser + catches callback (no more paste-code)
- Server /oauth/start + /oauth/callback endpoints for desktop/browser
- Frontend OAuthPanel with popup + polling

Apple connectors:
- Apple Health reads from HealthKit DB or iPhone export XML
- Apple Music queries Music.app via AppleScript

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:05:35 -07:00
908e28d42e fix(evals): ToolCall-15 JSON parsing + traces thread safety (#172)
* fix(evals): ToolCall-15 JSON parsing + traces(True) → traces(telemetry)

Two fixes from sanity check:

1. ToolCall-15: Embed system prompt + tool descriptions + JSON format
   instructions into the problem text so jarvis-direct backend works.
   Fix scorer's JSON extraction to handle nested braces (balanced
   brace parser instead of regex). Models now correctly output tool
   calls and get scored. Claude/GPT/Gemini all score 40% (6/15).

2. JarvisAgentBackend: Change traces(True) back to traces(telemetry).
   The hardcoded True created SQLite trace connections that crash in
   ThreadPoolExecutor worker threads for GAIA and LiveResearchBench
   with jarvis-agent backend.

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

* fix: remove unused tool_names variable

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

---------

Co-authored-by: Jon Saad-Falcon <jonsaadfalcon@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:17:33 -07:00
Jon Saad-FalconandGitHub fded003f4f Delete MagicMock/load_config().security.audit_log_path directory 2026-04-02 09:14:37 -07:00
Jon Saad-FalconandGitHub 393acc9e1d Delete :memory: 2026-04-02 09:14:21 -07:00
Jon Saad-FalconandGitHub 172f6e52d9 Merge pull request #170 from mrTSB/fix-desktop
Fix Desktop App Cloud Models
2026-04-02 09:14:04 -07:00
Robby ManihaniandGitHub 4a8cc41034 Merge pull request #156 from eddierichter-amd/lemonade-backend
Adding Lemonade Backend
2026-04-02 01:53:10 -07:00