feat: OSINT Action Engine + Tests + Deploy#541
Open
skiniger wants to merge 749 commits into
Open
Conversation
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>
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>
- "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>
…gs (open-jarvis#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>
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>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…apture feat(evals): rich trace capture + TerminalBench V2 native harness
- 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>
…is#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>
…gistration 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>
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>
… 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>
- 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>
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>
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>
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>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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>
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>
`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>
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>
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>
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>
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>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add frontend test for Clear All history button - Mock clearHistory API and window.confirm Frontend Tests: 34/34 | Backend Tests: 41/41
- Backend: PATCH /v1/osint/schedule/{id} endpoint
- Backend: OsintStore.update_schedule() with partial updates
- Frontend: Inline edit form in SchedulePanel with target/modules/interval
- Frontend: Edit/Save/Cancel flow with Pencil icon buttons
- Tests: 5 backend tests for PATCH endpoint
- Tests: 3 frontend tests for edit flow
- All tests green: 277 backend, 24 frontend
- New AlertsPanel component with expandable diff details - Added 'Alerts' tab to OsintPage with Bell icon + badge - Shows changed/added/removed sections per alert - Tests: empty state, alert list, diff expansion, error handling - All tests green: 277 backend, 28 frontend
- Verify fetchOsintReport called with 'json' when download button clicked - All tests green: 277 backend, 30 frontend
- AlertsPanel: JSX.Element[] → React.ReactNode[] for React 18 strict - Frontend build green, 277 backend tests green, 30 frontend tests green
- Backend: ws_bridge forwards SCHEDULER_TASK_END to WebSocket clients - Frontend: new useOsintEvents hook with auto-reconnect - OsintPage: auto-refresh alert count when scheduler task completes - Build green, 277 backend tests green, 29 frontend tests green
- Test that ws_bridge publishes scheduler_task_end events to clients - 278 backend tests green (was 277), 29 frontend tests green
- Add osint_bridge.py for WebSocket SCHEDULER_TASK_END forwarding - Add tools/discovery.py for tool discovery - Update all OSINT panels (Alerts, Dashboard, History, Schedule, Watchdog) - Add comprehensive frontend + backend tests - Wire bridge into app.py and osint_router
- LandhausBavariaConnector: health checks for website, deskline, iCal, Vercel - landhaus_router: FastAPI endpoints /v1/landhaus/health + /availability - agent_delegate: make engine/model optional with guard for A2AChain usage Co-Authored-By: Claude <noreply@anthropic.com>
- LandhausBavariaTool now inherits BaseTool, registers in ToolRegistry - BavariaBookingAgent auto-injects landhaus_bavaria tool on init - Updated bavaria_booking.md with tool descriptions and actions - tools/__init__.py imports landhaus_bavaria for registry discovery Co-Authored-By: Claude <noreply@anthropic.com>
- LandhausStatusPanel React component with health cards for Website, Deskline, iCal, Vercel - Frontend tests: loading, success, error, not_configured, down states, refresh button - LandhausBavariaConnector unit tests with respx mocking (7 tests) - All tests green: 549 Python + 66 Frontend Co-Authored-By: Claude <noreply@anthropic.com>
# Conflicts: # frontend/.claude-flow/sessions/current.json # frontend/src/components/Desktop/lib/api.ts # frontend/src/components/Osint/DashboardPanel.tsx # frontend/src/components/Osint/HistoryPanel.tsx # frontend/src/components/Osint/SchedulePanel.tsx # frontend/src/components/Osint/__tests__/DashboardPanel.test.tsx # frontend/src/components/Osint/__tests__/HistoryPanel.test.tsx # frontend/src/components/Osint/__tests__/SchedulePanel.test.tsx # frontend/src/pages/OsintPage.tsx # frontend/tsconfig.tsbuildinfo # src/openjarvis/server/app.py # src/openjarvis/server/osint_router.py # src/openjarvis/server/osint_scheduler.py # src/openjarvis/server/osint_store.py # tests/server/test_osint_scheduler.py # tests/server/test_osint_store.py
…l cards - LandhausStatusPanel renders demo data (rooms, bookings, deploy) when credentials are missing so the panel never looks empty. - Backend health() returns structured demo payloads for deskline/iCal/vercel. - Fix asyncio.run() crash inside FastAPI by wrapping tool work in a single coroutine and offloading to ThreadPoolExecutor when a loop is already running. - ToolCallCard defaults to expanded when a result is present. - Update frontend + backend tests for demo assertions. Tests: 7/7 backend + 7/7 frontend pass. Build green.
- Add 5 interactive widgets with real-time polling: - AgentFleetWidget (agents, status, budget warnings) - OsintWatchdogWidget (alerts, severity colors) - LandhausBavariaWidget (health, rooms, demo badge) - EnergyOverviewWidget (power, tokens, mini-chart) - CompactTraceWidget (last 5 traces, expandable) - Click navigation to detail pages via React Router - Dynamic border colors based on subsystem health - Add fetchLandhausHealth() API helper - Add DashboardWidgets unit tests (5/5 passing) - Build green, 71/71 tests passing
Removes hardcoded 0.1.0 and injects version at build time. Build + 71 frontend tests + 57 relevant Python tests all green.
…text tests - _run_agent now detects coroutines from async agents (OrchestratorAgent) and wraps with asyncio.run(), keeping sync agents (SimpleAgent) untouched. - test_ask_context mocks get_rust_module so SQLiteMemory tests pass when the optional openjarvis_rust compiled extension is absent. 28/28 CLI tests green; 1605 passed total; 5 pre-existing JSON banner failures in ask_e2e/doctor unrelated to this change.
- dashboard.py: replace hardcoded Savings Dashboard HTML with FileResponse to React index.html - GlobalStatusStrip: fix service-down counting logic (was flagging 'up'/'demo' as down) Co-Authored-By: Claude <noreply@anthropic.com>
- Ignore .claude-flow/sessions/ and frontend/tsconfig.tsbuildinfo - Delete tracked .claude-flow session dumps and tsbuildinfo - Remove root snapshot YAMLs - Move CONFIGURATION.md to docs/
- Always set up memory backend in jarvis serve so /v1/memory/* works - Fall back to SimpleMemory in memory routes when SQLite/Rust ext fails - Add SimpleMemory in-memory implementation in storage/_stubs.py - Add 'status' field to connectors responses for frontend compatibility - Relax CSP for fonts, inline images and local Ollama connections
- Add SitDeckConnector and registered SitDeckTool
- Add FastAPI router /v1/sitdeck/health and /v1/sitdeck/{endpoint}
- Add SitDeckWidget to dashboard with live endpoint health
- Add frontend API client fetchSitDeckHealth
- Add Python and React component tests
…t lifecycle, error handling
- Refactor SitDeck connector to use shared httpx client with atexit cleanup - Add SSRF validation for base URLs (HTTPS + allowed hosts only) - Improve async error handling and avoid closing shared client per call - Add tests for SSRF validation and shared client lifecycle - Polish UI: better tertiary text contrast, focus-visible outline, CSS cleanup - Minor SitDeck detail page and sidebar routing tweaks
- Add system_monitor tool (CPU/RAM/disk/GPU metrics, clean_cache, analyze_disk) - Add /v1/monitoring router (metrics, analyze-disk, clean-cache) - Wire monitoring router and tool into app and tool imports - Add Host status badge to dashboard GlobalStatusStrip - Add psutil dependency and uv.lock update - Add tests for system_monitor
- Add SITDECK_DEMO env flag and automatic DNS/connection fallback - Synthetic data for all 7 endpoints returned in demo mode - Router passes demo flag to connector - Frontend shows demo status and renders synthetic data without errors - Keep existing tests green
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What's New
Verification
Files Added/Modified