"""CLI entrypoints — routing only, no business logic.""" from __future__ import annotations import contextlib import sys with contextlib.suppress(ImportError): import ddtrace.auto # noqa: F401 def serve() -> None: """Start the FastMCP server (MCP container entrypoint).""" from marketing_intelligence.core.config import settings from marketing_intelligence.mcp.server import mcp with contextlib.suppress(KeyboardInterrupt): mcp.run( transport="streamable-http", host=settings.mcp_host, port=settings.mcp_port, host_origin_protection=False, ) def api() -> None: """Start the FastAPI service (API container entrypoint).""" import uvicorn from marketing_intelligence.core.config import settings uvicorn.run( "marketing_intelligence.api.main:app", host=settings.api_host, port=settings.api_port, ) def agent(args: list[str]) -> None: """Discovery run via CLI.""" import argparse from datetime import UTC, datetime from marketing_intelligence.agent_workflows.discovery import run_discovery_sync from marketing_intelligence.core.logging import setup_logging from marketing_intelligence.storage.campaigns import get_campaign parser = argparse.ArgumentParser(prog="marketing_intelligence agent") parser.add_argument("--campaign-id", dest="campaign_id", required=True) parser.add_argument("--tag") parser.add_argument("--sample-size", type=int, default=0, dest="sample_size") parser.add_argument( "--stealth-hint", default="conservative", choices=["conservative", "aggressive"], dest="stealth_hint", ) parsed = parser.parse_args(args) campaign = get_campaign(parsed.campaign_id) if not campaign: print(f"Campaign '{parsed.campaign_id}' not found") sys.exit(1) if parsed.tag: campaign.tags = [parsed.tag] if parsed.sample_size: campaign.sample_size = parsed.sample_size run_id = datetime.now(tz=UTC).strftime("%Y%m%d_%H%M%S") setup_logging(run_id=run_id) print(run_discovery_sync(campaign, run_id, parsed.stealth_hint)) def monitor(mode: str = "direct") -> None: """Monitoring run via CLI.""" import asyncio from datetime import UTC, datetime from marketing_intelligence.core.logging import setup_logging run_id = datetime.now(tz=UTC).strftime("%Y%m%d_%H%M%S") setup_logging(run_id=run_id) if mode == "agent": from marketing_intelligence.agent_workflows.monitor_agent import ( run_monitor_agent, ) asyncio.run(run_monitor_agent(run_id)) else: from marketing_intelligence.agent_workflows.monitor_direct import ( run_monitor_direct, ) asyncio.run(run_monitor_direct(run_id)) def main() -> None: cmd = sys.argv[1] if len(sys.argv) > 1 else "api" if cmd == "api": api() elif cmd == "serve": serve() elif cmd == "agent": agent(sys.argv[2:]) elif cmd == "monitor_agent": monitor("agent") elif cmd == "monitor_direct": monitor("direct") else: print( f"Unknown command: {cmd}. " "Use: api, serve, agent, monitor_agent, monitor_direct" ) sys.exit(1)