Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
be83129
initial ilspy
moohax Aug 22, 2025
991c1c6
fs tool
moohax Aug 22, 2025
6ce8bf3
bloodhound
moohax Aug 22, 2025
152ea10
bbot
moohax Aug 22, 2025
20269d3
example assembly
moohax Aug 22, 2025
0af906d
reset pyproject, org examples
moohax Aug 22, 2025
2d83848
manifest wip, tools
moohax Aug 23, 2025
4b2b52a
thread fixes, tool fixes
moohax Aug 24, 2025
43123e6
auto-gen docs
moohax Aug 24, 2025
95c5fbf
poetry lock, python max version 3.13
moohax Aug 24, 2025
63d9034
remove unused PLC0415
moohax Aug 24, 2025
5c5faca
remove unused noqa, redefine for export
moohax Aug 24, 2025
4cf1178
copy old poetry config
moohax Aug 24, 2025
f00d9b6
regen lock file
moohax Aug 24, 2025
4a09db0
fix linting
moohax Aug 24, 2025
98e7ece
fix linting
moohax Aug 25, 2025
d1e4f5a
fix linting
moohax Aug 25, 2025
3f2ee2d
reset to main pyproject
moohax Aug 25, 2025
cc1b0a6
fix typing
moohax Aug 25, 2025
e25f221
skopeo
moohax Aug 25, 2025
37e0ddc
new examples
moohax Aug 26, 2025
3d5d727
kali
moohax Aug 26, 2025
4fda85b
bbot cli
moohax Aug 28, 2025
b3146cd
agents entry point
moohax Aug 28, 2025
3ccec4e
chore: basic configs and wip preset
GangGreenTemperTatum Aug 28, 2025
a9198fe
chore: add light usage
GangGreenTemperTatum Aug 28, 2025
2125639
fix: tool_method invalid decorator parentheses
GangGreenTemperTatum Aug 28, 2025
068d290
chore: wip example auth cred stuff agent
GangGreenTemperTatum Aug 28, 2025
a7d2922
chore: kali hydra creds stuffer
GangGreenTemperTatum Aug 28, 2025
fb1bd85
feat: subdomain jacking example agent
GangGreenTemperTatum Aug 28, 2025
e772e4b
chore: nit tidy prompt for specialized agent
GangGreenTemperTatum Aug 29, 2025
966867c
feat: neo4j tool and equip agent
GangGreenTemperTatum Aug 29, 2025
d758f19
chore: dont make neo4j conditional
GangGreenTemperTatum Aug 29, 2025
2159cf7
envs, dn logging
moohax Aug 29, 2025
a5c26de
chore: setup dreadnode run
GangGreenTemperTatum Aug 29, 2025
8adc058
Revert "chore: setup dreadnode run"
GangGreenTemperTatum Aug 29, 2025
20057da
chore: setup dreadnode run
GangGreenTemperTatum Aug 29, 2025
af57a2a
fix: kali tools for subdomain enum and grant cleaner agency
GangGreenTemperTatum Aug 29, 2025
27e5494
chore: hook up dn.task decorators to async functions
GangGreenTemperTatum Aug 29, 2025
90c96e9
chore: add metrics at run level for evaluations
GangGreenTemperTatum Aug 29, 2025
f615309
reconfigure bbot tool
moohax Aug 30, 2025
abcbce3
fix merge conflicts
moohax Aug 30, 2025
9b7e022
refactor sub-agent
moohax Aug 31, 2025
9dbd1f5
posterity
moohax Sep 1, 2025
50ab288
bbot as deployment
moohax Sep 1, 2025
950efad
fix: subdomain takeover agent - replace BBOT discovery with direct an…
GangGreenTemperTatum Sep 1, 2025
de98ac9
chore: custom footprint module
GangGreenTemperTatum Sep 2, 2025
027d997
feat: basic ssrf agent with curl requests kali tools
GangGreenTemperTatum Sep 3, 2025
e6a18e0
feat: basic sql injection agent
GangGreenTemperTatum Sep 3, 2025
c024918
chore: display httpx HTTP_RESPONSE events for specific agents
GangGreenTemperTatum Sep 3, 2025
60e3c8b
feat: host header injection agent
GangGreenTemperTatum Sep 3, 2025
567992a
chore: store hh neo4j tool
GangGreenTemperTatum Sep 3, 2025
503eb6d
feat: oast interactsh oob and tighten sys prompt for ssrf
GangGreenTemperTatum Sep 4, 2025
58b1feb
chore: tighten sub takeover agent event parsing
GangGreenTemperTatum Sep 4, 2025
de18e58
chore: insert dangling ns records logic into the subdomain takeover a…
GangGreenTemperTatum Sep 4, 2025
5ad7aaf
feat: graphql node storage and agent api discovery
GangGreenTemperTatum Sep 5, 2025
dc232ba
chore: add takeoverxyz verdict verification
GangGreenTemperTatum Sep 5, 2025
cc78c8d
chore: fork multi-agent
GangGreenTemperTatum Sep 5, 2025
ca23433
fix: all agents react to is_sqli_finding(event)
GangGreenTemperTatum Sep 5, 2025
d64cbd0
feat: crypto artifact agent
GangGreenTemperTatum Sep 8, 2025
3aae65c
feat: cvevalidator agent
GangGreenTemperTatum Sep 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ coverage.xml
.pytest_cache/
cover/

.mypy_cache/
.ruff_cache/

# Translations
*.mo
*.pot
Expand Down
10 changes: 5 additions & 5 deletions .hooks/generate_docs.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import argparse # noqa: INP001
import argparse
import re
import typing as t
from pathlib import Path
Expand All @@ -18,7 +18,7 @@ def convert_pre(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any:
return super().convert_pre(el, text.strip(), parent_tags)

# bold items with doc-section-title in a span class
def convert_span(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any: # noqa: ARG002
def convert_span(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any:
if "doc-section-title" in el.get("class", []):
return f"**{text.strip()}**"
return text
Expand All @@ -30,7 +30,7 @@ def convert_div(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any:
return super().convert_div(el, text, parent_tags)

# Map mkdocstrings details classes to Mintlify callouts
def convert_details(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any: # noqa: ARG002
def convert_details(self, el: t.Any, text: str, parent_tags: t.Any) -> t.Any:
classes = el.get("class", [])

# Handle source code details specially
Expand Down Expand Up @@ -83,7 +83,7 @@ def __init__(self, source_paths: list[str], theme: str = "material", **options:
self.handler = PythonHandler(PythonConfig.from_data(), base_dir=Path.cwd())
self.options = options

self.handler._update_env( # noqa: SLF001
self.handler._update_env(
Markdown(),
config={"mdx": ["toc"]},
)
Expand All @@ -96,7 +96,7 @@ def simple_convert_markdown(
html_id: str = "",
**kwargs: t.Any,
) -> t.Any:
return Markup(md.convert(text) if text else "") # noqa: S704 # nosec
return Markup(md.convert(text) if text else "") # nosec

self.handler.env.filters["convert_markdown"] = simple_convert_markdown

Expand Down
8 changes: 4 additions & 4 deletions docs/sdk/api.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def export_metrics(
Returns:
A DataFrame containing the exported metric data.
"""
import pandas as pd
import pandas as pd # noqa: PLC0415

response = self.request(
"GET",
Expand Down Expand Up @@ -264,7 +264,7 @@ def export_parameters(
Returns:
A DataFrame containing the exported parameter data.
"""
import pandas as pd
import pandas as pd # noqa: PLC0415

response = self.request(
"GET",
Expand Down Expand Up @@ -347,7 +347,7 @@ def export_runs(
Returns:
A DataFrame containing the exported run data.
"""
import pandas as pd
import pandas as pd # noqa: PLC0415

response = self.request(
"GET",
Expand Down Expand Up @@ -444,7 +444,7 @@ def export_timeseries(
Returns:
A DataFrame containing the exported timeseries data.
"""
import pandas as pd
import pandas as pd # noqa: PLC0415

response = self.request(
"GET",
Expand Down
6 changes: 4 additions & 2 deletions docs/sdk/data_types.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -643,10 +643,12 @@ def to_serializable(self) -> tuple[bytes, dict[str, t.Any]]:
Returns:
A tuple of (video_bytes, metadata_dict)
"""
import numpy as np # type: ignore[import,unused-ignore]
import numpy as np # type: ignore[import,unused-ignore] # noqa: PLC0415

try:
from moviepy.video.VideoClip import VideoClip # type: ignore[import,unused-ignore]
from moviepy.video.VideoClip import ( # type: ignore[import,unused-ignore,import-untyped] # noqa: PLC0415
VideoClip,
)
except ImportError:
VideoClip = None # noqa: N806

Expand Down
8 changes: 2 additions & 6 deletions docs/sdk/main.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -283,10 +283,7 @@ def configure(
with contextlib.suppress(Exception):
user_config = UserConfig.read()
profile_name = profile or os.environ.get(ENV_PROFILE)
if profile_name:
active_profile = profile_name
else:
active_profile = user_config.active_profile_name
active_profile = profile_name or user_config.active_profile_name

if active_profile:
config_source = f"profile: {active_profile}"
Expand Down Expand Up @@ -460,7 +457,6 @@ def initialize(self) -> None:

This method is called automatically when you call `configure()`.
"""
from s3fs import S3FileSystem # type: ignore [import-untyped]

if self._initialized:
return
Expand Down Expand Up @@ -976,7 +972,7 @@ with dreadnode.run("my_run"):
def log_metric(
self,
name: str,
value: float | bool | Metric,
value: float | bool | Metric, # noqa: FBT001
*,
step: int = 0,
origin: t.Any | None = None,
Expand Down
8 changes: 3 additions & 5 deletions docs/sdk/metric.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ Metric
Metric(
value: float,
step: int = 0,
timestamp: datetime = lambda: datetime.now(
timezone.utc
timestamp: datetime = (
lambda: datetime.now(timezone.utc)
)(),
attributes: JsonDict = dict(),
)
Expand Down Expand Up @@ -136,9 +136,7 @@ def apply_mode(self, mode: MetricAggMode, others: "list[Metric]") -> "Metric":
self.value = len(others) + 1
elif mode == "avg" and prior_values:
current_avg = prior_values[-1]
self.value = current_avg + (self.value - current_avg) / (
len(prior_values) + 1
)
self.value = current_avg + (self.value - current_avg) / (len(prior_values) + 1)

return self
```
Expand Down
10 changes: 5 additions & 5 deletions docs/sdk/scorers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def zero_shot_classification(
)

try:
from transformers import ( # type: ignore [attr-defined,import-not-found,unused-ignore]
from transformers import ( # type: ignore [attr-defined,import-not-found,unused-ignore] # noqa: PLC0415
pipeline,
)
except ImportError:
Expand Down Expand Up @@ -846,7 +846,7 @@ def detect_harm_with_openai(
model: The moderation model to use.
name: Name of the scorer.
"""
import openai
import openai # noqa: PLC0415

async def evaluate(data: t.Any) -> Metric:
text = str(data)
Expand Down Expand Up @@ -1816,7 +1816,7 @@ def detect_pii_with_presidio(
)

try:
import presidio_analyzer # type: ignore[import-not-found,unused-ignore] # noqa: F401
import presidio_analyzer # type: ignore[import-not-found,unused-ignore] # noqa: F401, PLC0415
except ImportError:
warn_at_user_stacklevel(presidio_import_error_msg, UserWarning)

Expand Down Expand Up @@ -2020,7 +2020,7 @@ def wrap_chat(
"""

async def evaluate(chat: "Chat") -> Metric:
from rigging.chat import Chat
from rigging.chat import Chat # noqa: PLC0415

# Fall through to the inner scorer if chat is not a Chat instance
if not isinstance(chat, Chat):
Expand Down Expand Up @@ -2479,7 +2479,7 @@ def similarity_with_litellm(
or self-hosted models.
name: Name of the scorer.
"""
import litellm
import litellm # noqa: PLC0415

async def evaluate(data: t.Any) -> Metric:
nonlocal reference, model
Expand Down
2 changes: 1 addition & 1 deletion dreadnode/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from dreadnode.version import VERSION

if t.TYPE_CHECKING:
from dreadnode import scorers # noqa: F401
from dreadnode import scorers

configure = DEFAULT_INSTANCE.configure
shutdown = DEFAULT_INSTANCE.shutdown
Expand Down
6 changes: 3 additions & 3 deletions dreadnode/agent/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
from dreadnode.agent.agent import Agent
from dreadnode.agent.events import rebuild_event_models
from dreadnode.agent.result import AgentResult
from dreadnode.agent.thread import Thread
from dreadnode.agent.state import State

Agent.model_rebuild()
Thread.model_rebuild()
State.model_rebuild()

rebuild_event_models()
# rebuild_event_models()

rebuild_dataclass(AgentResult) # type: ignore[arg-type]
Loading