| """Command-line interface for the OSINT Expert Agent.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
|
|
| from .osint_agent import OSINTAgent |
|
|
|
|
| def interactive_mode(agent: OSINTAgent) -> None: |
| print("OSINT Expert Agent — Interactive Mode") |
| print("Commands: 'exit'/'quit' to end, 'reset' to clear history.\n") |
| while True: |
| try: |
| user_input = input("You: ").strip() |
| except (EOFError, KeyboardInterrupt): |
| print("\nExiting.") |
| break |
| if not user_input: |
| continue |
| if user_input.lower() in ("exit", "quit"): |
| print("Session ended.") |
| break |
| if user_input.lower() == "reset": |
| agent.reset() |
| print("[Conversation history cleared]\n") |
| continue |
| print("Agent: ", end="", flush=True) |
| for chunk in agent.stream_chat(user_input): |
| print(chunk, end="", flush=True) |
| print("\n") |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser( |
| description="OSINT Expert Agent powered by Claude 3.5 Sonnet", |
| formatter_class=argparse.RawDescriptionHelpFormatter, |
| epilog=""" |
| Examples: |
| python -m agent.cli # interactive mode |
| python -m agent.cli --target example.com # full analysis |
| python -m agent.cli --target example.com --type passive |
| python -m agent.cli --target 1.2.3.4 --type threat --context "seen in phishing" |
| python -m agent.cli --iocs 1.2.3.4 bad.com abc123hash |
| python -m agent.cli --explain "certificate transparency log mining" |
| """, |
| ) |
| parser.add_argument("--target", "-t", help="Target to analyze (domain, IP, username, etc.)") |
| parser.add_argument( |
| "--type", |
| choices=["full", "passive", "threat", "footprint", "breach", "darkweb", "socmint"], |
| default="full", |
| help="Analysis type (default: full)", |
| ) |
| parser.add_argument("--context", "-c", help="Additional context for the analysis") |
| parser.add_argument("--iocs", nargs="+", metavar="IOC", help="IOCs for enrichment report") |
| parser.add_argument("--explain", "-e", metavar="TECHNIQUE", help="Explain an OSINT technique") |
| parser.add_argument("--model", default="claude-3-5-sonnet-20241022", help="Claude model to use") |
| parser.add_argument("--no-stream", action="store_true", help="Disable streaming output") |
|
|
| args = parser.parse_args() |
| agent = OSINTAgent(model=args.model) |
|
|
| if args.iocs: |
| result = agent.generate_ioc_report(args.iocs) |
| print(result) |
| elif args.explain: |
| result = agent.explain_technique(args.explain) |
| print(result) |
| elif args.target: |
| prompt = OSINTAgent._build_analysis_prompt(args.target, args.type, args.context) |
| if args.no_stream: |
| result = agent.chat(prompt) |
| print(result) |
| else: |
| for chunk in agent.stream_chat(prompt): |
| print(chunk, end="", flush=True) |
| print() |
| else: |
| interactive_mode(agent) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|