Reviewed and tested: zero new test failures vs main, Rust tests all pass (7/7 including 2 new). Added debug logging for memory injection errors and cleaned up .gitignore.
- Remove openjarvis-bugfix-spec-v2.md from .gitignore (not a general pattern)
- Replace bare `except: pass` with debug logging in routes.py memory injection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add _annotate_anthropic_cache helper that annotates system messages
with cache_control for Anthropic prompt caching.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add optional prompt_builder parameter to BaseAgent. When provided,
_build_messages() uses builder.build() output instead of raw system_prompt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The web UI chat endpoint and managed agent executor both skipped
memory context injection entirely:
- serve.py never created a memory backend
- app.py received config but never stored it on app.state
- executor.py never queried the FTS5 document store
Now all three entry points (CLI, server, agents) inject retrieved
context from the indexed knowledge base.
- Add porter stemming to FTS5 tokenizer (tokenize='porter unicode61')
so plurals like 'medications' match 'Medication'
- Strip punctuation from FTS5 queries so question marks don't break MATCH
- Expand tilde (~) in db_path before opening SQLite connection
- Remove 'id' from FTS5 columns (UUIDs shouldn't be full-text indexed)
- Add memory context injection to server chat_completions route
(routes.py had no memory integration - UI chat was never grounded)
- Fix agent name-to-ID resolution in agent_cmd.py (foreign key error)
- Align Python SQLiteMemory schema with Rust backend
Sort the check_ssrf import alphabetically to fix ruff I001. Mock the
SSRF check in URL-fetching tests since it requires the Rust backend
which isn't available in CI. Add a dedicated test verifying SSRF
rejection.
macos-latest now resolves to macOS 15 (Sequoia), which removed the
SetFile command from Xcode Command Line Tools. Tauri's bundle_dmg.sh
relies on SetFile to set custom icon attributes on the DMG volume,
causing the Desktop Build & Release workflow to fail on the macOS
runner.
Pin to macos-14 (Apple Silicon M1, Sonoma) which still includes
SetFile and supports universal binary builds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Engine discovery (#73): get_engine() now falls back to any healthy
engine when the explicitly-requested key fails, instead of returning
None. Fixes LM Studio (and other non-default engines) not being found
when deploying agents.
- FTS5 case sensitivity & scoring (#67): Add explicit unicode61 tokenizer
to the FTS5 virtual table for case-insensitive search. Replace ambiguous
`rank` column with explicit `bm25()` call with column weights (id=0,
content=1, source=0.5) to produce correct positive scores. Includes
auto-migration for existing databases.
- Interactive engine selection (#72): `jarvis init` now detects running
engines and presents an interactive picker. Also accepts `--engine`
flag to skip the prompt. Engine choice flows through to config
generation.
- Windows desktop support (#68): Add RAM detection via wmic, Windows
binary paths (LOCALAPPDATA, ProgramFiles, cargo), port cleanup via
netstat+taskkill, and USERPROFILE fallback for HOME env var.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
messages_to_dicts() serializes tool_call arguments as JSON strings,
but OpenAI-compatible servers (vLLM, SGLang, llama.cpp, etc.) expect
them as JSON objects. This caused 400 Bad Request errors on every
multi-turn tool-calling conversation, breaking GAIA, DeepPlanning,
and LifelongAgent benchmarks for all local models.
The fix adds _fix_tool_call_arguments() to _OpenAICompatibleEngine
which json.loads() any string-typed arguments back to dicts before
sending. Applied to both generate() and stream() methods. This is
the same fix as commit 45c0e44 (Ollama), now applied to all
OpenAI-compatible engines.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
Previously, running `uv run jarvis start` would fail to start the process with error:
"No module named openjarvis.cli.__main__; 'openjarvis.cli' is a package and cannot be
directly executed" because the CLI package lacked an entry point.
Signed-off-by: Patrick Fung <patrick_fung@foxmail.com>
- 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>
- 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>
- Rewrite Five Primitives with plain-English descriptions
- Add 10+ engine backends with hyperlinks (Ollama, vLLM, SGLang, etc.)
- Add Automated Workflows and Energy & Cost Tracking feature cards
- Add Research section linking to Intelligence Per Watt and Stanford
- Add Citation section with BibTeX
- Fix hero-tagline max-width to span full title width
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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").
* feat: add interactive agent confirmation mode and fix tool loading
- Add `interactive` and `confirm_callback` params to ToolUsingAgent and
NativeReActAgent so CLI sessions can prompt user before tool execution
- Fix tool resolution in `ask` and `chat` commands to fall back to
config.tools.enabled when no --tools flag is provided
- Register shell_exec tool in tools/__init__.py auto-discovery
- Add dspy and gepa as optional learning extras (learning-dspy, learning-gepa)
- Fix openjarvis-rust lock version (1.0.0 → 0.1.0)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(cli): support configured tool defaults and confirmations
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>