| Navigation: README | Contributing | Security | Docs |
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Company Intelligence overhaul, settings UX improvements, and two security dependency fixes.
| Feature | Description |
|---|---|
FINANCIAL_NEWS_DOMAINS |
Curated set of financial & market news domains for richer company coverage |
| Export Report | Company OSINT results exportable as structured report via /osint/company |
| Business Search Query | Additional search strategy in company intel for broader entity discovery |
| Ollama Model Listing | LLM settings now lists locally available Ollama models for quick selection |
_extract_leadership() — Improved executive and leadership extraction from company pages/osint/companyTwo dependency pins addressing active vulnerability alerts.
CompanyIntelligence for company-focused discovery (profile, leadership, structure, risk signals) with source aggregation.POST /osint/company with optional country, region, and language hints./osint/company (aligned with OSINT limits).site:<domain>) and domain-match promotion so primary websites appear in top source references.gpt-oss context-window registry entry and model-aware token capping to prevent overly aggressive prompt truncation.country, region, language).data/.cli_history to prevent accidental commits of local CLI history.prompt_budget=0 scenarios caused by unsafe response token reservation versus model window._query_direct handling for empty-string LLM responses to avoid retry/error loops.prompt_toolkit/readline.sha256 verification for plugin loading.cached_at metadata.core/memory_store.py (1,094 lines) into core/memory/ package with 9 modules (constants, persistence, quotas, sanitization, operations, breach, export, store). Follows existing core/health/ and core/osint/ patterns. Backward-compatible shim keeps all existing imports working.AsyncFetcher now defaults to SafeFetcher to inherit SSRF protection, blacklist/robots checks, rate limiting, and size limits. Redirects are disabled by default.core/agent.py into core/agent/ package with constants.py, session.py, tools_flow.py, and osint_flow.py while preserving SearchAgent API.export_memory_snapshot crash: Called non-existent self.get_stats() — fixed to self.get_summary()memory_store.get_all() missing: Added get_all() method returning full data dict (used by API endpoints)memory.remember_note() missing: Fixed call in core/agent.py to use existing add_note(), added metadata parametercore.agent now re-exports OllamaClient for test and integration compatibilityrobots.txtSafeFetcher and AsyncFetcherRemove heavy embedding dependency: Removed sentence-transformers from core requirements.txt to avoid pulling PyTorch and ~12 NVIDIA/CUDA packages — saves approximately 3–4 GB of downloads and disk space. ChromaDB supplies an ONNX-based embedding model (~17 MB via onnxruntime) which is sufficient for RAG workflows (see tools/rag.py). Leftover sentence-transformers entries were also removed from requirements_temp.txt where present.
Move langchain & langgraph to CORE: langchain, langchain-core, langchain-community, and langgraph were moved into the CORE section of requirements.txt because these packages are required by tools/tool_registry.py and core/langgraph_agent.py at startup regardless of LLM provider. This prevents crashes when only the OpenAI provider is selected and makes the setup process consistent across providers. If you’ve already run ./setup.sh, re-run it to install the moved packages; otherwise the next setup will include them. This change should make the setup experience faster and more robust for all users.
protobuf>=6.33.5 to the security overrides section. This pins the transitive dependency (pulled in by chromadb) to the patched version that fixes the ParseDict() recursion depth bypass (CVE-2026-0994, Dependabot alert #37).linkedin-api as a truly optional package that enriches LinkedIn OSINT lookups without breaking core dependencies (ddgs, etc.)linkedin-api is installed and credentials are configuredcore/osint/linkedin_api_intel.py with try/except import pattern (follows existing ChromaDB pattern in tools/rag.py)setup.sh and setup.bat now offer interactive prompt for optional LinkedIn API installationOSINT_LINKEDIN_API commented section in requirements.txt with linkedin-api==2.3.1 and lxml==5.3.0SOCIAL_INTELLIGENCE.md with LinkedIn API setup, security warnings, and ToS implicationstests/osint/test_linkedin_optional.py covering availability checks, graceful degradation, mocked API integration, and social_intel.py integrationforce_complexity (“low”/”mid”/”high”)** Cloud LLM Provider Support:**
get_llm_client() factory function for unified client creation** Complete English Localization:**
Available Clear Commands:
Users now have these options:
clear - Reset session (history + cache, optionally memory if configured)clear-cache - Clear cache onlyclear-memory - Clear memory store onlyclear-all - Clear everything (session + cache + memory) NEWThe clear-all command is useful for completely resetting the application state, regardless of the auto_clear_on_clear configuration setting.
Forced UTF-8 encoding for stdout and stderr on Windows to prevent encoding errors.
AdaptiveQueryProcessor for consistent agent selection and escalation.Legacy direct agent.query() calls removed from CLI; retained only for internal use by adaptive system.
MultiHopReasoningAgent where ToolRegistry._web_search_wrapper() was called with an invalid max_results parameter.Memory Store Logging: Reduced excessive logging by changing memory load/save log level from INFO to DEBUG. Improved log clarity and reduced console spam.
UI Settings for Adaptive Intelligence Report:
ui category in the settings editor allows users to enable/disable the report via the config file (config.json).ui category, and saving changes.Testing & Validation: Verified correct agent selection and complexity detection for both simple and complex queries. Confirmed robust output and no encoding errors across platforms.
tests/unit/test_adaptive_hops.py (600+ lines) 30 unit test cases Tests for complexity analysis Resource constraint handling Strategy decisions Escalation logic Edge cases tests/integration/test_adaptive_integration.py (500+ lines) Integration test suite End-to-end scenarios Mock agent testing Escalation flow validation
Zero dependencies added (uses existing infrastructure) Fully backward compatible (opt-in via new endpoint) Integrates with existing SystemMonitor and PerformanceTracker Supports both SearchAgent and MultiHopReasoningAgent Comprehensive logging at all decision points Thread-safe and production-ready
LOW complexity: ~0.5-1s (no tools) MID complexity: ~2-3s (web search) HIGH complexity: ~10-15s (multi-hop reasoning) Escalation overhead: +0.2s per attempt
AdaptiveConfig(
enable_resource_monitoring=True,
enable_confidence_escalation=True,
cpu_threshold_high=80.0,
memory_threshold_high=85.0,
confidence_low=0.5,
max_hops_low=0,
max_hops_mid=1,
max_hops_high=5,
fallback_on_resource_constraint=True,
degraded_mode_max_hops=2
)
AdaptiveConfig(
enable_resource_monitoring=True,
enable_confidence_escalation=True,
cpu_threshold_high=80.0,
memory_threshold_high=85.0,
confidence_low=0.5,
max_hops_low=0,
max_hops_mid=1,
max_hops_high=5,
fallback_on_resource_constraint=True,
degraded_mode_max_hops=2
)
tests/security/ directoryREDIS_URL environment variable (default: redis://localhost:6379/0)utils/redis_rate_limiter.pyALLOWED_HOSTS - Trusted host middlewareALLOWED_ORIGINS - CORS configurationCRAWLLAMA_DEV_MODE - Development mode bypass.env.example for Redis configurationtests/security/ directory with comprehensive examplesutils/redis_rate_limiter.py with detailed docstringsapp.py middleware implementation examples| Supports TXT/CSV combo lists (email:password, email | password) |
data/memory.jsonupdate_email_breach_info() - Store/update breach dataget_email_with_breach_info() - Retrieve email with breach summaryformat_email_breach_report() - Formatted report generatorVULNERABILITY_INTEL.md - Setup guide for all options (free & paid)MEMORY_BREACH_STORAGE.md - API documentation, examples, best practicestest_vuln_intel.py - Test script for vulnerability intelligencetest_memory_breach.py - Test script for memory breach storagecore/memory_store.py) - NEW in v1.4.2!clear command - data persists across sessionsremember email:test@example.com - Store email addressremember phone:+491234567890 - Store phone numberremember ip:192.168.1.1 - Store IP addressremember username:johndoe - Store usernameremember domain:example.com - Store domainremember note:"Important finding" - Add noterecall - Show all stored datarecall emails - Show only emailsrecall search:keyword - Search all categoriesforget email:test@example.com - Remove specific entry (NEW!)forget category:emails - Clear entire category (NEW!)forget all:true - Clear all memory (NEW!)forget operator)forget email:test@example.comforget category:emails, forget category:phonesforget all:trueconfig.json: memory.enabled, memory.auto_clear_on_clearmemory.max_entries - Warning thresholdmemory.max_file_size_mb - Size limitsettings memory - Configure memory behaviortools/osint_tool.py)_handle_remember(), _handle_recall(), _handle_forget()forget email:test@test.com no longer misinterpreted as email lookup\S+ to match emails, IPs with special characters- to avoid matching phone extensionsr'-(\w+)' to r'\s-(\w+)(?=\s|$)'memory._load() call in SystemMonitor for live updatescore/osint/query_parser.py: Reorganized operator parsing sequencecore/agent.py: Added _process_forget_command(), _auto_store_intel(), _get_memory_store_context() methodsmain.py: Added Memory Store help section with examples and settings UIcore/health/system_monitor.py: Force memory reload for live updatescore/health/test_collector.py: Support for test subdirectoriescore/memory_store.py: Complete Memory Store implementationtest_forget.py validates parsing and memory operationstests/unit/test_memory_store.py with 44 comprehensive testscore/osint/ip_intel.py)email:test@example.com user@domain.com admin@site.comphone:+491234567890 +441234567890 +331234567890ip: operator support in query parserdocs/README.mdcore/osint/query_parser.py)core/health/system_monitor.py)utils/cli_helper.py)data/memory.json) added to .gitignoretests/test_memory_store.py)tools/osint_tool.py)analyze_ip() method for direct IP analysisanalyze_social_username()osint_search('ip:8.8.8.8') or osint_search('192.168.1.1')cache.clear_on_startup option (default: false, only expired)_query_with_tools() from 246 → 37 lines (split into 11 focused methods)_should_use_web_search()_execute_web_search()_should_use_rag()_execute_rag_search()_build_context()_estimate_tokens()_generate_response()_handle_search_error()_log_query_stats()estimate_tokens() now uses tiktoken instead of chars/4core/osint/)core/health/)core/langgraph_agent.py)utils/parallel_search.py)core/lazy_loader.py)app.py)/query, /plugins, /stats, /health, etc.core/plugin_manager.py)utils/cli_helper.py)utils/async_utils.py)utils/resource_monitor.py)tools/rag.py)setup.bat / setup.sh for automated installationrun.bat / run.sh for easy startupcrawllama.service for Linux deploymentdocs/LANGGRAPH_GUIDE.md - Multi-Hop Reasoningdocs/PLUGIN_TUTORIAL.md - Plugin Developmentdocs/OSINT_USAGE.md - OSINT Featuresdocs/HEALTH_MONITORING.md - Health Dashboardcore/llm_client.py)tools/web_search.py)tools/wiki_lookup.py)tools/rag.py)core/agent.py)core/fallback_manager.py)utils/rate_limiter.py)utils/domain_blacklist.py)utils/safe_fetch.py)core/cache.py)clear - Reset sessionstats - Display statisticssave/load - Save/load sessionexit/quit - Exittests/)test_web_search.pytest_fallback_manager.pytest_cache.pytest_domain_blacklist.pytest_llm_client.pytest_integration.py