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>
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
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.
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.
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.
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.
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>
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>
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>
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>
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>
`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>
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>
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>
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>
- 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>
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>
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>
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>
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>
- 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>
- 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>
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>
- "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>
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>
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>
* 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>