dreadnode 2.0.24__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.24 → dreadnode-2.0.25}/PKG-INFO +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/agent.py +10 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/skills.py +3 -3
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/subagent.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/tools.py +20 -15
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/assessment.py +5 -2
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/airt.py +6 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/capability.py +9 -2
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/runtime_client.py +0 -7
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/app.py +16 -21
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/app.py +18 -41
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/command_dispatcher.py +2 -4
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/commands.py +1 -2
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/dreadnode.tcss +8 -15
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capabilities.py +12 -5
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/console.py +15 -3
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/sessions_manager.py +22 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/tool_format.py +68 -8
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_coordinator.py +22 -6
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/composer.py +23 -16
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/conversation.py +47 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/help_panel.py +1 -1
- {dreadnode-2.0.24 → 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.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +2 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +35 -20
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -12
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -8
- {dreadnode-2.0.24 → 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.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +12 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/loader.py +36 -10
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/base.py +7 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/litellm_.py +20 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/_ripgrep.py +7 -6
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/apply_patch.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/dreadnode_cli.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/editing.py +4 -4
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/execute.py +3 -3
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/fetch.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/glob.py +1 -1
- dreadnode-2.0.25/dreadnode/tools/grep.py +764 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/interaction.py +8 -8
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/ls.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/memory.py +2 -2
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/read.py +7 -3
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/report.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/todo.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/trajectory_search.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/web_extract.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/web_search.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/write.py +1 -1
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/jobs.py +3 -3
- {dreadnode-2.0.24 → dreadnode-2.0.25}/pyproject.toml +1 -1
- dreadnode-2.0.24/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -175
- dreadnode-2.0.24/dreadnode/tools/grep.py +0 -285
- {dreadnode-2.0.24 → dreadnode-2.0.25}/.gitignore +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/LICENSE +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/README.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/evaluation.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/guard.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.24 → 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
|
|
|
@@ -128,9 +128,12 @@ class Assessment:
|
|
|
128
128
|
self.judge_model = judge_model or model
|
|
129
129
|
|
|
130
130
|
if target_config is None and model is not None:
|
|
131
|
-
target_config = {"model": model}
|
|
131
|
+
target_config = {"model": self.target_model or model}
|
|
132
132
|
if attacker_config is None and model is not None:
|
|
133
|
-
attacker_config = {
|
|
133
|
+
attacker_config = {
|
|
134
|
+
"model": self.attacker_model or model,
|
|
135
|
+
"evaluator_model": self.judge_model or model,
|
|
136
|
+
}
|
|
134
137
|
|
|
135
138
|
self.target_config = target_config
|
|
136
139
|
self.attacker_config = attacker_config
|
|
@@ -1243,6 +1243,9 @@ def run(
|
|
|
1243
1243
|
description=f"CLI attack: {goal}",
|
|
1244
1244
|
target=target_fn,
|
|
1245
1245
|
model=atk_model,
|
|
1246
|
+
target_model=target_model,
|
|
1247
|
+
attacker_model=atk_model,
|
|
1248
|
+
judge_model=eval_model,
|
|
1246
1249
|
goal=goal,
|
|
1247
1250
|
goal_category=goal_category,
|
|
1248
1251
|
project_id=final_project_id,
|
|
@@ -1440,6 +1443,9 @@ def run_suite(
|
|
|
1440
1443
|
description=f"Suite run: {goal_text}",
|
|
1441
1444
|
target=target_fn,
|
|
1442
1445
|
model=atk_model,
|
|
1446
|
+
target_model=model,
|
|
1447
|
+
attacker_model=atk_model,
|
|
1448
|
+
judge_model=atk_model,
|
|
1443
1449
|
goal=goal_text,
|
|
1444
1450
|
goal_category=goal_cat,
|
|
1445
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(
|
|
@@ -1008,9 +1008,6 @@ class _AppCommandActions:
|
|
|
1008
1008
|
agent = self._app._selected_agent_for_new_session()
|
|
1009
1009
|
self._app._create_new_session(agent)
|
|
1010
1010
|
|
|
1011
|
-
def reset_active_session(self) -> None:
|
|
1012
|
-
self._app._reset_active_session()
|
|
1013
|
-
|
|
1014
1011
|
def rename_session(self, title: str) -> None:
|
|
1015
1012
|
self._app._rename_session(title)
|
|
1016
1013
|
|
|
@@ -1611,16 +1608,18 @@ class DreadnodeTextualApp(App[None]):
|
|
|
1611
1608
|
surface=BG,
|
|
1612
1609
|
panel=BG,
|
|
1613
1610
|
variables={
|
|
1614
|
-
# Calm markdown headers — avoid primary orange bleeding in
|
|
1611
|
+
# Calm markdown headers — avoid primary orange bleeding in.
|
|
1612
|
+
# H1-H4 share $fg so headings read against $fg-subtle body
|
|
1613
|
+
# copy; H5/H6 step down to $fg-muted.
|
|
1615
1614
|
"markdown-h1-color": FG,
|
|
1616
1615
|
"markdown-h1-text-style": "bold",
|
|
1617
1616
|
"markdown-h2-color": FG,
|
|
1618
1617
|
"markdown-h2-text-style": "bold",
|
|
1619
|
-
"markdown-h3-color":
|
|
1618
|
+
"markdown-h3-color": FG,
|
|
1620
1619
|
"markdown-h3-text-style": "bold",
|
|
1621
|
-
"markdown-h4-color":
|
|
1620
|
+
"markdown-h4-color": FG,
|
|
1622
1621
|
"markdown-h4-text-style": "bold",
|
|
1623
|
-
"markdown-h5-color":
|
|
1622
|
+
"markdown-h5-color": FG_SUBTLE,
|
|
1624
1623
|
"markdown-h5-text-style": "bold",
|
|
1625
1624
|
"markdown-h6-color": FG_MUTED,
|
|
1626
1625
|
"markdown-h6-text-style": "bold",
|
|
@@ -1981,15 +1980,19 @@ class DreadnodeTextualApp(App[None]):
|
|
|
1981
1980
|
|
|
1982
1981
|
def on_key(self, event: "Key") -> None:
|
|
1983
1982
|
"""Global key routing for history and vim-style navigation."""
|
|
1984
|
-
# Only handle keys on the main screen where composer/conversation exist
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1983
|
+
# Only handle keys on the main screen where composer/conversation exist.
|
|
1984
|
+
# ID-based lookup goes through Textual's _nodes_by_id index (O(1));
|
|
1985
|
+
# the old class-based screen.query(ComposerInput) walked the entire
|
|
1986
|
+
# screen DOM and cost ~40ms per keystroke at ~120 conversation entries.
|
|
1987
|
+
screen = self.screen
|
|
1988
|
+
try:
|
|
1989
|
+
composer = screen.query_one("#composer", ComposerInput)
|
|
1990
|
+
conversation = screen.query_one("#conversation", ConversationView)
|
|
1991
|
+
except NoMatches:
|
|
1988
1992
|
return
|
|
1989
|
-
composer = composer_results.first()
|
|
1990
1993
|
|
|
1991
|
-
# Overlay routing fallback — when the composer is disabled (e.g.
|
|
1992
|
-
# profile recovery), route keys to the active overlay directly.
|
|
1994
|
+
# Overlay routing fallback — when the composer is disabled (e.g.
|
|
1995
|
+
# during profile recovery), route keys to the active overlay directly.
|
|
1993
1996
|
if composer.disabled and self._has_active_overlay():
|
|
1994
1997
|
overlay = composer._get_active_overlay()
|
|
1995
1998
|
if overlay is not None:
|
|
@@ -2015,7 +2018,6 @@ class DreadnodeTextualApp(App[None]):
|
|
|
2015
2018
|
# Forward unhandled keys to the overlay for custom handling
|
|
2016
2019
|
if overlay.on_key(event):
|
|
2017
2020
|
return
|
|
2018
|
-
conversation = conversation_results.first()
|
|
2019
2021
|
|
|
2020
2022
|
# ? shows help when conversation is focused (composer handled via HelpRequested)
|
|
2021
2023
|
if event.key == "question_mark" and conversation.has_focus:
|
|
@@ -2962,31 +2964,6 @@ class DreadnodeTextualApp(App[None]):
|
|
|
2962
2964
|
else:
|
|
2963
2965
|
self._flash("Interactive mode restored", severity="info")
|
|
2964
2966
|
|
|
2965
|
-
@work(exclusive=True, group="session-switch")
|
|
2966
|
-
async def _reset_active_session(self) -> None:
|
|
2967
|
-
session = self._active_session()
|
|
2968
|
-
if session is None:
|
|
2969
|
-
self._flash("No active session to reset", severity="warning")
|
|
2970
|
-
return
|
|
2971
|
-
logger.info("Session reset | session={}", session.info.session_id[:8])
|
|
2972
|
-
await self.managed_client.reset_session(session.info.session_id)
|
|
2973
|
-
session.transcript.clear()
|
|
2974
|
-
session.info.message_count = 0
|
|
2975
|
-
session.turn_count = 0
|
|
2976
|
-
session.queued_messages.clear()
|
|
2977
|
-
session.allowlisted_tools.clear()
|
|
2978
|
-
session.turn_state = TurnState.empty(session.info.session_id)
|
|
2979
|
-
session.unread_events = 0
|
|
2980
|
-
session.inline_activity = None
|
|
2981
|
-
await self._sync_runtime_session_subscriptions()
|
|
2982
|
-
|
|
2983
|
-
self._sync_conversation()
|
|
2984
|
-
self._sync_active_session_projection()
|
|
2985
|
-
self._sync_sessions()
|
|
2986
|
-
self._sessions_manager.sync_queue()
|
|
2987
|
-
display = session.info.session_id[:8]
|
|
2988
|
-
self._flash(f"Reset session {display}", severity="info")
|
|
2989
|
-
|
|
2990
2967
|
async def _update_command(self) -> None:
|
|
2991
2968
|
"""Handle /update — check for updates and run upgrade."""
|
|
2992
2969
|
import asyncio
|
|
@@ -3284,7 +3261,7 @@ class DreadnodeTextualApp(App[None]):
|
|
|
3284
3261
|
# ``phase`` to GENERATING/RUNNING_TOOLS. Without this reset,
|
|
3285
3262
|
# ``sync_progress_indicator`` sees ``phase=IDLE`` with non-empty
|
|
3286
3263
|
# ``tool_runs`` and keeps the spinner up as "thinking between
|
|
3287
|
-
# tool_end and next generation".
|
|
3264
|
+
# tool_end and next generation".
|
|
3288
3265
|
session.turn_state = TurnState.empty(session_id)
|
|
3289
3266
|
self._sync_active_session_projection()
|
|
3290
3267
|
|
|
@@ -166,8 +166,6 @@ class CommandActions(t.Protocol):
|
|
|
166
166
|
|
|
167
167
|
def create_new_session(self, agent: str | None = None) -> None: ...
|
|
168
168
|
|
|
169
|
-
def reset_active_session(self) -> None: ...
|
|
170
|
-
|
|
171
169
|
def rename_session(self, title: str) -> None: ...
|
|
172
170
|
|
|
173
171
|
def export_session(self, filename: str | None) -> None: ...
|
|
@@ -299,8 +297,8 @@ class CommandDispatcher:
|
|
|
299
297
|
"q": self._actions.exit_app,
|
|
300
298
|
"help": self._actions.show_help,
|
|
301
299
|
"new": lambda: self._actions.create_new_session(),
|
|
302
|
-
"
|
|
303
|
-
"
|
|
300
|
+
"clear": lambda: self._actions.create_new_session(),
|
|
301
|
+
"reset": lambda: self._actions.create_new_session(),
|
|
304
302
|
"sessions": self._actions.screen_router_open_sessions,
|
|
305
303
|
"agents": self._actions.write_agent_listing,
|
|
306
304
|
"reload": lambda: self._actions.run_command(self.reload_capabilities_command),
|
|
@@ -32,8 +32,7 @@ class SlashCommand:
|
|
|
32
32
|
SLASH_COMMANDS: list[SlashCommand] = [
|
|
33
33
|
SlashCommand("/help", "Show available commands"),
|
|
34
34
|
SlashCommand("/new", "Create a new session"),
|
|
35
|
-
SlashCommand("/
|
|
36
|
-
SlashCommand("/clear", "Alias for /reset"),
|
|
35
|
+
SlashCommand("/clear", "Alias for /new"),
|
|
37
36
|
SlashCommand("/sessions", "List all sessions"),
|
|
38
37
|
SlashCommand("/agents", "List loaded agents"),
|
|
39
38
|
SlashCommand("/agent", "Start agent session", "<name>"),
|
|
@@ -748,23 +748,16 @@ ToolCall {
|
|
|
748
748
|
color: $fg-subtle;
|
|
749
749
|
}
|
|
750
750
|
|
|
751
|
-
/* Headers — theme variables
|
|
752
|
-
*
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
MarkdownH2 {
|
|
758
|
-
margin: 1 0 0 0;
|
|
759
|
-
border-bottom: solid $border;
|
|
760
|
-
padding-bottom: 1;
|
|
761
|
-
}
|
|
762
|
-
|
|
751
|
+
/* Headers — colors come from theme variables; here we only set margins.
|
|
752
|
+
* Headings own the gap *below* them so adjacent blocks don't double-up
|
|
753
|
+
* (a list with bottom-margin + a heading with top-margin = 2 rows). */
|
|
754
|
+
MarkdownH1,
|
|
755
|
+
MarkdownH2,
|
|
763
756
|
MarkdownH3,
|
|
764
757
|
MarkdownH4,
|
|
765
758
|
MarkdownH5,
|
|
766
759
|
MarkdownH6 {
|
|
767
|
-
margin:
|
|
760
|
+
margin: 0 0 1 0;
|
|
768
761
|
}
|
|
769
762
|
|
|
770
763
|
/* Paragraphs */
|
|
@@ -775,7 +768,7 @@ Markdown > MarkdownParagraph {
|
|
|
775
768
|
/* Code — fenced blocks and inline */
|
|
776
769
|
MarkdownFence {
|
|
777
770
|
background: $bg-lighter;
|
|
778
|
-
margin: 1 0;
|
|
771
|
+
margin: 0 0 1 0;
|
|
779
772
|
}
|
|
780
773
|
|
|
781
774
|
MarkdownBlock > .code_inline {
|
|
@@ -787,7 +780,7 @@ MarkdownBlock > .code_inline {
|
|
|
787
780
|
MarkdownBlockQuote {
|
|
788
781
|
background: $bg-light;
|
|
789
782
|
border-left: outer $border-light;
|
|
790
|
-
margin: 1 0;
|
|
783
|
+
margin: 0 0 1 0;
|
|
791
784
|
padding: 0 1;
|
|
792
785
|
}
|
|
793
786
|
|
|
@@ -296,10 +296,13 @@ def _build_actions(
|
|
|
296
296
|
elif update_ver and is_sandbox and item.get("binding_id"):
|
|
297
297
|
actions.append(("update", f"Update to v{update_ver}"))
|
|
298
298
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
299
|
+
# The default bundled capability provides the active agent and
|
|
300
|
+
# tool surface — disabling it from the UI would brick the runtime.
|
|
301
|
+
if item.get("name") != "dreadnode":
|
|
302
|
+
if state == "enabled":
|
|
303
|
+
actions.append(("toggle", "Disable capability"))
|
|
304
|
+
else:
|
|
305
|
+
actions.append(("toggle", "Enable capability"))
|
|
303
306
|
|
|
304
307
|
if item.get("local_path"):
|
|
305
308
|
actions.append(("browse_files", "Browse files"))
|
|
@@ -1383,7 +1386,11 @@ class CapabilitiesScreen(DreadnodeScreen):
|
|
|
1383
1386
|
],
|
|
1384
1387
|
"components": {
|
|
1385
1388
|
"agents": len(agents),
|
|
1386
|
-
"skills":
|
|
1389
|
+
"skills": sum(
|
|
1390
|
+
1
|
|
1391
|
+
for h in cap.component_health
|
|
1392
|
+
if h.get("kind") == "skill" and h.get("status") == "ok"
|
|
1393
|
+
),
|
|
1387
1394
|
"mcp_servers": len(cap.mcp_server_defs),
|
|
1388
1395
|
},
|
|
1389
1396
|
"update_available": None,
|
|
@@ -40,6 +40,9 @@ _LEVEL_COLORS: dict[str, str] = {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
_LEVELS = ["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"]
|
|
43
|
+
# Cap per-entry rendered length so cycling to TRACE doesn't freeze the UI on
|
|
44
|
+
# full LLM request/response payloads. Buffer + saved log still keep the full text.
|
|
45
|
+
_MAX_DISPLAY_CHARS = 2000
|
|
43
46
|
# Exports share the central dreadnode logs directory alongside worker logs
|
|
44
47
|
# (and, eventually, MCP + TUI/SDK self-logs).
|
|
45
48
|
_LOG_EXPORT_DIR = LOGS_DIR
|
|
@@ -124,7 +127,13 @@ class ConsoleScreen(DreadnodeScreen):
|
|
|
124
127
|
t.append(" ")
|
|
125
128
|
t.append(f"{entry.level:<8}", style=color)
|
|
126
129
|
t.append(f" {entry.source}", style=FG_MUTED)
|
|
127
|
-
|
|
130
|
+
msg = entry.message
|
|
131
|
+
if len(msg) > _MAX_DISPLAY_CHARS:
|
|
132
|
+
extra = len(msg) - _MAX_DISPLAY_CHARS
|
|
133
|
+
t.append(f" {msg[:_MAX_DISPLAY_CHARS]}")
|
|
134
|
+
t.append(f" …[+{extra:,} chars]", style=FG_FAINTEST)
|
|
135
|
+
else:
|
|
136
|
+
t.append(f" {msg}")
|
|
128
137
|
return t
|
|
129
138
|
|
|
130
139
|
def _title_markup(self) -> str:
|
|
@@ -141,7 +150,10 @@ class ConsoleScreen(DreadnodeScreen):
|
|
|
141
150
|
self.dismiss()
|
|
142
151
|
|
|
143
152
|
def action_cycle_level(self) -> None:
|
|
144
|
-
|
|
153
|
+
# Cycle toward more-verbose first (INFO → DEBUG → TRACE …) so the
|
|
154
|
+
# common "I want a bit more detail" step doesn't have to wrap through
|
|
155
|
+
# WARNING/ERROR/CRITICAL.
|
|
156
|
+
self._level_index = (self._level_index - 1) % len(_LEVELS)
|
|
145
157
|
level = _LEVELS[self._level_index]
|
|
146
158
|
self._min_level_no = self._resolve_level_no(level)
|
|
147
159
|
self._refresh_log()
|
|
@@ -165,7 +177,7 @@ class ConsoleScreen(DreadnodeScreen):
|
|
|
165
177
|
]
|
|
166
178
|
_LOG_EXPORT_DIR.mkdir(parents=True, exist_ok=True)
|
|
167
179
|
output_path = _LOG_EXPORT_DIR / filename
|
|
168
|
-
output_path.write_text("\n".join(lines), encoding="utf-8")
|
|
180
|
+
output_path.write_text("\n".join(lines), encoding="utf-8", errors="replace")
|
|
169
181
|
self.notify(f"Saved to {output_path}")
|
|
170
182
|
|
|
171
183
|
def action_clear_logs(self) -> None:
|
|
@@ -1699,6 +1699,28 @@ class SessionsManager:
|
|
|
1699
1699
|
envelope_status or "ok",
|
|
1700
1700
|
error_text or "none",
|
|
1701
1701
|
)
|
|
1702
|
+
if is_active_session:
|
|
1703
|
+
# Perf telemetry — log one summary line per turn so we can
|
|
1704
|
+
# see how rendering cost correlates with session length.
|
|
1705
|
+
# See widgets/conversation.py:perf_snapshot_and_reset.
|
|
1706
|
+
try:
|
|
1707
|
+
conv = self._ui.query_conversation()
|
|
1708
|
+
draft = self._ui.query_draft()
|
|
1709
|
+
entries, vsize_changes = conv.perf_snapshot_and_reset()
|
|
1710
|
+
tok_n, tok_p50, tok_p95, tok_max = draft.perf_snapshot_and_reset()
|
|
1711
|
+
logger.info(
|
|
1712
|
+
"TUI perf | session={} | entries={} | vsize_events={} "
|
|
1713
|
+
"| tokens={} | tok_us_p50={:.0f} | tok_us_p95={:.0f} | tok_us_max={:.0f}",
|
|
1714
|
+
session_id[:8],
|
|
1715
|
+
entries,
|
|
1716
|
+
vsize_changes,
|
|
1717
|
+
tok_n,
|
|
1718
|
+
tok_p50,
|
|
1719
|
+
tok_p95,
|
|
1720
|
+
tok_max,
|
|
1721
|
+
)
|
|
1722
|
+
except Exception:
|
|
1723
|
+
logger.opt(exception=True).debug("TUI perf snapshot failed")
|
|
1702
1724
|
if error_text:
|
|
1703
1725
|
logger.error(
|
|
1704
1726
|
"Agent ended with error: {} (type={})",
|