dreadnode 2.0.33__tar.gz → 2.0.34__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.33 → dreadnode-2.0.34}/PKG-INFO +9 -1
- {dreadnode-2.0.33 → dreadnode-2.0.34}/README.md +3 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/agent.py +7 -0
- dreadnode-2.0.34/dreadnode/agents/sanitize.py +150 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/subagent.py +16 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/tools.py +9 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/assessment.py +25 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/streaming/nova_sonic.py +41 -8
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/client.py +38 -3
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/evaluation.py +15 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/transports.py +1 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/app.py +5 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/app.py +7 -4
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/capabilities_manager.py +1 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/dreadnode.tcss +48 -18
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/sessions_manager.py +26 -9
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/theme.py +24 -8
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_dialog.py +7 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/conversation.py +101 -21
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool.py +85 -8
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
- dreadnode-2.0.34/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +139 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +1 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +1 -1
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -1
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +1 -1
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +6 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +6 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +15 -15
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +8 -12
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +1 -1
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +3 -17
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +2 -13
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +2 -2
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/loader.py +2 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/litellm_.py +15 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/oci.py +24 -13
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/__init__.py +14 -8
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/report_items.py +21 -9
- dreadnode-2.0.34/dreadnode/transforms/audio.py +2098 -0
- dreadnode-2.0.34/dreadnode/transforms/image.py +2293 -0
- dreadnode-2.0.34/dreadnode/transforms/video.py +949 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/pyproject.toml +11 -1
- dreadnode-2.0.33/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -92
- dreadnode-2.0.33/dreadnode/transforms/audio.py +0 -990
- dreadnode-2.0.33/dreadnode/transforms/image.py +0 -895
- dreadnode-2.0.33/dreadnode/transforms/video.py +0 -234
- {dreadnode-2.0.33 → dreadnode-2.0.34}/.gitignore +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/LICENSE +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/AGENTS.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/claude_code.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/native.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/message_parts.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/auth.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/factory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/http.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/message.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/spec.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/streaming/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/task_set.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/ws_auth.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/readme.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/proxy.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/trajectory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/trajectory_tools.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/guard.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/reconciliation.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/project_memory.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dreadnode
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.34
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -62,6 +62,11 @@ Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'all'
|
|
|
62
62
|
Requires-Dist: torch>=2.9.0; extra == 'all'
|
|
63
63
|
Provides-Extra: claude-code
|
|
64
64
|
Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'claude-code'
|
|
65
|
+
Provides-Extra: nova-sonic
|
|
66
|
+
Requires-Dist: aws-sdk-bedrock-runtime>=0.7.0; (python_version >= '3.12') and extra == 'nova-sonic'
|
|
67
|
+
Requires-Dist: awscrt>=0.27.0; extra == 'nova-sonic'
|
|
68
|
+
Requires-Dist: boto3>=1.40.0; extra == 'nova-sonic'
|
|
69
|
+
Requires-Dist: smithy-aws-core>=0.7.0; (python_version >= '3.12') and extra == 'nova-sonic'
|
|
65
70
|
Provides-Extra: scoring
|
|
66
71
|
Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'scoring'
|
|
67
72
|
Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'scoring'
|
|
@@ -379,6 +384,9 @@ pip install -U "dreadnode[scoring]"
|
|
|
379
384
|
# Optional training and serving stack
|
|
380
385
|
pip install -U "dreadnode[training]"
|
|
381
386
|
|
|
387
|
+
# Amazon Nova Sonic speech-to-speech target (requires Python >=3.12)
|
|
388
|
+
pip install -U "dreadnode[nova-sonic]"
|
|
389
|
+
|
|
382
390
|
# All optional features
|
|
383
391
|
pip install -U "dreadnode[all]"
|
|
384
392
|
```
|
|
@@ -298,6 +298,9 @@ pip install -U "dreadnode[scoring]"
|
|
|
298
298
|
# Optional training and serving stack
|
|
299
299
|
pip install -U "dreadnode[training]"
|
|
300
300
|
|
|
301
|
+
# Amazon Nova Sonic speech-to-speech target (requires Python >=3.12)
|
|
302
|
+
pip install -U "dreadnode[nova-sonic]"
|
|
303
|
+
|
|
301
304
|
# All optional features
|
|
302
305
|
pip install -U "dreadnode[all]"
|
|
303
306
|
```
|
|
@@ -50,6 +50,7 @@ from dreadnode.agents.reactions import (
|
|
|
50
50
|
Retry,
|
|
51
51
|
RetryWithFeedback,
|
|
52
52
|
)
|
|
53
|
+
from dreadnode.agents.sanitize import sanitize_orphan_tool_messages
|
|
53
54
|
from dreadnode.agents.tools import Tool, ToolCall, ToolMode, Toolset, discover_tools_on_obj
|
|
54
55
|
from dreadnode.agents.trajectory import Trajectory
|
|
55
56
|
from dreadnode.core.exceptions import warn_at_user_stacklevel
|
|
@@ -329,6 +330,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
329
330
|
messages, params, post_transform = await transform_callback(messages, params)
|
|
330
331
|
post_transforms.append(post_transform)
|
|
331
332
|
|
|
333
|
+
# ENG-7343 / ENG-6214: general tool-call repair at the provider boundary.
|
|
334
|
+
# Strip orphan tool_results and synthesize placeholders for tool_use
|
|
335
|
+
# blocks whose results were lost (cancel mid-tool, compaction split).
|
|
336
|
+
# Anthropic + OpenAI both 400 on the orphan shape.
|
|
337
|
+
messages = sanitize_orphan_tool_messages(messages)
|
|
338
|
+
|
|
332
339
|
try:
|
|
333
340
|
if self.cache is not None and self.generator.supports_prompt_caching():
|
|
334
341
|
messages = caching.apply_cache_mode_to_messages(self.cache, [messages])[0]
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Trajectory sanitization for tool-call/tool-result integrity (ENG-7343, ENG-6214).
|
|
2
|
+
|
|
3
|
+
Strict providers (Anthropic, OpenAI, and OpenAI-compatible gateways) reject
|
|
4
|
+
requests whose tool-call structure is malformed. Mid-tool cancellation,
|
|
5
|
+
compaction, session resume, and weak-model output can all produce shapes that
|
|
6
|
+
400 the entire request and leave a session unrecoverable. This module is the
|
|
7
|
+
single pre-provider chokepoint that repairs them.
|
|
8
|
+
|
|
9
|
+
Two failure families, both surfacing as request-fatal 400s, are handled here:
|
|
10
|
+
|
|
11
|
+
1. **Orphan pairs.** An assistant ``tool_call`` with no matching ``tool_result``
|
|
12
|
+
(or the inverse). Anthropic 400s with "unexpected tool_use_id ... must have a
|
|
13
|
+
corresponding tool_use block". Cause: cancel mid-tool, or compaction splitting
|
|
14
|
+
a pair across the summarization boundary.
|
|
15
|
+
|
|
16
|
+
2. **Malformed tool_calls that the adapter silently drops.** A ``tool_call`` with
|
|
17
|
+
a blank ``function.name`` is dropped by Responses-API adapters while its
|
|
18
|
+
``function_call_output`` survives, producing OpenAI's
|
|
19
|
+
"No tool call found for function call output with call_id ..." 400 — the same
|
|
20
|
+
symptom as (1) but a different root cause the orphan pass cannot see (the id
|
|
21
|
+
is present on both sides, so the pair *looks* complete). An empty
|
|
22
|
+
``tool_calls`` array is likewise rejected by some gateways (DeepSeek). These
|
|
23
|
+
are normalized *before* the orphan analysis. Reference: hermes-agent
|
|
24
|
+
``agent/agent_runtime_helpers.py`` pre-call sanitizer.
|
|
25
|
+
|
|
26
|
+
None of these passes mutate the input messages or the persisted trajectory —
|
|
27
|
+
repaired messages are shallow copies, so stored history and prompt caching stay
|
|
28
|
+
byte-stable.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from collections import Counter
|
|
32
|
+
|
|
33
|
+
from loguru import logger
|
|
34
|
+
|
|
35
|
+
from dreadnode.generators.message import Message
|
|
36
|
+
|
|
37
|
+
_INTERRUPTED_TOOL_RESULT = "[Tool execution was interrupted]"
|
|
38
|
+
# A blank tool-call name is invalid anyway; a non-empty sentinel keeps the call
|
|
39
|
+
# paired with its result through Responses-API adapters that would otherwise drop
|
|
40
|
+
# the nameless call and orphan its output.
|
|
41
|
+
_EMPTY_NAME_SENTINEL = "invalid_tool_call"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _repair_tool_calls(messages: list[Message]) -> tuple[list[Message], int, int]:
|
|
45
|
+
"""Normalize assistant ``tool_calls`` that strict providers reject.
|
|
46
|
+
|
|
47
|
+
- Empty ``tool_calls`` list → ``None`` (some gateways 400 on empty arrays).
|
|
48
|
+
- Blank ``function.name`` → ``_EMPTY_NAME_SENTINEL`` so the call is not
|
|
49
|
+
silently dropped by the adapter and orphaned from its output (ENG-7343).
|
|
50
|
+
|
|
51
|
+
Returns ``(messages, emptied, renamed)``. Never mutates the input.
|
|
52
|
+
"""
|
|
53
|
+
result: list[Message] = []
|
|
54
|
+
emptied = 0
|
|
55
|
+
renamed = 0
|
|
56
|
+
|
|
57
|
+
for m in messages:
|
|
58
|
+
if m.role != "assistant" or not m.tool_calls:
|
|
59
|
+
# Collapse an empty (but non-None) tool_calls array to None.
|
|
60
|
+
if m.role == "assistant" and m.tool_calls is not None and not m.tool_calls:
|
|
61
|
+
result.append(m.model_copy(update={"tool_calls": None}))
|
|
62
|
+
emptied += 1
|
|
63
|
+
else:
|
|
64
|
+
result.append(m)
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
new_calls = []
|
|
68
|
+
changed = False
|
|
69
|
+
for tc in m.tool_calls:
|
|
70
|
+
if (tc.function.name or "").strip():
|
|
71
|
+
new_calls.append(tc)
|
|
72
|
+
continue
|
|
73
|
+
new_calls.append(
|
|
74
|
+
tc.model_copy(
|
|
75
|
+
update={
|
|
76
|
+
"function": tc.function.model_copy(update={"name": _EMPTY_NAME_SENTINEL})
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
)
|
|
80
|
+
renamed += 1
|
|
81
|
+
changed = True
|
|
82
|
+
|
|
83
|
+
result.append(m.model_copy(update={"tool_calls": new_calls}) if changed else m)
|
|
84
|
+
|
|
85
|
+
return result, emptied, renamed
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def sanitize_orphan_tool_messages(messages: list[Message]) -> list[Message]:
|
|
89
|
+
"""Return ``messages`` with tool-call/result integrity restored.
|
|
90
|
+
|
|
91
|
+
Runs the malformed-tool_call repair, then resolves orphan pairs. Does not
|
|
92
|
+
mutate the input list. Idempotent: ``f(f(x)) == f(x)``.
|
|
93
|
+
"""
|
|
94
|
+
messages, emptied, renamed = _repair_tool_calls(messages)
|
|
95
|
+
|
|
96
|
+
tool_use_ids: set[str] = {
|
|
97
|
+
tc.id for m in messages if m.role == "assistant" and m.tool_calls for tc in m.tool_calls
|
|
98
|
+
}
|
|
99
|
+
# A *count* of available results per id, not a set: duplicate or blank ids
|
|
100
|
+
# (weak models behind OpenAI-compatible gateways emit both) would collapse
|
|
101
|
+
# in a set, so a second same-id call whose result is missing would never be
|
|
102
|
+
# synthesized and reach the provider unmatched. Each call consumes one
|
|
103
|
+
# available result; a call with none left gets a synthesized result.
|
|
104
|
+
available_results: Counter[str] = Counter(
|
|
105
|
+
m.tool_call_id for m in messages if m.role == "tool" and m.tool_call_id is not None
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
result: list[Message] = []
|
|
109
|
+
synthesized = 0
|
|
110
|
+
stripped = 0
|
|
111
|
+
|
|
112
|
+
for m in messages:
|
|
113
|
+
if m.role == "tool" and m.tool_call_id is not None and m.tool_call_id not in tool_use_ids:
|
|
114
|
+
stripped += 1
|
|
115
|
+
continue
|
|
116
|
+
|
|
117
|
+
result.append(m)
|
|
118
|
+
|
|
119
|
+
if m.role == "assistant" and m.tool_calls:
|
|
120
|
+
for tc in m.tool_calls:
|
|
121
|
+
if available_results[tc.id] > 0:
|
|
122
|
+
# Reserve one real result for this call; the rest of the loop
|
|
123
|
+
# keeps it in place when it is reached.
|
|
124
|
+
available_results[tc.id] -= 1
|
|
125
|
+
continue
|
|
126
|
+
result.append(
|
|
127
|
+
Message(
|
|
128
|
+
role="tool",
|
|
129
|
+
tool_call_id=tc.id,
|
|
130
|
+
content=_INTERRUPTED_TOOL_RESULT,
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
synthesized += 1
|
|
134
|
+
|
|
135
|
+
if synthesized or stripped or emptied or renamed:
|
|
136
|
+
# INFO, not DEBUG: any repair here means a malformed/orphan tool shape
|
|
137
|
+
# reached the provider boundary — a signal the compaction boundary
|
|
138
|
+
# detector, a cancel path, or a weak model let something through. We
|
|
139
|
+
# want to see this firing in the wild, not silently paper over it.
|
|
140
|
+
# See ENG-7343 / ENG-6551 Phase 2.
|
|
141
|
+
logger.info(
|
|
142
|
+
"sanitize_orphan_tool_messages: synthesized={}, stripped={}, "
|
|
143
|
+
"emptied_tool_calls={}, renamed_blank_tool_calls={}",
|
|
144
|
+
synthesized,
|
|
145
|
+
stripped,
|
|
146
|
+
emptied,
|
|
147
|
+
renamed,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return result
|
|
@@ -11,6 +11,7 @@ from textwrap import dedent
|
|
|
11
11
|
|
|
12
12
|
from loguru import logger
|
|
13
13
|
|
|
14
|
+
from dreadnode.agents.events import AgentEnd
|
|
14
15
|
from dreadnode.agents.tools import Toolset, tool_method
|
|
15
16
|
from dreadnode.core.meta import Config
|
|
16
17
|
from dreadnode.generators.message import Message
|
|
@@ -207,6 +208,21 @@ class SubAgentToolset(Toolset):
|
|
|
207
208
|
logger.error(f"Sub-agent failed: {e}")
|
|
208
209
|
return f"Sub-agent failed: {e}"
|
|
209
210
|
else:
|
|
211
|
+
terminal_event = next(
|
|
212
|
+
(event for event in reversed(trajectory.events) if isinstance(event, AgentEnd)),
|
|
213
|
+
None,
|
|
214
|
+
)
|
|
215
|
+
if terminal_event is not None and terminal_event.error:
|
|
216
|
+
error_text = str(terminal_event.error)
|
|
217
|
+
logger.error(
|
|
218
|
+
"Sub-agent ended with error | type={} | message={}",
|
|
219
|
+
type(terminal_event.error).__name__
|
|
220
|
+
if isinstance(terminal_event.error, BaseException)
|
|
221
|
+
else "error",
|
|
222
|
+
error_text,
|
|
223
|
+
)
|
|
224
|
+
return f"Sub-agent failed: {error_text}"
|
|
225
|
+
|
|
210
226
|
# Get the last assistant message content as the response
|
|
211
227
|
last_message = trajectory.messages[-1] if trajectory.messages else None
|
|
212
228
|
response = str(last_message.content) if last_message else ""
|
|
@@ -121,8 +121,15 @@ class FunctionDefinition(BaseModel):
|
|
|
121
121
|
if not isinstance(value, dict):
|
|
122
122
|
return value
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
# A function definition must always carry a parameters object with a
|
|
125
|
+
# `properties` key so it survives model_dump(exclude_none=True) and satisfies
|
|
126
|
+
# strict providers (e.g. Together, DeepInfra) that reject tool definitions
|
|
127
|
+
# missing the `parameters` field. Fill in an empty `properties` when absent
|
|
128
|
+
# while preserving any sibling schema keys (additionalProperties,
|
|
129
|
+
# patternProperties, required, $defs, ...) so free-form-map and strict
|
|
130
|
+
# no-arg schemas are not silently flattened.
|
|
131
|
+
if value.get("type") == "object" and not value.get("properties"):
|
|
132
|
+
return {**value, "properties": value.get("properties") or {}}
|
|
126
133
|
|
|
127
134
|
return value
|
|
128
135
|
|
|
@@ -138,6 +138,22 @@ class Assessment:
|
|
|
138
138
|
|
|
139
139
|
self.target_config = target_config
|
|
140
140
|
self.attacker_config = attacker_config
|
|
141
|
+
|
|
142
|
+
# Infer first-class model ids from the configs when not passed explicitly,
|
|
143
|
+
# so a user who only provides target_config / attacker_config still gets
|
|
144
|
+
# model metadata on the assessment header AND findings (mirrors the
|
|
145
|
+
# platform-side backfill). Keys match the capability/TUI convention.
|
|
146
|
+
if self.target_model is None and self.target_config:
|
|
147
|
+
self.target_model = self.target_config.get("model")
|
|
148
|
+
if self.attacker_model is None and self.attacker_config:
|
|
149
|
+
self.attacker_model = self.attacker_config.get("model") or self.attacker_config.get(
|
|
150
|
+
"attacker_model"
|
|
151
|
+
)
|
|
152
|
+
if self.judge_model is None and self.attacker_config:
|
|
153
|
+
self.judge_model = self.attacker_config.get(
|
|
154
|
+
"evaluator_model"
|
|
155
|
+
) or self.attacker_config.get("judge")
|
|
156
|
+
|
|
141
157
|
self._attack_manifest = attack_manifest
|
|
142
158
|
self._workflow_run_id = workflow_run_id
|
|
143
159
|
self._workflow_script = workflow_script
|
|
@@ -350,6 +366,15 @@ class Assessment:
|
|
|
350
366
|
study.airt_category = self.goal_category
|
|
351
367
|
if self.goal_category and not study.airt_sub_category:
|
|
352
368
|
study.airt_sub_category = self.goal_category
|
|
369
|
+
# Propagate the assessment's model identifiers so findings carry the
|
|
370
|
+
# target/judge metadata without the caller passing airt_* kwargs to the
|
|
371
|
+
# attack factory (e.g. multimodal_attack, which the user builds directly).
|
|
372
|
+
if self.target_model and not study.airt_target_model:
|
|
373
|
+
study.airt_target_model = self.target_model
|
|
374
|
+
if self.judge_model and not study.airt_evaluator_model:
|
|
375
|
+
study.airt_evaluator_model = self.judge_model
|
|
376
|
+
if self.attacker_model and not study.airt_attacker_model:
|
|
377
|
+
study.airt_attacker_model = self.attacker_model
|
|
353
378
|
|
|
354
379
|
from dreadnode.airt.analytics.types import GoalCategory
|
|
355
380
|
|
|
@@ -12,12 +12,30 @@ dynamically. Auth is AWS IAM/SigV4 via the credential chain — no API key.
|
|
|
12
12
|
import base64
|
|
13
13
|
import contextlib
|
|
14
14
|
import importlib
|
|
15
|
+
import importlib.util
|
|
15
16
|
import os
|
|
16
17
|
import typing as t
|
|
17
18
|
|
|
18
19
|
from dreadnode.core.task import Task, task
|
|
19
20
|
from dreadnode.generators.message import ContentAudioInput, ContentText, Message
|
|
20
21
|
|
|
22
|
+
_NOVA_DEPS = ("aws_sdk_bedrock_runtime", "awscrt", "smithy_aws_core")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _require_nova_deps() -> None:
|
|
26
|
+
"""Fail fast if the Nova Sonic streaming deps are missing.
|
|
27
|
+
|
|
28
|
+
Called at target-construction time so a missing ``dreadnode[nova-sonic]``
|
|
29
|
+
stops the run up front instead of surfacing as a mid-stream error finding.
|
|
30
|
+
"""
|
|
31
|
+
for mod in _NOVA_DEPS:
|
|
32
|
+
if importlib.util.find_spec(mod) is None:
|
|
33
|
+
raise RuntimeError(
|
|
34
|
+
"Nova Sonic speech-to-speech needs the optional streaming "
|
|
35
|
+
'dependencies. Install them with: pip install "dreadnode[nova-sonic]"'
|
|
36
|
+
f" (requires Python >=3.12). Missing module: {mod}."
|
|
37
|
+
)
|
|
38
|
+
|
|
21
39
|
|
|
22
40
|
def _ensure_aws_credentials(region: str) -> None:
|
|
23
41
|
"""Resolve AWS credentials up front and seed the environment for Nova Sonic.
|
|
@@ -69,9 +87,12 @@ def nova_sonic_target(
|
|
|
69
87
|
decodes to it). Streams it to Nova Sonic and returns a :class:`Message` with the
|
|
70
88
|
model's spoken reply (audio) and its transcript (text).
|
|
71
89
|
|
|
72
|
-
Prerequisites (see docs): ``pip install
|
|
73
|
-
credentials (env vars / profile / role), and Nova Sonic model access in the region.
|
|
90
|
+
Prerequisites (see docs): ``pip install "dreadnode[nova-sonic]"`` (Python >=3.12),
|
|
91
|
+
AWS credentials (env vars / profile / role), and Nova Sonic model access in the region.
|
|
74
92
|
"""
|
|
93
|
+
# Fail fast at construction so a missing dependency doesn't register a doomed
|
|
94
|
+
# assessment that only errors mid-stream.
|
|
95
|
+
_require_nova_deps()
|
|
75
96
|
|
|
76
97
|
async def target(message: Message) -> Message:
|
|
77
98
|
pcm = _first_audio_pcm(message)
|
|
@@ -128,10 +149,17 @@ async def _roundtrip(
|
|
|
128
149
|
# fast with a clear error instead of hanging on the Bedrock handshake.
|
|
129
150
|
_ensure_aws_credentials(region)
|
|
130
151
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
152
|
+
try:
|
|
153
|
+
bedrock = importlib.import_module("aws_sdk_bedrock_runtime.client")
|
|
154
|
+
models = importlib.import_module("aws_sdk_bedrock_runtime.models")
|
|
155
|
+
config_mod = importlib.import_module("aws_sdk_bedrock_runtime.config")
|
|
156
|
+
smithy_env = importlib.import_module("smithy_aws_core.identity.environment")
|
|
157
|
+
except ModuleNotFoundError as e:
|
|
158
|
+
raise RuntimeError(
|
|
159
|
+
"Nova Sonic speech-to-speech needs the optional streaming dependencies. "
|
|
160
|
+
'Install them with: pip install "dreadnode[nova-sonic]" (requires Python '
|
|
161
|
+
f">=3.12). Missing module: {e.name}."
|
|
162
|
+
) from e
|
|
135
163
|
|
|
136
164
|
prompt_id, sys_id, audio_id = (str(uuid.uuid4()) for _ in range(3))
|
|
137
165
|
text_out: list[str] = []
|
|
@@ -161,9 +189,14 @@ async def _roundtrip(
|
|
|
161
189
|
while not done.is_set():
|
|
162
190
|
output = await stream.await_output()
|
|
163
191
|
result = await output[1].receive()
|
|
164
|
-
|
|
192
|
+
# `result` is a union of chunk + error types; only the chunk variant
|
|
193
|
+
# carries `.value.bytes_`. Access defensively so the type checker
|
|
194
|
+
# doesn't flag the error variants (which have no such attribute).
|
|
195
|
+
value = getattr(result, "value", None)
|
|
196
|
+
payload = getattr(value, "bytes_", None)
|
|
197
|
+
if not payload:
|
|
165
198
|
continue
|
|
166
|
-
ev = json.loads(
|
|
199
|
+
ev = json.loads(payload.decode("utf-8")).get("event", {})
|
|
167
200
|
if "contentStart" in ev:
|
|
168
201
|
role["v"] = ev["contentStart"].get("role")
|
|
169
202
|
elif "textOutput" in ev and role["v"] == "ASSISTANT":
|
|
@@ -172,8 +172,20 @@ class ApiClient:
|
|
|
172
172
|
json_data: dict[str, t.Any] | None = None,
|
|
173
173
|
data: dict[str, t.Any] | None = None,
|
|
174
174
|
headers: dict[str, str] | None = None,
|
|
175
|
+
*,
|
|
176
|
+
timeout: float | None = None,
|
|
175
177
|
) -> httpx.Response:
|
|
176
178
|
"""Make a raw HTTP request without raising on errors."""
|
|
179
|
+
if timeout is not None:
|
|
180
|
+
return self._client.request(
|
|
181
|
+
method,
|
|
182
|
+
path,
|
|
183
|
+
params=params,
|
|
184
|
+
json=json_data,
|
|
185
|
+
data=data,
|
|
186
|
+
headers=headers,
|
|
187
|
+
timeout=timeout,
|
|
188
|
+
)
|
|
177
189
|
return self._client.request(
|
|
178
190
|
method,
|
|
179
191
|
path,
|
|
@@ -191,9 +203,22 @@ class ApiClient:
|
|
|
191
203
|
json_data: dict[str, t.Any] | None = None,
|
|
192
204
|
data: dict[str, t.Any] | None = None,
|
|
193
205
|
headers: dict[str, str] | None = None,
|
|
206
|
+
*,
|
|
207
|
+
timeout: float | None = None,
|
|
194
208
|
) -> httpx.Response:
|
|
195
209
|
"""Make an HTTP request and raise on errors."""
|
|
196
|
-
|
|
210
|
+
if timeout is None:
|
|
211
|
+
response = self._request(method, path, params, json_data, data, headers)
|
|
212
|
+
else:
|
|
213
|
+
response = self._request(
|
|
214
|
+
method,
|
|
215
|
+
path,
|
|
216
|
+
params,
|
|
217
|
+
json_data,
|
|
218
|
+
data,
|
|
219
|
+
headers,
|
|
220
|
+
timeout=timeout,
|
|
221
|
+
)
|
|
197
222
|
if response.status_code == 401:
|
|
198
223
|
raise AuthenticationError(self._get_error_message(response))
|
|
199
224
|
if response.status_code == 404:
|
|
@@ -2249,10 +2274,20 @@ class ApiClient:
|
|
|
2249
2274
|
response = self.request("GET", f"/org/{org}/capabilities/facets", params=params)
|
|
2250
2275
|
return t.cast("dict[str, t.Any]", response.json())
|
|
2251
2276
|
|
|
2252
|
-
def list_capability_versions(
|
|
2277
|
+
def list_capability_versions(
|
|
2278
|
+
self,
|
|
2279
|
+
org: str,
|
|
2280
|
+
name: str,
|
|
2281
|
+
*,
|
|
2282
|
+
timeout: float | None = None,
|
|
2283
|
+
) -> dict[str, t.Any]:
|
|
2253
2284
|
"""GET /org/{org}/capabilities/{name}/versions - List all versions."""
|
|
2254
2285
|
safe_name = _url_quote(name, safe="")
|
|
2255
|
-
response = self.request(
|
|
2286
|
+
response = self.request(
|
|
2287
|
+
"GET",
|
|
2288
|
+
f"/org/{org}/capabilities/{safe_name}/versions",
|
|
2289
|
+
timeout=timeout,
|
|
2290
|
+
)
|
|
2256
2291
|
return t.cast("dict[str, t.Any]", response.json())
|
|
2257
2292
|
|
|
2258
2293
|
def get_capability(self, org: str, name: str, version: str | None = None) -> dict[str, t.Any]:
|
|
@@ -670,6 +670,16 @@ def create(
|
|
|
670
670
|
] = None,
|
|
671
671
|
concurrency: int | None = None,
|
|
672
672
|
task_timeout_sec: int | None = None,
|
|
673
|
+
max_steps: t.Annotated[
|
|
674
|
+
int | None,
|
|
675
|
+
cyclopts.Parameter(
|
|
676
|
+
help=(
|
|
677
|
+
"Maximum agent tool/generation steps per sample. "
|
|
678
|
+
"Enforced via a headless session policy; the task timeout "
|
|
679
|
+
"still applies as a wall-clock bound."
|
|
680
|
+
),
|
|
681
|
+
),
|
|
682
|
+
] = None,
|
|
673
683
|
cleanup_policy: CleanupPolicy | None = None,
|
|
674
684
|
judge_model: str | None = None,
|
|
675
685
|
env_model: t.Annotated[
|
|
@@ -726,6 +736,9 @@ def create(
|
|
|
726
736
|
`dn secret list` to discover configured names.
|
|
727
737
|
concurrency: Maximum concurrent evaluation samples.
|
|
728
738
|
task_timeout_sec: Timeout per task in seconds.
|
|
739
|
+
max_steps: Maximum agent tool/generation steps per sample.
|
|
740
|
+
Enforced via a headless session policy; the task timeout still
|
|
741
|
+
applies as a wall-clock bound.
|
|
729
742
|
cleanup_policy: Sandbox cleanup policy.
|
|
730
743
|
judge_model: Override the judge model for all tasks in this evaluation.
|
|
731
744
|
wait: Block until the evaluation reaches a terminal state.
|
|
@@ -758,6 +771,8 @@ def create(
|
|
|
758
771
|
request["concurrency"] = concurrency
|
|
759
772
|
if task_timeout_sec is not None:
|
|
760
773
|
request["task_timeout_sec"] = task_timeout_sec
|
|
774
|
+
if max_steps is not None:
|
|
775
|
+
request["max_steps"] = max_steps
|
|
761
776
|
if cleanup_policy:
|
|
762
777
|
request["cleanup_policy"] = cleanup_policy
|
|
763
778
|
if judge_model:
|
|
@@ -122,6 +122,7 @@ class StreamingASGITransport(httpx.AsyncBaseTransport):
|
|
|
122
122
|
if tasks:
|
|
123
123
|
await asyncio.gather(*tasks, return_exceptions=True)
|
|
124
124
|
await loop.shutdown_asyncgens()
|
|
125
|
+
await loop.shutdown_default_executor()
|
|
125
126
|
|
|
126
127
|
async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
|
|
127
128
|
server_loop = self.require_server_loop()
|
|
@@ -657,6 +657,9 @@ async def server_lifecycle() -> t.AsyncIterator[None]:
|
|
|
657
657
|
try:
|
|
658
658
|
yield
|
|
659
659
|
finally:
|
|
660
|
+
if not synchronous:
|
|
661
|
+
with suppress(Exception):
|
|
662
|
+
await asyncio.wait_for(asyncio.shield(warm_future), timeout=2)
|
|
660
663
|
# Workers stop BEFORE MCP teardown
|
|
661
664
|
if registry and registry.worker_manager:
|
|
662
665
|
await registry.worker_manager.stop()
|
|
@@ -4327,7 +4330,7 @@ def _check_capability_updates(
|
|
|
4327
4330
|
) -> tuple[str, str | None, str]:
|
|
4328
4331
|
identity, owner, name, installed_ver, _source = item
|
|
4329
4332
|
try:
|
|
4330
|
-
resp = api.list_capability_versions(owner, name)
|
|
4333
|
+
resp = api.list_capability_versions(owner, name, timeout=timeout)
|
|
4331
4334
|
latest = resp.get("latest")
|
|
4332
4335
|
if isinstance(latest, dict):
|
|
4333
4336
|
return identity, latest.get("version"), installed_ver
|
|
@@ -4356,7 +4359,7 @@ def _check_capability_updates(
|
|
|
4356
4359
|
except Exception:
|
|
4357
4360
|
logger.debug("Capability update check failed", exc_info=True)
|
|
4358
4361
|
finally:
|
|
4359
|
-
executor.shutdown(wait=
|
|
4362
|
+
executor.shutdown(wait=True, cancel_futures=True)
|
|
4360
4363
|
|
|
4361
4364
|
return updates
|
|
4362
4365
|
|
|
@@ -3643,12 +3643,13 @@ class DreadnodeTextualApp(App[None]):
|
|
|
3643
3643
|
"expanded" if self.output_mode == "compact" else "compact"
|
|
3644
3644
|
)
|
|
3645
3645
|
self.output_mode = new_mode
|
|
3646
|
-
from dreadnode.app.tui.widgets.conversation import CompactionSummary
|
|
3646
|
+
from dreadnode.app.tui.widgets.conversation import CompactionSummary, ThinkingBlock
|
|
3647
3647
|
from dreadnode.app.tui.widgets.tool import ToolCall as ToolCallWidget
|
|
3648
3648
|
|
|
3649
|
-
# ^O
|
|
3650
|
-
#
|
|
3651
|
-
#
|
|
3649
|
+
# ^O drives every expandable surface: tool output, compaction summaries,
|
|
3650
|
+
# and reasoning. Reasoning was previously excluded (ENG-6108) but that
|
|
3651
|
+
# left long traces filling the viewport with no way to shorten them, so
|
|
3652
|
+
# ^O now shortens/expands ThinkingBlocks too (ENG-7463).
|
|
3652
3653
|
try:
|
|
3653
3654
|
conv = self.query_one("#conversation", ConversationView)
|
|
3654
3655
|
for tc in conv.query(ToolCallWidget):
|
|
@@ -3656,6 +3657,8 @@ class DreadnodeTextualApp(App[None]):
|
|
|
3656
3657
|
expanded = new_mode == "expanded"
|
|
3657
3658
|
for cs in conv.query(CompactionSummary):
|
|
3658
3659
|
cs.display = expanded
|
|
3660
|
+
for tb in conv.query(ThinkingBlock):
|
|
3661
|
+
tb.set_output_mode(new_mode)
|
|
3659
3662
|
except Exception:
|
|
3660
3663
|
logger.debug("Could not refresh output mode widgets")
|
|
3661
3664
|
self._flash(f"Output: {new_mode}", severity="info")
|