dreadnode 2.0.14__tar.gz → 2.0.16__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.
- {dreadnode-2.0.14 → dreadnode-2.0.16}/PKG-INFO +4 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/__init__.py +2 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/__init__.py +12 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/agent.py +10 -12
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/events.py +10 -0
- dreadnode-2.0.16/dreadnode/agents/judge.py +196 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/skills.py +11 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/tools.py +22 -19
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/assessment.py +1 -67
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/image.py +68 -31
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/client.py +265 -134
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/models.py +339 -76
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/capability.py +2 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/dataset.py +62 -6
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/evaluation.py +2 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/optimize.py +194 -23
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/train.py +129 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/managed_client.py +4 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/models.py +134 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/runtime_client.py +168 -7
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/main.py +144 -15
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/model_catalog.py +4 -4
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/app.py +360 -19
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/prompt.py +15 -13
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_persistence.py +7 -3
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/worker_manager.py +12 -4
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/app.py +69 -11
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/dreadnode.tcss +8 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/profile_manager.py +6 -15
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/auth.py +10 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/capabilities.py +139 -104
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/sandboxes.py +0 -57
- dreadnode-2.0.16/dreadnode/app/tui/screens/sessions.py +652 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/workspaces.py +0 -4
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/sessions_manager.py +130 -4
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/tool_format.py +181 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_reducer.py +27 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/context_bar.py +29 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/conversation.py +11 -0
- dreadnode-2.0.16/dreadnode/app/tui/widgets/tool.py +341 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/wire_events.py +5 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +71 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +18 -6
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +175 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +60 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +54 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +28 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +124 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +96 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +172 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +87 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +128 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +97 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +240 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +174 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +68 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +117 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +107 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +80 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +189 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +165 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +329 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +139 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +133 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2034 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +1726 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +99 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +66 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +83 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +22 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +356 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +260 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +173 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +239 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +79 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +217 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +182 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +91 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +94 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +100 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +236 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +229 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +363 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +218 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +74 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +31 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +97 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +68 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +218 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +32 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +117 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +86 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +132 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +111 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +68 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +113 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +94 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +160 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +89 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +86 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +200 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +83 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +161 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +58 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +86 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +107 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +64 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +108 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +88 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +44 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/.gitignore +2 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/capability.yaml +29 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +93 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +66 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +36 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +100 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +12 -0
- dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +12 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/worker.py +9 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/__init__.py +2 -0
- dreadnode-2.0.16/dreadnode/core/environment.py +524 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/util.py +2 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/base.py +6 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/litellm_.py +77 -8
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/message.py +18 -1
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/__init__.py +9 -1
- dreadnode-2.0.16/dreadnode/optimization/adapters/__init__.py +11 -0
- dreadnode-2.0.16/dreadnode/optimization/adapters/_env_eval.py +167 -0
- dreadnode-2.0.16/dreadnode/optimization/adapters/env.py +173 -0
- dreadnode-2.0.16/dreadnode/optimization/adapters/runtime.py +630 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/adapters/stack.py +53 -3
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/events.py +5 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/jobs.py +387 -77
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/study.py +122 -15
- dreadnode-2.0.16/dreadnode/packaging/__init__.py +0 -0
- dreadnode-2.0.16/dreadnode/py.typed +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/image.py +121 -74
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/storage.py +109 -55
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/__init__.py +7 -8
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/fetch.py +63 -21
- dreadnode-2.0.16/dreadnode/tools/report.py +134 -0
- dreadnode-2.0.16/dreadnode/tools/web_extract.py +176 -0
- dreadnode-2.0.16/dreadnode/tools/web_search.py +685 -0
- dreadnode-2.0.16/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/constants.py +11 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/spans.py +50 -3
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/__init__.py +25 -0
- dreadnode-2.0.16/dreadnode/training/_progress.py +248 -0
- dreadnode-2.0.16/dreadnode/training/env_rollouts.py +347 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/__init__.py +4 -0
- dreadnode-2.0.16/dreadnode/training/etl/sft.py +335 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/events.py +2 -2
- dreadnode-2.0.16/dreadnode/training/jobs.py +2550 -0
- dreadnode-2.0.16/dreadnode/training/models.py +88 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/recipes.py +89 -0
- dreadnode-2.0.16/dreadnode/training/rollouts/agent_rollout.py +332 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/orchestrator.py +7 -7
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/worlds.py +3 -3
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/__init__.py +4 -2
- dreadnode-2.0.16/dreadnode/training/tinker/renderer.py +918 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/rl.py +135 -6
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker_sft.py +2 -2
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/utils.py +11 -18
- {dreadnode-2.0.14 → dreadnode-2.0.16}/pyproject.toml +21 -5
- dreadnode-2.0.14/dreadnode/app/tui/screens/sessions.py +0 -384
- dreadnode-2.0.14/dreadnode/app/tui/widgets/tool.py +0 -168
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -160
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-components.md +0 -111
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -339
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -262
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -109
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/command-groups.md +0 -224
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/tui-crosswalk.md +0 -27
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-runtime-reference/SKILL.md +0 -76
- dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/system-prompt.md +0 -7
- dreadnode-2.0.14/dreadnode/core/environment.py +0 -254
- dreadnode-2.0.14/dreadnode/optimization/adapters/__init__.py +0 -3
- dreadnode-2.0.14/dreadnode/tools/report.py +0 -95
- dreadnode-2.0.14/dreadnode/tools/web_search.py +0 -170
- dreadnode-2.0.14/dreadnode/training/etl/sft.py +0 -102
- dreadnode-2.0.14/dreadnode/training/jobs.py +0 -1404
- dreadnode-2.0.14/dreadnode/training/tinker/renderer.py +0 -533
- {dreadnode-2.0.14 → dreadnode-2.0.16}/.gitignore +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/LICENSE +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/README.md +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_policy.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.14/dreadnode/packaging → dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/hooks}/__init__.py +0 -0
- {dreadnode-2.0.14/dreadnode/tracing → dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib}/__init__.py +0 -0
- /dreadnode-2.0.14/dreadnode/py.typed → /dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dreadnode
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.16
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -13,6 +13,7 @@ Requires-Dist: coolname<3.0.0,>=2.2.0
|
|
|
13
13
|
Requires-Dist: croniter<7.0.0,>=6.0.0
|
|
14
14
|
Requires-Dist: cyclopts>=4.2.0
|
|
15
15
|
Requires-Dist: datasets>=4.5.0
|
|
16
|
+
Requires-Dist: ddgs>=9.0.0
|
|
16
17
|
Requires-Dist: fastapi>=0.115.0
|
|
17
18
|
Requires-Dist: fastmcp>=2.14.0
|
|
18
19
|
Requires-Dist: fsspec[s3]<=2025.10.0,>=2025.10.0
|
|
@@ -20,9 +21,10 @@ Requires-Dist: gepa>=0.1.1
|
|
|
20
21
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
21
22
|
Requires-Dist: jsonpath-ng>=1.7.0
|
|
22
23
|
Requires-Dist: jsonref>=1.1.0
|
|
23
|
-
Requires-Dist: litellm<=1.83.
|
|
24
|
+
Requires-Dist: litellm<=1.83.7,>=1.83.7
|
|
24
25
|
Requires-Dist: logfire<=3.20.0,>=3.5.3
|
|
25
26
|
Requires-Dist: loguru>=0.7.3
|
|
27
|
+
Requires-Dist: markdownify<2.0.0,>=1.1.0
|
|
26
28
|
Requires-Dist: mcp<2.0.0,>=1.25.0
|
|
27
29
|
Requires-Dist: moviepy<3.0.0,>=2.1.2
|
|
28
30
|
Requires-Dist: numpy<=2.3.5,>=2.3.0
|
|
@@ -154,6 +154,7 @@ __all__ = [
|
|
|
154
154
|
"push_capability",
|
|
155
155
|
"push_dataset",
|
|
156
156
|
"push_environment",
|
|
157
|
+
"push_hf_dataset",
|
|
157
158
|
"push_model",
|
|
158
159
|
"push_update",
|
|
159
160
|
"run",
|
|
@@ -290,6 +291,7 @@ __instance_methods__: list[str] = [
|
|
|
290
291
|
"push_capability",
|
|
291
292
|
"push_dataset",
|
|
292
293
|
"push_environment",
|
|
294
|
+
"push_hf_dataset",
|
|
293
295
|
"push_model",
|
|
294
296
|
]
|
|
295
297
|
|
|
@@ -20,12 +20,14 @@ from dreadnode.core.hook import Hook
|
|
|
20
20
|
|
|
21
21
|
__all__ = [
|
|
22
22
|
"Agent",
|
|
23
|
+
"AgentJudge",
|
|
23
24
|
"Continue",
|
|
24
25
|
"Fail",
|
|
25
26
|
"Finish",
|
|
26
27
|
"FunctionCall",
|
|
27
28
|
"FunctionDefinition",
|
|
28
29
|
"Hook",
|
|
30
|
+
"JudgeResult",
|
|
29
31
|
"Reaction",
|
|
30
32
|
"Retry",
|
|
31
33
|
"RetryWithFeedback",
|
|
@@ -59,6 +61,8 @@ _LAZY_NAMES = frozenset(
|
|
|
59
61
|
"reactions",
|
|
60
62
|
"stopping",
|
|
61
63
|
"Agent",
|
|
64
|
+
"AgentJudge",
|
|
65
|
+
"JudgeResult",
|
|
62
66
|
"Trajectory",
|
|
63
67
|
"Continue",
|
|
64
68
|
"Fail",
|
|
@@ -77,6 +81,7 @@ def _lazy_init() -> None:
|
|
|
77
81
|
_stopping = importlib.import_module("dreadnode.agents.stopping")
|
|
78
82
|
_agent = importlib.import_module("dreadnode.agents.agent")
|
|
79
83
|
_trajectory = importlib.import_module("dreadnode.agents.trajectory")
|
|
84
|
+
_judge = importlib.import_module("dreadnode.agents.judge")
|
|
80
85
|
|
|
81
86
|
_Agent = _agent.Agent # noqa: N806
|
|
82
87
|
_Trajectory = _trajectory.Trajectory # noqa: N806
|
|
@@ -84,11 +89,18 @@ def _lazy_init() -> None:
|
|
|
84
89
|
_Agent.model_rebuild()
|
|
85
90
|
_Trajectory.model_rebuild()
|
|
86
91
|
|
|
92
|
+
# Expose AgentJudge as ``Agent.Judge`` for discoverability. ``Agent`` is
|
|
93
|
+
# the primary abstraction; ``Agent.Judge(...)`` is the specialized
|
|
94
|
+
# construction mirror for trajectory-scoring use cases.
|
|
95
|
+
_Agent.Judge = _judge.AgentJudge
|
|
96
|
+
|
|
87
97
|
g = globals()
|
|
88
98
|
g["events"] = _events
|
|
89
99
|
g["reactions"] = _reactions
|
|
90
100
|
g["stopping"] = _stopping
|
|
91
101
|
g["Agent"] = _Agent
|
|
102
|
+
g["AgentJudge"] = _judge.AgentJudge
|
|
103
|
+
g["JudgeResult"] = _judge.JudgeResult
|
|
92
104
|
g["Trajectory"] = _Trajectory
|
|
93
105
|
g["Continue"] = _reactions.Continue
|
|
94
106
|
g["Fail"] = _reactions.Fail
|
|
@@ -6,7 +6,6 @@ import time
|
|
|
6
6
|
import typing as t
|
|
7
7
|
from contextlib import AsyncExitStack, asynccontextmanager, suppress
|
|
8
8
|
from copy import deepcopy
|
|
9
|
-
from pathlib import Path
|
|
10
9
|
from textwrap import dedent
|
|
11
10
|
from uuid import UUID, uuid4
|
|
12
11
|
|
|
@@ -169,8 +168,6 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
169
168
|
"""Timeout in seconds for each LLM generation call. None = no timeout."""
|
|
170
169
|
generate_params_extra: dict[str, t.Any] = Config(default_factory=dict)
|
|
171
170
|
"""Extra parameters merged into GenerateParams for every generation (e.g. thinking config)."""
|
|
172
|
-
working_dir: Path | None = Config(default=None)
|
|
173
|
-
"""Working directory used for tool output offloading and other IO."""
|
|
174
171
|
backoff_max_tries: int = Config(default=8, ge=0)
|
|
175
172
|
"""Maximum retries on transient LLM API errors per step. ``0`` disables retry."""
|
|
176
173
|
backoff_max_time: float = Config(default=300.0, ge=0)
|
|
@@ -184,6 +181,15 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
184
181
|
_generator: Generator | None = PrivateAttr(None, init=False)
|
|
185
182
|
_current_input: str = PrivateAttr("", init=False)
|
|
186
183
|
|
|
184
|
+
# Discoverability namespace for the AgentJudge specialized construction.
|
|
185
|
+
# Assigned at module-load time by ``dreadnode.agents.__init__._lazy_init``
|
|
186
|
+
# to break the import cycle between Agent and AgentJudge (which in turn
|
|
187
|
+
# imports the llm_judge scorer stack).
|
|
188
|
+
if t.TYPE_CHECKING:
|
|
189
|
+
from dreadnode.agents.judge import AgentJudge
|
|
190
|
+
|
|
191
|
+
Judge: t.ClassVar[type[AgentJudge]]
|
|
192
|
+
|
|
187
193
|
@field_validator("tools", mode="before")
|
|
188
194
|
@classmethod
|
|
189
195
|
def validate_tools(cls, value: t.Any) -> t.Any:
|
|
@@ -219,14 +225,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
219
225
|
return StopCondition.fit_many(value)
|
|
220
226
|
|
|
221
227
|
@model_validator(mode="after")
|
|
222
|
-
def
|
|
228
|
+
def ensure_agent_tag(self) -> "Agent":
|
|
223
229
|
if "agent" not in self.tags:
|
|
224
230
|
self.tags.insert(0, "agent")
|
|
225
|
-
|
|
226
|
-
working_dir = self.working_dir or Path.cwd()
|
|
227
|
-
for tool in self.all_tools:
|
|
228
|
-
if tool.working_dir is None:
|
|
229
|
-
tool.working_dir = working_dir
|
|
230
231
|
return self
|
|
231
232
|
|
|
232
233
|
@property
|
|
@@ -640,9 +641,6 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
640
641
|
|
|
641
642
|
return
|
|
642
643
|
|
|
643
|
-
if tool.working_dir is None:
|
|
644
|
-
tool.working_dir = self.working_dir or Path.cwd()
|
|
645
|
-
|
|
646
644
|
try:
|
|
647
645
|
message, stop = await tool.handle_tool_call(tool_call)
|
|
648
646
|
|
|
@@ -152,6 +152,15 @@ class AgentStep(AgentEvent):
|
|
|
152
152
|
|
|
153
153
|
@property
|
|
154
154
|
def estimated_cost(self) -> float | None:
|
|
155
|
+
# Prefer the cost litellm attached to the response - it dispatches
|
|
156
|
+
# per-provider (anthropic_cost_per_token, openai_cost_per_token,
|
|
157
|
+
# bedrock_*, vertex_*, gemini_*, ...) and honours cache_read /
|
|
158
|
+
# cache_creation rates, reasoning tokens, tiered pricing, and
|
|
159
|
+
# region/service-tier multipliers. The naive math below ignores
|
|
160
|
+
# all of that and is wrong by 30-80% under prompt caching.
|
|
161
|
+
if self.usage.cost_usd is not None:
|
|
162
|
+
return self.usage.cost_usd
|
|
163
|
+
|
|
155
164
|
import litellm
|
|
156
165
|
|
|
157
166
|
if self.generator is None:
|
|
@@ -701,6 +710,7 @@ class GenerationStep(AgentStep):
|
|
|
701
710
|
"input_tokens": self.usage.input_tokens,
|
|
702
711
|
"output_tokens": self.usage.output_tokens,
|
|
703
712
|
"total_tokens": self.usage.total_tokens,
|
|
713
|
+
"cost_usd": self.estimated_cost,
|
|
704
714
|
},
|
|
705
715
|
"stop_reason": self.stop_reason,
|
|
706
716
|
"model": self.generator.model if self.generator else None,
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Agent.Judge — specialized agent for evaluating trajectories against a rubric.
|
|
2
|
+
|
|
3
|
+
Thin wrapper over ``dreadnode.scorers.judge.llm_judge`` that adapts the scorer
|
|
4
|
+
to consume a full :class:`Trajectory` (multi-turn message log) rather than a
|
|
5
|
+
single output string. Used by the hosted training ``llm_judge`` verification
|
|
6
|
+
method and by anyone grading rollouts in a notebook.
|
|
7
|
+
|
|
8
|
+
Exposed as ``Agent.Judge(...)`` (class attribute) and as ``AgentJudge`` directly
|
|
9
|
+
from ``dreadnode.agents``.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import typing as t
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from dreadnode.core.metric import Metric
|
|
17
|
+
|
|
18
|
+
if t.TYPE_CHECKING:
|
|
19
|
+
from dreadnode.agents.trajectory import Trajectory
|
|
20
|
+
from dreadnode.core.scorer import Scorer
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(slots=True)
|
|
24
|
+
class JudgeResult:
|
|
25
|
+
"""Structured result of an :class:`AgentJudge` evaluation.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
passed: Whether the trajectory cleared the judge's passing threshold.
|
|
29
|
+
score: Scalar in ``[0, 1]`` — the rubric-driven judge score.
|
|
30
|
+
reason: Free-text rationale returned by the judge LLM.
|
|
31
|
+
metrics: Raw metric list from the underlying scorer (score metric
|
|
32
|
+
first, followed by the boolean pass metric).
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
passed: bool
|
|
36
|
+
score: float
|
|
37
|
+
reason: str
|
|
38
|
+
metrics: list[Metric] = field(default_factory=list)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class AgentJudge:
|
|
42
|
+
"""Specialized agent that evaluates a :class:`Trajectory` against a rubric.
|
|
43
|
+
|
|
44
|
+
Example::
|
|
45
|
+
|
|
46
|
+
from dreadnode.agents import Agent
|
|
47
|
+
|
|
48
|
+
judge = Agent.Judge(
|
|
49
|
+
model="openai/gpt-4o",
|
|
50
|
+
rubric="rce",
|
|
51
|
+
passing_threshold=0.7,
|
|
52
|
+
)
|
|
53
|
+
result = await judge.evaluate(rollout.trajectory)
|
|
54
|
+
if result.passed:
|
|
55
|
+
print("win!", result.score, result.reason)
|
|
56
|
+
|
|
57
|
+
Reuses the production :func:`dreadnode.scorers.judge.llm_judge` scorer
|
|
58
|
+
(rubric YAML loading, XML response parsing, fallback regex, etc.) — this
|
|
59
|
+
class only adapts the transcript shape and surfaces a :class:`JudgeResult`.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
*,
|
|
65
|
+
model: str,
|
|
66
|
+
rubric: str | Path,
|
|
67
|
+
passing_threshold: float = 0.5,
|
|
68
|
+
system_prompt: str | None = None,
|
|
69
|
+
model_params: dict[str, t.Any] | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
if not 0.0 <= passing_threshold <= 1.0:
|
|
72
|
+
raise ValueError(
|
|
73
|
+
f"passing_threshold must be between 0.0 and 1.0 (got {passing_threshold!r})"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Lazy import keeps agents/__init__ import graph cheap — scorers.judge
|
|
77
|
+
# pulls in yaml + the rubrics dir.
|
|
78
|
+
from dreadnode.scorers.judge import llm_judge
|
|
79
|
+
|
|
80
|
+
self._model = model
|
|
81
|
+
self._rubric = rubric
|
|
82
|
+
self._passing_threshold = passing_threshold
|
|
83
|
+
self._system_prompt = system_prompt
|
|
84
|
+
self._model_params = model_params
|
|
85
|
+
self._scorer: Scorer[t.Any] = llm_judge(
|
|
86
|
+
model=model,
|
|
87
|
+
rubric=rubric,
|
|
88
|
+
passing=lambda score: score >= passing_threshold,
|
|
89
|
+
system_prompt=system_prompt,
|
|
90
|
+
model_params=model_params,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def model(self) -> str:
|
|
95
|
+
return self._model
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def rubric(self) -> str | Path:
|
|
99
|
+
return self._rubric
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def passing_threshold(self) -> float:
|
|
103
|
+
return self._passing_threshold
|
|
104
|
+
|
|
105
|
+
async def evaluate(
|
|
106
|
+
self,
|
|
107
|
+
trajectory: "Trajectory",
|
|
108
|
+
*,
|
|
109
|
+
context: dict[str, t.Any] | None = None,
|
|
110
|
+
) -> JudgeResult:
|
|
111
|
+
"""Score ``trajectory`` against the configured rubric.
|
|
112
|
+
|
|
113
|
+
Flattens ``trajectory.messages`` to a transcript formatted as
|
|
114
|
+
``[role] content`` lines, optionally prepended with a
|
|
115
|
+
``# Task context`` block built from ``context`` (task instruction,
|
|
116
|
+
env service URLs, flag hints, etc.).
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
trajectory: The agent run to evaluate. Uses ``trajectory.messages``
|
|
120
|
+
which already chains per-step messages in chat order.
|
|
121
|
+
context: Optional per-call context merged into the judge's input.
|
|
122
|
+
Good use: pass the rendered task instruction and any known
|
|
123
|
+
ground-truth hints so the judge can evaluate faithfulness.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
A :class:`JudgeResult` with ``passed`` / ``score`` / ``reason``.
|
|
127
|
+
|
|
128
|
+
Raises:
|
|
129
|
+
ValueError: if the scorer returned fewer than two metrics (the
|
|
130
|
+
scorer contract is score metric + pass metric).
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
transcript = self._trajectory_to_transcript(trajectory, context=context)
|
|
134
|
+
metrics = await self._scorer.normalize_and_score(transcript)
|
|
135
|
+
if not metrics:
|
|
136
|
+
raise ValueError(
|
|
137
|
+
"AgentJudge scorer returned no metrics — check the judge model's output format."
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
score_metric = metrics[0]
|
|
141
|
+
score = float(score_metric.value)
|
|
142
|
+
reason = str(score_metric.attributes.get("reason", ""))
|
|
143
|
+
|
|
144
|
+
# Second metric is the boolean pass flag (see scorers/judge.py). If
|
|
145
|
+
# absent, fall back to threshold comparison so callers still get a
|
|
146
|
+
# sensible ``passed`` value.
|
|
147
|
+
if len(metrics) >= 2:
|
|
148
|
+
passed = bool(metrics[1].value)
|
|
149
|
+
else:
|
|
150
|
+
passed = score >= self._passing_threshold
|
|
151
|
+
|
|
152
|
+
return JudgeResult(
|
|
153
|
+
passed=passed,
|
|
154
|
+
score=score,
|
|
155
|
+
reason=reason,
|
|
156
|
+
metrics=list(metrics),
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
def _trajectory_to_transcript(
|
|
161
|
+
trajectory: "Trajectory",
|
|
162
|
+
*,
|
|
163
|
+
context: dict[str, t.Any] | None = None,
|
|
164
|
+
) -> str:
|
|
165
|
+
"""Render a transcript the judge LLM can consume.
|
|
166
|
+
|
|
167
|
+
Format:
|
|
168
|
+
# Task context
|
|
169
|
+
- key: value
|
|
170
|
+
- ...
|
|
171
|
+
|
|
172
|
+
# Conversation transcript
|
|
173
|
+
[system] ...
|
|
174
|
+
[user] ...
|
|
175
|
+
[assistant] ...
|
|
176
|
+
...
|
|
177
|
+
|
|
178
|
+
Context is optional. The conversation section always appears, even
|
|
179
|
+
for empty trajectories (judge then scores on instruction only).
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
lines: list[str] = []
|
|
183
|
+
if context:
|
|
184
|
+
lines.append("# Task context")
|
|
185
|
+
for key, value in context.items():
|
|
186
|
+
lines.append(f"- {key}: {value}")
|
|
187
|
+
lines.append("")
|
|
188
|
+
lines.append("# Conversation transcript")
|
|
189
|
+
for msg in trajectory.messages:
|
|
190
|
+
role = getattr(msg, "role", "unknown")
|
|
191
|
+
content = getattr(msg, "content", "") or ""
|
|
192
|
+
lines.append(f"[{role}] {content}")
|
|
193
|
+
return "\n".join(lines)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
__all__ = ["AgentJudge", "JudgeResult"]
|
|
@@ -15,6 +15,7 @@ import yaml
|
|
|
15
15
|
from loguru import logger
|
|
16
16
|
|
|
17
17
|
from dreadnode.agents.tools import tool
|
|
18
|
+
from dreadnode.capabilities.capability import Capability
|
|
18
19
|
|
|
19
20
|
# CAP-IDENT-010 (skill surface): unsafe characters are replaced with `_` and
|
|
20
21
|
# the segment is trimmed of leading/trailing `_`. Unlike the tool wire surface,
|
|
@@ -522,3 +523,13 @@ def create_skill_tool(skills: list[Skill]) -> t.Any:
|
|
|
522
523
|
return resolve_skill(name, skills).render_content()
|
|
523
524
|
|
|
524
525
|
return skill
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def attach_capability_skills(*, agent: t.Any, capability: Capability) -> None:
|
|
529
|
+
"""Attach capability-local skills to the reconstructed agent, if any."""
|
|
530
|
+
|
|
531
|
+
all_skills: list[Skill] = []
|
|
532
|
+
for skills_path in capability.skills_paths or []:
|
|
533
|
+
all_skills.extend(discover_skills(skills_path))
|
|
534
|
+
if all_skills:
|
|
535
|
+
agent.tools.append(create_skill_tool(all_skills))
|
|
@@ -7,7 +7,6 @@ import re
|
|
|
7
7
|
import typing as t
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
|
-
import aiofiles
|
|
11
10
|
import typing_extensions as te
|
|
12
11
|
from pydantic import (
|
|
13
12
|
BaseModel,
|
|
@@ -167,20 +166,19 @@ async def offload_tool_output(
|
|
|
167
166
|
content: str,
|
|
168
167
|
tool_call_id: str,
|
|
169
168
|
tool_name: str, # noqa: ARG001 - callers pass as keyword arg
|
|
170
|
-
working_dir: Path,
|
|
171
169
|
) -> tuple[str, Path]:
|
|
172
|
-
"""Write tool output to disk and return middle-out summary plus file path.
|
|
173
|
-
output_root = working_dir if working_dir.name == ".dreadnode" else working_dir / ".dreadnode"
|
|
174
|
-
output_dir = output_root / "tool-output"
|
|
175
|
-
await asyncio.to_thread(output_dir.mkdir, parents=True, exist_ok=True)
|
|
170
|
+
"""Write tool output to disk and return middle-out summary plus file path.
|
|
176
171
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
172
|
+
Output lands at ``<cache>/tool-output/<YYYYMMDD-HHMMSS>-<tool_call_id>.txt``,
|
|
173
|
+
where ``<cache>`` is the active Dreadnode instance's cache directory
|
|
174
|
+
(``~/.dreadnode`` by default; honors ``configure(cache=...)``).
|
|
175
|
+
"""
|
|
176
|
+
from dreadnode import _get_default_instance
|
|
177
|
+
from dreadnode.storage.storage import write_timestamped
|
|
181
178
|
|
|
182
|
-
|
|
183
|
-
|
|
179
|
+
output_dir = _get_default_instance().storage.tool_output_path
|
|
180
|
+
safe_id = re.sub(r"[^a-zA-Z0-9_-]", "_", tool_call_id)
|
|
181
|
+
file_path = await asyncio.to_thread(write_timestamped, output_dir, f"{safe_id}.txt", content)
|
|
184
182
|
|
|
185
183
|
half = OFFLOAD_THRESHOLD // 2
|
|
186
184
|
start = content[:half]
|
|
@@ -189,7 +187,7 @@ async def offload_tool_output(
|
|
|
189
187
|
|
|
190
188
|
truncated = (
|
|
191
189
|
f"{start}\n\n"
|
|
192
|
-
f"... [{middle_lines} lines truncated — full output saved to {
|
|
190
|
+
f"... [{middle_lines} lines truncated — full output saved to {file_path}] ...\n\n"
|
|
193
191
|
f"{end}"
|
|
194
192
|
)
|
|
195
193
|
return truncated, file_path
|
|
@@ -304,8 +302,6 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
304
302
|
"""If set, the maximum number of characters to truncate any tool output to."""
|
|
305
303
|
offload: bool = True
|
|
306
304
|
"""Whether large tool outputs should be offloaded to disk."""
|
|
307
|
-
working_dir: Path | None = None
|
|
308
|
-
"""Working directory used to store offloaded tool outputs."""
|
|
309
305
|
|
|
310
306
|
_signature: inspect.Signature | None = PrivateAttr(default=None, init=False)
|
|
311
307
|
_type_adapter: TypeAdapter[t.Any] | None = PrivateAttr(default=None, init=False)
|
|
@@ -535,16 +531,24 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
535
531
|
message = message.shorten(self.truncate)
|
|
536
532
|
|
|
537
533
|
if self.offload and message.content and len(message.content) > OFFLOAD_THRESHOLD:
|
|
538
|
-
|
|
534
|
+
from dreadnode import _get_default_instance
|
|
535
|
+
|
|
539
536
|
truncated_content, output_file = await offload_tool_output(
|
|
540
537
|
message.content,
|
|
541
538
|
tool_call.id,
|
|
542
539
|
tool_call.name,
|
|
543
|
-
working_dir,
|
|
544
540
|
)
|
|
545
541
|
message = message.clone()
|
|
546
542
|
message.content_parts = [ContentText(text=truncated_content)]
|
|
547
|
-
|
|
543
|
+
# Strip cache root before persisting on the span — absolute paths
|
|
544
|
+
# leak user home / hostname to the platform without giving the
|
|
545
|
+
# server anything actionable (the file is local-only).
|
|
546
|
+
cache_root = _get_default_instance().cache
|
|
547
|
+
try:
|
|
548
|
+
metadata_path = output_file.relative_to(cache_root)
|
|
549
|
+
except ValueError:
|
|
550
|
+
metadata_path = output_file
|
|
551
|
+
message.metadata["output_file"] = str(metadata_path)
|
|
548
552
|
|
|
549
553
|
return message, stop
|
|
550
554
|
|
|
@@ -564,7 +568,6 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
564
568
|
catch=self.catch,
|
|
565
569
|
truncate=self.truncate,
|
|
566
570
|
offload=self.offload,
|
|
567
|
-
working_dir=self.working_dir,
|
|
568
571
|
)
|
|
569
572
|
|
|
570
573
|
new._signature = self._signature
|
|
@@ -24,7 +24,6 @@ import contextvars
|
|
|
24
24
|
import os
|
|
25
25
|
import signal
|
|
26
26
|
import typing as t
|
|
27
|
-
import uuid
|
|
28
27
|
from pathlib import Path
|
|
29
28
|
|
|
30
29
|
from loguru import logger
|
|
@@ -127,7 +126,6 @@ class Assessment:
|
|
|
127
126
|
|
|
128
127
|
self._assessment_id: str | None = None
|
|
129
128
|
self._attack_results: list[AttackResult] = []
|
|
130
|
-
self._attack_run_ids: dict[int, str] = {} # index in _attack_results -> platform run_id
|
|
131
129
|
self._tracing_enabled: bool = False
|
|
132
130
|
self._auto_registered: bool = False
|
|
133
131
|
self._context_token: contextvars.Token[Assessment | None] | None = None
|
|
@@ -232,14 +230,10 @@ class Assessment:
|
|
|
232
230
|
yield a
|
|
233
231
|
|
|
234
232
|
async def _finalize(self) -> None:
|
|
235
|
-
"""
|
|
233
|
+
"""Flush pending OTEL spans and mark complete."""
|
|
236
234
|
if not self._attack_results:
|
|
237
235
|
return
|
|
238
236
|
|
|
239
|
-
for i, result in enumerate(self._attack_results):
|
|
240
|
-
if i not in self._attack_run_ids:
|
|
241
|
-
await self.upload_result(result)
|
|
242
|
-
|
|
243
237
|
# Flush pending OTEL spans BEFORE marking complete so CH has data
|
|
244
238
|
# when the API materializes findings on status change.
|
|
245
239
|
# dn.shutdown() would kill the trace provider, breaking any
|
|
@@ -327,7 +321,6 @@ class Assessment:
|
|
|
327
321
|
execution_time_s=getattr(result, "execution_time_s", 0.0),
|
|
328
322
|
)
|
|
329
323
|
self._attack_results.append(ar)
|
|
330
|
-
await self.upload_result(ar)
|
|
331
324
|
|
|
332
325
|
return result
|
|
333
326
|
|
|
@@ -496,65 +489,6 @@ class Assessment:
|
|
|
496
489
|
_current_assessment.reset(self._context_token)
|
|
497
490
|
self._context_token = None
|
|
498
491
|
|
|
499
|
-
# =========================================================================
|
|
500
|
-
# Result Upload
|
|
501
|
-
# =========================================================================
|
|
502
|
-
|
|
503
|
-
async def upload_result(self, result: AttackResult) -> str | None:
|
|
504
|
-
"""Register and upload an attack result to the platform.
|
|
505
|
-
|
|
506
|
-
Args:
|
|
507
|
-
result: The AttackResult to upload.
|
|
508
|
-
|
|
509
|
-
Returns:
|
|
510
|
-
The platform run ID, or None if offline.
|
|
511
|
-
"""
|
|
512
|
-
ctx = _get_platform_context()
|
|
513
|
-
if ctx is None or self._assessment_id is None:
|
|
514
|
-
return None
|
|
515
|
-
|
|
516
|
-
api, profile = ctx
|
|
517
|
-
org = profile.org_key
|
|
518
|
-
ws = profile.workspace_key
|
|
519
|
-
|
|
520
|
-
try:
|
|
521
|
-
trace_id = uuid.uuid4().hex
|
|
522
|
-
run_data = api.register_airt_attack_run(
|
|
523
|
-
org,
|
|
524
|
-
ws,
|
|
525
|
-
self._assessment_id,
|
|
526
|
-
attack_name=result.attack_name,
|
|
527
|
-
goal=result.goal,
|
|
528
|
-
goal_category=result.goal_category.value,
|
|
529
|
-
transforms_applied=result.transforms_applied,
|
|
530
|
-
compliance_tags=result.compliance_tags,
|
|
531
|
-
trace_id=trace_id,
|
|
532
|
-
)
|
|
533
|
-
run_id = run_data["id"]
|
|
534
|
-
|
|
535
|
-
api.upload_airt_attack_result(
|
|
536
|
-
org,
|
|
537
|
-
ws,
|
|
538
|
-
self._assessment_id,
|
|
539
|
-
run_id,
|
|
540
|
-
attack_result_json=result.to_dict(),
|
|
541
|
-
best_score=result.best_score,
|
|
542
|
-
total_trials=result.total_trials,
|
|
543
|
-
finished_trials=len(result.finished_trials),
|
|
544
|
-
execution_time_s=result.execution_time_s,
|
|
545
|
-
)
|
|
546
|
-
except Exception as e:
|
|
547
|
-
logger.error(f"Failed to upload attack result: {e}")
|
|
548
|
-
return None
|
|
549
|
-
|
|
550
|
-
idx = len(self._attack_results) - 1
|
|
551
|
-
if result in self._attack_results:
|
|
552
|
-
idx = self._attack_results.index(result)
|
|
553
|
-
self._attack_run_ids[idx] = run_id
|
|
554
|
-
|
|
555
|
-
logger.info(f"Attack result uploaded: {result.attack_name} -> {run_id}")
|
|
556
|
-
return run_id
|
|
557
|
-
|
|
558
492
|
# =========================================================================
|
|
559
493
|
# Lifecycle
|
|
560
494
|
# =========================================================================
|