agentic-threat-hunting-framework 0.5.1__py3-none-any.whl → 0.5.2__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-threat-hunting-framework
3
- Version: 0.5.1
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,8 +1,8 @@
1
- agentic_threat_hunting_framework-0.5.1.dist-info/licenses/LICENSE,sha256=_KObErRfiKoolznt-DF0nJnr3U9Rdh7Z4Ba7G5qqckk,1071
1
+ agentic_threat_hunting_framework-0.5.2.dist-info/licenses/LICENSE,sha256=_KObErRfiKoolznt-DF0nJnr3U9Rdh7Z4Ba7G5qqckk,1071
2
2
  athf/__init__.py,sha256=OrjZe8P97_BTEkscapnwSsqKSjwXNP9d8-HtGr19Ni0,241
3
3
  athf/__version__.py,sha256=wCIQoU9b7qKcSNQiIOgHaD2buzBC-dlQYtvg8X5WS4A,59
4
4
  athf/cli.py,sha256=108PnDRlaytJj9KzjzcTLljB3DeerMIXZOeAQJrmtPU,5052
5
- athf/plugin_system.py,sha256=c_9-oUiR6tuYpWpEmeVRayU8-TXlkjvZC3EUxuYWW4M,1515
5
+ athf/plugin_system.py,sha256=eS_P56IAZQEtyefQkp-x2J-8pxKcZX_394-WoCY7M3U,2323
6
6
  athf/agents/__init__.py,sha256=iaSJpvnXm9rz4QS7gBrsaLEjm49uvsMs4BLPOJeyp78,346
7
7
  athf/agents/base.py,sha256=ZLqSW6I0pKqs1Z3OIoV8urkysMRzNDs52yNIxDgQjTU,3981
8
8
  athf/agents/llm/__init__.py,sha256=qSGA-NaInjsDkMpGQwnTz3S1OgCVlzetpMcDS_to1co,671
@@ -52,8 +52,8 @@ athf/data/prompts/ai-workflow.md,sha256=rZtOcGuAEi35qx7182TwHJEORdz1-RxkZMBVkg61
52
52
  athf/data/prompts/basic-prompts.md,sha256=2bunpO35RoBdJWYthXVi40RNl2UWrfwOaFthBLHF5sU,8463
53
53
  athf/data/templates/HUNT_LOCK.md,sha256=zXxHaKMWbRDLewLTegYJMbXRM72s9gFFvjdwFfGNeJE,7386
54
54
  athf/utils/__init__.py,sha256=aEAPI1xnAsowOtc036cCb9ZOek5nrrfevu8PElhbNgk,30
55
- agentic_threat_hunting_framework-0.5.1.dist-info/METADATA,sha256=A9gPoTr0bXjdPo_l76Fn1tIxJFAL3RFQRRUPSDT6N8I,15949
56
- agentic_threat_hunting_framework-0.5.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
57
- agentic_threat_hunting_framework-0.5.1.dist-info/entry_points.txt,sha256=GopR2iTiBs-yNMWiUZ2DaFIFglXxWJx1XPjTa3ePtfE,39
58
- agentic_threat_hunting_framework-0.5.1.dist-info/top_level.txt,sha256=Cxxg6SMLfawDJWBITsciRzq27XV8fiaAor23o9Byoes,5
59
- agentic_threat_hunting_framework-0.5.1.dist-info/RECORD,,
55
+ agentic_threat_hunting_framework-0.5.2.dist-info/METADATA,sha256=YfuSvYBFEkY6HIsnVOIuC7Yjx16mCRvycZHfXAwSZIA,15949
56
+ agentic_threat_hunting_framework-0.5.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
57
+ agentic_threat_hunting_framework-0.5.2.dist-info/entry_points.txt,sha256=GopR2iTiBs-yNMWiUZ2DaFIFglXxWJx1XPjTa3ePtfE,39
58
+ agentic_threat_hunting_framework-0.5.2.dist-info/top_level.txt,sha256=Cxxg6SMLfawDJWBITsciRzq27XV8fiaAor23o9Byoes,5
59
+ agentic_threat_hunting_framework-0.5.2.dist-info/RECORD,,
athf/plugin_system.py CHANGED
@@ -1,17 +1,27 @@
1
1
  """Plugin system for ATHF extensions."""
2
- from typing import Dict, Type, Callable
3
- import importlib.metadata
2
+ from typing import Any, Dict, Optional, Type
3
+ import sys
4
4
  from click import Command
5
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
+
6
16
 
7
17
  class PluginRegistry:
8
18
  """Central registry for ATHF plugins."""
9
19
 
10
- _agents: Dict[str, Type] = {}
20
+ _agents: Dict[str, Type[Any]] = {}
11
21
  _commands: Dict[str, Command] = {}
12
22
 
13
23
  @classmethod
14
- def register_agent(cls, name: str, agent_class: Type) -> None:
24
+ def register_agent(cls, name: str, agent_class: Type[Any]) -> None:
15
25
  """Register an agent plugin."""
16
26
  cls._agents[name] = agent_class
17
27
 
@@ -21,12 +31,12 @@ class PluginRegistry:
21
31
  cls._commands[name] = command
22
32
 
23
33
  @classmethod
24
- def get_agent(cls, name: str) -> Type:
34
+ def get_agent(cls, name: str) -> Optional[Type[Any]]:
25
35
  """Get registered agent by name."""
26
36
  return cls._agents.get(name)
27
37
 
28
38
  @classmethod
29
- def get_command(cls, name: str) -> Command:
39
+ def get_command(cls, name: str) -> Optional[Command]:
30
40
  """Get registered command by name."""
31
41
  return cls._commands.get(name)
32
42
 
@@ -34,14 +44,26 @@ class PluginRegistry:
34
44
  def load_plugins(cls) -> None:
35
45
  """Auto-discover and load all installed plugins."""
36
46
  try:
37
- for ep in importlib.metadata.entry_points(group='athf.commands'):
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:
38
54
  command = ep.load()
39
55
  cls.register_command(ep.name, command)
40
56
  except Exception:
41
57
  pass # No plugins installed yet
42
58
 
43
59
  try:
44
- for ep in importlib.metadata.entry_points(group='athf.agents'):
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:
45
67
  agent = ep.load()
46
68
  cls.register_agent(ep.name, agent)
47
69
  except Exception: