dreadnode 2.0.38__tar.gz → 2.0.41__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.41}/PKG-INFO +18 -6
- {dreadnode-2.0.38 → dreadnode-2.0.41}/README.md +12 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/agent.py +158 -64
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/events.py +14 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/hooks.py +169 -9
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/process_judge.py +32 -8
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/reactions.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/tools.py +3 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/trajectory.py +53 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/client.py +363 -8
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/models.py +40 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/airt.py +36 -41
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/args.py +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/capability.py +146 -25
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/evaluation.py +24 -16
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/main.py +2 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/runtime.py +265 -46
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/shared.py +248 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/task.py +149 -18
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/task_set.py +192 -7
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/interactive.py +13 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/managed_client.py +16 -20
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/runtime_client.py +115 -58
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/main.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/app.py +202 -47
- dreadnode-2.0.41/dreadnode/app/server/auth.py +119 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/capability_manager.py +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/model_resolution.py +9 -1
- dreadnode-2.0.41/dreadnode/app/server/runtime_credentials.py +314 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/session_hydrator.py +25 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/websocket.py +65 -96
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/worker_manager.py +27 -5
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/ws_auth.py +4 -11
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/app.py +123 -7
- dreadnode-2.0.41/dreadnode/app/tui/bug_report.py +489 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/command_dispatcher.py +3 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/commands.py +1 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/dreadnode.tcss +42 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/error_handler.py +4 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/profile_manager.py +15 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screen_router.py +68 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/__init__.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/auth.py +81 -17
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/capabilities.py +14 -9
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/capability_docs.py +10 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/connection_error.py +3 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/console.py +10 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/environments.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/evaluations.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/readme.py +10 -0
- dreadnode-2.0.41/dreadnode/app/tui/screens/report_bug.py +429 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/runtimes.py +54 -104
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/sandboxes.py +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/secrets.py +7 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/services.py +20 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/sessions.py +10 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/traces.py +7 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/sessions_manager.py +155 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_reducer.py +50 -5
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/context_bar.py +4 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/conversation.py +3 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/header_bar.py +2 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/help_panel.py +14 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/prompt_info.py +2 -1
- dreadnode-2.0.41/dreadnode/app/tui/widgets/scope_modal.py +401 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tool.py +13 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/wire_events.py +49 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +230 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +15 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +11 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +13 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +3 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +6 -6
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +128 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +10 -5
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +13 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +24 -8
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +2 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +12 -6
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +38 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +2 -12
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +170 -0
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +177 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +9 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +17 -9
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +5 -9
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +16 -7
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +3 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +16 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +12 -12
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +4 -8
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +2 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +6 -4
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +78 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +2 -0
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +113 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +126 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +18 -18
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +10 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +4 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +5 -1
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +94 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +4 -0
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +76 -0
- dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +43 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/loader.py +20 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/sync.py +6 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/log.py +61 -19
- dreadnode-2.0.41/dreadnode/core/tls.py +124 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/audio.py +6 -5
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/litellm_.py +167 -16
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/config.py +66 -25
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/jobs.py +18 -6
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/manifest.py +4 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/oci.py +36 -4
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/__init__.py +16 -5
- dreadnode-2.0.41/dreadnode/policies/guard.py +240 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/rubrics/process/default.yaml +11 -6
- dreadnode-2.0.41/dreadnode/policies/scope.py +633 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/__init__.py +6 -1
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/dreadnode_cli.py +14 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/report_items.py +574 -60
- dreadnode-2.0.41/dreadnode/tools/submission.py +225 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/exporter.py +4 -2
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/span.py +5 -3
- {dreadnode-2.0.38 → dreadnode-2.0.41}/pyproject.toml +21 -3
- dreadnode-2.0.38/dreadnode/app/server/auth.py +0 -120
- dreadnode-2.0.38/dreadnode/app/server/runtime_token.py +0 -395
- dreadnode-2.0.38/dreadnode/app/tui/runtime_cache.py +0 -97
- 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-cli/references/cli/runtime.md +0 -94
- 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/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -83
- dreadnode-2.0.38/dreadnode/policies/guard.py +0 -193
- {dreadnode-2.0.38 → dreadnode-2.0.41}/.gitignore +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/LICENSE +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/AGENTS.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/claude_code.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/native.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/sanitize.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/art_engine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/defense.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/failure.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/gate.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/modes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/probes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/recon.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/router.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/strategy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/_text_common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/bae.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/boundary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/deepwordbug.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/hopskipjump.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/pwws.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/simba.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/square.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/textbugger.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/textfooler.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/zoo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/activethief.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/copycat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/distillation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/equation_solving.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/jacobian.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/knockoff.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/confidence.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/nes_inversion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/_base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/entropy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/label_only.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/lira.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/loss.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/shadow_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/threshold.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/message_parts.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/model_export.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/target.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/auth.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/factory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/http.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/message.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/prediction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/spec.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/streaming/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/proxy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/trajectory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/trajectory_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/reconciliation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/project_memory.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.38 → dreadnode-2.0.41}/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.41
|
|
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
|
```
|
|
@@ -85,54 +85,53 @@ def _raise_exception(error: BaseException) -> t.NoReturn:
|
|
|
85
85
|
raise error
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
"
|
|
90
|
-
"Timeout",
|
|
91
|
-
"APIConnectionError",
|
|
92
|
-
"APIConnectionTimeoutError",
|
|
93
|
-
"ServiceUnavailableError",
|
|
94
|
-
"InternalServerError",
|
|
95
|
-
"BadGatewayError",
|
|
96
|
-
"APIError",
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def _is_transient_api_error(error: BaseException) -> bool:
|
|
101
|
-
"""Classify an error as a transient LLM API failure worth retrying.
|
|
88
|
+
def _is_retry_safe_api_error(error: BaseException) -> bool:
|
|
89
|
+
"""Return whether an LLM API failure is safe to send again.
|
|
102
90
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
``BadRequestError``, ``AuthenticationError``,
|
|
107
|
-
``ContextWindowExceededError`` (handled by overflow recovery), or other
|
|
108
|
-
deterministic client errors.
|
|
109
|
-
|
|
110
|
-
The allow-list is walked dynamically because ``litellm.exceptions`` does
|
|
111
|
-
not expose a single common ancestor for its transient exceptions.
|
|
112
|
-
Returns ``False`` if ``litellm`` is not importable.
|
|
91
|
+
Only explicit 429 admission failures are retryable. Timeouts, connection
|
|
92
|
+
failures, interrupted streams, and 5xx responses are ambiguous because the
|
|
93
|
+
provider may still be working on the original request.
|
|
113
94
|
"""
|
|
114
95
|
with contextlib.suppress(ImportError):
|
|
115
96
|
import litellm.exceptions as _litellm_exc
|
|
116
97
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
98
|
+
rate_limit_cls = getattr(_litellm_exc, "RateLimitError", None)
|
|
99
|
+
if (
|
|
100
|
+
rate_limit_cls is not None
|
|
101
|
+
and isinstance(error, rate_limit_cls)
|
|
102
|
+
and getattr(error, "status_code", None) == 429
|
|
103
|
+
):
|
|
123
104
|
# OpenAI returns 429 with code "insufficient_quota" when the
|
|
124
105
|
# account is out of credits — a permanent billing condition,
|
|
125
106
|
# not a rate limit. litellm packs the provider body into the
|
|
126
107
|
# message verbatim, so substring-match to exclude.
|
|
127
|
-
|
|
128
|
-
return not (
|
|
129
|
-
rate_limit_cls is not None
|
|
130
|
-
and isinstance(error, rate_limit_cls)
|
|
131
|
-
and "insufficient_quota" in str(error)
|
|
132
|
-
)
|
|
108
|
+
return "insufficient_quota" not in str(error)
|
|
133
109
|
return False
|
|
134
110
|
|
|
135
111
|
|
|
112
|
+
def _is_tool_array_overflow(error: BaseException | None) -> bool:
|
|
113
|
+
"""Whether ``error`` is an OpenAI/Azure rejection of too many tools.
|
|
114
|
+
|
|
115
|
+
OpenAI-family endpoints cap the ``tools`` array at 128 and 400 with
|
|
116
|
+
``code: array_above_max_length`` when it is longer. Anthropic has no
|
|
117
|
+
such cap and never raises this, so matching the provider's own error
|
|
118
|
+
string keeps the prompt-serialized fallback scoped to models that
|
|
119
|
+
actually need it — Claude keeps native tool calling untouched.
|
|
120
|
+
"""
|
|
121
|
+
if error is None:
|
|
122
|
+
return False
|
|
123
|
+
text = str(error)
|
|
124
|
+
cause = getattr(error, "__cause__", None) or getattr(error, "__context__", None)
|
|
125
|
+
if cause is not None:
|
|
126
|
+
text += " " + str(cause)
|
|
127
|
+
lowered = text.lower()
|
|
128
|
+
return (
|
|
129
|
+
"array_above_max_length" in lowered
|
|
130
|
+
or ("tools" in lowered and "array too long" in lowered)
|
|
131
|
+
or "maximum length 128" in lowered
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
136
135
|
def _replayable(messages: list[Message]) -> list[Message]:
|
|
137
136
|
"""Drop assistant messages that carry nothing worth sending back.
|
|
138
137
|
|
|
@@ -205,9 +204,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
205
204
|
generate_params_extra: dict[str, t.Any] = Config(default_factory=dict)
|
|
206
205
|
"""Extra parameters merged into GenerateParams for every generation (e.g. thinking config)."""
|
|
207
206
|
backoff_max_tries: int = Config(default=8, ge=0)
|
|
208
|
-
"""Maximum retries on
|
|
207
|
+
"""Maximum retries on retry-safe LLM admission failures per step. ``0`` disables retry."""
|
|
209
208
|
backoff_max_time: float = Config(default=300.0, ge=0)
|
|
210
|
-
"""Maximum total seconds to spend
|
|
209
|
+
"""Maximum total seconds to spend on retry-safe LLM attempts per step."""
|
|
211
210
|
backoff_base_factor: float = Config(default=1.0, ge=0)
|
|
212
211
|
"""Base factor for exponential backoff: wait = base_factor * 2 ** (attempt - 1)."""
|
|
213
212
|
backoff_jitter: bool = Config(default=True)
|
|
@@ -219,6 +218,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
219
218
|
|
|
220
219
|
# Private state
|
|
221
220
|
_generator: Generator | None = PrivateAttr(None, init=False)
|
|
221
|
+
_tool_cap_exceeded: bool = PrivateAttr(False, init=False)
|
|
222
|
+
"""Set once the provider has rejected the tool count (>128 for OpenAI/Azure)
|
|
223
|
+
so later turns serialize tools up front instead of retrying a doomed api
|
|
224
|
+
attempt. Write-once True - safe under concurrent run() calls."""
|
|
222
225
|
_current_input: str = PrivateAttr("", init=False)
|
|
223
226
|
_capability: tuple[str, str] | None = PrivateAttr(None, init=False)
|
|
224
227
|
"""The (name, version) capability this agent runs under, if any. Bound to
|
|
@@ -313,11 +316,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
313
316
|
"""Get conversation history."""
|
|
314
317
|
return self.trajectory.messages
|
|
315
318
|
|
|
316
|
-
def _get_transforms(self) -> list[Transform]:
|
|
317
|
-
"""Resolve message transforms for the current configuration.
|
|
319
|
+
def _get_transforms(self, tool_mode: ToolMode | None = None) -> list[Transform]:
|
|
320
|
+
"""Resolve message transforms for the current configuration.
|
|
321
|
+
|
|
322
|
+
``tool_mode`` overrides ``self.tool_mode`` for a single generation
|
|
323
|
+
without mutating shared state - used by the tool-overflow fallback so
|
|
324
|
+
concurrent ``run()`` calls on one Agent don't clobber each other.
|
|
325
|
+
"""
|
|
326
|
+
tool_mode = tool_mode if tool_mode is not None else self.tool_mode
|
|
318
327
|
transforms = []
|
|
319
328
|
if self.tools:
|
|
320
|
-
match
|
|
329
|
+
match tool_mode:
|
|
321
330
|
case "xml":
|
|
322
331
|
transforms.append(
|
|
323
332
|
make_tools_to_xml_transform(self.all_tools, add_tool_stop_token=True)
|
|
@@ -334,6 +343,49 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
334
343
|
|
|
335
344
|
async def _generate(self, messages: list[Message]) -> Chat:
|
|
336
345
|
"""Execute a single LLM generation step."""
|
|
346
|
+
if self.tool_mode == "auto" and self.tools:
|
|
347
|
+
self.tool_mode = (
|
|
348
|
+
"api" if await self.generator.supports_function_calling() else "json-in-xml"
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# Effective mode is local to this call - never mutate self.tool_mode for
|
|
352
|
+
# the fallback, or concurrent run() calls on one shared Agent (e.g.
|
|
353
|
+
# Evaluation(concurrency > 1)) would clobber each other's mode.
|
|
354
|
+
effective_mode = self.tool_mode
|
|
355
|
+
# Once any turn has hit the provider tool cap, serialize up front on
|
|
356
|
+
# later turns to skip a doomed api attempt. The flag is only ever set
|
|
357
|
+
# True, so concurrent writers are harmless.
|
|
358
|
+
if effective_mode == "api" and self.tools and self._tool_cap_exceeded:
|
|
359
|
+
effective_mode = "json-in-xml"
|
|
360
|
+
|
|
361
|
+
chat = await self._generate_once(messages, effective_mode)
|
|
362
|
+
|
|
363
|
+
# Non-degrading fallback for the OpenAI/Azure 128-tool ceiling.
|
|
364
|
+
# GPT-family endpoints 400 with `array_above_max_length` when the
|
|
365
|
+
# tools array exceeds 128; Claude has no such cap and never hits this.
|
|
366
|
+
# Retry once with prompt-serialized tools so the full tool surface
|
|
367
|
+
# stays available instead of failing the turn. Native api mode is
|
|
368
|
+
# preserved for every model that accepts the tool count. The retry is
|
|
369
|
+
# gated on the call-local ``effective_mode`` so a sibling call that
|
|
370
|
+
# flipped the flag can't make this one skip its own recovery.
|
|
371
|
+
if (
|
|
372
|
+
chat.failed
|
|
373
|
+
and effective_mode == "api"
|
|
374
|
+
and self.tools
|
|
375
|
+
and _is_tool_array_overflow(chat.error)
|
|
376
|
+
):
|
|
377
|
+
logger.warning(
|
|
378
|
+
"Model '{}' rejected {} tool definitions (over provider cap); "
|
|
379
|
+
"retrying with prompt-serialized tools (json-in-xml)",
|
|
380
|
+
self.generator.model,
|
|
381
|
+
len(self.all_tools),
|
|
382
|
+
)
|
|
383
|
+
self._tool_cap_exceeded = True
|
|
384
|
+
chat = await self._generate_once(messages, "json-in-xml")
|
|
385
|
+
|
|
386
|
+
return chat
|
|
387
|
+
|
|
388
|
+
async def _generate_once(self, messages: list[Message], tool_mode: ToolMode) -> Chat:
|
|
337
389
|
messages = list(messages)
|
|
338
390
|
extra = dict(self.generate_params_extra) if self.generate_params_extra else {}
|
|
339
391
|
params_kwargs: dict[str, t.Any] = {
|
|
@@ -344,12 +396,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
344
396
|
params_kwargs["extra"] = extra
|
|
345
397
|
params = GenerateParams(**params_kwargs)
|
|
346
398
|
|
|
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()
|
|
399
|
+
transforms = self._get_transforms(tool_mode)
|
|
353
400
|
post_transforms: list[PostTransform | None] = []
|
|
354
401
|
for transform_callback in transforms:
|
|
355
402
|
messages, params, post_transform = await transform_callback(messages, params)
|
|
@@ -468,11 +515,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
468
515
|
(name for name, r in hook_reactions.items() if r is winning_reaction), "unknown"
|
|
469
516
|
)
|
|
470
517
|
|
|
518
|
+
reaction_messages: list[Message] = []
|
|
519
|
+
if isinstance(winning_reaction, RetryWithFeedback):
|
|
520
|
+
if winning_reaction.tool_call_id:
|
|
521
|
+
reaction_messages.append(
|
|
522
|
+
Message(
|
|
523
|
+
"tool",
|
|
524
|
+
f"[POLICY DENIED] {winning_reaction.feedback}",
|
|
525
|
+
tool_call_id=winning_reaction.tool_call_id,
|
|
526
|
+
metadata=winning_reaction.metadata,
|
|
527
|
+
)
|
|
528
|
+
)
|
|
529
|
+
else:
|
|
530
|
+
reaction_messages.append(
|
|
531
|
+
Message(
|
|
532
|
+
"user",
|
|
533
|
+
winning_reaction.feedback,
|
|
534
|
+
metadata=winning_reaction.metadata,
|
|
535
|
+
)
|
|
536
|
+
)
|
|
537
|
+
|
|
471
538
|
async for _event in self._dispatch(
|
|
472
539
|
ReactStep(
|
|
473
540
|
agent_id=self.agent_id,
|
|
474
541
|
hook_name=winning_hook_name,
|
|
475
542
|
reaction=winning_reaction,
|
|
543
|
+
messages=reaction_messages,
|
|
476
544
|
)
|
|
477
545
|
):
|
|
478
546
|
yield _event
|
|
@@ -483,8 +551,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
483
551
|
messages.append(Message("user", winning_reaction.feedback))
|
|
484
552
|
raise Continue(messages=messages)
|
|
485
553
|
if isinstance(winning_reaction, RetryWithFeedback):
|
|
486
|
-
messages
|
|
487
|
-
raise Retry(messages=messages)
|
|
554
|
+
raise Continue(messages=reaction_messages)
|
|
488
555
|
|
|
489
556
|
raise winning_reaction
|
|
490
557
|
|
|
@@ -495,10 +562,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
495
562
|
tries: int,
|
|
496
563
|
start_time: float,
|
|
497
564
|
) -> float | None:
|
|
498
|
-
"""Compute a retry sleep for a
|
|
565
|
+
"""Compute a retry sleep for a retry-safe LLM admission failure.
|
|
499
566
|
|
|
500
567
|
Returns the sleep duration in seconds if the caller should retry, or
|
|
501
|
-
``None`` if the error is not
|
|
568
|
+
``None`` if the error is not retry-safe, tries are exhausted, or the
|
|
502
569
|
per-step time budget has been spent. Caller owns sleeping and emitting
|
|
503
570
|
the ``GenerationRetry`` event. Backoff is agent-owned at the error
|
|
504
571
|
site, mirroring ``_try_overflow_recovery`` — no step is consumed and
|
|
@@ -507,7 +574,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
507
574
|
if self.backoff_max_tries <= 0:
|
|
508
575
|
return None
|
|
509
576
|
|
|
510
|
-
if not
|
|
577
|
+
if not _is_retry_safe_api_error(error):
|
|
511
578
|
return None
|
|
512
579
|
|
|
513
580
|
if tries >= self.backoff_max_tries:
|
|
@@ -670,6 +737,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
670
737
|
agent_name=self.name,
|
|
671
738
|
tool_call=tool_call,
|
|
672
739
|
error=NameError(error_msg),
|
|
740
|
+
policy_decision=start_event.policy_decision,
|
|
673
741
|
)
|
|
674
742
|
error_event.emit(t_span)
|
|
675
743
|
async for event in self._dispatch(error_event):
|
|
@@ -678,6 +746,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
678
746
|
message = Message.from_model(
|
|
679
747
|
SystemErrorModel(content=f"Tool '{tool_call.name}' not found.")
|
|
680
748
|
)
|
|
749
|
+
if start_event.policy_decision is not None:
|
|
750
|
+
message.metadata["policy_decision"] = start_event.policy_decision
|
|
681
751
|
|
|
682
752
|
step_event = ToolStep(
|
|
683
753
|
agent_id=self.agent_id,
|
|
@@ -698,6 +768,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
698
768
|
try:
|
|
699
769
|
message, stop = await tool.handle_tool_call(tool_call)
|
|
700
770
|
|
|
771
|
+
if start_event.policy_decision is not None:
|
|
772
|
+
message.metadata["policy_decision"] = start_event.policy_decision
|
|
773
|
+
|
|
701
774
|
# Tools that catch their own exceptions (bash non-zero,
|
|
702
775
|
# @tool(catch=True), MCP isError) lift the failure into
|
|
703
776
|
# message.metadata. Surface it on ToolEnd so renderers can
|
|
@@ -717,6 +790,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
717
790
|
error=tool_error,
|
|
718
791
|
error_type=tool_error_type,
|
|
719
792
|
cost_usd=tool_cost_usd,
|
|
793
|
+
policy_decision=start_event.policy_decision,
|
|
720
794
|
)
|
|
721
795
|
async for event in self._dispatch(end_event):
|
|
722
796
|
yield event
|
|
@@ -754,6 +828,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
754
828
|
status="errored",
|
|
755
829
|
tool_call=tool_call,
|
|
756
830
|
error=e,
|
|
831
|
+
policy_decision=start_event.policy_decision,
|
|
757
832
|
)
|
|
758
833
|
error_event.emit(t_span)
|
|
759
834
|
async for event in self._dispatch(error_event):
|
|
@@ -862,15 +937,13 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
862
937
|
async for event in self._dispatch(gen_start):
|
|
863
938
|
yield event
|
|
864
939
|
|
|
940
|
+
backoff_started = time.monotonic()
|
|
865
941
|
step_chat = await self._generate(messages)
|
|
866
942
|
|
|
867
|
-
# In-place
|
|
868
|
-
#
|
|
869
|
-
#
|
|
870
|
-
# consumed; clients observe GenerationRetry events
|
|
871
|
-
# rather than a spurious terminal GenerationError.
|
|
943
|
+
# In-place retry-safe backoff — only explicit 429 admission
|
|
944
|
+
# failures are sent again. Ambiguous transport and provider
|
|
945
|
+
# failures may still have active work, so they terminate.
|
|
872
946
|
backoff_tries = 0
|
|
873
|
-
backoff_started = time.monotonic()
|
|
874
947
|
while step_chat.failed and step_chat.error:
|
|
875
948
|
wait = self._try_backoff(
|
|
876
949
|
step_chat.error,
|
|
@@ -1090,11 +1163,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1090
1163
|
"""Run all tools and signal completion."""
|
|
1091
1164
|
nonlocal tool_execution_error
|
|
1092
1165
|
try:
|
|
1166
|
+
tool_calls = _messages[-1].tool_calls or []
|
|
1167
|
+
item_calls = [tc for tc in tool_calls if tc.name == "report_item"]
|
|
1168
|
+
other_calls = [tc for tc in tool_calls if tc.name != "report_item"]
|
|
1169
|
+
|
|
1170
|
+
async def run_item_tools() -> None:
|
|
1171
|
+
for tool_call in item_calls:
|
|
1172
|
+
await run_tool_with_queue(tool_call)
|
|
1173
|
+
|
|
1093
1174
|
await asyncio.gather(
|
|
1094
|
-
*
|
|
1095
|
-
|
|
1096
|
-
for tc in (_messages[-1].tool_calls or [])
|
|
1097
|
-
]
|
|
1175
|
+
*(run_tool_with_queue(tc) for tc in other_calls),
|
|
1176
|
+
run_item_tools(),
|
|
1098
1177
|
)
|
|
1099
1178
|
except Exception as exc:
|
|
1100
1179
|
tool_execution_error = exc
|
|
@@ -1116,9 +1195,21 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1116
1195
|
stopped_by_tool_call = event.tool_call
|
|
1117
1196
|
|
|
1118
1197
|
await tools_task # Ensure task completes
|
|
1119
|
-
|
|
1120
|
-
|
|
1198
|
+
# Always preserve completed tool results — even when
|
|
1199
|
+
# one tool was denied, other tools may have finished
|
|
1200
|
+
# and their results must stay in the conversation.
|
|
1121
1201
|
messages.extend(tool_messages)
|
|
1202
|
+
# A hook retry or continuation (including a ScopeGuard
|
|
1203
|
+
# denial) still completes this generation boundary. Defer
|
|
1204
|
+
# that reaction until after GenerationStep so the assistant
|
|
1205
|
+
# tool call is persisted and can be paired with feedback.
|
|
1206
|
+
deferred_reaction = (
|
|
1207
|
+
tool_execution_error
|
|
1208
|
+
if isinstance(tool_execution_error, (Continue, Retry))
|
|
1209
|
+
else None
|
|
1210
|
+
)
|
|
1211
|
+
if tool_execution_error is not None and deferred_reaction is None:
|
|
1212
|
+
_raise_exception(tool_execution_error)
|
|
1122
1213
|
|
|
1123
1214
|
# Emit GenerationEnd AFTER tools (closes generation span)
|
|
1124
1215
|
gen_end = GenerationEnd(
|
|
@@ -1158,6 +1249,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
1158
1249
|
yield event
|
|
1159
1250
|
gen_event.emit(gen_span) # Emit after dispatch - metrics attached
|
|
1160
1251
|
|
|
1252
|
+
if deferred_reaction is not None:
|
|
1253
|
+
_raise_exception(deferred_reaction)
|
|
1254
|
+
|
|
1161
1255
|
if stopped_by_tool_call:
|
|
1162
1256
|
_raise_exception(
|
|
1163
1257
|
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,
|