dreadnode 2.0.38__tar.gz → 2.0.40__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.38 → dreadnode-2.0.40}/PKG-INFO +18 -6
- {dreadnode-2.0.38 → dreadnode-2.0.40}/README.md +12 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/agent.py +137 -17
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/events.py +14 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/hooks.py +169 -9
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/process_judge.py +32 -8
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/reactions.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/tools.py +3 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/trajectory.py +13 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/client.py +356 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/models.py +40 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/airt.py +36 -41
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/args.py +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/capability.py +146 -25
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/evaluation.py +24 -16
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/main.py +2 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/shared.py +209 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/task.py +149 -18
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/task_set.py +192 -7
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/runtime_client.py +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/main.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/app.py +169 -20
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/model_resolution.py +9 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/runtime_token.py +11 -41
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/app.py +123 -7
- dreadnode-2.0.40/dreadnode/app/tui/bug_report.py +489 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/command_dispatcher.py +3 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/commands.py +1 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/dreadnode.tcss +42 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/error_handler.py +4 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/profile_manager.py +15 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screen_router.py +68 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/__init__.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/auth.py +81 -17
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/capabilities.py +14 -9
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/capability_docs.py +10 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/connection_error.py +3 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/console.py +10 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/environments.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/evaluations.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/readme.py +10 -0
- dreadnode-2.0.40/dreadnode/app/tui/screens/report_bug.py +429 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/runtimes.py +135 -43
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/sandboxes.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/secrets.py +7 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/services.py +20 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/sessions.py +10 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/traces.py +7 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/sessions_manager.py +155 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_reducer.py +50 -5
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/context_bar.py +4 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/conversation.py +3 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/header_bar.py +2 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/help_panel.py +14 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/prompt_info.py +2 -1
- dreadnode-2.0.40/dreadnode/app/tui/widgets/scope_modal.py +401 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tool.py +13 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/wire_events.py +49 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +230 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +15 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +11 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +13 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +3 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +6 -6
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +128 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +13 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +24 -8
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +12 -6
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +38 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +2 -12
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +177 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +9 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +17 -9
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +5 -9
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +16 -7
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +3 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +16 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +12 -12
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +4 -8
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +6 -4
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +78 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +2 -0
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +113 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +20 -8
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +18 -18
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +4 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +1 -1
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +94 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +2 -0
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +79 -0
- dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +43 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/loader.py +20 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/sync.py +6 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/log.py +61 -19
- dreadnode-2.0.40/dreadnode/core/tls.py +113 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/audio.py +6 -5
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/litellm_.py +41 -15
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/config.py +66 -25
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/jobs.py +18 -6
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/manifest.py +4 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/oci.py +36 -4
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/__init__.py +16 -5
- dreadnode-2.0.40/dreadnode/policies/guard.py +240 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/rubrics/process/default.yaml +11 -6
- dreadnode-2.0.40/dreadnode/policies/scope.py +633 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/__init__.py +6 -1
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/dreadnode_cli.py +14 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/report_items.py +574 -60
- dreadnode-2.0.40/dreadnode/tools/submission.py +225 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/exporter.py +4 -2
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/span.py +5 -3
- {dreadnode-2.0.38 → dreadnode-2.0.40}/pyproject.toml +13 -3
- dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -144
- dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -136
- dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -96
- dreadnode-2.0.38/dreadnode/policies/guard.py +0 -193
- {dreadnode-2.0.38 → dreadnode-2.0.40}/.gitignore +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/LICENSE +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/AGENTS.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/claude_code.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/native.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/sanitize.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/art_engine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/defense.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/failure.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/gate.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/modes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/probes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/recon.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/router.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/strategy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/_text_common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/bae.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/boundary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/deepwordbug.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/hopskipjump.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/pwws.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/simba.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/square.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/textbugger.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/textfooler.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/zoo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/activethief.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/copycat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/distillation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/equation_solving.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/jacobian.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/knockoff.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/confidence.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/nes_inversion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/entropy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/label_only.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/lira.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/loss.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/shadow_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/threshold.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/message_parts.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/model_export.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/target.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/factory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/http.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/message.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/prediction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/spec.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/streaming/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/ws_auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/proxy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/trajectory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/trajectory_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/reconciliation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/project_memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: dreadnode
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.40
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -11,7 +11,7 @@ Requires-Dist: aiofiles<25.0.0,>=24.1.0
|
|
|
11
11
|
Requires-Dist: art<7.0.0,>=6.5
|
|
12
12
|
Requires-Dist: aws-sdk-bedrock-runtime>=0.7.0; python_version >= '3.12'
|
|
13
13
|
Requires-Dist: awscrt>=0.27.0; python_version >= '3.12'
|
|
14
|
-
Requires-Dist: boto3
|
|
14
|
+
Requires-Dist: boto3<=1.41.5,>=1.40.0
|
|
15
15
|
Requires-Dist: coolname<3.0.0,>=2.2.0
|
|
16
16
|
Requires-Dist: croniter<7.0.0,>=6.0.0
|
|
17
17
|
Requires-Dist: cyclopts>=4.2.0
|
|
@@ -24,6 +24,7 @@ Requires-Dist: gepa>=0.1.1
|
|
|
24
24
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
25
25
|
Requires-Dist: jsonpath-ng>=1.7.0
|
|
26
26
|
Requires-Dist: jsonref>=1.1.0
|
|
27
|
+
Requires-Dist: jsonschema>=4.26.0
|
|
27
28
|
Requires-Dist: litellm<=1.84.0,>=1.84.0
|
|
28
29
|
Requires-Dist: logfire<=3.20.0,>=3.5.3
|
|
29
30
|
Requires-Dist: loguru>=0.7.3
|
|
@@ -42,12 +43,14 @@ Requires-Dist: pyarrow>=4.0.0
|
|
|
42
43
|
Requires-Dist: pydantic-xml>=2.14.0
|
|
43
44
|
Requires-Dist: pydantic<3.0.0,>=2.9.2
|
|
44
45
|
Requires-Dist: pyyaml>=6.0.2
|
|
46
|
+
Requires-Dist: s3fs<=2025.10.0,>=2025.10.0
|
|
45
47
|
Requires-Dist: scipy<2.0.0,>=1.11.0
|
|
46
48
|
Requires-Dist: smithy-aws-core>=0.7.0; python_version >= '3.12'
|
|
47
49
|
Requires-Dist: soundfile<1.0.0,>=0.13.1
|
|
48
50
|
Requires-Dist: starlette<1.4.0,>=1.3.1
|
|
49
51
|
Requires-Dist: textual>=8.0.2
|
|
50
52
|
Requires-Dist: transformers>=4.57.1
|
|
53
|
+
Requires-Dist: truststore<1.0.0,>=0.10.4
|
|
51
54
|
Requires-Dist: uvicorn>=0.34.0
|
|
52
55
|
Requires-Dist: websockets>=14.0
|
|
53
56
|
Requires-Dist: xmltodict>=1.0.2
|
|
@@ -131,24 +134,27 @@ import dreadnode as dn
|
|
|
131
134
|
|
|
132
135
|
dn.configure()
|
|
133
136
|
|
|
137
|
+
|
|
134
138
|
# Define a tool
|
|
135
139
|
@dn.tool
|
|
136
140
|
def search_database(query: str) -> list[str]:
|
|
137
141
|
"""Search the vulnerability database."""
|
|
138
142
|
return ["CVE-2024-1234", "CVE-2024-5678"]
|
|
139
143
|
|
|
144
|
+
|
|
140
145
|
# Create an agent with tools
|
|
141
146
|
@dn.agent(model="openai/gpt-4o", tools=[search_database])
|
|
142
147
|
def security_analyst():
|
|
143
148
|
"""You are a security analyst. Find and analyze vulnerabilities."""
|
|
144
149
|
|
|
150
|
+
|
|
145
151
|
# Run the agent - tracing is automatic
|
|
146
152
|
async def main():
|
|
147
|
-
trajectory = await security_analyst.run(
|
|
148
|
-
"Analyze recent vulnerabilities in the database"
|
|
149
|
-
)
|
|
153
|
+
trajectory = await security_analyst.run("Analyze recent vulnerabilities in the database")
|
|
150
154
|
|
|
151
155
|
print(f"Completed in {len(trajectory.steps)} steps")
|
|
156
|
+
|
|
157
|
+
|
|
152
158
|
print(f"Token usage: {trajectory.usage.total_tokens}")
|
|
153
159
|
```
|
|
154
160
|
|
|
@@ -190,12 +196,14 @@ import dreadnode as dn
|
|
|
190
196
|
from dreadnode import tool
|
|
191
197
|
from dreadnode.core.agents.reactions import Finish, Continue
|
|
192
198
|
|
|
199
|
+
|
|
193
200
|
# Tools with type hints
|
|
194
201
|
@tool
|
|
195
202
|
def scan_ports(host: str) -> list[int]:
|
|
196
203
|
"""Scan for open ports on a host."""
|
|
197
204
|
return [22, 80, 443] # Simplified example
|
|
198
205
|
|
|
206
|
+
|
|
199
207
|
# Agent with configuration
|
|
200
208
|
@dn.agent(
|
|
201
209
|
model="anthropic/claude-3-5-sonnet",
|
|
@@ -205,6 +213,7 @@ def scan_ports(host: str) -> list[int]:
|
|
|
205
213
|
def pentester():
|
|
206
214
|
"""You are a penetration tester. Find security issues."""
|
|
207
215
|
|
|
216
|
+
|
|
208
217
|
# Hooks for control flow
|
|
209
218
|
@pentester.hook
|
|
210
219
|
async def check_progress(event):
|
|
@@ -212,6 +221,7 @@ async def check_progress(event):
|
|
|
212
221
|
return Finish("Vulnerability discovered")
|
|
213
222
|
return Continue()
|
|
214
223
|
|
|
224
|
+
|
|
215
225
|
# Run the agent
|
|
216
226
|
trajectory = await pentester.run("Test the web application at localhost:8080")
|
|
217
227
|
print(f"Completed in {len(trajectory.steps)} steps")
|
|
@@ -354,6 +364,7 @@ import dreadnode as dn
|
|
|
354
364
|
trajectory = await security_analyst.run("Analyze the target")
|
|
355
365
|
# All steps, tool calls, and generations are traced
|
|
356
366
|
|
|
367
|
+
|
|
357
368
|
# For custom task workflows, use explicit runs
|
|
358
369
|
@dn.task
|
|
359
370
|
async def analyze(target: str) -> dict:
|
|
@@ -363,6 +374,7 @@ async def analyze(target: str) -> dict:
|
|
|
363
374
|
dn.log_metric("quality", 0.95)
|
|
364
375
|
return result
|
|
365
376
|
|
|
377
|
+
|
|
366
378
|
with dn.run(name="custom-analysis"):
|
|
367
379
|
await analyze("webapp")
|
|
368
380
|
```
|
|
@@ -42,24 +42,27 @@ import dreadnode as dn
|
|
|
42
42
|
|
|
43
43
|
dn.configure()
|
|
44
44
|
|
|
45
|
+
|
|
45
46
|
# Define a tool
|
|
46
47
|
@dn.tool
|
|
47
48
|
def search_database(query: str) -> list[str]:
|
|
48
49
|
"""Search the vulnerability database."""
|
|
49
50
|
return ["CVE-2024-1234", "CVE-2024-5678"]
|
|
50
51
|
|
|
52
|
+
|
|
51
53
|
# Create an agent with tools
|
|
52
54
|
@dn.agent(model="openai/gpt-4o", tools=[search_database])
|
|
53
55
|
def security_analyst():
|
|
54
56
|
"""You are a security analyst. Find and analyze vulnerabilities."""
|
|
55
57
|
|
|
58
|
+
|
|
56
59
|
# Run the agent - tracing is automatic
|
|
57
60
|
async def main():
|
|
58
|
-
trajectory = await security_analyst.run(
|
|
59
|
-
"Analyze recent vulnerabilities in the database"
|
|
60
|
-
)
|
|
61
|
+
trajectory = await security_analyst.run("Analyze recent vulnerabilities in the database")
|
|
61
62
|
|
|
62
63
|
print(f"Completed in {len(trajectory.steps)} steps")
|
|
64
|
+
|
|
65
|
+
|
|
63
66
|
print(f"Token usage: {trajectory.usage.total_tokens}")
|
|
64
67
|
```
|
|
65
68
|
|
|
@@ -101,12 +104,14 @@ import dreadnode as dn
|
|
|
101
104
|
from dreadnode import tool
|
|
102
105
|
from dreadnode.core.agents.reactions import Finish, Continue
|
|
103
106
|
|
|
107
|
+
|
|
104
108
|
# Tools with type hints
|
|
105
109
|
@tool
|
|
106
110
|
def scan_ports(host: str) -> list[int]:
|
|
107
111
|
"""Scan for open ports on a host."""
|
|
108
112
|
return [22, 80, 443] # Simplified example
|
|
109
113
|
|
|
114
|
+
|
|
110
115
|
# Agent with configuration
|
|
111
116
|
@dn.agent(
|
|
112
117
|
model="anthropic/claude-3-5-sonnet",
|
|
@@ -116,6 +121,7 @@ def scan_ports(host: str) -> list[int]:
|
|
|
116
121
|
def pentester():
|
|
117
122
|
"""You are a penetration tester. Find security issues."""
|
|
118
123
|
|
|
124
|
+
|
|
119
125
|
# Hooks for control flow
|
|
120
126
|
@pentester.hook
|
|
121
127
|
async def check_progress(event):
|
|
@@ -123,6 +129,7 @@ async def check_progress(event):
|
|
|
123
129
|
return Finish("Vulnerability discovered")
|
|
124
130
|
return Continue()
|
|
125
131
|
|
|
132
|
+
|
|
126
133
|
# Run the agent
|
|
127
134
|
trajectory = await pentester.run("Test the web application at localhost:8080")
|
|
128
135
|
print(f"Completed in {len(trajectory.steps)} steps")
|
|
@@ -265,6 +272,7 @@ import dreadnode as dn
|
|
|
265
272
|
trajectory = await security_analyst.run("Analyze the target")
|
|
266
273
|
# All steps, tool calls, and generations are traced
|
|
267
274
|
|
|
275
|
+
|
|
268
276
|
# For custom task workflows, use explicit runs
|
|
269
277
|
@dn.task
|
|
270
278
|
async def analyze(target: str) -> dict:
|
|
@@ -274,6 +282,7 @@ async def analyze(target: str) -> dict:
|
|
|
274
282
|
dn.log_metric("quality", 0.95)
|
|
275
283
|
return result
|
|
276
284
|
|
|
285
|
+
|
|
277
286
|
with dn.run(name="custom-analysis"):
|
|
278
287
|
await analyze("webapp")
|
|
279
288
|
```
|
|
@@ -133,6 +133,29 @@ def _is_transient_api_error(error: BaseException) -> bool:
|
|
|
133
133
|
return False
|
|
134
134
|
|
|
135
135
|
|
|
136
|
+
def _is_tool_array_overflow(error: BaseException | None) -> bool:
|
|
137
|
+
"""Whether ``error`` is an OpenAI/Azure rejection of too many tools.
|
|
138
|
+
|
|
139
|
+
OpenAI-family endpoints cap the ``tools`` array at 128 and 400 with
|
|
140
|
+
``code: array_above_max_length`` when it is longer. Anthropic has no
|
|
141
|
+
such cap and never raises this, so matching the provider's own error
|
|
142
|
+
string keeps the prompt-serialized fallback scoped to models that
|
|
143
|
+
actually need it — Claude keeps native tool calling untouched.
|
|
144
|
+
"""
|
|
145
|
+
if error is None:
|
|
146
|
+
return False
|
|
147
|
+
text = str(error)
|
|
148
|
+
cause = getattr(error, "__cause__", None) or getattr(error, "__context__", None)
|
|
149
|
+
if cause is not None:
|
|
150
|
+
text += " " + str(cause)
|
|
151
|
+
lowered = text.lower()
|
|
152
|
+
return (
|
|
153
|
+
"array_above_max_length" in lowered
|
|
154
|
+
or ("tools" in lowered and "array too long" in lowered)
|
|
155
|
+
or "maximum length 128" in lowered
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
136
159
|
def _replayable(messages: list[Message]) -> list[Message]:
|
|
137
160
|
"""Drop assistant messages that carry nothing worth sending back.
|
|
138
161
|
|
|
@@ -219,6 +242,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
219
242
|
|
|
220
243
|
# Private state
|
|
221
244
|
_generator: Generator | None = PrivateAttr(None, init=False)
|
|
245
|
+
_tool_cap_exceeded: bool = PrivateAttr(False, init=False)
|
|
246
|
+
"""Set once the provider has rejected the tool count (>128 for OpenAI/Azure)
|
|
247
|
+
so later turns serialize tools up front instead of retrying a doomed api
|
|
248
|
+
attempt. Write-once True - safe under concurrent run() calls."""
|
|
222
249
|
_current_input: str = PrivateAttr("", init=False)
|
|
223
250
|
_capability: tuple[str, str] | None = PrivateAttr(None, init=False)
|
|
224
251
|
"""The (name, version) capability this agent runs under, if any. Bound to
|
|
@@ -313,11 +340,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
313
340
|
"""Get conversation history."""
|
|
314
341
|
return self.trajectory.messages
|
|
315
342
|
|
|
316
|
-
def _get_transforms(self) -> list[Transform]:
|
|
317
|
-
"""Resolve message transforms for the current configuration.
|
|
343
|
+
def _get_transforms(self, tool_mode: ToolMode | None = None) -> list[Transform]:
|
|
344
|
+
"""Resolve message transforms for the current configuration.
|
|
345
|
+
|
|
346
|
+
``tool_mode`` overrides ``self.tool_mode`` for a single generation
|
|
347
|
+
without mutating shared state - used by the tool-overflow fallback so
|
|
348
|
+
concurrent ``run()`` calls on one Agent don't clobber each other.
|
|
349
|
+
"""
|
|
350
|
+
tool_mode = tool_mode if tool_mode is not None else self.tool_mode
|
|
318
351
|
transforms = []
|
|
319
352
|
if self.tools:
|
|
320
|
-
match
|
|
353
|
+
match tool_mode:
|
|
321
354
|
case "xml":
|
|
322
355
|
transforms.append(
|
|
323
356
|
make_tools_to_xml_transform(self.all_tools, add_tool_stop_token=True)
|
|
@@ -334,6 +367,49 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
334
367
|
|
|
335
368
|
async def _generate(self, messages: list[Message]) -> Chat:
|
|
336
369
|
"""Execute a single LLM generation step."""
|
|
370
|
+
if self.tool_mode == "auto" and self.tools:
|
|
371
|
+
self.tool_mode = (
|
|
372
|
+
"api" if await self.generator.supports_function_calling() else "json-in-xml"
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
# Effective mode is local to this call - never mutate self.tool_mode for
|
|
376
|
+
# the fallback, or concurrent run() calls on one shared Agent (e.g.
|
|
377
|
+
# Evaluation(concurrency > 1)) would clobber each other's mode.
|
|
378
|
+
effective_mode = self.tool_mode
|
|
379
|
+
# Once any turn has hit the provider tool cap, serialize up front on
|
|
380
|
+
# later turns to skip a doomed api attempt. The flag is only ever set
|
|
381
|
+
# True, so concurrent writers are harmless.
|
|
382
|
+
if effective_mode == "api" and self.tools and self._tool_cap_exceeded:
|
|
383
|
+
effective_mode = "json-in-xml"
|
|
384
|
+
|
|
385
|
+
chat = await self._generate_once(messages, effective_mode)
|
|
386
|
+
|
|
387
|
+
# Non-degrading fallback for the OpenAI/Azure 128-tool ceiling.
|
|
388
|
+
# GPT-family endpoints 400 with `array_above_max_length` when the
|
|
389
|
+
# tools array exceeds 128; Claude has no such cap and never hits this.
|
|
390
|
+
# Retry once with prompt-serialized tools so the full tool surface
|
|
391
|
+
# stays available instead of failing the turn. Native api mode is
|
|
392
|
+
# preserved for every model that accepts the tool count. The retry is
|
|
393
|
+
# gated on the call-local ``effective_mode`` so a sibling call that
|
|
394
|
+
# flipped the flag can't make this one skip its own recovery.
|
|
395
|
+
if (
|
|
396
|
+
chat.failed
|
|
397
|
+
and effective_mode == "api"
|
|
398
|
+
and self.tools
|
|
399
|
+
and _is_tool_array_overflow(chat.error)
|
|
400
|
+
):
|
|
401
|
+
logger.warning(
|
|
402
|
+
"Model '{}' rejected {} tool definitions (over provider cap); "
|
|
403
|
+
"retrying with prompt-serialized tools (json-in-xml)",
|
|
404
|
+
self.generator.model,
|
|
405
|
+
len(self.all_tools),
|
|
406
|
+
)
|
|
407
|
+
self._tool_cap_exceeded = True
|
|
408
|
+
chat = await self._generate_once(messages, "json-in-xml")
|
|
409
|
+
|
|
410
|
+
return chat
|
|
411
|
+
|
|
412
|
+
async def _generate_once(self, messages: list[Message], tool_mode: ToolMode) -> Chat:
|
|
337
413
|
messages = list(messages)
|
|
338
414
|
extra = dict(self.generate_params_extra) if self.generate_params_extra else {}
|
|
339
415
|
params_kwargs: dict[str, t.Any] = {
|
|
@@ -344,12 +420,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
344
420
|
params_kwargs["extra"] = extra
|
|
345
421
|
params = GenerateParams(**params_kwargs)
|
|
346
422
|
|
|
347
|
-
|
|
348
|
-
self.tool_mode = (
|
|
349
|
-
"api" if await self.generator.supports_function_calling() else "json-in-xml"
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
transforms = self._get_transforms()
|
|
423
|
+
transforms = self._get_transforms(tool_mode)
|
|
353
424
|
post_transforms: list[PostTransform | None] = []
|
|
354
425
|
for transform_callback in transforms:
|
|
355
426
|
messages, params, post_transform = await transform_callback(messages, params)
|
|
@@ -468,11 +539,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
468
539
|
(name for name, r in hook_reactions.items() if r is winning_reaction), "unknown"
|
|
469
540
|
)
|
|
470
541
|
|
|
542
|
+
reaction_messages: list[Message] = []
|
|
543
|
+
if isinstance(winning_reaction, RetryWithFeedback):
|
|
544
|
+
if winning_reaction.tool_call_id:
|
|
545
|
+
reaction_messages.append(
|
|
546
|
+
Message(
|
|
547
|
+
"tool",
|
|
548
|
+
f"[POLICY DENIED] {winning_reaction.feedback}",
|
|
549
|
+
tool_call_id=winning_reaction.tool_call_id,
|
|
550
|
+
metadata=winning_reaction.metadata,
|
|
551
|
+
)
|
|
552
|
+
)
|
|
553
|
+
else:
|
|
554
|
+
reaction_messages.append(
|
|
555
|
+
Message(
|
|
556
|
+
"user",
|
|
557
|
+
winning_reaction.feedback,
|
|
558
|
+
metadata=winning_reaction.metadata,
|
|
559
|
+
)
|
|
560
|
+
)
|
|
561
|
+
|
|
471
562
|
async for _event in self._dispatch(
|
|
472
563
|
ReactStep(
|
|
473
564
|
agent_id=self.agent_id,
|
|
474
565
|
hook_name=winning_hook_name,
|
|
475
566
|
reaction=winning_reaction,
|
|
567
|
+
messages=reaction_messages,
|
|
476
568
|
)
|
|
477
569
|
):
|
|
478
570
|
yield _event
|
|
@@ -483,8 +575,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
483
575
|
messages.append(Message("user", winning_reaction.feedback))
|
|
484
576
|
raise Continue(messages=messages)
|
|
485
577
|
if isinstance(winning_reaction, RetryWithFeedback):
|
|
486
|
-
messages
|
|
487
|
-
raise Retry(messages=messages)
|
|
578
|
+
raise Continue(messages=reaction_messages)
|
|
488
579
|
|
|
489
580
|
raise winning_reaction
|
|
490
581
|
|
|
@@ -670,6 +761,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
670
761
|
agent_name=self.name,
|
|
671
762
|
tool_call=tool_call,
|
|
672
763
|
error=NameError(error_msg),
|
|
764
|
+
policy_decision=start_event.policy_decision,
|
|
673
765
|
)
|
|
674
766
|
error_event.emit(t_span)
|
|
675
767
|
async for event in self._dispatch(error_event):
|
|
@@ -678,6 +770,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
678
770
|
message = Message.from_model(
|
|
679
771
|
SystemErrorModel(content=f"Tool '{tool_call.name}' not found.")
|
|
680
772
|
)
|
|
773
|
+
if start_event.policy_decision is not None:
|
|
774
|
+
message.metadata["policy_decision"] = start_event.policy_decision
|
|
681
775
|
|
|
682
776
|
step_event = ToolStep(
|
|
683
777
|
agent_id=self.agent_id,
|
|
@@ -698,6 +792,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
698
792
|
try:
|
|
699
793
|
message, stop = await tool.handle_tool_call(tool_call)
|
|
700
794
|
|
|
795
|
+
if start_event.policy_decision is not None:
|
|
796
|
+
message.metadata["policy_decision"] = start_event.policy_decision
|
|
797
|
+
|
|
701
798
|
# Tools that catch their own exceptions (bash non-zero,
|
|
702
799
|
# @tool(catch=True), MCP isError) lift the failure into
|
|
703
800
|
# message.metadata. Surface it on ToolEnd so renderers can
|
|
@@ -717,6 +814,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
717
814
|
error=tool_error,
|
|
718
815
|
error_type=tool_error_type,
|
|
719
816
|
cost_usd=tool_cost_usd,
|
|
817
|
+
policy_decision=start_event.policy_decision,
|
|
720
818
|
)
|
|
721
819
|
async for event in self._dispatch(end_event):
|
|
722
820
|
yield event
|
|
@@ -754,6 +852,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
754
852
|
status="errored",
|
|
755
853
|
tool_call=tool_call,
|
|
756
854
|
error=e,
|
|
855
|
+
policy_decision=start_event.policy_decision,
|
|
757
856
|
)
|
|
758
857
|
error_event.emit(t_span)
|
|
759
858
|
async for event in self._dispatch(error_event):
|
|
@@ -1090,11 +1189,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1090
1189
|
"""Run all tools and signal completion."""
|
|
1091
1190
|
nonlocal tool_execution_error
|
|
1092
1191
|
try:
|
|
1192
|
+
tool_calls = _messages[-1].tool_calls or []
|
|
1193
|
+
item_calls = [tc for tc in tool_calls if tc.name == "report_item"]
|
|
1194
|
+
other_calls = [tc for tc in tool_calls if tc.name != "report_item"]
|
|
1195
|
+
|
|
1196
|
+
async def run_item_tools() -> None:
|
|
1197
|
+
for tool_call in item_calls:
|
|
1198
|
+
await run_tool_with_queue(tool_call)
|
|
1199
|
+
|
|
1093
1200
|
await asyncio.gather(
|
|
1094
|
-
*
|
|
1095
|
-
|
|
1096
|
-
for tc in (_messages[-1].tool_calls or [])
|
|
1097
|
-
]
|
|
1201
|
+
*(run_tool_with_queue(tc) for tc in other_calls),
|
|
1202
|
+
run_item_tools(),
|
|
1098
1203
|
)
|
|
1099
1204
|
except Exception as exc:
|
|
1100
1205
|
tool_execution_error = exc
|
|
@@ -1116,9 +1221,21 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1116
1221
|
stopped_by_tool_call = event.tool_call
|
|
1117
1222
|
|
|
1118
1223
|
await tools_task # Ensure task completes
|
|
1119
|
-
|
|
1120
|
-
|
|
1224
|
+
# Always preserve completed tool results — even when
|
|
1225
|
+
# one tool was denied, other tools may have finished
|
|
1226
|
+
# and their results must stay in the conversation.
|
|
1121
1227
|
messages.extend(tool_messages)
|
|
1228
|
+
# A hook retry or continuation (including a ScopeGuard
|
|
1229
|
+
# denial) still completes this generation boundary. Defer
|
|
1230
|
+
# that reaction until after GenerationStep so the assistant
|
|
1231
|
+
# tool call is persisted and can be paired with feedback.
|
|
1232
|
+
deferred_reaction = (
|
|
1233
|
+
tool_execution_error
|
|
1234
|
+
if isinstance(tool_execution_error, (Continue, Retry))
|
|
1235
|
+
else None
|
|
1236
|
+
)
|
|
1237
|
+
if tool_execution_error is not None and deferred_reaction is None:
|
|
1238
|
+
_raise_exception(tool_execution_error)
|
|
1122
1239
|
|
|
1123
1240
|
# Emit GenerationEnd AFTER tools (closes generation span)
|
|
1124
1241
|
gen_end = GenerationEnd(
|
|
@@ -1158,6 +1275,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1158
1275
|
yield event
|
|
1159
1276
|
gen_event.emit(gen_span) # Emit after dispatch - metrics attached
|
|
1160
1277
|
|
|
1278
|
+
if deferred_reaction is not None:
|
|
1279
|
+
_raise_exception(deferred_reaction)
|
|
1280
|
+
|
|
1161
1281
|
if stopped_by_tool_call:
|
|
1162
1282
|
_raise_exception(
|
|
1163
1283
|
Finish(
|
|
@@ -456,6 +456,7 @@ class ToolStart(AgentEvent):
|
|
|
456
456
|
"""
|
|
457
457
|
|
|
458
458
|
tool_call: ToolCall
|
|
459
|
+
policy_decision: dict[str, t.Any] | None = None
|
|
459
460
|
|
|
460
461
|
def _get_data(self) -> dict[str, t.Any]:
|
|
461
462
|
try:
|
|
@@ -468,6 +469,7 @@ class ToolStart(AgentEvent):
|
|
|
468
469
|
"name": self.tool_call.name,
|
|
469
470
|
"arguments": args,
|
|
470
471
|
},
|
|
472
|
+
"policy_decision": self.policy_decision,
|
|
471
473
|
}
|
|
472
474
|
|
|
473
475
|
def __repr__(self) -> str:
|
|
@@ -542,6 +544,7 @@ class ToolEnd(AgentEvent):
|
|
|
542
544
|
error: str | None = None
|
|
543
545
|
error_type: str | None = None
|
|
544
546
|
cost_usd: float | None = None
|
|
547
|
+
policy_decision: dict[str, t.Any] | None = None
|
|
545
548
|
"""Estimated USD cost contributed by this tool call, when the tool
|
|
546
549
|
ran an internal LLM (e.g. ``spawn_agent``). ``None`` for ordinary
|
|
547
550
|
tools — the TUI only accumulates this into the sub-agent cost
|
|
@@ -559,6 +562,7 @@ class ToolEnd(AgentEvent):
|
|
|
559
562
|
"error": self.error,
|
|
560
563
|
"error_type": self.error_type,
|
|
561
564
|
"cost_usd": self.cost_usd,
|
|
565
|
+
"policy_decision": self.policy_decision,
|
|
562
566
|
}
|
|
563
567
|
|
|
564
568
|
def __repr__(self) -> str:
|
|
@@ -605,6 +609,7 @@ class ToolError(AgentEvent):
|
|
|
605
609
|
|
|
606
610
|
tool_call: ToolCall
|
|
607
611
|
error: SerializableError
|
|
612
|
+
policy_decision: dict[str, t.Any] | None = None
|
|
608
613
|
|
|
609
614
|
def _get_data(self) -> dict[str, t.Any]:
|
|
610
615
|
return {
|
|
@@ -614,6 +619,7 @@ class ToolError(AgentEvent):
|
|
|
614
619
|
},
|
|
615
620
|
"error": str(self.error),
|
|
616
621
|
"error_type": type(self.error).__name__,
|
|
622
|
+
"policy_decision": self.policy_decision,
|
|
617
623
|
}
|
|
618
624
|
|
|
619
625
|
def emit(self, span: "TaskSpan") -> None:
|
|
@@ -1005,10 +1011,17 @@ class ReactStep(AgentStep):
|
|
|
1005
1011
|
reaction_data["type"] = type(self.reaction).__name__
|
|
1006
1012
|
if hasattr(self.reaction, "feedback"):
|
|
1007
1013
|
reaction_data["feedback"] = self.reaction.feedback
|
|
1014
|
+
if hasattr(self.reaction, "tool_call_id"):
|
|
1015
|
+
reaction_data["tool_call_id"] = self.reaction.tool_call_id
|
|
1016
|
+
if hasattr(self.reaction, "metadata"):
|
|
1017
|
+
reaction_data["metadata"] = self.reaction.metadata
|
|
1008
1018
|
if hasattr(self.reaction, "reason"):
|
|
1009
1019
|
reaction_data["reason"] = self.reaction.reason
|
|
1010
1020
|
if hasattr(self.reaction, "error"):
|
|
1011
|
-
|
|
1021
|
+
error = self.reaction.error
|
|
1022
|
+
reaction_data["error"] = str(error)
|
|
1023
|
+
if isinstance(error, BaseException):
|
|
1024
|
+
reaction_data["error_type"] = type(error).__name__
|
|
1012
1025
|
return {
|
|
1013
1026
|
"hook_name": self.hook_name,
|
|
1014
1027
|
"reaction": reaction_data,
|