dreadnode 2.0.44__tar.gz → 2.0.45__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.44 → dreadnode-2.0.45}/PKG-INFO +1 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/_base.py +74 -13
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/evaluation.py +3 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/main.py +150 -35
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/app.py +44 -21
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/prompt.py +7 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/app.py +36 -2
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/dreadnode.tcss +37 -34
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/raw_spans.py +2 -2
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/theme.py +54 -31
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tool.py +2 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -3
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -3
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +1 -2
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +59 -26
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +4 -4
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/tls.py +1 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/storage.py +4 -3
- {dreadnode-2.0.44 → dreadnode-2.0.45}/pyproject.toml +1 -1
- {dreadnode-2.0.44 → dreadnode-2.0.45}/.gitignore +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/LICENSE +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/README.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/agent.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/AGENTS.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/claude_code.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/native.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/process_judge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/sanitize.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/agent_suite.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/agentic_suite.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/approval_bypass.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/art_engine.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/defense.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/failure.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/gate.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/memory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/modes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/probes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/recon.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/router.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/strategy.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/authz.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/browser_probes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/detect.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/_base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/_text_common.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/bae.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/boundary.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/deepwordbug.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/hopskipjump.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/pwws.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/simba.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/square.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/text.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/textbugger.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/textfooler.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/zoo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/_base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/activethief.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/copycat.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/distillation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/equation_solving.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/jacobian.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/knockoff.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/honeytoken.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/injection_channels.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/_base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/confidence.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/nes_inversion.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/mcp_probes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/_base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/entropy.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/label_only.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/lira.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/loss.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/shadow_model.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/threshold.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/message_parts.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/model_export.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/oast.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/policies.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/probe_planner.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/propagation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/resource_abuse.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/target.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/auth.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/factory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/http.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/message.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/prediction.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/spec.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/streaming/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tool_attack.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/judge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/session.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/task_set.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/runtime_credentials.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/ws_auth.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/bug_report.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/readme.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/report_bug.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/sessions_manager.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/command_tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/install.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/startup_clock.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/proxy.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/outcome.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/trajectory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/trajectory_tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/egress.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/guard.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/reconciliation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/scope.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/browser_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/project_memory.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/report_items.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/submission.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/art_prompt.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/past_tense.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/version.py +0 -0
|
@@ -89,12 +89,27 @@ class BlackBoxAttack:
|
|
|
89
89
|
self.rng = np.random.default_rng(seed)
|
|
90
90
|
self.airt_assessment_id = airt_assessment_id
|
|
91
91
|
self.airt_target_model = airt_target_model or target.name
|
|
92
|
-
|
|
92
|
+
# Make the default goal target-aware so the same objective against
|
|
93
|
+
# different models counts as distinct goals on the dashboard (e.g. evasion
|
|
94
|
+
# of the fraud, digits, and sentiment classifiers = 3 goals, not 1). An
|
|
95
|
+
# explicit airt_goal is respected verbatim; only the default is suffixed.
|
|
96
|
+
self.airt_goal = airt_goal or (
|
|
97
|
+
f"{self.default_goal} on {self.airt_target_model}"
|
|
98
|
+
if self.airt_target_model
|
|
99
|
+
else self.default_goal
|
|
100
|
+
)
|
|
93
101
|
self.airt_goal_category = airt_goal_category or self.default_goal_category
|
|
94
102
|
self._query_count = 0
|
|
95
103
|
#: A sample of real (input -> prediction) pairs so the finding can show
|
|
96
104
|
#: the actual queries the attacker sent, not just the total count.
|
|
97
105
|
self._query_samples: list[dict[str, t.Any]] = []
|
|
106
|
+
#: Count of trial spans emitted this run. Each algorithm iteration is one
|
|
107
|
+
#: trial (mirroring how a generative Study counts a trial per step), so the
|
|
108
|
+
#: platform can count trials / incurred budget for traditional-ML attacks.
|
|
109
|
+
self._trials_emitted = 0
|
|
110
|
+
#: Hard safety cap on trial spans so a pathologically long loop cannot
|
|
111
|
+
#: explode the trace tree.
|
|
112
|
+
self._max_trial_spans = 1000
|
|
98
113
|
|
|
99
114
|
# -- target I/O -------------------------------------------------------- #
|
|
100
115
|
async def _query(self, xs: t.Sequence[QueryInput]) -> list[Prediction]:
|
|
@@ -146,28 +161,74 @@ class BlackBoxAttack:
|
|
|
146
161
|
metrics: dict[str, float] | None = None,
|
|
147
162
|
**attrs: t.Any,
|
|
148
163
|
) -> None:
|
|
149
|
-
"""Emit a
|
|
164
|
+
"""Emit a **trial** span for one algorithm iteration, recording the
|
|
150
165
|
intermediate adversarial state so the full attack trajectory is
|
|
151
|
-
inspectable in the Traces tab.
|
|
166
|
+
inspectable in the Traces tab and every iteration is counted as a trial.
|
|
167
|
+
|
|
168
|
+
One iteration == one trial: this mirrors how a generative ``Study`` emits
|
|
169
|
+
a trial span per refinement step, so the platform counts trials (and the
|
|
170
|
+
incurred query budget) for traditional-ML attacks the same way. The span
|
|
171
|
+
carries the AIRT assessment/attack attributes and is a child of the run's
|
|
172
|
+
``study`` span (opened in :meth:`run`), which is how ClickHouse links a
|
|
173
|
+
trial to its assessment.
|
|
152
174
|
|
|
153
175
|
``input`` is the current candidate (perturbed text / feature vector /
|
|
154
176
|
image preview) the attacker sent; ``output`` is the target's response at
|
|
155
|
-
this step
|
|
156
|
-
|
|
157
|
-
|
|
177
|
+
this step; ``metrics`` are the scalar signals (distance, confidence,
|
|
178
|
+
fidelity) plotted over the run. The lightweight trial span is emitted
|
|
179
|
+
every iteration; the heavier input/output previews are attached only for
|
|
180
|
+
the first 20 iterations then every 10th, so a long run does not bloat the
|
|
158
181
|
trace tree."""
|
|
159
|
-
if
|
|
182
|
+
if self._trials_emitted >= self._max_trial_spans:
|
|
160
183
|
return
|
|
161
|
-
|
|
162
|
-
|
|
184
|
+
self._trials_emitted += 1
|
|
185
|
+
heavy = iteration < 20 or iteration % 10 == 0
|
|
186
|
+
with self._trial(iteration, **attrs) as span:
|
|
187
|
+
if span is None or not hasattr(span, "log_metric"):
|
|
163
188
|
return
|
|
164
189
|
with suppress(Exception):
|
|
165
|
-
if input is not None:
|
|
166
|
-
span.log_input("candidate", input)
|
|
167
|
-
if output is not None:
|
|
168
|
-
span.log_output("prediction", output)
|
|
169
190
|
for key, value in (metrics or {}).items():
|
|
170
191
|
span.log_metric(key, float(value), step=iteration)
|
|
192
|
+
if heavy and input is not None and hasattr(span, "log_input"):
|
|
193
|
+
span.log_input("candidate", input)
|
|
194
|
+
if heavy and output is not None and hasattr(span, "log_output"):
|
|
195
|
+
span.log_output("prediction", output)
|
|
196
|
+
|
|
197
|
+
def _trial(self, iteration: int, **attrs: t.Any) -> t.Any:
|
|
198
|
+
"""Open a ``trial`` span for one iteration, tagged with the AIRT
|
|
199
|
+
assessment/attack attributes so it is counted against this assessment."""
|
|
200
|
+
try:
|
|
201
|
+
from dreadnode.tracing.spans import trial_span
|
|
202
|
+
|
|
203
|
+
ctx = trial_span(
|
|
204
|
+
trial_id=f"{self._attack_name}-{iteration}-{self._trials_emitted}",
|
|
205
|
+
step=int(iteration),
|
|
206
|
+
airt_assessment_id=self.airt_assessment_id,
|
|
207
|
+
airt_trial_index=int(iteration),
|
|
208
|
+
airt_attack_name=self._attack_name,
|
|
209
|
+
airt_attack_domain=self.attack_domain,
|
|
210
|
+
airt_target_model=self.airt_target_model,
|
|
211
|
+
airt_goal=self.airt_goal,
|
|
212
|
+
airt_goal_category=self.airt_goal_category,
|
|
213
|
+
airt_input_modality=self.modality,
|
|
214
|
+
)
|
|
215
|
+
except Exception:
|
|
216
|
+
return nullcontext()
|
|
217
|
+
if not attrs:
|
|
218
|
+
return ctx
|
|
219
|
+
# Fold any per-iteration attrs (e.g. distance norm) onto the span.
|
|
220
|
+
from contextlib import contextmanager
|
|
221
|
+
|
|
222
|
+
@contextmanager
|
|
223
|
+
def _wrapped() -> t.Iterator[t.Any]:
|
|
224
|
+
with ctx as span:
|
|
225
|
+
if span is not None and hasattr(span, "set_attribute"):
|
|
226
|
+
with suppress(Exception):
|
|
227
|
+
for key, value in attrs.items():
|
|
228
|
+
span.set_attribute(str(key), value)
|
|
229
|
+
yield span
|
|
230
|
+
|
|
231
|
+
return _wrapped()
|
|
171
232
|
|
|
172
233
|
# -- run scaffold ------------------------------------------------------ #
|
|
173
234
|
@property
|
|
@@ -792,7 +792,9 @@ def create(
|
|
|
792
792
|
max_steps: Maximum agent tool/generation steps per sample.
|
|
793
793
|
Enforced via a headless session policy; the task timeout still
|
|
794
794
|
applies as a wall-clock bound.
|
|
795
|
-
cleanup_policy: Sandbox cleanup policy.
|
|
795
|
+
cleanup_policy: Sandbox cleanup policy. Hosted E2B evaluations support
|
|
796
|
+
only ``always``; ``on_success`` is available on Docker and
|
|
797
|
+
OpenSandbox deployments.
|
|
796
798
|
judge_model: Override the judge model for all tasks in this evaluation.
|
|
797
799
|
egress: Additional outbound destination for this run's sandboxes, as an
|
|
798
800
|
FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Unions
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""Root cyclopts App with top-level commands (tui, login, serve)."""
|
|
2
2
|
|
|
3
|
+
import importlib
|
|
3
4
|
import importlib.metadata
|
|
4
5
|
import os
|
|
5
6
|
import secrets
|
|
6
7
|
import sys
|
|
8
|
+
import threading
|
|
7
9
|
import time
|
|
8
10
|
import typing as t
|
|
9
11
|
|
|
@@ -14,25 +16,8 @@ import cyclopts
|
|
|
14
16
|
from loguru import logger
|
|
15
17
|
from rich.panel import Panel
|
|
16
18
|
|
|
17
|
-
from dreadnode.app.cli.airt import cli as airt_cli
|
|
18
19
|
from dreadnode.app.cli.args import RESUME_PICK_SENTINEL, PlatformArgs, TuiArgs
|
|
19
|
-
from dreadnode.app.cli.capability import cli as capability_cli
|
|
20
|
-
from dreadnode.app.cli.dataset import cli as dataset_cli
|
|
21
|
-
from dreadnode.app.cli.environment import cli as environment_cli
|
|
22
|
-
from dreadnode.app.cli.evaluation import cli as evaluation_cli
|
|
23
|
-
from dreadnode.app.cli.inference_model import cli as inference_model_cli
|
|
24
|
-
from dreadnode.app.cli.judge import cli as judge_cli
|
|
25
|
-
from dreadnode.app.cli.model import cli as model_cli
|
|
26
|
-
from dreadnode.app.cli.optimize import cli as optimize_cli
|
|
27
|
-
from dreadnode.app.cli.runtime import cli as runtime_cli
|
|
28
|
-
from dreadnode.app.cli.sandbox import cli as sandbox_cli
|
|
29
|
-
from dreadnode.app.cli.secret import cli as secret_cli
|
|
30
|
-
from dreadnode.app.cli.session import cli as session_cli
|
|
31
20
|
from dreadnode.app.cli.shared import console, print_error, print_success
|
|
32
|
-
from dreadnode.app.cli.task import cli as task_cli
|
|
33
|
-
from dreadnode.app.cli.task_set import cli as task_set_cli
|
|
34
|
-
from dreadnode.app.cli.train import cli as train_cli
|
|
35
|
-
from dreadnode.app.cli.worlds import cli as worlds_cli
|
|
36
21
|
from dreadnode.app.model_catalog import resolve_model
|
|
37
22
|
from dreadnode.core.tls import format_tls_error
|
|
38
23
|
|
|
@@ -68,7 +53,55 @@ def _render_profile_context(profile: t.Any) -> str:
|
|
|
68
53
|
# Root app
|
|
69
54
|
# ---------------------------------------------------------------------------
|
|
70
55
|
|
|
71
|
-
|
|
56
|
+
|
|
57
|
+
class _LazyCommandApp(cyclopts.App):
|
|
58
|
+
"""Root app that resolves subcommands from the tokens it is handed.
|
|
59
|
+
|
|
60
|
+
Subcommands import on demand (see ``_LAZY_COMMANDS`` below), so anything
|
|
61
|
+
reaching this object directly rather than through ``run()`` would otherwise
|
|
62
|
+
see only the commands defined in this module. That failure is silent:
|
|
63
|
+
cyclopts answers an unregistered command by printing the *root* help and
|
|
64
|
+
exiting 0, so the caller gets a plausible wrong answer instead of an error.
|
|
65
|
+
|
|
66
|
+
Preparing inside the entry points covers every caller rather than the two
|
|
67
|
+
that happen to be known today — the agent's ``dreadnode_cli`` tool calls
|
|
68
|
+
``cli(tokens)``, tests call ``parse_args``, and the next one has not been
|
|
69
|
+
written yet. Registration is idempotent, so the repeat calls cyclopts makes
|
|
70
|
+
internally cost a set lookup.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def _as_tokens(tokens: "None | str | t.Iterable[str]") -> list[str]:
|
|
75
|
+
if tokens is None:
|
|
76
|
+
return sys.argv[1:]
|
|
77
|
+
if isinstance(tokens, str):
|
|
78
|
+
return tokens.split()
|
|
79
|
+
return list(tokens)
|
|
80
|
+
|
|
81
|
+
def __call__(self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any) -> t.Any:
|
|
82
|
+
_prepare_commands(self._as_tokens(tokens))
|
|
83
|
+
return super().__call__(tokens, **kwargs)
|
|
84
|
+
|
|
85
|
+
def parse_args( # type: ignore[override]
|
|
86
|
+
self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
|
|
87
|
+
) -> t.Any:
|
|
88
|
+
_prepare_commands(self._as_tokens(tokens))
|
|
89
|
+
return super().parse_args(tokens, **kwargs)
|
|
90
|
+
|
|
91
|
+
def parse_known_args( # type: ignore[override]
|
|
92
|
+
self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
|
|
93
|
+
) -> t.Any:
|
|
94
|
+
_prepare_commands(self._as_tokens(tokens))
|
|
95
|
+
return super().parse_known_args(tokens, **kwargs)
|
|
96
|
+
|
|
97
|
+
def parse_commands( # type: ignore[override]
|
|
98
|
+
self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
|
|
99
|
+
) -> t.Any:
|
|
100
|
+
_prepare_commands(self._as_tokens(tokens))
|
|
101
|
+
return super().parse_commands(tokens, **kwargs)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
cli = _LazyCommandApp(
|
|
72
105
|
name="dreadnode",
|
|
73
106
|
help="Dreadnode CLI — agent development and platform tooling.",
|
|
74
107
|
version=_get_version_safe(),
|
|
@@ -85,23 +118,99 @@ cli["--install-completion"].group = "Meta"
|
|
|
85
118
|
# Subcommands
|
|
86
119
|
# ---------------------------------------------------------------------------
|
|
87
120
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
cli.
|
|
104
|
-
cli.
|
|
121
|
+
# Subcommands are imported when one is invoked, not when the CLI loads.
|
|
122
|
+
#
|
|
123
|
+
# Registering them eagerly meant every invocation paid for every command:
|
|
124
|
+
# `dreadnode serve` imported the AIRT tree and, under it, pandas, pyarrow,
|
|
125
|
+
# numpy and optuna, none of which a running runtime uses. That was the
|
|
126
|
+
# majority of a runtime's cold start (ENG-8259).
|
|
127
|
+
#
|
|
128
|
+
# This is the same lazy-table shape the SDK already uses for its own
|
|
129
|
+
# subpackages (`__lazy_submodules__` and friends in `dreadnode/__init__.py`);
|
|
130
|
+
# cyclopts has no native support for deferred subcommands, so registration is
|
|
131
|
+
# driven from the invoked token instead.
|
|
132
|
+
#
|
|
133
|
+
# Keys are the command name as it is typed. The value is the module holding
|
|
134
|
+
# the sub-app and its alias, if it has one.
|
|
135
|
+
_LAZY_COMMANDS: dict[str, tuple[str, str | None]] = {
|
|
136
|
+
"airt": ("dreadnode.app.cli.airt", None),
|
|
137
|
+
"capability": ("dreadnode.app.cli.capability", None),
|
|
138
|
+
"dataset": ("dreadnode.app.cli.dataset", None),
|
|
139
|
+
"environment": ("dreadnode.app.cli.environment", "env"),
|
|
140
|
+
"evaluation": ("dreadnode.app.cli.evaluation", None),
|
|
141
|
+
"inference-model": ("dreadnode.app.cli.inference_model", "llm"),
|
|
142
|
+
"judge": ("dreadnode.app.cli.judge", None),
|
|
143
|
+
"model": ("dreadnode.app.cli.model", None),
|
|
144
|
+
"optimize": ("dreadnode.app.cli.optimize", None),
|
|
145
|
+
"runtime": ("dreadnode.app.cli.runtime", None),
|
|
146
|
+
"sandbox": ("dreadnode.app.cli.sandbox", None),
|
|
147
|
+
"secret": ("dreadnode.app.cli.secret", None),
|
|
148
|
+
"session": ("dreadnode.app.cli.session", None),
|
|
149
|
+
"task": ("dreadnode.app.cli.task", None),
|
|
150
|
+
"task-set": ("dreadnode.app.cli.task_set", None),
|
|
151
|
+
"train": ("dreadnode.app.cli.train", None),
|
|
152
|
+
"worlds": ("dreadnode.app.cli.worlds", None),
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
_COMMAND_ALIASES: dict[str, str] = {
|
|
156
|
+
alias: name for name, (_, alias) in _LAZY_COMMANDS.items() if alias
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
_registered_commands: set[str] = set()
|
|
160
|
+
# `dreadnode serve` hosts concurrent sessions and the agent's CLI tool is
|
|
161
|
+
# dispatched with asyncio.to_thread, so two threads can reach the same
|
|
162
|
+
# unregistered command at once. cyclopts raises CommandCollisionError on a
|
|
163
|
+
# duplicate name, which would fail the second caller's invocation.
|
|
164
|
+
_registration_lock = threading.Lock()
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def register_command(name: str) -> bool:
|
|
168
|
+
"""Register one lazy subcommand, importing its module. True if it exists.
|
|
169
|
+
|
|
170
|
+
Idempotent, so a caller may register a command that is already present.
|
|
171
|
+
"""
|
|
172
|
+
primary = _COMMAND_ALIASES.get(name, name)
|
|
173
|
+
entry = _LAZY_COMMANDS.get(primary)
|
|
174
|
+
if entry is None:
|
|
175
|
+
return False
|
|
176
|
+
if primary in _registered_commands:
|
|
177
|
+
return True
|
|
178
|
+
with _registration_lock:
|
|
179
|
+
# Re-check under the lock: another thread may have registered it while
|
|
180
|
+
# this one waited, and registering twice raises.
|
|
181
|
+
if primary not in _registered_commands:
|
|
182
|
+
module_path, alias = entry
|
|
183
|
+
subapp = importlib.import_module(module_path).cli
|
|
184
|
+
if alias:
|
|
185
|
+
cli.command(subapp, alias=alias)
|
|
186
|
+
else:
|
|
187
|
+
cli.command(subapp)
|
|
188
|
+
_registered_commands.add(primary)
|
|
189
|
+
return True
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def register_all_commands() -> None:
|
|
193
|
+
"""Register every subcommand, importing all of them.
|
|
194
|
+
|
|
195
|
+
Needed whenever the whole command tree has to be visible at once: help,
|
|
196
|
+
shell completion, an unrecognised command that should be reported against
|
|
197
|
+
the full list, and tests that assert on the CLI surface.
|
|
198
|
+
"""
|
|
199
|
+
for name in _LAZY_COMMANDS:
|
|
200
|
+
register_command(name)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _prepare_commands(tokens: t.Sequence[str]) -> None:
|
|
204
|
+
"""Import whatever the invocation needs, and nothing else."""
|
|
205
|
+
for token in tokens:
|
|
206
|
+
if token.startswith("-"):
|
|
207
|
+
continue # a flag before the command, e.g. `dreadnode --version`
|
|
208
|
+
if register_command(token):
|
|
209
|
+
return
|
|
210
|
+
if token in cli:
|
|
211
|
+
return # defined here rather than in a subcommand module
|
|
212
|
+
break # unknown: fall through so the error lists every command
|
|
213
|
+
register_all_commands()
|
|
105
214
|
|
|
106
215
|
|
|
107
216
|
# ---------------------------------------------------------------------------
|
|
@@ -115,6 +224,7 @@ def _meta(
|
|
|
115
224
|
) -> None:
|
|
116
225
|
try:
|
|
117
226
|
console.print()
|
|
227
|
+
_prepare_commands(tokens)
|
|
118
228
|
cli(tokens)
|
|
119
229
|
except Exception as exc:
|
|
120
230
|
if DEBUG:
|
|
@@ -645,6 +755,11 @@ def run(argv: list[str] | None = None) -> None:
|
|
|
645
755
|
try:
|
|
646
756
|
tokens = argv if argv is not None else sys.argv[1:]
|
|
647
757
|
tokens = _rewrite_bare_resume(list(tokens))
|
|
758
|
+
# Before dispatch, not inside the meta handler: cyclopts answers
|
|
759
|
+
# `--help` and `--version` on the meta app itself and never runs the
|
|
760
|
+
# handler body, so registering there would leave the help listing
|
|
761
|
+
# showing only the commands defined in this module.
|
|
762
|
+
_prepare_commands(tokens)
|
|
648
763
|
cli.meta(tokens)
|
|
649
764
|
except SystemExit as exc:
|
|
650
765
|
if exc.code not in (None, 0):
|
|
@@ -611,6 +611,31 @@ def create_agent(
|
|
|
611
611
|
# =============================================================================
|
|
612
612
|
|
|
613
613
|
|
|
614
|
+
def _configure_litellm_env() -> None:
|
|
615
|
+
"""Configure litellm through the environment, before anything imports it.
|
|
616
|
+
|
|
617
|
+
litellm reads these at import time:
|
|
618
|
+
|
|
619
|
+
drop_params = bool(os.getenv("LITELLM_DROP_PARAMS", False))
|
|
620
|
+
modify_params = bool(os.getenv("LITELLM_MODIFY_PARAMS", False))
|
|
621
|
+
|
|
622
|
+
so setting them configures whoever imports litellm first — the warm thread,
|
|
623
|
+
or a request that beats it. Going through the environment is what lets the
|
|
624
|
+
import itself come off the readiness path: this needs no import of its own.
|
|
625
|
+
|
|
626
|
+
``suppress_debug_info`` has no environment hook and is set as an attribute
|
|
627
|
+
by the warm thread. It only silences debug prints, so the warm window costs
|
|
628
|
+
noise rather than correctness.
|
|
629
|
+
|
|
630
|
+
``LITELLM_LOCAL_MODEL_COST_MAP`` stops litellm fetching its model-cost map
|
|
631
|
+
over the network on first import. The platform sets it in the sandbox
|
|
632
|
+
environment; this covers a local ``dreadnode serve``.
|
|
633
|
+
"""
|
|
634
|
+
os.environ.setdefault("LITELLM_DROP_PARAMS", "True")
|
|
635
|
+
os.environ.setdefault("LITELLM_MODIFY_PARAMS", "True")
|
|
636
|
+
os.environ.setdefault("LITELLM_LOCAL_MODEL_COST_MAP", "True")
|
|
637
|
+
|
|
638
|
+
|
|
614
639
|
def _warm_litellm() -> None:
|
|
615
640
|
"""Import litellm so the first chat turn doesn't pay the cold-import cost.
|
|
616
641
|
|
|
@@ -622,10 +647,13 @@ def _warm_litellm() -> None:
|
|
|
622
647
|
"""
|
|
623
648
|
_t0 = time.perf_counter()
|
|
624
649
|
try:
|
|
625
|
-
#
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
650
|
+
# Belt and braces: the lifecycle sets these, but this runs on other
|
|
651
|
+
# paths too and must never be the one that imports litellm unconfigured.
|
|
652
|
+
_configure_litellm_env()
|
|
653
|
+
with startup_clock.timed("litellm.import"):
|
|
654
|
+
import litellm
|
|
655
|
+
import litellm.exceptions
|
|
656
|
+
startup_clock.mark("litellm_imported")
|
|
629
657
|
|
|
630
658
|
litellm.drop_params = True
|
|
631
659
|
litellm.suppress_debug_info = True # ty: ignore[invalid-assignment]
|
|
@@ -695,23 +723,18 @@ async def server_lifecycle() -> t.AsyncIterator[None]:
|
|
|
695
723
|
await registry.worker_manager.start(registry)
|
|
696
724
|
state.startup.mark("workers_started")
|
|
697
725
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
#
|
|
701
|
-
#
|
|
702
|
-
#
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
except Exception: # noqa: S110 - _warm_litellm will retry the full import
|
|
711
|
-
pass
|
|
712
|
-
|
|
713
|
-
# Warm litellm in a background thread so the health endpoint goes live
|
|
714
|
-
# immediately while the ~2s import finishes in the background.
|
|
726
|
+
_configure_litellm_env()
|
|
727
|
+
|
|
728
|
+
# litellm is deliberately NOT imported here. It was the largest single item
|
|
729
|
+
# on the readiness path (~1.8s on a laptop, ~4.3s on a sandbox) and it ran
|
|
730
|
+
# last, so readiness waited on it (ENG-8259). The warm thread below still
|
|
731
|
+
# shifts the import cost off the first chat turn; it just no longer holds
|
|
732
|
+
# readiness open while it does.
|
|
733
|
+
#
|
|
734
|
+
# The flags this block used to import litellm to set are covered by the
|
|
735
|
+
# environment above. Note that LiteLLMGenerator.__post_model_init__ looks
|
|
736
|
+
# like it sets them too, but that is not a pydantic hook and never runs —
|
|
737
|
+
# see ENG-8259. Do not rely on it.
|
|
715
738
|
warm_future = asyncio.get_running_loop().run_in_executor(None, _warm_litellm)
|
|
716
739
|
warm_future.add_done_callback(lambda _future: state.startup.mark("litellm_warmed"))
|
|
717
740
|
|
|
@@ -38,7 +38,13 @@ def _get_cli_commands() -> str:
|
|
|
38
38
|
its internals, the CLI section will be omitted from the system prompt.
|
|
39
39
|
"""
|
|
40
40
|
try:
|
|
41
|
-
from dreadnode.app.cli.main import cli
|
|
41
|
+
from dreadnode.app.cli.main import cli, register_all_commands
|
|
42
|
+
|
|
43
|
+
# Subcommands import on demand (ENG-8259), and this listing is built
|
|
44
|
+
# once per process behind a cache. Under `dreadnode serve` nothing else
|
|
45
|
+
# would have registered them, so the agent's system prompt would name
|
|
46
|
+
# only the handful of commands defined in main.py, permanently.
|
|
47
|
+
register_all_commands()
|
|
42
48
|
|
|
43
49
|
# Access internal command registry — guarded by try/except
|
|
44
50
|
command_registry = getattr(cli, "_commands", None)
|
|
@@ -75,14 +75,24 @@ from dreadnode.app.tui.status_messages import STATUS_READY, STATUS_STARTING
|
|
|
75
75
|
from dreadnode.app.tui.theme import (
|
|
76
76
|
ACCENT,
|
|
77
77
|
BG,
|
|
78
|
+
BG_LIGHT,
|
|
79
|
+
BG_LIGHTER,
|
|
80
|
+
BORDER,
|
|
81
|
+
BORDER_LIGHT,
|
|
78
82
|
BRAND,
|
|
83
|
+
CODE,
|
|
84
|
+
CODE_BG,
|
|
79
85
|
ERROR,
|
|
80
86
|
FG,
|
|
81
87
|
FG_FAINTEST,
|
|
82
88
|
FG_MUTED,
|
|
83
89
|
FG_SUBTLE,
|
|
84
90
|
INFO,
|
|
91
|
+
IS_LIGHT,
|
|
92
|
+
LINK,
|
|
93
|
+
PURPLE,
|
|
85
94
|
SUCCESS,
|
|
95
|
+
TEAL,
|
|
86
96
|
WARNING,
|
|
87
97
|
)
|
|
88
98
|
from dreadnode.app.tui.turn_lifecycle import TurnLifecycle
|
|
@@ -1731,11 +1741,35 @@ class DreadnodeTextualApp(App[None]):
|
|
|
1731
1741
|
warning=WARNING,
|
|
1732
1742
|
error=ERROR,
|
|
1733
1743
|
success=SUCCESS,
|
|
1734
|
-
dark=
|
|
1744
|
+
dark=not IS_LIGHT,
|
|
1735
1745
|
background=BG,
|
|
1736
1746
|
surface=BG,
|
|
1737
|
-
panel
|
|
1747
|
+
# $panel is the raised tier Textual paints its own widgets on
|
|
1748
|
+
# (DataTable headers, tooltips, collapsibles). Dark flattens it
|
|
1749
|
+
# onto BG; light needs the real step up, because BG there is
|
|
1750
|
+
# pure white and the surface would otherwise disappear.
|
|
1751
|
+
panel=BG_LIGHT if IS_LIGHT else BG,
|
|
1738
1752
|
variables={
|
|
1753
|
+
"dn-bg": BG,
|
|
1754
|
+
"dn-bg-light": BG_LIGHT,
|
|
1755
|
+
"dn-bg-lighter": BG_LIGHTER,
|
|
1756
|
+
"dn-fg": FG,
|
|
1757
|
+
"dn-fg-subtle": FG_SUBTLE,
|
|
1758
|
+
"dn-fg-muted": FG_MUTED,
|
|
1759
|
+
"dn-fg-faintest": FG_FAINTEST,
|
|
1760
|
+
"dn-border": BORDER,
|
|
1761
|
+
"dn-border-light": BORDER_LIGHT,
|
|
1762
|
+
"dn-code": CODE,
|
|
1763
|
+
"dn-code-bg": CODE_BG,
|
|
1764
|
+
"dn-link": LINK,
|
|
1765
|
+
"dn-info": INFO,
|
|
1766
|
+
"dn-success": SUCCESS,
|
|
1767
|
+
"dn-warning": WARNING,
|
|
1768
|
+
"dn-error": ERROR,
|
|
1769
|
+
"dn-brand": BRAND,
|
|
1770
|
+
"dn-accent": ACCENT,
|
|
1771
|
+
"dn-purple": PURPLE,
|
|
1772
|
+
"dn-teal": TEAL,
|
|
1739
1773
|
# Calm markdown headers — avoid primary orange bleeding in.
|
|
1740
1774
|
# H1-H4 share $fg so headings read against $fg-subtle body
|
|
1741
1775
|
# copy; H5/H6 step down to $fg-muted.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Dreadnode TUI — minimal dark
|
|
1
|
+
/* Dreadnode TUI — minimal theme, dark by default
|
|
2
2
|
*
|
|
3
3
|
* Design principles:
|
|
4
4
|
* 1. Content is king — full width for conversation
|
|
@@ -7,41 +7,44 @@
|
|
|
7
7
|
* 4. Minimal chrome — one status line, no sidebar, no hotkey bar
|
|
8
8
|
* 5. Clear hierarchy — bullets + whitespace over bordered panels
|
|
9
9
|
* 6. Quiet confidence — subtle indicators, not flashy gradients
|
|
10
|
+
*
|
|
11
|
+
* Every variable below aliases a `$dn-*` theme variable that app.py feeds from
|
|
12
|
+
* theme.py, which resolves the dark or light value. Edit the palette there;
|
|
13
|
+
* a literal hex here would be correct for only one theme.
|
|
10
14
|
*/
|
|
11
15
|
|
|
12
|
-
$bg:
|
|
13
|
-
$bg-light:
|
|
14
|
-
$bg-lighter:
|
|
15
|
-
|
|
16
|
-
$fg:
|
|
17
|
-
$fg-subtle:
|
|
18
|
-
$fg-muted:
|
|
19
|
-
$fg-faintest:
|
|
20
|
-
|
|
21
|
-
/* Inline code + fenced blocks:
|
|
22
|
-
* The pill carries the "code" affordance; tune
|
|
23
|
-
*
|
|
24
|
-
|
|
25
|
-
$code: $
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
$border:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
$
|
|
36
|
-
$
|
|
37
|
-
$
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
$
|
|
42
|
-
$
|
|
43
|
-
$
|
|
44
|
-
$teal: #20dfc8;
|
|
16
|
+
$bg: $dn-bg;
|
|
17
|
+
$bg-light: $dn-bg-light;
|
|
18
|
+
$bg-lighter: $dn-bg-lighter;
|
|
19
|
+
|
|
20
|
+
$fg: $dn-fg;
|
|
21
|
+
$fg-subtle: $dn-fg-subtle;
|
|
22
|
+
$fg-muted: $dn-fg-muted;
|
|
23
|
+
$fg-faintest: $dn-fg-faintest;
|
|
24
|
+
|
|
25
|
+
/* Inline code + fenced blocks: prose-colored text on a raised background
|
|
26
|
+
* "pill". The pill carries the "code" affordance; tune CODE / CODE_BG in
|
|
27
|
+
* theme.py to restyle all code. */
|
|
28
|
+
$code: $dn-code;
|
|
29
|
+
$code-bg: $dn-code-bg;
|
|
30
|
+
|
|
31
|
+
/* Links: always underlined, colored by LINK in theme.py. Warm accent is
|
|
32
|
+
* reserved for tool calls. */
|
|
33
|
+
$link: $dn-link;
|
|
34
|
+
|
|
35
|
+
$border: $dn-border;
|
|
36
|
+
$border-light: $dn-border-light;
|
|
37
|
+
|
|
38
|
+
$info: $dn-info;
|
|
39
|
+
$success: $dn-success;
|
|
40
|
+
$warning: $dn-warning;
|
|
41
|
+
$error: $dn-error;
|
|
42
|
+
|
|
43
|
+
/* Extended palette — platform screens, data visualization */
|
|
44
|
+
$brand: $dn-brand;
|
|
45
|
+
$accent: $dn-accent;
|
|
46
|
+
$purple: $dn-purple;
|
|
47
|
+
$teal: $dn-teal;
|
|
45
48
|
|
|
46
49
|
Screen {
|
|
47
50
|
background: $bg;
|
|
@@ -17,7 +17,7 @@ from textual.widgets import DataTable, Static
|
|
|
17
17
|
|
|
18
18
|
from dreadnode.app.tui.screens.base import DreadnodeScreen
|
|
19
19
|
from dreadnode.app.tui.spans_reader import RawSpansReader, SpanLineSummary
|
|
20
|
-
from dreadnode.app.tui.theme import FG, FG_FAINTEST, FG_MUTED, FG_SUBTLE, WARNING
|
|
20
|
+
from dreadnode.app.tui.theme import FG, FG_FAINTEST, FG_MUTED, FG_SUBTLE, SYNTAX_THEME, WARNING
|
|
21
21
|
|
|
22
22
|
if t.TYPE_CHECKING:
|
|
23
23
|
from pathlib import Path
|
|
@@ -185,6 +185,6 @@ class RawSpansScreen(DreadnodeScreen):
|
|
|
185
185
|
renderable = Group(
|
|
186
186
|
self._detail_header(summary),
|
|
187
187
|
Text(""),
|
|
188
|
-
Syntax(payload, "json", theme=
|
|
188
|
+
Syntax(payload, "json", theme=SYNTAX_THEME, word_wrap=True),
|
|
189
189
|
)
|
|
190
190
|
self.query_one("#raw-spans-detail", Static).update(renderable)
|