dreadnode 2.0.42__tar.gz → 2.0.43__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.42 → dreadnode-2.0.43}/PKG-INFO +1 -1
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/agent.py +4 -2
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/events.py +13 -10
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/tools.py +1 -1
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/owasp_agentic.py +7 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/evaluation.py +41 -3
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/runtime.py +231 -7
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/shared.py +24 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/task.py +13 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/capability_manager.py +6 -24
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +54 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +2 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +58 -4
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -3
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +43 -1
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +58 -1
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +3 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +26 -11
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +2 -0
- dreadnode-2.0.43/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +188 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/capability.py +16 -0
- dreadnode-2.0.43/dreadnode/capabilities/command_tools.py +388 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/loader.py +3 -1
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/sync.py +7 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/trajectory.py +20 -14
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/trajectory_tools.py +50 -15
- dreadnode-2.0.43/dreadnode/packaging/egress.py +193 -0
- dreadnode-2.0.43/dreadnode/packaging/manifest.py +193 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/oci.py +5 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/task_validation.py +26 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/__init__.py +14 -0
- dreadnode-2.0.43/dreadnode/scorers/browser_security.py +173 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/exfiltration_detection.py +111 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/exfiltration.py +122 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/pyproject.toml +1 -1
- dreadnode-2.0.42/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +0 -94
- dreadnode-2.0.42/dreadnode/packaging/manifest.py +0 -93
- {dreadnode-2.0.42 → dreadnode-2.0.43}/.gitignore +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/LICENSE +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/README.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/AGENTS.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/claude_code.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/native.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/sanitize.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/_base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/agent_suite.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/agentic_suite.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/approval_bypass.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/art_engine.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/defense.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/failure.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/gate.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/memory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/modes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/probes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/recon.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/router.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/strategy.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/authz.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/browser_probes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/detect.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/_base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/_text_common.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/bae.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/boundary.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/deepwordbug.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/hopskipjump.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/pwws.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/simba.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/square.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/text.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/textbugger.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/textfooler.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/zoo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/_base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/activethief.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/copycat.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/distillation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/equation_solving.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/jacobian.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/knockoff.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/honeytoken.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/injection_channels.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/_base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/confidence.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/nes_inversion.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/mcp_probes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/_base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/entropy.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/label_only.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/lira.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/loss.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/shadow_model.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/threshold.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/message_parts.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/model_export.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/oast.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/policies.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/probe_planner.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/propagation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/resource_abuse.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/target.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/auth.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/factory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/http.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/message.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/prediction.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/spec.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/streaming/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/task_set.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/app.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/runtime_credentials.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/ws_auth.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/app.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/bug_report.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/dreadnode.tcss +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/readme.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/report_bug.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/sessions_manager.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/tls.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/proxy.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/guard.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/reconciliation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/scope.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/project_memory.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/report_items.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/submission.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/art_prompt.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/past_tense.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/version.py +0 -0
|
@@ -710,6 +710,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
710
710
|
self, tool_call: "ToolCall", step_count: int
|
|
711
711
|
) -> t.AsyncGenerator[AgentEvent, None]:
|
|
712
712
|
"""Process a single tool call with its own span."""
|
|
713
|
+
tool = next((t for t in self.all_tools if t.wire_name == tool_call.name), None)
|
|
714
|
+
redact_telemetry = tool is not None and tool.source == "command"
|
|
713
715
|
with dreadnode.task_span(
|
|
714
716
|
f"tool:{tool_call.name}",
|
|
715
717
|
type="tool",
|
|
@@ -721,13 +723,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
721
723
|
agent_name=self.name,
|
|
722
724
|
status="running",
|
|
723
725
|
tool_call=tool_call,
|
|
726
|
+
redact_telemetry=redact_telemetry,
|
|
724
727
|
)
|
|
725
728
|
start_event.emit(t_span)
|
|
726
729
|
async for event in self._dispatch(start_event):
|
|
727
730
|
yield event
|
|
728
731
|
|
|
729
|
-
tool = next((t for t in self.all_tools if t.wire_name == tool_call.name), None)
|
|
730
|
-
|
|
731
732
|
if tool is None:
|
|
732
733
|
error_msg = f"Tool '{tool_call.name}' not found."
|
|
733
734
|
logger.warning(error_msg)
|
|
@@ -791,6 +792,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
791
792
|
error_type=tool_error_type,
|
|
792
793
|
cost_usd=tool_cost_usd,
|
|
793
794
|
policy_decision=start_event.policy_decision,
|
|
795
|
+
redact_telemetry=redact_telemetry,
|
|
794
796
|
)
|
|
795
797
|
async for event in self._dispatch(end_event):
|
|
796
798
|
yield event
|
|
@@ -457,6 +457,7 @@ class ToolStart(AgentEvent):
|
|
|
457
457
|
|
|
458
458
|
tool_call: ToolCall
|
|
459
459
|
policy_decision: dict[str, t.Any] | None = None
|
|
460
|
+
redact_telemetry: bool = Field(default=False, exclude=True)
|
|
460
461
|
|
|
461
462
|
def _get_data(self) -> dict[str, t.Any]:
|
|
462
463
|
try:
|
|
@@ -480,14 +481,15 @@ class ToolStart(AgentEvent):
|
|
|
480
481
|
span.set_attribute(TOOL_ATTRIBUTE_NAME, self.tool_call.name)
|
|
481
482
|
span.set_attribute(TOOL_ATTRIBUTE_CALL_ID, self.tool_call.id)
|
|
482
483
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
484
|
+
if not self.redact_telemetry:
|
|
485
|
+
# Parse and set arguments
|
|
486
|
+
try:
|
|
487
|
+
args = json.loads(self.tool_call.function.arguments)
|
|
488
|
+
except (json.JSONDecodeError, TypeError):
|
|
489
|
+
args = self.tool_call.function.arguments
|
|
488
490
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
+
span.set_attribute(TOOL_ATTRIBUTE_ARGUMENTS, args)
|
|
492
|
+
span.log_input("arguments", args)
|
|
491
493
|
|
|
492
494
|
super().emit(span)
|
|
493
495
|
|
|
@@ -544,11 +546,12 @@ class ToolEnd(AgentEvent):
|
|
|
544
546
|
error: str | None = None
|
|
545
547
|
error_type: str | None = None
|
|
546
548
|
cost_usd: float | None = None
|
|
547
|
-
policy_decision: dict[str, t.Any] | None = None
|
|
548
549
|
"""Estimated USD cost contributed by this tool call, when the tool
|
|
549
550
|
ran an internal LLM (e.g. ``spawn_agent``). ``None`` for ordinary
|
|
550
551
|
tools — the TUI only accumulates this into the sub-agent cost
|
|
551
552
|
display, never the main session cost."""
|
|
553
|
+
policy_decision: dict[str, t.Any] | None = None
|
|
554
|
+
redact_telemetry: bool = Field(default=False, exclude=True)
|
|
552
555
|
|
|
553
556
|
def _get_data(self) -> dict[str, t.Any]:
|
|
554
557
|
return {
|
|
@@ -571,13 +574,13 @@ class ToolEnd(AgentEvent):
|
|
|
571
574
|
|
|
572
575
|
def emit(self, span: "TaskSpan") -> None:
|
|
573
576
|
# Attributes
|
|
574
|
-
if self.result:
|
|
577
|
+
if self.result and not self.redact_telemetry:
|
|
575
578
|
span.set_attribute(TOOL_ATTRIBUTE_RESULT, self.result)
|
|
576
579
|
span.log_output("result", self.result)
|
|
577
580
|
|
|
578
581
|
span.set_attribute(TOOL_ATTRIBUTE_STOPPED, self.stop)
|
|
579
582
|
|
|
580
|
-
if self.error:
|
|
583
|
+
if self.error and not self.redact_telemetry:
|
|
581
584
|
span.set_attribute(TOOL_ATTRIBUTE_ERROR, self.error)
|
|
582
585
|
span.log_metric(f"tool/{self.tool_call.name}/error", 1)
|
|
583
586
|
|
|
@@ -201,7 +201,7 @@ async def offload_tool_output(
|
|
|
201
201
|
return truncated, file_path
|
|
202
202
|
|
|
203
203
|
|
|
204
|
-
ToolSource = t.Literal["builtin", "python", "mcp", "synthetic", "bundled"]
|
|
204
|
+
ToolSource = t.Literal["builtin", "python", "command", "mcp", "synthetic", "bundled"]
|
|
205
205
|
"""The origin of a tool. See CAP-IDENT-001 in specs/capabilities/runtime.md."""
|
|
206
206
|
|
|
207
207
|
_WIRE_NAME_MAX = 64
|
|
@@ -128,6 +128,8 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
|
|
|
128
128
|
"indirect_injection_success",
|
|
129
129
|
"echo_chamber_detected",
|
|
130
130
|
"sycophancy_detected",
|
|
131
|
+
"visual_injection_followed",
|
|
132
|
+
"navigation_hijacked",
|
|
131
133
|
],
|
|
132
134
|
"rubrics": ["goal_hijacking"],
|
|
133
135
|
},
|
|
@@ -144,6 +146,8 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
|
|
|
144
146
|
"tool_description_poisoned",
|
|
145
147
|
"implicit_tool_poison_detected",
|
|
146
148
|
"tool_output_injected",
|
|
149
|
+
"clickfix_executed",
|
|
150
|
+
"domain_validation_bypassed",
|
|
147
151
|
],
|
|
148
152
|
"rubrics": ["tool_selection_safety", "tool_chaining"],
|
|
149
153
|
},
|
|
@@ -166,6 +170,9 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
|
|
|
166
170
|
"markdown_exfil_detected",
|
|
167
171
|
"dns_exfil_detected",
|
|
168
172
|
"unicode_exfil_detected",
|
|
173
|
+
"ssrf_exfil_detected",
|
|
174
|
+
"search_query_exfil_detected",
|
|
175
|
+
"trusted_domain_exfil_detected",
|
|
169
176
|
],
|
|
170
177
|
"rubrics": [],
|
|
171
178
|
},
|
|
@@ -29,10 +29,12 @@ from dreadnode.app.cli.shared import (
|
|
|
29
29
|
confirm_destructive,
|
|
30
30
|
console,
|
|
31
31
|
merge_env_model_overrides,
|
|
32
|
+
parse_egress_targets,
|
|
32
33
|
parse_env_model_overrides,
|
|
33
34
|
print_link,
|
|
34
35
|
)
|
|
35
36
|
from dreadnode.app.model_catalog import resolve_model
|
|
37
|
+
from dreadnode.packaging.egress import merge_targets as merge_egress_targets
|
|
36
38
|
|
|
37
39
|
cli = cyclopts.App(
|
|
38
40
|
name="evaluation",
|
|
@@ -724,6 +726,23 @@ def create(
|
|
|
724
726
|
negative_iterable=(),
|
|
725
727
|
),
|
|
726
728
|
] = None,
|
|
729
|
+
egress: t.Annotated[
|
|
730
|
+
list[str] | None,
|
|
731
|
+
cyclopts.Parameter(
|
|
732
|
+
name="--egress",
|
|
733
|
+
help=(
|
|
734
|
+
"Additional outbound destination for this run's sandboxes "
|
|
735
|
+
"(e.g. --egress staging.example.com, --egress '*.internal.corp', "
|
|
736
|
+
"--egress 10.20.0.0/16; repeatable). Targets union with the "
|
|
737
|
+
"task's own egress.allow and are checked against the "
|
|
738
|
+
"deployment's egress floor identically, so they grant no reach "
|
|
739
|
+
"a task declaration could not. Supplying any target makes this "
|
|
740
|
+
"run a declaration, restricting it to what is named plus the "
|
|
741
|
+
"platform destinations the platform derives."
|
|
742
|
+
),
|
|
743
|
+
negative_iterable=(),
|
|
744
|
+
),
|
|
745
|
+
] = None,
|
|
727
746
|
wait: t.Annotated[bool, cyclopts.Parameter(negative=())] = False,
|
|
728
747
|
poll_interval_sec: t.Annotated[
|
|
729
748
|
float,
|
|
@@ -775,6 +794,12 @@ def create(
|
|
|
775
794
|
applies as a wall-clock bound.
|
|
776
795
|
cleanup_policy: Sandbox cleanup policy.
|
|
777
796
|
judge_model: Override the judge model for all tasks in this evaluation.
|
|
797
|
+
egress: Additional outbound destination for this run's sandboxes, as an
|
|
798
|
+
FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Unions
|
|
799
|
+
with the task's own `egress.allow` and is checked against the
|
|
800
|
+
deployment's egress floor identically. Supplying any target makes
|
|
801
|
+
this run a declaration, restricting it to what is named plus the
|
|
802
|
+
platform destinations the platform derives.
|
|
778
803
|
wait: Block until the evaluation reaches a terminal state.
|
|
779
804
|
poll_interval_sec: Seconds between status polls when --wait is set.
|
|
780
805
|
timeout_sec: Maximum seconds to wait before timing out.
|
|
@@ -818,6 +843,17 @@ def create(
|
|
|
818
843
|
if merged_env_models is not None:
|
|
819
844
|
request["model_overrides"] = merged_env_models
|
|
820
845
|
|
|
846
|
+
# TSK-EGR-007: --egress adds to any egress_overrides block from --file
|
|
847
|
+
# rather than replacing it, the same way --env-model merges per role.
|
|
848
|
+
# Both sides are validated here so a bad target is named before the round
|
|
849
|
+
# trip, whichever of the two the author wrote it in.
|
|
850
|
+
merged_egress = merge_egress_targets(
|
|
851
|
+
parse_egress_targets(request.get("egress_overrides"), where="egress_overrides"),
|
|
852
|
+
parse_egress_targets(egress),
|
|
853
|
+
)
|
|
854
|
+
if merged_egress is not None:
|
|
855
|
+
request["egress_overrides"] = merged_egress
|
|
856
|
+
|
|
821
857
|
if not request.get("name"):
|
|
822
858
|
raise ValueError(
|
|
823
859
|
"dn evaluation create requires a name. Pass one positionally or in --file."
|
|
@@ -1494,10 +1530,12 @@ def retry(
|
|
|
1494
1530
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
1495
1531
|
platform: PlatformScopeArgs = PlatformScopeArgs(),
|
|
1496
1532
|
) -> None:
|
|
1497
|
-
"""Retry failed
|
|
1533
|
+
"""Retry failed samples in an evaluation.
|
|
1498
1534
|
|
|
1499
|
-
Resets samples that ended in failed, timed_out, or infra_error
|
|
1500
|
-
back to queued so they are picked up by workers again.
|
|
1535
|
+
Resets samples that ended in failed, timed_out, cancelled, or infra_error
|
|
1536
|
+
back to queued so they are picked up by workers again. Samples whose judge
|
|
1537
|
+
errored are not requeued: rerunning the agent would produce a different
|
|
1538
|
+
trajectory.
|
|
1501
1539
|
|
|
1502
1540
|
Args:
|
|
1503
1541
|
evaluation_id: The evaluation ID.
|
|
@@ -7,10 +7,11 @@ from pathlib import Path
|
|
|
7
7
|
import cyclopts
|
|
8
8
|
import yaml
|
|
9
9
|
|
|
10
|
-
from dreadnode.app.api.client import NotFoundError
|
|
10
|
+
from dreadnode.app.api.client import ConflictError, NotFoundError
|
|
11
11
|
from dreadnode.app.cli.args import PlatformScopeArgs
|
|
12
12
|
from dreadnode.app.cli.shared import (
|
|
13
13
|
_FLAG_STATE,
|
|
14
|
+
_LABEL_W,
|
|
14
15
|
_collect_cursor_pages,
|
|
15
16
|
_hint,
|
|
16
17
|
_render,
|
|
@@ -19,9 +20,11 @@ from dreadnode.app.cli.shared import (
|
|
|
19
20
|
_status_color,
|
|
20
21
|
confirm_destructive,
|
|
21
22
|
console,
|
|
23
|
+
parse_egress_targets,
|
|
22
24
|
print_info,
|
|
23
25
|
print_success,
|
|
24
26
|
)
|
|
27
|
+
from dreadnode.packaging.egress import merge_targets, normalize_declaration
|
|
25
28
|
|
|
26
29
|
RuntimeStatus = t.Literal["idle", "running", "paused"]
|
|
27
30
|
|
|
@@ -217,6 +220,35 @@ def _split_runtime_manifest(
|
|
|
217
220
|
return identity, (config or None)
|
|
218
221
|
|
|
219
222
|
|
|
223
|
+
def _apply_egress_targets(
|
|
224
|
+
config: dict[str, t.Any] | None,
|
|
225
|
+
cli_targets: list[str] | None,
|
|
226
|
+
) -> dict[str, t.Any] | None:
|
|
227
|
+
"""Merge ``--egress`` targets into ``sandbox.egress.allow`` (`RT-SBX-006`).
|
|
228
|
+
|
|
229
|
+
Also validates a ``sandbox.egress`` block loaded from ``runtime.yaml``, so a
|
|
230
|
+
malformed target is named here rather than after a round trip.
|
|
231
|
+
|
|
232
|
+
Absent stays absent (`RT-SBX-009`): with no declaration on either side the
|
|
233
|
+
sandbox inherits the operator's floor unchanged, which is not the same as
|
|
234
|
+
an empty allow list restricting it to the platform's own destinations.
|
|
235
|
+
"""
|
|
236
|
+
sandbox_raw = (config or {}).get("sandbox")
|
|
237
|
+
if sandbox_raw is not None and not isinstance(sandbox_raw, dict):
|
|
238
|
+
raise TypeError("runtime.yaml sandbox must be a mapping")
|
|
239
|
+
|
|
240
|
+
declared = normalize_declaration((sandbox_raw or {}).get("egress"))
|
|
241
|
+
merged = merge_targets(declared, cli_targets)
|
|
242
|
+
if merged is None:
|
|
243
|
+
return config
|
|
244
|
+
|
|
245
|
+
updated = dict(config or {})
|
|
246
|
+
sandbox = dict(sandbox_raw or {})
|
|
247
|
+
sandbox["egress"] = {"allow": merged}
|
|
248
|
+
updated["sandbox"] = sandbox
|
|
249
|
+
return updated
|
|
250
|
+
|
|
251
|
+
|
|
220
252
|
def _coalesce_manifest_value(
|
|
221
253
|
explicit: str | None,
|
|
222
254
|
manifest_identity: dict[str, t.Any],
|
|
@@ -365,12 +397,30 @@ def create(
|
|
|
365
397
|
Path | None,
|
|
366
398
|
cyclopts.Parameter(name="--file", help="Load runtime.yaml from a file or directory."),
|
|
367
399
|
] = None,
|
|
400
|
+
egress: t.Annotated[
|
|
401
|
+
list[str] | None,
|
|
402
|
+
cyclopts.Parameter(
|
|
403
|
+
name="--egress",
|
|
404
|
+
help=(
|
|
405
|
+
"Outbound destination this runtime's sandbox may reach "
|
|
406
|
+
"(e.g. --egress target.example.com, --egress '*.internal.corp', "
|
|
407
|
+
"--egress 10.20.0.0/16; repeatable). Adds to any "
|
|
408
|
+
"sandbox.egress.allow from --file. A declaration can only "
|
|
409
|
+
"narrow what the deployment already permits, and declaring "
|
|
410
|
+
"anything restricts the sandbox to what is named plus the "
|
|
411
|
+
"platform destinations the platform derives. Pass "
|
|
412
|
+
"--empty-egress to declare a scope that names nothing, "
|
|
413
|
+
"restricting the sandbox to the platform destinations alone."
|
|
414
|
+
),
|
|
415
|
+
),
|
|
416
|
+
] = None,
|
|
368
417
|
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
369
418
|
platform: PlatformScopeArgs = PlatformScopeArgs(),
|
|
370
419
|
) -> None:
|
|
371
420
|
"""Ensure a runtime exists for a project or the workspace default project.
|
|
372
421
|
|
|
373
422
|
Idempotent — re-running against an existing runtime returns it unchanged.
|
|
423
|
+
Re-running with a *different* config is a conflict, not an update.
|
|
374
424
|
|
|
375
425
|
Args:
|
|
376
426
|
project_ref: Project key or UUID. Defaults to the active project scope,
|
|
@@ -379,6 +429,10 @@ def create(
|
|
|
379
429
|
name: Runtime display name. Required with --key when no project is resolved.
|
|
380
430
|
description: Optional runtime description.
|
|
381
431
|
file: Load runtime.yaml from a file or directory.
|
|
432
|
+
egress: Outbound destination this runtime's sandbox may reach, as an
|
|
433
|
+
FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Adds to
|
|
434
|
+
any `sandbox.egress.allow` from --file. Narrowing only, so it needs
|
|
435
|
+
no permission beyond owning the runtime.
|
|
382
436
|
as_json: Output as JSON.
|
|
383
437
|
"""
|
|
384
438
|
api, profile = platform.connect()
|
|
@@ -386,6 +440,7 @@ def create(
|
|
|
386
440
|
manifest_config: dict[str, t.Any] | None = None
|
|
387
441
|
if file is not None:
|
|
388
442
|
manifest_identity, manifest_config = _split_runtime_manifest(api, file)
|
|
443
|
+
manifest_config = _apply_egress_targets(manifest_config, parse_egress_targets(egress))
|
|
389
444
|
|
|
390
445
|
resolved_project = (
|
|
391
446
|
project_ref
|
|
@@ -414,12 +469,23 @@ def create(
|
|
|
414
469
|
if manifest_config is not None:
|
|
415
470
|
create_kwargs["config"] = manifest_config
|
|
416
471
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
472
|
+
try:
|
|
473
|
+
payload = api.create_runtime(
|
|
474
|
+
profile.org_key,
|
|
475
|
+
profile.workspace_key,
|
|
476
|
+
resolved_project,
|
|
477
|
+
**create_kwargs,
|
|
478
|
+
)
|
|
479
|
+
except ConflictError as exc:
|
|
480
|
+
# The runtime exists with a different configuration. Create is ensure,
|
|
481
|
+
# not update, so say where updates go rather than leaving the user
|
|
482
|
+
# to re-run the same command.
|
|
483
|
+
runtime_ref = resolved_key or "<runtime-id>"
|
|
484
|
+
raise ConflictError(
|
|
485
|
+
f"{exc} To change a runtime's configuration, run "
|
|
486
|
+
f"`dn runtime config-set {runtime_ref} --egress <target>` or "
|
|
487
|
+
f"`dn runtime config-set {runtime_ref} --file runtime.yaml`."
|
|
488
|
+
) from exc
|
|
423
489
|
if as_json:
|
|
424
490
|
_render(payload, as_json=True, summary=_summarize_runtime)
|
|
425
491
|
return
|
|
@@ -699,3 +765,161 @@ def reset(
|
|
|
699
765
|
return
|
|
700
766
|
_print_lifecycle_result(str(result.get("id", runtime_id)), "reset", "red")
|
|
701
767
|
_hint(f"dn runtime start {runtime_id}")
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
# ---------------------------------------------------------------------------
|
|
771
|
+
# Durable configuration (RT-API-023 / RT-API-024)
|
|
772
|
+
# ---------------------------------------------------------------------------
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
def _summarize_runtime_config(payload: dict[str, t.Any]) -> str:
|
|
776
|
+
config = payload.get("config") or {}
|
|
777
|
+
sandbox = config.get("sandbox") or {}
|
|
778
|
+
egress = sandbox.get("egress")
|
|
779
|
+
|
|
780
|
+
if egress is None:
|
|
781
|
+
# RT-SBX-009: absent is not empty. Say which one this is, because the
|
|
782
|
+
# difference decides whether the sandbox inherits the deployment's
|
|
783
|
+
# floor or is restricted to the platform's own destinations.
|
|
784
|
+
egress_line = "[dim]inherits the deployment's floor[/dim]"
|
|
785
|
+
else:
|
|
786
|
+
allowed = egress.get("allow") or []
|
|
787
|
+
egress_line = (
|
|
788
|
+
", ".join(str(target) for target in allowed)
|
|
789
|
+
if allowed
|
|
790
|
+
else "[dim]declared, names nothing (platform destinations only)[/dim]"
|
|
791
|
+
)
|
|
792
|
+
|
|
793
|
+
capabilities = config.get("capabilities") or []
|
|
794
|
+
return "\n".join(
|
|
795
|
+
[
|
|
796
|
+
f"[dim]{'runtime':<{_LABEL_W}}[/dim]{payload.get('runtime_id', 'unknown')}",
|
|
797
|
+
f"[dim]{'version':<{_LABEL_W}}[/dim]{config.get('version', 'unknown')}",
|
|
798
|
+
f"[dim]{'capabilities':<{_LABEL_W}}[/dim]{len(capabilities)}",
|
|
799
|
+
f"[dim]{'egress':<{_LABEL_W}}[/dim]{egress_line}",
|
|
800
|
+
f"[dim]{'digest':<{_LABEL_W}}[/dim]{payload.get('config_digest', 'unknown')}",
|
|
801
|
+
]
|
|
802
|
+
)
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
@cli.command(name="config-get", alias="config")
|
|
806
|
+
def config_get(
|
|
807
|
+
runtime_id: t.Annotated[str, cyclopts.Parameter(name="runtime-id")],
|
|
808
|
+
*,
|
|
809
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
810
|
+
platform: PlatformScopeArgs = PlatformScopeArgs(),
|
|
811
|
+
) -> None:
|
|
812
|
+
"""Show a runtime's durable configuration.
|
|
813
|
+
|
|
814
|
+
Workspace read access is enough to read a config; only the owner may
|
|
815
|
+
replace one. Use --json for the full document — the summary shows the
|
|
816
|
+
fields with a CLI surface.
|
|
817
|
+
|
|
818
|
+
Args:
|
|
819
|
+
runtime_id: Runtime key or UUID, as shown by `dn runtime list`.
|
|
820
|
+
as_json: Output as JSON.
|
|
821
|
+
"""
|
|
822
|
+
api, profile = platform.connect()
|
|
823
|
+
payload = api.get_runtime_config(profile.org_key, profile.workspace_key, runtime_id)
|
|
824
|
+
_render(payload, as_json=as_json, summary=_summarize_runtime_config)
|
|
825
|
+
if not as_json:
|
|
826
|
+
_hint(f"dn runtime config-set {runtime_id} --egress <target>")
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
@cli.command(name="config-set")
|
|
830
|
+
def config_set(
|
|
831
|
+
runtime_id: t.Annotated[str, cyclopts.Parameter(name="runtime-id")],
|
|
832
|
+
*,
|
|
833
|
+
file: t.Annotated[
|
|
834
|
+
Path | None,
|
|
835
|
+
cyclopts.Parameter(
|
|
836
|
+
name="--file",
|
|
837
|
+
help=(
|
|
838
|
+
"Replace the whole configuration with this runtime.yaml. "
|
|
839
|
+
"Wholesale, not a merge: a field the file omits is reset to "
|
|
840
|
+
"its default. Without --file the stored configuration is "
|
|
841
|
+
"edited in place and every other field is preserved."
|
|
842
|
+
),
|
|
843
|
+
),
|
|
844
|
+
] = None,
|
|
845
|
+
egress: t.Annotated[
|
|
846
|
+
list[str] | None,
|
|
847
|
+
cyclopts.Parameter(
|
|
848
|
+
name="--egress",
|
|
849
|
+
help=(
|
|
850
|
+
"Outbound destination this runtime's sandbox may reach "
|
|
851
|
+
"(e.g. --egress target.example.com, --egress '*.internal.corp', "
|
|
852
|
+
"--egress 10.20.0.0/16; repeatable). Adds to the scope already "
|
|
853
|
+
"stored, or to --file's when given. Pass --empty-egress to "
|
|
854
|
+
"declare a scope that names nothing, restricting the sandbox "
|
|
855
|
+
"to the platform destinations alone."
|
|
856
|
+
),
|
|
857
|
+
),
|
|
858
|
+
] = None,
|
|
859
|
+
yes: t.Annotated[bool, cyclopts.Parameter(name="--yes", alias="-y", negative=())] = False,
|
|
860
|
+
as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
|
|
861
|
+
platform: PlatformScopeArgs = PlatformScopeArgs(),
|
|
862
|
+
) -> None:
|
|
863
|
+
"""Replace a runtime's durable configuration.
|
|
864
|
+
|
|
865
|
+
Only the runtime's owner may call this, and it does not alter an already
|
|
866
|
+
running sandbox — the new configuration applies from the next start.
|
|
867
|
+
|
|
868
|
+
A narrowing egress declaration needs no permission beyond owning the
|
|
869
|
+
runtime, and is re-checked against the deployment's egress floor at start,
|
|
870
|
+
so a target the floor denies fails the start naming the target rather than
|
|
871
|
+
starting without it.
|
|
872
|
+
|
|
873
|
+
Args:
|
|
874
|
+
runtime_id: Runtime key or UUID, as shown by `dn runtime list`.
|
|
875
|
+
file: Replace the whole configuration with this runtime.yaml. Wholesale,
|
|
876
|
+
not a merge — a field the file omits is reset to its default.
|
|
877
|
+
egress: Outbound destination this runtime's sandbox may reach, as an
|
|
878
|
+
FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable).
|
|
879
|
+
yes: Skip the confirmation prompt when replacing wholesale with --file.
|
|
880
|
+
as_json: Output as JSON.
|
|
881
|
+
"""
|
|
882
|
+
if file is None and egress is None:
|
|
883
|
+
raise ValueError(
|
|
884
|
+
"dn runtime config-set requires --file or --egress. "
|
|
885
|
+
"Run `dn runtime config-get <runtime-id>` to see the current configuration."
|
|
886
|
+
)
|
|
887
|
+
|
|
888
|
+
api, profile = platform.connect()
|
|
889
|
+
|
|
890
|
+
if file is not None:
|
|
891
|
+
manifest_identity, base = _split_runtime_manifest(api, file)
|
|
892
|
+
if manifest_identity:
|
|
893
|
+
# Identity is not part of the configuration document, so silently
|
|
894
|
+
# dropping these would look like they had been applied.
|
|
895
|
+
raise ValueError(
|
|
896
|
+
"runtime.yaml passed to config-set may not carry identity fields: "
|
|
897
|
+
+ ", ".join(sorted(manifest_identity))
|
|
898
|
+
+ ". Set those with `dn runtime create`."
|
|
899
|
+
)
|
|
900
|
+
base = base or {}
|
|
901
|
+
if not confirm_destructive(
|
|
902
|
+
f"Replace the configuration of runtime '{runtime_id}' wholesale? "
|
|
903
|
+
"Fields absent from the file are reset to their defaults.",
|
|
904
|
+
yes=yes,
|
|
905
|
+
):
|
|
906
|
+
print_info("Aborted")
|
|
907
|
+
return
|
|
908
|
+
else:
|
|
909
|
+
current = api.get_runtime_config(profile.org_key, profile.workspace_key, runtime_id)
|
|
910
|
+
base = dict(current.get("config") or {})
|
|
911
|
+
|
|
912
|
+
updated = _apply_egress_targets(base, parse_egress_targets(egress)) or {}
|
|
913
|
+
payload = api.update_runtime_config(
|
|
914
|
+
profile.org_key,
|
|
915
|
+
profile.workspace_key,
|
|
916
|
+
runtime_id,
|
|
917
|
+
updated,
|
|
918
|
+
)
|
|
919
|
+
|
|
920
|
+
if as_json:
|
|
921
|
+
_render(payload, as_json=True, summary=_summarize_runtime_config)
|
|
922
|
+
return
|
|
923
|
+
print_success(f"Updated configuration for runtime '{runtime_id}'")
|
|
924
|
+
console.print(_summarize_runtime_config(payload))
|
|
925
|
+
_hint(f"dn runtime start {runtime_id}")
|
|
@@ -16,6 +16,7 @@ if t.TYPE_CHECKING:
|
|
|
16
16
|
from dreadnode.app.main import Dreadnode
|
|
17
17
|
|
|
18
18
|
from dreadnode.core.log import console
|
|
19
|
+
from dreadnode.packaging.egress import validate_target_list
|
|
19
20
|
|
|
20
21
|
# Label-column width for detail views (2-space indent + label text + padding).
|
|
21
22
|
# Shared so every domain renders key/value blocks with consistent alignment.
|
|
@@ -279,6 +280,29 @@ def merge_env_model_overrides(
|
|
|
279
280
|
return merged or None
|
|
280
281
|
|
|
281
282
|
|
|
283
|
+
def parse_egress_targets(
|
|
284
|
+
values: list[str] | None,
|
|
285
|
+
*,
|
|
286
|
+
where: str = "--egress",
|
|
287
|
+
) -> list[str] | None:
|
|
288
|
+
"""Parse repeatable ``--egress TARGET`` flags into a canonical target list.
|
|
289
|
+
|
|
290
|
+
Also used for the equivalent block loaded from a manifest -- pass ``where``
|
|
291
|
+
so the error names the field the author actually wrote.
|
|
292
|
+
|
|
293
|
+
Validated against the same grammar the task contract uses (``TSK-EGR-002``)
|
|
294
|
+
so a bad target is named here rather than after a round trip. Whether a
|
|
295
|
+
target is *reachable* depends on the deployment's egress floor, which only
|
|
296
|
+
the platform can judge, so that check stays at provision (``TSK-EGR-005``).
|
|
297
|
+
|
|
298
|
+
Returns ``None`` when no flags are given -- distinct from an empty list,
|
|
299
|
+
which is a declaration in its own right.
|
|
300
|
+
"""
|
|
301
|
+
if values is None:
|
|
302
|
+
return None
|
|
303
|
+
return validate_target_list(values, where=where)
|
|
304
|
+
|
|
305
|
+
|
|
282
306
|
def _parse_ref(value: str) -> tuple[str | None, str, str | None]:
|
|
283
307
|
"""Shared parsing logic for artifact references."""
|
|
284
308
|
version: str | None = None
|
|
@@ -754,6 +754,19 @@ def info(
|
|
|
754
754
|
if tags and isinstance(tags, list):
|
|
755
755
|
console.print(f" [dim]tags:[/dim] {', '.join(str(tag) for tag in tags)}")
|
|
756
756
|
|
|
757
|
+
# Shown only when declared: absent means the task inherits the deployment's
|
|
758
|
+
# floor, and an empty allow list is a declaration in its own right, so the
|
|
759
|
+
# two must not read alike (TSK-EGR-003).
|
|
760
|
+
egress = task.get("egress")
|
|
761
|
+
if isinstance(egress, dict):
|
|
762
|
+
allowed = egress.get("allow") or []
|
|
763
|
+
egress_line = (
|
|
764
|
+
", ".join(str(target) for target in allowed)
|
|
765
|
+
if allowed
|
|
766
|
+
else "[dim]declared, names nothing (platform destinations only)[/dim]"
|
|
767
|
+
)
|
|
768
|
+
console.print(f" [dim]egress:[/dim] {egress_line}")
|
|
769
|
+
|
|
757
770
|
instruction = task.get("instruction")
|
|
758
771
|
if instruction:
|
|
759
772
|
console.print()
|
|
@@ -25,11 +25,6 @@ if t.TYPE_CHECKING:
|
|
|
25
25
|
from dreadnode.capabilities.types import AgentDef
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def _tool_name(tool: t.Any) -> str:
|
|
29
|
-
"""Get the name of a tool object."""
|
|
30
|
-
return getattr(tool, "name", "")
|
|
31
|
-
|
|
32
|
-
|
|
33
28
|
_COMPONENT_KINDS: frozenset[str] = frozenset(t.get_args(ComponentKind))
|
|
34
29
|
_LOGGED_MALFORMED_ENTRIES: set[str] = set()
|
|
35
30
|
|
|
@@ -163,28 +158,15 @@ class CapabilityRegistry:
|
|
|
163
158
|
return capability_name, capability, agent_def
|
|
164
159
|
|
|
165
160
|
def all_tools(self) -> list[t.Any]:
|
|
166
|
-
"""
|
|
167
|
-
|
|
161
|
+
"""Return every tool with a unique computed wire name."""
|
|
162
|
+
from dreadnode.capabilities.tool_rules import validate_wire_names
|
|
163
|
+
|
|
168
164
|
tools: list[t.Any] = []
|
|
169
165
|
for cap in self.capabilities.values():
|
|
170
|
-
|
|
171
|
-
name = _tool_name(tool)
|
|
172
|
-
if name and name not in seen:
|
|
173
|
-
tools.append(tool)
|
|
174
|
-
seen.add(name)
|
|
175
|
-
elif name in seen:
|
|
176
|
-
logger.debug(
|
|
177
|
-
"Tool '{}' already registered, skipping duplicate",
|
|
178
|
-
name,
|
|
179
|
-
)
|
|
166
|
+
tools.extend(cap.tools)
|
|
180
167
|
if self.mcp_manager:
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if name and name not in seen:
|
|
184
|
-
tools.append(tool)
|
|
185
|
-
seen.add(name)
|
|
186
|
-
elif name in seen:
|
|
187
|
-
logger.debug("Tool '{}' already registered (MCP), skipping", name)
|
|
168
|
+
tools.extend(self.mcp_manager.all_tools())
|
|
169
|
+
validate_wire_names(tools)
|
|
188
170
|
return tools
|
|
189
171
|
|
|
190
172
|
def all_hooks(self) -> list[t.Any]:
|