dreadnode 2.0.30__tar.gz → 2.0.31__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.30 → dreadnode-2.0.31}/PKG-INFO +7 -4
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/agent.py +36 -0
- dreadnode-2.0.31/dreadnode/agents/engines/AGENTS.md +27 -0
- dreadnode-2.0.31/dreadnode/agents/engines/__init__.py +89 -0
- dreadnode-2.0.31/dreadnode/agents/engines/base.py +166 -0
- dreadnode-2.0.31/dreadnode/agents/engines/claude_code.py +528 -0
- dreadnode-2.0.31/dreadnode/agents/engines/native.py +26 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/events.py +6 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/client.py +76 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/subagent.py +9 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/tools.py +4 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/assessment.py +11 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/client.py +272 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/models.py +18 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/airt.py +20 -5
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/args.py +1 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/environment.py +20 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/evaluation.py +72 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/main.py +35 -5
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/shared.py +46 -0
- dreadnode-2.0.31/dreadnode/app/cli/task_set.py +791 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/managed_client.py +4 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/runtime_client.py +6 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/print_mode.py +96 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/app.py +203 -3
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/prompt.py +57 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/session_persistence.py +29 -1
- dreadnode-2.0.31/dreadnode/app/server/utils.py +59 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/websocket.py +14 -3
- dreadnode-2.0.31/dreadnode/app/server/ws_auth.py +76 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/app.py +22 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/command_dispatcher.py +4 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/dreadnode.tcss +11 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/model_manager.py +7 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/sessions_manager.py +16 -14
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_reducer.py +8 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/context_bar.py +9 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/conversation.py +80 -30
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tool.py +68 -6
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/wire_events.py +4 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +2 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +10 -9
- dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +130 -0
- dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +109 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +2 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +20 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +20 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +24 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +1 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +1 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -0
- dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +223 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +1 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +10 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +10 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +1 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +3 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/loader.py +6 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/types.py +4 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/base.py +12 -5
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/litellm_.py +158 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/proxy.py +22 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/trajectory.py +3 -39
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/jobs.py +4 -27
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/study.py +38 -3
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/task_validation.py +83 -17
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/__init__.py +23 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/guard.py +13 -0
- dreadnode-2.0.31/dreadnode/policies/reconciliation.py +138 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/__init__.py +9 -1
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/interaction.py +54 -0
- dreadnode-2.0.31/dreadnode/tools/project_memory.py +318 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/read.py +12 -2
- {dreadnode-2.0.30 → dreadnode-2.0.31}/pyproject.toml +13 -4
- dreadnode-2.0.30/dreadnode/app/server/utils.py +0 -25
- {dreadnode-2.0.30 → dreadnode-2.0.31}/.gitignore +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/LICENSE +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/README.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/trajectory_tools.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.30 → dreadnode-2.0.31}/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.31
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -21,9 +21,10 @@ Requires-Dist: gepa>=0.1.1
|
|
|
21
21
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
22
22
|
Requires-Dist: jsonpath-ng>=1.7.0
|
|
23
23
|
Requires-Dist: jsonref>=1.1.0
|
|
24
|
-
Requires-Dist: litellm<=1.
|
|
24
|
+
Requires-Dist: litellm<=1.84.0,>=1.84.0
|
|
25
25
|
Requires-Dist: logfire<=3.20.0,>=3.5.3
|
|
26
26
|
Requires-Dist: loguru>=0.7.3
|
|
27
|
+
Requires-Dist: markdown-it-py[linkify]>=2.1.0
|
|
27
28
|
Requires-Dist: markdownify<2.0.0,>=1.1.0
|
|
28
29
|
Requires-Dist: mcp<2.0.0,>=1.25.0
|
|
29
30
|
Requires-Dist: moviepy<3.0.0,>=2.1.2
|
|
@@ -33,7 +34,7 @@ Requires-Dist: optuna<5.0.0,>=4.5.0
|
|
|
33
34
|
Requires-Dist: orjson>=3.11.5
|
|
34
35
|
Requires-Dist: packaging>=24.0
|
|
35
36
|
Requires-Dist: pandas<3.0.0,>=2.2.3
|
|
36
|
-
Requires-Dist: pillow<12.
|
|
37
|
+
Requires-Dist: pillow<12.3.0,>=12.2.0
|
|
37
38
|
Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
|
|
38
39
|
Requires-Dist: pyarrow>=4.0.0
|
|
39
40
|
Requires-Dist: pydantic-xml>=2.14.0
|
|
@@ -41,7 +42,7 @@ Requires-Dist: pydantic<3.0.0,>=2.9.2
|
|
|
41
42
|
Requires-Dist: pyyaml>=6.0.2
|
|
42
43
|
Requires-Dist: scipy<2.0.0,>=1.11.0
|
|
43
44
|
Requires-Dist: soundfile<1.0.0,>=0.13.1
|
|
44
|
-
Requires-Dist: starlette<1.
|
|
45
|
+
Requires-Dist: starlette<1.4.0,>=1.3.1
|
|
45
46
|
Requires-Dist: textual>=8.0.2
|
|
46
47
|
Requires-Dist: transformers>=4.57.1
|
|
47
48
|
Requires-Dist: uvicorn>=0.34.0
|
|
@@ -59,6 +60,8 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == 'all'
|
|
|
59
60
|
Requires-Dist: textblob<1.0.0,>=0.19.0; extra == 'all'
|
|
60
61
|
Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'all'
|
|
61
62
|
Requires-Dist: torch>=2.9.0; extra == 'all'
|
|
63
|
+
Provides-Extra: claude-code
|
|
64
|
+
Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'claude-code'
|
|
62
65
|
Provides-Extra: scoring
|
|
63
66
|
Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'scoring'
|
|
64
67
|
Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'scoring'
|
|
@@ -20,6 +20,7 @@ from pydantic import (
|
|
|
20
20
|
)
|
|
21
21
|
|
|
22
22
|
import dreadnode
|
|
23
|
+
from dreadnode.agents.engines import AgentEngine, EngineContext, PermissionBridge, resolve_engine
|
|
23
24
|
from dreadnode.agents.events import (
|
|
24
25
|
AgentEnd,
|
|
25
26
|
AgentError,
|
|
@@ -185,10 +186,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
185
186
|
"""Base factor for exponential backoff: wait = base_factor * 2 ** (attempt - 1)."""
|
|
186
187
|
backoff_jitter: bool = Config(default=True)
|
|
187
188
|
"""Whether to add up to ``backoff_base_factor`` seconds of random jitter to each wait."""
|
|
189
|
+
engine: str | AgentEngine | None = Config(default=None, expose_as=str | None)
|
|
190
|
+
"""Owner of the agent loop. ``None``/``"native"`` runs the in-process loop; a
|
|
191
|
+
built-in name (e.g. ``"claude-code"``) or a ``mod:attr`` reference delegates the
|
|
192
|
+
loop to a foreign harness while sessions/eval/optimization/policy keep working."""
|
|
188
193
|
|
|
189
194
|
# Private state
|
|
190
195
|
_generator: Generator | None = PrivateAttr(None, init=False)
|
|
191
196
|
_current_input: str = PrivateAttr("", init=False)
|
|
197
|
+
_permission_bridge: PermissionBridge | None = PrivateAttr(None, init=False)
|
|
198
|
+
"""Tool-approval bridge injected by the runtime so foreign engines wire their
|
|
199
|
+
permission callback into the native HITL path. ``None`` for bare-SDK use."""
|
|
192
200
|
|
|
193
201
|
# Discoverability namespace for the AgentJudge specialized construction.
|
|
194
202
|
# Assigned at module-load time by ``dreadnode.agents.__init__._lazy_init``
|
|
@@ -660,6 +668,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
660
668
|
# out of the result body.
|
|
661
669
|
tool_error = message.metadata.get("error")
|
|
662
670
|
tool_error_type = message.metadata.get("error_type")
|
|
671
|
+
tool_cost_usd = message.metadata.get("subagent_cost_usd")
|
|
663
672
|
|
|
664
673
|
end_event = ToolEnd(
|
|
665
674
|
agent_id=self.agent_id,
|
|
@@ -670,6 +679,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
670
679
|
stop=stop,
|
|
671
680
|
error=tool_error,
|
|
672
681
|
error_type=tool_error_type,
|
|
682
|
+
cost_usd=tool_cost_usd,
|
|
673
683
|
)
|
|
674
684
|
async for event in self._dispatch(end_event):
|
|
675
685
|
yield event
|
|
@@ -715,6 +725,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
715
725
|
|
|
716
726
|
async def _stream(
|
|
717
727
|
self, trajectory: Trajectory | None = None
|
|
728
|
+
) -> t.AsyncGenerator[AgentEvent, None]:
|
|
729
|
+
"""Drive the loop through the resolved :class:`AgentEngine`.
|
|
730
|
+
|
|
731
|
+
For the native engine this delegates straight to ``_native_run_loop``
|
|
732
|
+
(which dispatches its own hooks inline). Foreign engines yield translated
|
|
733
|
+
native events and call ``ctx.dispatch`` themselves for observational hooks.
|
|
734
|
+
This shim is the ``Executor._stream`` implementation; the surrounding span,
|
|
735
|
+
trajectory accumulation, and tool-context management stay in ``stream``.
|
|
736
|
+
"""
|
|
737
|
+
engine = self._resolve_engine()
|
|
738
|
+
ctx = EngineContext(
|
|
739
|
+
agent=self,
|
|
740
|
+
trajectory=trajectory if trajectory is not None else self.trajectory,
|
|
741
|
+
goal=self._current_input,
|
|
742
|
+
dispatch=self._dispatch,
|
|
743
|
+
permission=self._permission_bridge,
|
|
744
|
+
)
|
|
745
|
+
async for event in engine.run_loop(ctx):
|
|
746
|
+
yield event
|
|
747
|
+
|
|
748
|
+
def _resolve_engine(self) -> AgentEngine:
|
|
749
|
+
"""Resolve this agent's ``engine`` selector to a concrete engine instance."""
|
|
750
|
+
return resolve_engine(self.engine)
|
|
751
|
+
|
|
752
|
+
async def _native_run_loop(
|
|
753
|
+
self, trajectory: Trajectory | None = None
|
|
718
754
|
) -> t.AsyncGenerator[AgentEvent, None]:
|
|
719
755
|
"""
|
|
720
756
|
Core agent execution loop with inline tracing.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# AGENTS.md — agent engines
|
|
2
|
+
|
|
3
|
+
An **engine** owns the agent loop. The native engine is the default; foreign
|
|
4
|
+
engines (e.g. `claude-code`) delegate the loop to an external harness while the
|
|
5
|
+
agent stays a first-class `Agent`. Canonical contract: `specs/capabilities/engines.md`
|
|
6
|
+
(`CAP-ENG-*`, `CAP-ERES-*`, `CAP-EGOV-*`, `CAP-EBIND-*`).
|
|
7
|
+
|
|
8
|
+
## Files
|
|
9
|
+
|
|
10
|
+
- `base.py` — `AgentEngine` ABC, `EngineContext`, `EnforcementSurface`, `PolicyFacet`, `PermissionBridge`.
|
|
11
|
+
- `native.py` — `NativeEngine`, a thin delegate to `Agent._native_run_loop` (the historical loop body). Keep native byte-for-byte: the loop logic stays on `Agent`.
|
|
12
|
+
- `__init__.py` — registry (`register_engine`) + `resolve_engine` (built-in name / class / instance / `module.path:ClassName`).
|
|
13
|
+
|
|
14
|
+
## Authoring a built-in engine
|
|
15
|
+
|
|
16
|
+
1. Subclass `AgentEngine`, set a stable `name`, implement `async def run_loop(self, ctx)` yielding native `AgentEvent`s and exactly one terminal `AgentEnd`.
|
|
17
|
+
2. Call `register_engine(YourEngine)` in `__init__.py`.
|
|
18
|
+
3. Translate the harness's activity into native events; do **not** invent a new event schema.
|
|
19
|
+
4. If you do not dispatch inline, call `ctx.dispatch(event)` on every translated event so observational hooks run (leave `dispatches_internally = False`).
|
|
20
|
+
5. Override `describe_enforcement(policy)` with an **honest** `EnforcementSurface` — do not claim `enforces` for a facet you only observe. Override `honored_config()` with the explicit set of `Agent` fields you respect, and `consumed_components()` with the capability component kinds you actually use (Decision A: a harness with its own tools consumes none of ours — don't claim `python_tools` you don't inject; see `CAP-ENG-020..025`).
|
|
21
|
+
|
|
22
|
+
## MUST / NEVER
|
|
23
|
+
|
|
24
|
+
- **MUST** keep the `native` path unchanged — the existing agent-loop test suite is the regression gate.
|
|
25
|
+
- **MUST** spawn third-party / subprocess engines inside the runtime sandbox, never in-process in the runtime (`CAP-EBIND-002`).
|
|
26
|
+
- **NEVER** let an engine silently downgrade governance: an un-enforceable required policy facet must surface as a refusal/warning via reconciliation, not be ignored.
|
|
27
|
+
- **NEVER** import `Agent` at module load (cycle): use `if TYPE_CHECKING` and reach the agent through `ctx.agent`.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Agent engines — pluggable, overridable owners of the agent loop.
|
|
2
|
+
|
|
3
|
+
Built-ins are resolved by name (``native``, ``claude-code``); customer engines
|
|
4
|
+
are resolved from a ``mod:attr`` reference (mirroring ``WorkerDef`` import refs).
|
|
5
|
+
Resolution precedence for the ``engine`` selector itself lives in
|
|
6
|
+
``create_agent`` and mirrors how ``model`` resolves.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import importlib
|
|
10
|
+
|
|
11
|
+
from dreadnode.agents.engines.base import (
|
|
12
|
+
AgentEngine,
|
|
13
|
+
CapabilityComponent,
|
|
14
|
+
EnforcementSurface,
|
|
15
|
+
EngineContext,
|
|
16
|
+
PermissionBridge,
|
|
17
|
+
PolicyFacet,
|
|
18
|
+
)
|
|
19
|
+
from dreadnode.agents.engines.claude_code import ClaudeCodeEngine, ClaudeCodeTranslationState
|
|
20
|
+
from dreadnode.agents.engines.native import NativeEngine
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"AgentEngine",
|
|
24
|
+
"CapabilityComponent",
|
|
25
|
+
"ClaudeCodeEngine",
|
|
26
|
+
"ClaudeCodeTranslationState",
|
|
27
|
+
"EnforcementSurface",
|
|
28
|
+
"EngineContext",
|
|
29
|
+
"NativeEngine",
|
|
30
|
+
"PermissionBridge",
|
|
31
|
+
"PolicyFacet",
|
|
32
|
+
"register_engine",
|
|
33
|
+
"resolve_engine",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
_REGISTRY: dict[str, type[AgentEngine]] = {}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def register_engine(cls: type[AgentEngine]) -> type[AgentEngine]:
|
|
40
|
+
"""Register a built-in engine class under its ``name`` (usable as a decorator)."""
|
|
41
|
+
name = getattr(cls, "name", None)
|
|
42
|
+
if not name:
|
|
43
|
+
raise ValueError(f"Engine {cls!r} must define a non-empty 'name'.")
|
|
44
|
+
_REGISTRY[name] = cls
|
|
45
|
+
return cls
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
register_engine(NativeEngine)
|
|
49
|
+
register_engine(ClaudeCodeEngine)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _load_engine_from_ref(ref: str) -> type[AgentEngine]:
|
|
53
|
+
"""Import an engine class from a ``module.path:Attr`` or ``module.path.Attr`` ref."""
|
|
54
|
+
module_path, _, attr = ref.partition(":")
|
|
55
|
+
if not attr:
|
|
56
|
+
module_path, _, attr = ref.rpartition(".")
|
|
57
|
+
if not module_path or not attr:
|
|
58
|
+
raise ValueError(f"Invalid engine reference {ref!r}; expected 'module.path:ClassName'.")
|
|
59
|
+
try:
|
|
60
|
+
module = importlib.import_module(module_path)
|
|
61
|
+
except ImportError as exc:
|
|
62
|
+
raise ValueError(f"Could not import engine module '{module_path}' from {ref!r}.") from exc
|
|
63
|
+
obj = getattr(module, attr, None)
|
|
64
|
+
if obj is None or not (isinstance(obj, type) and issubclass(obj, AgentEngine)):
|
|
65
|
+
raise ValueError(f"Engine reference {ref!r} did not resolve to an AgentEngine subclass.")
|
|
66
|
+
return obj
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def resolve_engine(spec: "str | AgentEngine | type[AgentEngine] | None") -> AgentEngine:
|
|
70
|
+
"""Resolve an ``engine`` selector to a concrete :class:`AgentEngine` instance.
|
|
71
|
+
|
|
72
|
+
Accepts ``None`` (→ native), an instance, a class, a built-in name, or a
|
|
73
|
+
``mod:attr`` reference. A fresh instance is returned for class/name/ref specs
|
|
74
|
+
so stateful engines (subprocess-backed) don't leak state across turns.
|
|
75
|
+
"""
|
|
76
|
+
if spec is None:
|
|
77
|
+
return NativeEngine()
|
|
78
|
+
if isinstance(spec, AgentEngine):
|
|
79
|
+
return spec
|
|
80
|
+
if isinstance(spec, type) and issubclass(spec, AgentEngine):
|
|
81
|
+
return spec()
|
|
82
|
+
if isinstance(spec, str):
|
|
83
|
+
if spec in _REGISTRY:
|
|
84
|
+
return _REGISTRY[spec]()
|
|
85
|
+
if ":" in spec or "." in spec:
|
|
86
|
+
return _load_engine_from_ref(spec)()
|
|
87
|
+
known = ", ".join(sorted(_REGISTRY)) or "(none)"
|
|
88
|
+
raise ValueError(f"Unknown engine '{spec}'. Known built-ins: {known}.")
|
|
89
|
+
raise TypeError(f"Unsupported engine selector: {spec!r}")
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""Engine contract for the agent loop.
|
|
2
|
+
|
|
3
|
+
An :class:`AgentEngine` owns the *interior* of an agent — the loop that turns a
|
|
4
|
+
goal into generation/tool events. The native engine is the default; foreign
|
|
5
|
+
engines (e.g. ``claude-code``) delegate the loop to an external harness while the
|
|
6
|
+
rest of the stack (sessions, eval, optimization, policy, telemetry, TUI) keeps
|
|
7
|
+
working because the foreign agent is still an :class:`~dreadnode.agents.agent.Agent`.
|
|
8
|
+
|
|
9
|
+
See ``specs/capabilities/engines.md`` (ENG-*) for the canonical contract.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import typing as t
|
|
13
|
+
from abc import ABC, abstractmethod
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from enum import StrEnum
|
|
16
|
+
|
|
17
|
+
if t.TYPE_CHECKING:
|
|
18
|
+
from dreadnode.agents.agent import Agent
|
|
19
|
+
from dreadnode.agents.events import AgentEvent
|
|
20
|
+
from dreadnode.agents.trajectory import Trajectory
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class PolicyFacet(StrEnum):
|
|
24
|
+
"""A single governable dimension of a session policy.
|
|
25
|
+
|
|
26
|
+
An engine declares, per facet, whether it *enforces* it, *bridges* it via a
|
|
27
|
+
harness callback, can only *observe* it, or has *no equivalent* mechanism.
|
|
28
|
+
The runtime reconciles the session policy against that declaration (ENG-REC-*).
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
AUTONOMY = "autonomy"
|
|
32
|
+
"""Block-vs-auto-allow (native ``is_autonomous`` / harness ``permission_mode``)."""
|
|
33
|
+
TOOL_APPROVAL = "tool_approval"
|
|
34
|
+
"""Human-in-the-loop tool approval (``ask_user`` → ``prompt.required``)."""
|
|
35
|
+
STEP_BUDGET = "step_budget"
|
|
36
|
+
"""Step/turn ceiling (``max_steps`` / harness ``max_turns``)."""
|
|
37
|
+
TOKEN_BUDGET = "token_budget" # noqa: S105 (facet name, not a secret)
|
|
38
|
+
"""Token ceiling (no harness equivalent — enforced by killing the run)."""
|
|
39
|
+
COST_BUDGET = "cost_budget"
|
|
40
|
+
"""Cost ceiling (no harness equivalent — enforced by killing the run)."""
|
|
41
|
+
TIME_BUDGET = "time_budget"
|
|
42
|
+
"""Wall-clock ceiling (no harness equivalent — enforced by killing the run)."""
|
|
43
|
+
GUARD_STEERING = "guard_steering"
|
|
44
|
+
"""Mid-loop prevention/steering via hook ``Reaction`` (in-loop only)."""
|
|
45
|
+
SCORERS = "scorers"
|
|
46
|
+
"""Observational scorers/detectors/metrics (attach to events after the fact)."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class CapabilityComponent(StrEnum):
|
|
50
|
+
"""A kind of capability-declared resource an engine may or may not consume.
|
|
51
|
+
|
|
52
|
+
The native engine consumes all kinds (it executes our tools in-loop and
|
|
53
|
+
surfaces our skills). A foreign engine that brings its own tools declares a
|
|
54
|
+
subset; the runtime informs the author which declared components are inert
|
|
55
|
+
under that engine (CAP-ENG-022). See ``specs/capabilities/engines.md``.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
PYTHON_TOOLS = "python_tools"
|
|
59
|
+
"""Capability ``@tool`` / MCP tools from our registry, executed in-loop."""
|
|
60
|
+
MCP_SERVERS = "mcp_servers"
|
|
61
|
+
"""MCP servers the capability declares (folded with python_tools today)."""
|
|
62
|
+
SKILLS = "skills"
|
|
63
|
+
"""``SKILL.md`` directories (the shared Agent Skills standard)."""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@dataclass(frozen=True)
|
|
67
|
+
class EnforcementSurface:
|
|
68
|
+
"""What an engine can actually do about each policy facet.
|
|
69
|
+
|
|
70
|
+
A facet absent from all four sets is treated as ``observes_only`` by the
|
|
71
|
+
reconciler (the conservative default).
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
enforces: frozenset[PolicyFacet] = field(default_factory=frozenset)
|
|
75
|
+
"""Enforced natively or by translatable config (e.g. ``permission_mode``)."""
|
|
76
|
+
bridges: frozenset[PolicyFacet] = field(default_factory=frozenset)
|
|
77
|
+
"""Enforced by wiring a harness callback back into our control plane."""
|
|
78
|
+
observes_only: frozenset[PolicyFacet] = field(default_factory=frozenset)
|
|
79
|
+
"""Visible after the harness acted — can record, cannot prevent."""
|
|
80
|
+
no_equivalent: frozenset[PolicyFacet] = field(default_factory=frozenset)
|
|
81
|
+
"""No mechanism in the harness — enforceable only by killing the run."""
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def all_enforced(cls) -> "EnforcementSurface":
|
|
85
|
+
"""The native engine's surface: it owns the loop, so it enforces everything."""
|
|
86
|
+
return cls(enforces=frozenset(PolicyFacet))
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@t.runtime_checkable
|
|
90
|
+
class PermissionBridge(t.Protocol):
|
|
91
|
+
"""Bridges a harness tool-approval callback into the native HITL path.
|
|
92
|
+
|
|
93
|
+
Implemented by the runtime over ``_human_prompt_handler`` so a foreign
|
|
94
|
+
engine's ``can_use_tool`` reuses the existing ``prompt.required`` /
|
|
95
|
+
``prompt.respond`` protocol (TUI widget, eval-worker auto-deny). Wired in M1.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
async def request_tool_approval(
|
|
99
|
+
self, *, tool_name: str, tool_input: dict[str, t.Any]
|
|
100
|
+
) -> bool: ...
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@dataclass
|
|
104
|
+
class EngineContext:
|
|
105
|
+
"""Everything an engine needs to run one turn.
|
|
106
|
+
|
|
107
|
+
The native engine uses only ``agent`` + ``trajectory`` (it reaches the rest
|
|
108
|
+
through ``agent``). Foreign engines additionally use ``goal``, ``dispatch``
|
|
109
|
+
(to run observational hooks on translated events), and ``permission``.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
agent: "Agent"
|
|
113
|
+
trajectory: "Trajectory"
|
|
114
|
+
goal: str
|
|
115
|
+
dispatch: "t.Callable[[AgentEvent], t.AsyncIterator[AgentEvent]]"
|
|
116
|
+
"""Run an event through the agent's hooks (metrics + reactions). Foreign
|
|
117
|
+
engines call this per translated event; the native engine dispatches inline."""
|
|
118
|
+
permission: "PermissionBridge | None" = None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class AgentEngine(ABC):
|
|
122
|
+
"""Pluggable owner of the agent loop.
|
|
123
|
+
|
|
124
|
+
Implementations live in this package (built-ins) or are supplied by a
|
|
125
|
+
customer via a ``mod:attr`` reference. Built-ins register via
|
|
126
|
+
:func:`~dreadnode.agents.engines.register_engine`.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
name: t.ClassVar[str]
|
|
130
|
+
"""Stable identifier used in ``engine:`` declarations and the registry."""
|
|
131
|
+
|
|
132
|
+
dispatches_internally: t.ClassVar[bool] = False
|
|
133
|
+
"""True when ``run_loop`` already routes its events through ``ctx.dispatch``
|
|
134
|
+
(the native engine does, inline). Foreign engines leave this False and call
|
|
135
|
+
``ctx.dispatch`` themselves on translated events."""
|
|
136
|
+
|
|
137
|
+
@abstractmethod
|
|
138
|
+
def run_loop(self, ctx: EngineContext) -> "t.AsyncIterator[AgentEvent]":
|
|
139
|
+
"""Drive one turn, yielding native ``AgentEvent``s as it progresses."""
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
def describe_enforcement(self, policy: t.Any) -> EnforcementSurface: # noqa: ARG002
|
|
143
|
+
"""Declare which policy facets this engine can enforce for ``policy``.
|
|
144
|
+
|
|
145
|
+
Defaults to fully-enforced (correct for any engine that owns a native
|
|
146
|
+
loop). Foreign engines override with an honest, partial surface.
|
|
147
|
+
"""
|
|
148
|
+
return EnforcementSurface.all_enforced()
|
|
149
|
+
|
|
150
|
+
def honored_config(self) -> set[str] | None:
|
|
151
|
+
"""Which ``Agent`` config fields this engine respects.
|
|
152
|
+
|
|
153
|
+
``None`` means "all" (the native engine). A foreign engine returns the
|
|
154
|
+
explicit set it honors so the runtime can warn about ignored config.
|
|
155
|
+
"""
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
def consumed_components(self) -> set[CapabilityComponent]:
|
|
159
|
+
"""Which capability component kinds this engine consumes.
|
|
160
|
+
|
|
161
|
+
Defaults to all (the native engine executes our tools in-loop and
|
|
162
|
+
surfaces our skills). A foreign engine that uses its own tools returns a
|
|
163
|
+
subset; the runtime informs the author about the unconsumed components
|
|
164
|
+
a capability declares (CAP-ENG-022).
|
|
165
|
+
"""
|
|
166
|
+
return set(CapabilityComponent)
|