agentic-threat-hunting-framework 0.4.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {agentic_threat_hunting_framework-0.4.0/agentic_threat_hunting_framework.egg-info → agentic_threat_hunting_framework-0.5.1}/PKG-INFO +1 -1
  2. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1/agentic_threat_hunting_framework.egg-info}/PKG-INFO +1 -1
  3. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/agentic_threat_hunting_framework.egg-info/SOURCES.txt +1 -0
  4. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/agents/base.py +6 -15
  5. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/cli.py +10 -2
  6. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/__init__.py +6 -1
  7. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/similar.py +2 -2
  8. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/web_search.py +1 -1
  9. agentic_threat_hunting_framework-0.5.1/athf/plugin_system.py +48 -0
  10. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/pyproject.toml +15 -1
  11. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/LICENSE +0 -0
  12. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/MANIFEST.in +0 -0
  13. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/README.md +0 -0
  14. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/USING_ATHF.md +0 -0
  15. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/agentic_threat_hunting_framework.egg-info/dependency_links.txt +0 -0
  16. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/agentic_threat_hunting_framework.egg-info/entry_points.txt +0 -0
  17. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/agentic_threat_hunting_framework.egg-info/requires.txt +0 -0
  18. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/agentic_threat_hunting_framework.egg-info/top_level.txt +0 -0
  19. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/ATHF_level_3.png +0 -0
  20. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf-cli-workflow.gif +0 -0
  21. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf-level0.gif +0 -0
  22. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf-level1.gif +0 -0
  23. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf-level2.gif +0 -0
  24. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf-level3.gif +0 -0
  25. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf_fivelevels.png +0 -0
  26. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf_lock.png +0 -0
  27. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf_logo.png +0 -0
  28. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/assets/athf_manual_v_ai.png +0 -0
  29. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/__init__.py +0 -0
  30. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/__version__.py +0 -0
  31. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/agents/__init__.py +0 -0
  32. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/agents/llm/__init__.py +0 -0
  33. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/agents/llm/hunt_researcher.py +0 -0
  34. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/agents/llm/hypothesis_generator.py +0 -0
  35. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/agent.py +0 -0
  36. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/context.py +0 -0
  37. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/env.py +0 -0
  38. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/hunt.py +0 -0
  39. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/init.py +0 -0
  40. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/investigate.py +0 -0
  41. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/research.py +0 -0
  42. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/commands/splunk.py +0 -0
  43. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/__init__.py +0 -0
  44. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/attack_matrix.py +0 -0
  45. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/hunt_manager.py +0 -0
  46. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/hunt_parser.py +0 -0
  47. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/investigation_parser.py +0 -0
  48. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/research_manager.py +0 -0
  49. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/splunk_client.py +0 -0
  50. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/core/template_engine.py +0 -0
  51. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/__init__.py +0 -0
  52. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/CHANGELOG.md +0 -0
  53. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/CLI_REFERENCE.md +0 -0
  54. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/INSTALL.md +0 -0
  55. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/README.md +0 -0
  56. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/environment.md +0 -0
  57. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/getting-started.md +0 -0
  58. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/level4-agentic-workflows.md +0 -0
  59. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/lock-pattern.md +0 -0
  60. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/maturity-model.md +0 -0
  61. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/docs/why-athf.md +0 -0
  62. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/hunts/FORMAT_GUIDELINES.md +0 -0
  63. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/hunts/H-0001.md +0 -0
  64. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/hunts/H-0002.md +0 -0
  65. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/hunts/H-0003.md +0 -0
  66. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/hunts/README.md +0 -0
  67. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/integrations/MCP_CATALOG.md +0 -0
  68. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/integrations/README.md +0 -0
  69. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/integrations/quickstart/splunk.md +0 -0
  70. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/knowledge/hunting-knowledge.md +0 -0
  71. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/prompts/README.md +0 -0
  72. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/prompts/ai-workflow.md +0 -0
  73. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/prompts/basic-prompts.md +0 -0
  74. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/data/templates/HUNT_LOCK.md +0 -0
  75. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/athf/utils/__init__.py +0 -0
  76. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/setup.cfg +0 -0
  77. {agentic_threat_hunting_framework-0.4.0 → agentic_threat_hunting_framework-0.5.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-threat-hunting-framework
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Agentic Threat Hunting Framework - Memory and AI for threat hunters
5
5
  Author-email: Sydney Marrone <athf@nebulock.io>
6
6
  Maintainer-email: Sydney Marrone <athf@nebulock.io>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-threat-hunting-framework
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Agentic Threat Hunting Framework - Memory and AI for threat hunters
5
5
  Author-email: Sydney Marrone <athf@nebulock.io>
6
6
  Maintainer-email: Sydney Marrone <athf@nebulock.io>
@@ -23,6 +23,7 @@ assets/athf_manual_v_ai.png
23
23
  athf/__init__.py
24
24
  athf/__version__.py
25
25
  athf/cli.py
26
+ athf/plugin_system.py
26
27
  athf/agents/__init__.py
27
28
  athf/agents/base.py
28
29
  athf/agents/llm/__init__.py
@@ -1,4 +1,4 @@
1
- """Base classes for hunt-vault agents."""
1
+ """Base classes for ATHF agents."""
2
2
 
3
3
  import os
4
4
  from abc import ABC, abstractmethod
@@ -89,6 +89,8 @@ class LLMAgent(Agent[InputT, OutputT]):
89
89
  ) -> None:
90
90
  """Log LLM call metrics to centralized tracker.
91
91
 
92
+ Override this method in subclasses or plugins to implement custom metrics tracking.
93
+
92
94
  Args:
93
95
  agent_name: Name of the agent (e.g., "hypothesis-generator")
94
96
  model_id: Bedrock model ID
@@ -97,19 +99,8 @@ class LLMAgent(Agent[InputT, OutputT]):
97
99
  cost_usd: Estimated cost in USD
98
100
  duration_ms: Call duration in milliseconds
99
101
  """
100
- try:
101
- from athf.core.metrics_tracker import MetricsTracker # type: ignore[import-not-found]
102
-
103
- MetricsTracker.get_instance().log_bedrock_call(
104
- agent=agent_name,
105
- model_id=model_id,
106
- input_tokens=input_tokens,
107
- output_tokens=output_tokens,
108
- cost_usd=cost_usd,
109
- duration_ms=duration_ms,
110
- )
111
- except Exception:
112
- pass # Never fail agent execution due to metrics logging
102
+ # No-op by default. Override in plugins for custom metrics tracking.
103
+ pass
113
104
 
114
105
  def _get_llm_client(self) -> Any:
115
106
  """Get AWS Bedrock runtime client for Claude models.
@@ -125,7 +116,7 @@ class LLMAgent(Agent[InputT, OutputT]):
125
116
  return None
126
117
 
127
118
  try:
128
- import boto3 # type: ignore[import-untyped]
119
+ import boto3
129
120
 
130
121
  # Get AWS region from environment or use default
131
122
  region = os.getenv("AWS_REGION", os.getenv("AWS_DEFAULT_REGION", "us-east-1"))
@@ -95,8 +95,16 @@ cli.add_command(similar)
95
95
  # Agent commands
96
96
  cli.add_command(agent)
97
97
 
98
- # Integration commands
99
- cli.add_command(splunk)
98
+ # Integration commands (optional, requires additional dependencies)
99
+ if splunk is not None:
100
+ cli.add_command(splunk)
101
+
102
+ # Load and register plugins
103
+ from athf.plugin_system import PluginRegistry
104
+
105
+ PluginRegistry.load_plugins()
106
+ for name, cmd in PluginRegistry._commands.items():
107
+ cli.add_command(cmd, name=name)
100
108
 
101
109
 
102
110
  @cli.command(hidden=True)
@@ -7,7 +7,12 @@ from athf.commands.init import init
7
7
  from athf.commands.investigate import investigate
8
8
  from athf.commands.research import research
9
9
  from athf.commands.similar import similar
10
- from athf.commands.splunk import splunk
10
+
11
+ # Optional: Splunk integration (requires requests package)
12
+ try:
13
+ from athf.commands.splunk import splunk
14
+ except ImportError:
15
+ splunk = None # type: ignore[assignment]
11
16
 
12
17
  __all__ = [
13
18
  "init",
@@ -132,8 +132,8 @@ def _find_similar_hunts(
132
132
  ) -> List[Dict[str, Any]]:
133
133
  """Find similar hunts using TF-IDF similarity."""
134
134
  try:
135
- from sklearn.feature_extraction.text import TfidfVectorizer # type: ignore[import-untyped]
136
- from sklearn.metrics.pairwise import cosine_similarity # type: ignore[import-untyped]
135
+ from sklearn.feature_extraction.text import TfidfVectorizer
136
+ from sklearn.metrics.pairwise import cosine_similarity
137
137
  except ImportError:
138
138
  console.print("[red]Error: scikit-learn not installed[/red]")
139
139
  console.print("[dim]Install with: pip install scikit-learn[/dim]")
@@ -84,7 +84,7 @@ class TavilySearchClient:
84
84
  """Get or create Tavily client instance."""
85
85
  if self._client is None:
86
86
  try:
87
- from tavily import TavilyClient # type: ignore[import-not-found]
87
+ from tavily import TavilyClient
88
88
 
89
89
  self._client = TavilyClient(api_key=self.api_key)
90
90
  except ImportError:
@@ -0,0 +1,48 @@
1
+ """Plugin system for ATHF extensions."""
2
+ from typing import Dict, Type, Callable
3
+ import importlib.metadata
4
+ from click import Command
5
+
6
+
7
+ class PluginRegistry:
8
+ """Central registry for ATHF plugins."""
9
+
10
+ _agents: Dict[str, Type] = {}
11
+ _commands: Dict[str, Command] = {}
12
+
13
+ @classmethod
14
+ def register_agent(cls, name: str, agent_class: Type) -> None:
15
+ """Register an agent plugin."""
16
+ cls._agents[name] = agent_class
17
+
18
+ @classmethod
19
+ def register_command(cls, name: str, command: Command) -> None:
20
+ """Register a CLI command plugin."""
21
+ cls._commands[name] = command
22
+
23
+ @classmethod
24
+ def get_agent(cls, name: str) -> Type:
25
+ """Get registered agent by name."""
26
+ return cls._agents.get(name)
27
+
28
+ @classmethod
29
+ def get_command(cls, name: str) -> Command:
30
+ """Get registered command by name."""
31
+ return cls._commands.get(name)
32
+
33
+ @classmethod
34
+ def load_plugins(cls) -> None:
35
+ """Auto-discover and load all installed plugins."""
36
+ try:
37
+ for ep in importlib.metadata.entry_points(group='athf.commands'):
38
+ command = ep.load()
39
+ cls.register_command(ep.name, command)
40
+ except Exception:
41
+ pass # No plugins installed yet
42
+
43
+ try:
44
+ for ep in importlib.metadata.entry_points(group='athf.agents'):
45
+ agent = ep.load()
46
+ cls.register_agent(ep.name, agent)
47
+ except Exception:
48
+ pass # No plugins installed yet
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agentic-threat-hunting-framework"
7
- version = "0.4.0"
7
+ version = "0.5.1"
8
8
  description = "Agentic Threat Hunting Framework - Memory and AI for threat hunters"
9
9
  readme = {file = "README.md", content-type = "text/markdown"}
10
10
  requires-python = ">=3.8"
@@ -149,6 +149,20 @@ strict_equality = true
149
149
  module = "tests.*"
150
150
  disallow_untyped_defs = false
151
151
 
152
+ # Ignore missing imports for optional dependencies
153
+ [[tool.mypy.overrides]]
154
+ module = [
155
+ "boto3",
156
+ "boto3.*",
157
+ "tavily",
158
+ "tavily.*",
159
+ "sklearn.*",
160
+ "requests",
161
+ "requests.*",
162
+ "athf.core.metrics_tracker"
163
+ ]
164
+ ignore_missing_imports = true
165
+
152
166
  [tool.pytest.ini_options]
153
167
  testpaths = ["tests"]
154
168
  python_files = ["test_*.py"]