dreadnode 2.0.23__tar.gz → 2.0.25__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.23 → dreadnode-2.0.25}/PKG-INFO +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/agent.py +10 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/skills.py +3 -3
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/subagent.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/tools.py +20 -15
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/assessment.py +50 -7
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/airt.py +92 -22
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/capability.py +9 -2
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/runtime_client.py +0 -7
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/app.py +16 -21
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/app.py +18 -41
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/command_dispatcher.py +2 -4
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/commands.py +1 -2
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/dreadnode.tcss +8 -15
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capabilities.py +12 -5
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/console.py +15 -3
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/sessions_manager.py +22 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/tool_format.py +68 -8
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_coordinator.py +22 -6
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/composer.py +23 -16
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/conversation.py +47 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/help_panel.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool.py +6 -6
- dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +299 -0
- dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +74 -0
- dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +91 -0
- dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +90 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +2 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +35 -20
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -12
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -8
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +1 -1
- dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +100 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +12 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/loader.py +36 -10
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/base.py +7 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/litellm_.py +20 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/_ripgrep.py +7 -6
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/apply_patch.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/dreadnode_cli.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/editing.py +4 -4
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/execute.py +3 -3
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/fetch.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/glob.py +1 -1
- dreadnode-2.0.25/dreadnode/tools/grep.py +764 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/interaction.py +8 -8
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/ls.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/memory.py +2 -2
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/read.py +7 -3
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/report.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/todo.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/trajectory_search.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/web_extract.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/web_search.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/write.py +1 -1
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/jobs.py +3 -3
- {dreadnode-2.0.23 → dreadnode-2.0.25}/pyproject.toml +1 -1
- dreadnode-2.0.23/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -175
- dreadnode-2.0.23/dreadnode/tools/grep.py +0 -285
- {dreadnode-2.0.23 → dreadnode-2.0.25}/.gitignore +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/LICENSE +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/README.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/evaluation.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/guard.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/version.py +0 -0
|
@@ -118,7 +118,16 @@ def _is_transient_api_error(error: BaseException) -> bool:
|
|
|
118
118
|
if (cls := getattr(_litellm_exc, name, None)) is not None
|
|
119
119
|
)
|
|
120
120
|
if classes and isinstance(error, classes):
|
|
121
|
-
|
|
121
|
+
# OpenAI returns 429 with code "insufficient_quota" when the
|
|
122
|
+
# account is out of credits — a permanent billing condition,
|
|
123
|
+
# not a rate limit. litellm packs the provider body into the
|
|
124
|
+
# message verbatim, so substring-match to exclude.
|
|
125
|
+
rate_limit_cls = getattr(_litellm_exc, "RateLimitError", None)
|
|
126
|
+
return not (
|
|
127
|
+
rate_limit_cls is not None
|
|
128
|
+
and isinstance(error, rate_limit_cls)
|
|
129
|
+
and "insufficient_quota" in str(error)
|
|
130
|
+
)
|
|
122
131
|
return False
|
|
123
132
|
|
|
124
133
|
|
|
@@ -348,9 +348,9 @@ def discover_skills(directory: Path | None = None) -> list[Skill]:
|
|
|
348
348
|
try:
|
|
349
349
|
skill = load_skill(skill_file)
|
|
350
350
|
skills.append(skill)
|
|
351
|
-
logger.debug(
|
|
351
|
+
logger.debug("Discovered skill: {} at {}", skill.name, skill_file)
|
|
352
352
|
except Exception as e:
|
|
353
|
-
logger.
|
|
353
|
+
logger.error("Failed to load skill from {}: {}", skill_file, e)
|
|
354
354
|
|
|
355
355
|
return skills
|
|
356
356
|
|
|
@@ -515,7 +515,7 @@ def create_skill_tool(skills: list[Skill]) -> t.Any:
|
|
|
515
515
|
examples = ", ".join(f"'{s.qualified_id}'" for s in skills[:3])
|
|
516
516
|
hint = f" (e.g., {examples}, ...)" if examples else ""
|
|
517
517
|
|
|
518
|
-
@tool(
|
|
518
|
+
@tool(description=description)
|
|
519
519
|
async def skill(
|
|
520
520
|
name: t.Annotated[str, f"The name of the skill from available_skills{hint}"],
|
|
521
521
|
) -> str:
|
|
@@ -95,7 +95,7 @@ class SubAgentToolset(Toolset):
|
|
|
95
95
|
run_in_background: bool = Config(default=False)
|
|
96
96
|
"""Whether to run sub-agents in background (not yet implemented)."""
|
|
97
97
|
|
|
98
|
-
@tool_method
|
|
98
|
+
@tool_method
|
|
99
99
|
async def spawn_agent(
|
|
100
100
|
self,
|
|
101
101
|
task: t.Annotated[str, "The task for the sub-agent to complete"],
|
|
@@ -288,15 +288,13 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
288
288
|
exclude=True,
|
|
289
289
|
)
|
|
290
290
|
"""The function to call."""
|
|
291
|
-
catch: bool | t.Iterable[type[Exception]] =
|
|
291
|
+
catch: bool | t.Iterable[type[Exception]] = True
|
|
292
292
|
"""
|
|
293
293
|
Whether to catch exceptions and return them as messages.
|
|
294
294
|
|
|
295
295
|
- `False`: Do not catch exceptions.
|
|
296
|
-
- `True`: Catch all exceptions.
|
|
296
|
+
- `True`: Catch all exceptions (default).
|
|
297
297
|
- `set[type[Exception]]`: Catch only the specified exceptions.
|
|
298
|
-
|
|
299
|
-
By default, catches `json.JSONDecodeError` and `ValidationError`.
|
|
300
298
|
"""
|
|
301
299
|
truncate: int | None = None
|
|
302
300
|
"""If set, the maximum number of characters to truncate any tool output to."""
|
|
@@ -386,7 +384,7 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
386
384
|
description=description,
|
|
387
385
|
parameters_schema=schema,
|
|
388
386
|
fn=fn,
|
|
389
|
-
catch=catch
|
|
387
|
+
catch=True if catch is None else catch,
|
|
390
388
|
truncate=truncate,
|
|
391
389
|
offload=offload if offload is not None else True,
|
|
392
390
|
)
|
|
@@ -471,8 +469,15 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
471
469
|
kwargs = self._type_adapter.validate_python(kwargs)
|
|
472
470
|
kwargs = kwargs or {}
|
|
473
471
|
|
|
474
|
-
# Call the function
|
|
475
|
-
|
|
472
|
+
# Call the function. Sync tools are offloaded to a worker thread
|
|
473
|
+
# so blocking work (subprocess.run, network, large file I/O) does
|
|
474
|
+
# not stall the event loop — the TUI shares that loop with input
|
|
475
|
+
# parsing, and a multi-second block desyncs Textual's escape-
|
|
476
|
+
# sequence parser, leaking raw mouse/key bytes into the composer.
|
|
477
|
+
if inspect.iscoroutinefunction(self.fn):
|
|
478
|
+
result = self.fn(**kwargs) # ty: ignore[missing-argument] # ParamSpec limitation
|
|
479
|
+
else:
|
|
480
|
+
result = await asyncio.to_thread(self.fn, **kwargs) # ParamSpec limitation
|
|
476
481
|
if inspect.isawaitable(result):
|
|
477
482
|
result = await result
|
|
478
483
|
|
|
@@ -596,9 +601,9 @@ class Tool(BaseModel, t.Generic[P, R]):
|
|
|
596
601
|
description: The description of the tool.
|
|
597
602
|
catch: Whether to catch exceptions and return them as messages.
|
|
598
603
|
- `False`: Do not catch exceptions.
|
|
599
|
-
- `True`: Catch all exceptions.
|
|
604
|
+
- `True`: Catch all exceptions (default).
|
|
600
605
|
- `list[type[Exception]]`: Catch only the specified exceptions.
|
|
601
|
-
- `None`:
|
|
606
|
+
- `None`: Use the default (`True`)
|
|
602
607
|
truncate: If set, the maximum number of characters to truncate any tool output to.
|
|
603
608
|
offload: Whether large tool outputs should be offloaded to disk.
|
|
604
609
|
|
|
@@ -667,7 +672,7 @@ class ToolMethod(property, t.Generic[P, R]):
|
|
|
667
672
|
name=self.tool_name,
|
|
668
673
|
description=self.tool_description,
|
|
669
674
|
parameters_schema=self.tool_parameters_schema,
|
|
670
|
-
catch=self.tool_catch
|
|
675
|
+
catch=True if self.tool_catch is None else self.tool_catch,
|
|
671
676
|
truncate=self.tool_truncate,
|
|
672
677
|
)
|
|
673
678
|
tool._signature = self._tool_signature
|
|
@@ -681,7 +686,7 @@ class ToolMethod(property, t.Generic[P, R]):
|
|
|
681
686
|
name=self.tool_name,
|
|
682
687
|
description=self.tool_description,
|
|
683
688
|
parameters_schema=self.tool_parameters_schema,
|
|
684
|
-
catch=self.tool_catch
|
|
689
|
+
catch=True if self.tool_catch is None else self.tool_catch,
|
|
685
690
|
truncate=self.tool_truncate,
|
|
686
691
|
)
|
|
687
692
|
bound_tool._signature = self._tool_signature
|
|
@@ -835,9 +840,9 @@ def tool(
|
|
|
835
840
|
description: The description of the tool.
|
|
836
841
|
catch: Whether to catch exceptions and return them as messages.
|
|
837
842
|
- `False`: Do not catch exceptions.
|
|
838
|
-
- `True`: Catch all exceptions.
|
|
843
|
+
- `True`: Catch all exceptions (default).
|
|
839
844
|
- `list[type[Exception]]`: Catch only the specified exceptions.
|
|
840
|
-
- `None`:
|
|
845
|
+
- `None`: Use the default (`True`).
|
|
841
846
|
truncate: If set, the maximum number of characters to truncate any tool output to.
|
|
842
847
|
|
|
843
848
|
Returns:
|
|
@@ -908,9 +913,9 @@ def tool_method(
|
|
|
908
913
|
description: Override the tool's description. Defaults to the docstring.
|
|
909
914
|
catch: Whether to catch exceptions and return them as messages.
|
|
910
915
|
- `False`: Do not catch exceptions.
|
|
911
|
-
- `True`: Catch all exceptions.
|
|
916
|
+
- `True`: Catch all exceptions (default).
|
|
912
917
|
- `list[type[Exception]]`: Catch only the specified exceptions.
|
|
913
|
-
- `None`:
|
|
918
|
+
- `None`: Use the default (`True`).
|
|
914
919
|
truncate: The maximum number of characters for the tool's output.
|
|
915
920
|
"""
|
|
916
921
|
|
|
@@ -23,6 +23,7 @@ import contextlib
|
|
|
23
23
|
import contextvars
|
|
24
24
|
import os
|
|
25
25
|
import signal
|
|
26
|
+
import threading
|
|
26
27
|
import typing as t
|
|
27
28
|
from pathlib import Path
|
|
28
29
|
|
|
@@ -57,6 +58,26 @@ def _get_platform_context() -> tuple[ApiClient, Profile] | None:
|
|
|
57
58
|
return None
|
|
58
59
|
|
|
59
60
|
|
|
61
|
+
# Thread-local storage for injected platform context
|
|
62
|
+
_thread_local = threading.local()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _set_platform_context(api: ApiClient, profile: Profile) -> None:
|
|
66
|
+
"""Set platform context for the current thread (used by AIRT CLI)."""
|
|
67
|
+
_thread_local.api = api
|
|
68
|
+
_thread_local.profile = profile
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _get_platform_context_with_fallback() -> tuple[ApiClient, Profile] | None:
|
|
72
|
+
"""Get platform context with CLI injection fallback."""
|
|
73
|
+
# First try thread-local injected context (from AIRT CLI)
|
|
74
|
+
if hasattr(_thread_local, "api") and hasattr(_thread_local, "profile"):
|
|
75
|
+
return _thread_local.api, _thread_local.profile
|
|
76
|
+
|
|
77
|
+
# Fallback to global DEFAULT_INSTANCE
|
|
78
|
+
return _get_platform_context()
|
|
79
|
+
|
|
80
|
+
|
|
60
81
|
class Assessment:
|
|
61
82
|
"""Orchestrates multi-attack assessments.
|
|
62
83
|
|
|
@@ -91,6 +112,7 @@ class Assessment:
|
|
|
91
112
|
workflow_run_id: str | None = None,
|
|
92
113
|
workflow_script: str | None = None,
|
|
93
114
|
project_id: str | None = None,
|
|
115
|
+
runtime_id: str | None = None,
|
|
94
116
|
) -> None:
|
|
95
117
|
self.name = name
|
|
96
118
|
self.description = description
|
|
@@ -106,9 +128,12 @@ class Assessment:
|
|
|
106
128
|
self.judge_model = judge_model or model
|
|
107
129
|
|
|
108
130
|
if target_config is None and model is not None:
|
|
109
|
-
target_config = {"model": model}
|
|
131
|
+
target_config = {"model": self.target_model or model}
|
|
110
132
|
if attacker_config is None and model is not None:
|
|
111
|
-
attacker_config = {
|
|
133
|
+
attacker_config = {
|
|
134
|
+
"model": self.attacker_model or model,
|
|
135
|
+
"evaluator_model": self.judge_model or model,
|
|
136
|
+
}
|
|
112
137
|
|
|
113
138
|
self.target_config = target_config
|
|
114
139
|
self.attacker_config = attacker_config
|
|
@@ -116,6 +141,7 @@ class Assessment:
|
|
|
116
141
|
self._workflow_run_id = workflow_run_id
|
|
117
142
|
self._workflow_script = workflow_script
|
|
118
143
|
self._project_id = project_id
|
|
144
|
+
self._runtime_id = runtime_id
|
|
119
145
|
|
|
120
146
|
self._session_id = session_id or os.environ.get("DREADNODE_SESSION_ID")
|
|
121
147
|
if self._session_id is None:
|
|
@@ -177,7 +203,7 @@ class Assessment:
|
|
|
177
203
|
if self._assessment_id is not None:
|
|
178
204
|
return self._assessment_id
|
|
179
205
|
|
|
180
|
-
ctx =
|
|
206
|
+
ctx = _get_platform_context_with_fallback()
|
|
181
207
|
if ctx is None:
|
|
182
208
|
logger.debug("SDK offline -- assessment not registered with platform")
|
|
183
209
|
return None
|
|
@@ -192,11 +218,28 @@ class Assessment:
|
|
|
192
218
|
return None
|
|
193
219
|
|
|
194
220
|
try:
|
|
221
|
+
# Get runtime_id - try to use a default runtime for the project
|
|
222
|
+
runtime_id = getattr(self, "_runtime_id", None)
|
|
223
|
+
if runtime_id is None:
|
|
224
|
+
# Auto-discover a runtime for this project (CLI users shouldn't need to specify this)
|
|
225
|
+
try:
|
|
226
|
+
runtimes_resp = api.list_runtimes(profile.org_key, profile.workspace_key)
|
|
227
|
+
runtime_items = runtimes_resp.get("items", [])
|
|
228
|
+
matching_runtimes = [r for r in runtime_items if r["project_id"] == project_id]
|
|
229
|
+
if matching_runtimes:
|
|
230
|
+
runtime_id = matching_runtimes[0]["id"]
|
|
231
|
+
logger.debug(f"Auto-selected runtime {runtime_id} for project {project_id}")
|
|
232
|
+
else:
|
|
233
|
+
logger.warning(f"No runtimes found for project {project_id}")
|
|
234
|
+
except Exception as e:
|
|
235
|
+
logger.debug(f"Failed to auto-discover runtime for project: {e}")
|
|
236
|
+
|
|
195
237
|
result = api.create_airt_assessment(
|
|
196
238
|
profile.org_key,
|
|
197
239
|
profile.workspace_key,
|
|
198
240
|
name=self.name,
|
|
199
241
|
project_id=project_id,
|
|
242
|
+
runtime_id=runtime_id,
|
|
200
243
|
description=self.description,
|
|
201
244
|
session_id=self._session_id,
|
|
202
245
|
target_model=self.target_model,
|
|
@@ -402,7 +445,7 @@ class Assessment:
|
|
|
402
445
|
await self.register()
|
|
403
446
|
# Notify the platform that execution has started (sets started_at server-side)
|
|
404
447
|
if self._assessment_id is not None:
|
|
405
|
-
ctx =
|
|
448
|
+
ctx = _get_platform_context_with_fallback()
|
|
406
449
|
if ctx is not None:
|
|
407
450
|
api, session = ctx
|
|
408
451
|
try:
|
|
@@ -459,7 +502,7 @@ class Assessment:
|
|
|
459
502
|
provider.force_flush(timeout_millis=10_000)
|
|
460
503
|
|
|
461
504
|
# Use the sync API client directly — no async gymnastics
|
|
462
|
-
ctx =
|
|
505
|
+
ctx = _get_platform_context_with_fallback()
|
|
463
506
|
if ctx is None or self._assessment_id is None:
|
|
464
507
|
return
|
|
465
508
|
|
|
@@ -499,7 +542,7 @@ class Assessment:
|
|
|
499
542
|
Returns:
|
|
500
543
|
True if successfully marked, False otherwise.
|
|
501
544
|
"""
|
|
502
|
-
ctx =
|
|
545
|
+
ctx = _get_platform_context_with_fallback()
|
|
503
546
|
if ctx is None or self._assessment_id is None:
|
|
504
547
|
return False
|
|
505
548
|
|
|
@@ -527,7 +570,7 @@ class Assessment:
|
|
|
527
570
|
Returns:
|
|
528
571
|
True if successfully marked, False otherwise.
|
|
529
572
|
"""
|
|
530
|
-
ctx =
|
|
573
|
+
ctx = _get_platform_context_with_fallback()
|
|
531
574
|
if ctx is None or self._assessment_id is None:
|
|
532
575
|
return False
|
|
533
576
|
|
|
@@ -65,7 +65,7 @@ def _parse_json_object_option(value: str | None, *, field_name: str) -> dict[str
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
def _resolve_project_id(api, profile, project):
|
|
68
|
-
"""Resolve project name to UUID."""
|
|
68
|
+
"""Resolve project name to UUID, creating the project if it doesn't exist."""
|
|
69
69
|
from uuid import UUID
|
|
70
70
|
|
|
71
71
|
candidate = project or getattr(profile, "project_key", None)
|
|
@@ -83,9 +83,25 @@ def _resolve_project_id(api, profile, project):
|
|
|
83
83
|
try:
|
|
84
84
|
resolved = api.get_project(profile.org_key, profile.workspace_key, str(candidate))
|
|
85
85
|
return str(resolved.id)
|
|
86
|
-
except Exception as
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
except Exception as get_error:
|
|
87
|
+
# Project doesn't exist, try to create it
|
|
88
|
+
try:
|
|
89
|
+
print(f"[PROJECT DEBUG] Project '{candidate}' not found, creating it...")
|
|
90
|
+
created = api.create_project(
|
|
91
|
+
profile.org_key,
|
|
92
|
+
profile.workspace_key,
|
|
93
|
+
name=str(candidate),
|
|
94
|
+
key=str(candidate),
|
|
95
|
+
description="Auto-created project for AIRT CLI run",
|
|
96
|
+
)
|
|
97
|
+
print(
|
|
98
|
+
f"[PROJECT DEBUG] Successfully created project '{candidate}' with ID {created.id}"
|
|
99
|
+
)
|
|
100
|
+
return str(created.id)
|
|
101
|
+
except Exception as create_error:
|
|
102
|
+
print(f"[PROJECT DEBUG] Failed to resolve project '{candidate}': {get_error}")
|
|
103
|
+
print(f"[PROJECT DEBUG] Failed to create project '{candidate}': {create_error}")
|
|
104
|
+
return None
|
|
89
105
|
|
|
90
106
|
|
|
91
107
|
_SEVERITY_COLORS = {
|
|
@@ -1150,6 +1166,9 @@ def run(
|
|
|
1150
1166
|
print_error(str(e))
|
|
1151
1167
|
return
|
|
1152
1168
|
|
|
1169
|
+
# Capture original project argument before connect() clears it
|
|
1170
|
+
original_project = platform.project
|
|
1171
|
+
|
|
1153
1172
|
# Configure SDK and validate scope to populate project_id
|
|
1154
1173
|
_api, profile = platform.connect()
|
|
1155
1174
|
|
|
@@ -1175,25 +1194,46 @@ def run(
|
|
|
1175
1194
|
console.print()
|
|
1176
1195
|
|
|
1177
1196
|
async def _run() -> None:
|
|
1197
|
+
# Determine project for SDK configuration
|
|
1198
|
+
# Use original CLI argument, fallback to profile, environment, then 'default'
|
|
1199
|
+
import os
|
|
1200
|
+
|
|
1178
1201
|
from dreadnode.airt import Assessment
|
|
1202
|
+
from dreadnode.airt.assessment import _set_platform_context
|
|
1179
1203
|
|
|
1180
1204
|
# Configure the SDK using the validated profile
|
|
1181
1205
|
from dreadnode.app.main import DEFAULT_INSTANCE
|
|
1182
1206
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1207
|
+
env_project = os.getenv("DREADNODE_PROJECT")
|
|
1208
|
+
sdk_project = original_project or profile.project or env_project or "default"
|
|
1209
|
+
|
|
1210
|
+
# Try global SDK configuration first
|
|
1211
|
+
try:
|
|
1212
|
+
DEFAULT_INSTANCE.configure(
|
|
1213
|
+
server=profile.url,
|
|
1214
|
+
api_key=profile.api_key,
|
|
1215
|
+
organization=profile.organization,
|
|
1216
|
+
workspace=profile.workspace,
|
|
1217
|
+
project=sdk_project,
|
|
1218
|
+
)
|
|
1219
|
+
from loguru import logger
|
|
1220
|
+
|
|
1221
|
+
logger.debug("SDK instance configured successfully for assessment registration")
|
|
1222
|
+
except Exception as e:
|
|
1223
|
+
from loguru import logger
|
|
1224
|
+
|
|
1225
|
+
logger.warning(f"Failed to configure SDK instance for assessment registration: {e}")
|
|
1226
|
+
logger.info("Using fallback context injection for assessment registration")
|
|
1227
|
+
|
|
1228
|
+
# Always inject platform context as fallback for assessment registration
|
|
1229
|
+
_set_platform_context(_api, profile)
|
|
1190
1230
|
|
|
1191
1231
|
# Resolve project name to UUID
|
|
1192
|
-
#
|
|
1232
|
+
# Use original CLI argument, fallback to profile, environment, then 'default'
|
|
1193
1233
|
import os
|
|
1194
1234
|
|
|
1195
1235
|
env_project = os.getenv("DREADNODE_PROJECT")
|
|
1196
|
-
actual_project = profile.project or env_project
|
|
1236
|
+
actual_project = original_project or profile.project or env_project or "default"
|
|
1197
1237
|
|
|
1198
1238
|
resolved_project_id = _resolve_project_id(_api, profile, actual_project)
|
|
1199
1239
|
final_project_id = resolved_project_id or profile.project_id or actual_project
|
|
@@ -1203,6 +1243,9 @@ def run(
|
|
|
1203
1243
|
description=f"CLI attack: {goal}",
|
|
1204
1244
|
target=target_fn,
|
|
1205
1245
|
model=atk_model,
|
|
1246
|
+
target_model=target_model,
|
|
1247
|
+
attacker_model=atk_model,
|
|
1248
|
+
judge_model=eval_model,
|
|
1206
1249
|
goal=goal,
|
|
1207
1250
|
goal_category=goal_category,
|
|
1208
1251
|
project_id=final_project_id,
|
|
@@ -1332,24 +1375,48 @@ def run_suite(
|
|
|
1332
1375
|
console.print(f" Config: [dim]{file}[/dim]")
|
|
1333
1376
|
console.print()
|
|
1334
1377
|
|
|
1378
|
+
# Capture original project argument before connect() clears it
|
|
1379
|
+
original_project = platform.project
|
|
1380
|
+
|
|
1335
1381
|
# Configure SDK
|
|
1336
1382
|
_api, profile = platform.connect()
|
|
1337
1383
|
|
|
1338
1384
|
target_fn = _build_target(model, max_tokens)
|
|
1339
1385
|
|
|
1340
1386
|
async def _run_suite() -> list[dict[str, t.Any]]:
|
|
1387
|
+
# Determine project for SDK configuration
|
|
1388
|
+
# Use original CLI argument, fallback to profile, environment, then 'default'
|
|
1389
|
+
import os
|
|
1390
|
+
|
|
1341
1391
|
from dreadnode.airt import Assessment
|
|
1392
|
+
from dreadnode.airt.assessment import _set_platform_context
|
|
1342
1393
|
|
|
1343
1394
|
# Configure the SDK using the validated profile
|
|
1344
1395
|
from dreadnode.app.main import DEFAULT_INSTANCE
|
|
1345
1396
|
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1397
|
+
env_project = os.getenv("DREADNODE_PROJECT")
|
|
1398
|
+
sdk_project = original_project or profile.project or env_project or "default"
|
|
1399
|
+
|
|
1400
|
+
# Try global SDK configuration first
|
|
1401
|
+
try:
|
|
1402
|
+
DEFAULT_INSTANCE.configure(
|
|
1403
|
+
server=profile.url,
|
|
1404
|
+
api_key=profile.api_key,
|
|
1405
|
+
organization=profile.organization,
|
|
1406
|
+
workspace=profile.workspace,
|
|
1407
|
+
project=sdk_project,
|
|
1408
|
+
)
|
|
1409
|
+
from loguru import logger
|
|
1410
|
+
|
|
1411
|
+
logger.debug("SDK instance configured successfully for assessment registration")
|
|
1412
|
+
except Exception as e:
|
|
1413
|
+
from loguru import logger
|
|
1414
|
+
|
|
1415
|
+
logger.warning(f"Failed to configure SDK instance for assessment registration: {e}")
|
|
1416
|
+
logger.info("Using fallback context injection for assessment registration")
|
|
1417
|
+
|
|
1418
|
+
# Always inject platform context as fallback for assessment registration
|
|
1419
|
+
_set_platform_context(_api, profile)
|
|
1353
1420
|
|
|
1354
1421
|
suite_results = []
|
|
1355
1422
|
for i, goal_cfg in enumerate(goals, 1):
|
|
@@ -1362,11 +1429,11 @@ def run_suite(
|
|
|
1362
1429
|
console.print(f"\n--- Goal {i}/{len(goals)}: {goal_text[:60]}...")
|
|
1363
1430
|
|
|
1364
1431
|
# Resolve project name to UUID
|
|
1365
|
-
#
|
|
1432
|
+
# Use original CLI argument, then environment variable as fallback
|
|
1366
1433
|
import os
|
|
1367
1434
|
|
|
1368
1435
|
env_project = os.getenv("DREADNODE_PROJECT")
|
|
1369
|
-
actual_project = profile.project or env_project
|
|
1436
|
+
actual_project = original_project or profile.project or env_project
|
|
1370
1437
|
|
|
1371
1438
|
resolved_project_id = _resolve_project_id(_api, profile, actual_project)
|
|
1372
1439
|
final_project_id = resolved_project_id or profile.project_id or actual_project
|
|
@@ -1376,6 +1443,9 @@ def run_suite(
|
|
|
1376
1443
|
description=f"Suite run: {goal_text}",
|
|
1377
1444
|
target=target_fn,
|
|
1378
1445
|
model=atk_model,
|
|
1446
|
+
target_model=model,
|
|
1447
|
+
attacker_model=atk_model,
|
|
1448
|
+
judge_model=atk_model,
|
|
1379
1449
|
goal=goal_text,
|
|
1380
1450
|
goal_category=goal_cat,
|
|
1381
1451
|
project_id=final_project_id,
|
|
@@ -1398,15 +1398,22 @@ def validate(
|
|
|
1398
1398
|
cap = Capability(cap_dir)
|
|
1399
1399
|
agents = cap.agents
|
|
1400
1400
|
tools = cap.tools
|
|
1401
|
-
skills = cap.skills_paths or []
|
|
1402
1401
|
mcp = cap.mcp_server_defs
|
|
1403
1402
|
workers = cap.worker_defs
|
|
1404
1403
|
|
|
1405
1404
|
health_errors = [h for h in cap.component_health if h.get("status") == "error"]
|
|
1405
|
+
# Count loadable skills (one SKILL.md per skill), not manifest path
|
|
1406
|
+
# entries — `skills_paths` is a list of search roots and overstates
|
|
1407
|
+
# the count, especially when entries fail to parse.
|
|
1408
|
+
skill_count = sum(
|
|
1409
|
+
1
|
|
1410
|
+
for h in cap.component_health
|
|
1411
|
+
if h.get("kind") == "skill" and h.get("status") == "ok"
|
|
1412
|
+
)
|
|
1406
1413
|
|
|
1407
1414
|
summary = (
|
|
1408
1415
|
f"agents={len(agents)}, tools={len(tools)}, "
|
|
1409
|
-
f"skills={
|
|
1416
|
+
f"skills={skill_count}, mcp={len(mcp)}, workers={len(workers)}"
|
|
1410
1417
|
)
|
|
1411
1418
|
|
|
1412
1419
|
if health_errors:
|
|
@@ -513,13 +513,6 @@ class RuntimeClient:
|
|
|
513
513
|
response.raise_for_status()
|
|
514
514
|
return models.SessionInfo.from_dict(response.json())
|
|
515
515
|
|
|
516
|
-
async def reset_session(self, session_id: str) -> None:
|
|
517
|
-
"""Reset a server session."""
|
|
518
|
-
logger.info("Resetting session | session_id={}", session_id[:8])
|
|
519
|
-
await self.start()
|
|
520
|
-
response = await self._http_client.post(f"/api/sessions/{session_id}/reset")
|
|
521
|
-
response.raise_for_status()
|
|
522
|
-
|
|
523
516
|
async def set_session_title(self, session_id: str, title: str) -> None:
|
|
524
517
|
"""Persist a session title on the server."""
|
|
525
518
|
logger.info("Setting session title | session_id={}", session_id[:8])
|
|
@@ -2201,16 +2201,6 @@ class SessionRuntime:
|
|
|
2201
2201
|
"""Async wrapper around ``_persist_state`` with per-session locking."""
|
|
2202
2202
|
await self.persistence.persist_state_locked(update_messages=update_messages)
|
|
2203
2203
|
|
|
2204
|
-
def reset(self, *, persist: bool = True) -> None:
|
|
2205
|
-
"""Reset the conversation history."""
|
|
2206
|
-
from dreadnode.agents.trajectory import Trajectory as TrajectoryModel
|
|
2207
|
-
|
|
2208
|
-
self._trajectory = TrajectoryModel()
|
|
2209
|
-
self._message_count = 0
|
|
2210
|
-
self._agent = None
|
|
2211
|
-
if persist:
|
|
2212
|
-
self._persist_state()
|
|
2213
|
-
|
|
2214
2204
|
def restore_messages(
|
|
2215
2205
|
self,
|
|
2216
2206
|
messages: list[SessionMessage],
|
|
@@ -3216,16 +3206,6 @@ async def set_session_policy(session_id: str, body: dict[str, t.Any]) -> JSONRes
|
|
|
3216
3206
|
)
|
|
3217
3207
|
|
|
3218
3208
|
|
|
3219
|
-
@app.post("/api/sessions/{session_id}/reset")
|
|
3220
|
-
async def reset_session(session_id: str) -> JSONResponse:
|
|
3221
|
-
"""Reset the agent conversation."""
|
|
3222
|
-
session = get_state().get_session(session_id)
|
|
3223
|
-
if session is None:
|
|
3224
|
-
raise HTTPException(status_code=404, detail=f"Session not found: {session_id}")
|
|
3225
|
-
session.reset()
|
|
3226
|
-
return JSONResponse(content={"status": "reset", "session_id": session_id})
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
3209
|
@app.post("/api/sessions/{session_id}/cancel")
|
|
3230
3210
|
async def cancel_session(session_id: str) -> JSONResponse:
|
|
3231
3211
|
"""Cancel the active turn and drain queued requests for a session."""
|
|
@@ -3897,7 +3877,10 @@ def _populate_registry(instance: t.Any) -> None:
|
|
|
3897
3877
|
"""Discover capabilities and install them into app state."""
|
|
3898
3878
|
from dreadnode.builtin_capabilities import load_builtin_capabilities
|
|
3899
3879
|
from dreadnode.capabilities import Capability
|
|
3900
|
-
from dreadnode.capabilities.capability import
|
|
3880
|
+
from dreadnode.capabilities.capability import (
|
|
3881
|
+
read_local_capability_records,
|
|
3882
|
+
read_local_capability_state,
|
|
3883
|
+
)
|
|
3901
3884
|
|
|
3902
3885
|
state = get_state()
|
|
3903
3886
|
registry = capability_manager.CapabilityRegistry()
|
|
@@ -3975,6 +3958,18 @@ def _populate_registry(instance: t.Any) -> None:
|
|
|
3975
3958
|
except Exception:
|
|
3976
3959
|
logger.exception("Failed to discover capabilities")
|
|
3977
3960
|
|
|
3961
|
+
# Bundled caps don't flow through Capability.discover(), so the
|
|
3962
|
+
# disabled-state filter that runs inside discover() never touches
|
|
3963
|
+
# them — they'd always load as active regardless of
|
|
3964
|
+
# local-capability-state.json. Apply the same filter here so the
|
|
3965
|
+
# toggle is honored. The default capability is pinned active.
|
|
3966
|
+
bundled_state = read_local_capability_state(instance.storage.local_capability_state_path)
|
|
3967
|
+
for name in list(registry.capabilities):
|
|
3968
|
+
if name == _BUNDLED_DEFAULT_CAPABILITY:
|
|
3969
|
+
continue
|
|
3970
|
+
if bundled_state.get(name, True) is False:
|
|
3971
|
+
registry.disabled_local[name] = registry.capabilities.pop(name)
|
|
3972
|
+
|
|
3978
3973
|
if instance.can_sync:
|
|
3979
3974
|
try:
|
|
3980
3975
|
registry.update_info = _check_capability_updates(
|