agentic-threat-hunting-framework 0.5.1__tar.gz → 0.5.2__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.
- {agentic_threat_hunting_framework-0.5.1/agentic_threat_hunting_framework.egg-info → agentic_threat_hunting_framework-0.5.2}/PKG-INFO +1 -1
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2/agentic_threat_hunting_framework.egg-info}/PKG-INFO +1 -1
- agentic_threat_hunting_framework-0.5.2/athf/plugin_system.py +70 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/pyproject.toml +1 -1
- agentic_threat_hunting_framework-0.5.1/athf/plugin_system.py +0 -48
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/LICENSE +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/MANIFEST.in +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/README.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/USING_ATHF.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/agentic_threat_hunting_framework.egg-info/SOURCES.txt +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/agentic_threat_hunting_framework.egg-info/dependency_links.txt +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/agentic_threat_hunting_framework.egg-info/entry_points.txt +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/agentic_threat_hunting_framework.egg-info/requires.txt +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/agentic_threat_hunting_framework.egg-info/top_level.txt +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/ATHF_level_3.png +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf-cli-workflow.gif +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf-level0.gif +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf-level1.gif +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf-level2.gif +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf-level3.gif +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf_fivelevels.png +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf_lock.png +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf_logo.png +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/assets/athf_manual_v_ai.png +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/__version__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/agents/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/agents/base.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/agents/llm/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/agents/llm/hunt_researcher.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/agents/llm/hypothesis_generator.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/cli.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/agent.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/context.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/env.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/hunt.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/init.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/investigate.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/research.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/similar.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/commands/splunk.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/attack_matrix.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/hunt_manager.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/hunt_parser.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/investigation_parser.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/research_manager.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/splunk_client.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/template_engine.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/core/web_search.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/CHANGELOG.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/CLI_REFERENCE.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/INSTALL.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/README.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/environment.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/getting-started.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/level4-agentic-workflows.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/lock-pattern.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/maturity-model.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/docs/why-athf.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/hunts/FORMAT_GUIDELINES.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/hunts/H-0001.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/hunts/H-0002.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/hunts/H-0003.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/hunts/README.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/integrations/MCP_CATALOG.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/integrations/README.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/integrations/quickstart/splunk.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/knowledge/hunting-knowledge.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/prompts/README.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/prompts/ai-workflow.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/prompts/basic-prompts.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/data/templates/HUNT_LOCK.md +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/utils/__init__.py +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/setup.cfg +0 -0
- {agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-threat-hunting-framework
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
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.5.
|
|
3
|
+
Version: 0.5.2
|
|
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>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Plugin system for ATHF extensions."""
|
|
2
|
+
from typing import Any, Dict, Optional, Type
|
|
3
|
+
import sys
|
|
4
|
+
from click import Command
|
|
5
|
+
|
|
6
|
+
# Handle importlib.metadata API changes across Python versions
|
|
7
|
+
if sys.version_info >= (3, 10):
|
|
8
|
+
from importlib.metadata import entry_points
|
|
9
|
+
else:
|
|
10
|
+
# Python 3.8-3.9: use importlib_metadata backport API
|
|
11
|
+
try:
|
|
12
|
+
from importlib.metadata import entry_points
|
|
13
|
+
except ImportError:
|
|
14
|
+
from importlib_metadata import entry_points # type: ignore
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PluginRegistry:
|
|
18
|
+
"""Central registry for ATHF plugins."""
|
|
19
|
+
|
|
20
|
+
_agents: Dict[str, Type[Any]] = {}
|
|
21
|
+
_commands: Dict[str, Command] = {}
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def register_agent(cls, name: str, agent_class: Type[Any]) -> None:
|
|
25
|
+
"""Register an agent plugin."""
|
|
26
|
+
cls._agents[name] = agent_class
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def register_command(cls, name: str, command: Command) -> None:
|
|
30
|
+
"""Register a CLI command plugin."""
|
|
31
|
+
cls._commands[name] = command
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def get_agent(cls, name: str) -> Optional[Type[Any]]:
|
|
35
|
+
"""Get registered agent by name."""
|
|
36
|
+
return cls._agents.get(name)
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def get_command(cls, name: str) -> Optional[Command]:
|
|
40
|
+
"""Get registered command by name."""
|
|
41
|
+
return cls._commands.get(name)
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def load_plugins(cls) -> None:
|
|
45
|
+
"""Auto-discover and load all installed plugins."""
|
|
46
|
+
try:
|
|
47
|
+
# Python 3.10+ uses group= parameter, 3.8-3.9 uses dict-like access
|
|
48
|
+
if sys.version_info >= (3, 10):
|
|
49
|
+
eps = entry_points(group='athf.commands')
|
|
50
|
+
else:
|
|
51
|
+
eps = entry_points().get('athf.commands', [])
|
|
52
|
+
|
|
53
|
+
for ep in eps:
|
|
54
|
+
command = ep.load()
|
|
55
|
+
cls.register_command(ep.name, command)
|
|
56
|
+
except Exception:
|
|
57
|
+
pass # No plugins installed yet
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
# Python 3.10+ uses group= parameter, 3.8-3.9 uses dict-like access
|
|
61
|
+
if sys.version_info >= (3, 10):
|
|
62
|
+
eps = entry_points(group='athf.agents')
|
|
63
|
+
else:
|
|
64
|
+
eps = entry_points().get('athf.agents', [])
|
|
65
|
+
|
|
66
|
+
for ep in eps:
|
|
67
|
+
agent = ep.load()
|
|
68
|
+
cls.register_agent(ep.name, agent)
|
|
69
|
+
except Exception:
|
|
70
|
+
pass # No plugins installed yet
|
{agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/pyproject.toml
RENAMED
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agentic-threat-hunting-framework"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.2"
|
|
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"
|
|
@@ -1,48 +0,0 @@
|
|
|
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
|
|
File without changes
|
{agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/MANIFEST.in
RENAMED
|
File without changes
|
|
File without changes
|
{agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/USING_ATHF.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_threat_hunting_framework-0.5.1 → agentic_threat_hunting_framework-0.5.2}/athf/cli.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|