Skip to content

feat: OSINT Action Engine + Tests + Deploy#541

Open
skiniger wants to merge 749 commits into
open-jarvis:mainfrom
skiniger:main
Open

feat: OSINT Action Engine + Tests + Deploy#541
skiniger wants to merge 749 commits into
open-jarvis:mainfrom
skiniger:main

Conversation

@skiniger

Copy link
Copy Markdown

What's New

  • OSINT Action Engine ( tool) — execute arsenal tools via shell or get URLs for web tools
  • New API endpoints: , , (JSON/CSV)
  • Chat integration — auto-execution when agent query contains run keywords
  • Frontend actions — Open / Copy Install / Run buttons on every tool card + inline ToolRunner panel
  • FBI Watchdog export — download scan results as JSON or CSV directly from the panel
  • Persistent ChatToolbar — model dropdown + agent dropdown + Deep Research / Plan Mode toggles
  • Tests: 9/9 backend pytest + 5/5 frontend vitest green
  • Merged Astrosp Awesome-OSINT-For-Everything into arsenal (1,763 tools, 118 categories)
  • Bug fixes: category-only search returning no results, WatchdogPanel React crash on nested ASN object

Verification

  • ✅ (9 passed)
  • ✅ (5 passed)

Files Added/Modified

  • (new)
  • (extended)
  • (new + updated)
  • (new)
  • (new)
  • Plus previous OSINT infrastructure (arsenal index, FBI Watchdog, router, pages)

jonsaadfalcon and others added 30 commits April 2, 2026 11:05
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>
skiniger and others added 29 commits June 14, 2026 10:59
- 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
- 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.