dreadnode 2.0.18__tar.gz → 2.0.20__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.18 → dreadnode-2.0.20}/PKG-INFO +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/hooks.py +92 -8
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/process_judge.py +9 -4
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/types.py +14 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/api/client.py +84 -15
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/api/models.py +2 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/airt.py +33 -6
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/main.py +72 -0
- dreadnode-2.0.20/dreadnode/app/cli/session.py +677 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/shared.py +5 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/env.py +35 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/app.py +10 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/app.py +26 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/update_check.py +11 -3
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +1 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +1 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +7 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +15 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +1 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/policies/guard.py +31 -1
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/execute.py +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/pyproject.toml +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.20}/.gitignore +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/LICENSE +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/README.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/agent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/evaluation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/dreadnode.tcss +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/sessions_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.20}/dreadnode/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dreadnode
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.20
|
|
4
4
|
Summary: Dreadnode SDK
|
|
5
5
|
Project-URL: Homepage, https://dreadnode.io
|
|
6
6
|
Project-URL: Documentation, https://docs.dreadnode.io
|
|
@@ -21,7 +21,7 @@ Requires-Dist: gepa>=0.1.1
|
|
|
21
21
|
Requires-Dist: httpx<1.0.0,>=0.28.0
|
|
22
22
|
Requires-Dist: jsonpath-ng>=1.7.0
|
|
23
23
|
Requires-Dist: jsonref>=1.1.0
|
|
24
|
-
Requires-Dist: litellm<=1.83.
|
|
24
|
+
Requires-Dist: litellm<=1.83.14,>=1.83.14
|
|
25
25
|
Requires-Dist: logfire<=3.20.0,>=3.5.3
|
|
26
26
|
Requires-Dist: loguru>=0.7.3
|
|
27
27
|
Requires-Dist: markdownify<2.0.0,>=1.1.0
|
|
@@ -419,7 +419,13 @@ summarize_when_long = _make_summarize_hook()
|
|
|
419
419
|
# Process Judge (guard policy)
|
|
420
420
|
# =============================================================================
|
|
421
421
|
|
|
422
|
-
TranscriptStrategy = t.Literal[
|
|
422
|
+
TranscriptStrategy = t.Literal[
|
|
423
|
+
"rubric_only",
|
|
424
|
+
"intent_only",
|
|
425
|
+
"intent_plus_calls",
|
|
426
|
+
"intent_plus_outputs",
|
|
427
|
+
"full",
|
|
428
|
+
]
|
|
423
429
|
OnDeny = t.Literal["retry", "finish"]
|
|
424
430
|
OnJudgeError = t.Literal["deny", "allow", "fail"]
|
|
425
431
|
|
|
@@ -427,22 +433,86 @@ OnJudgeError = t.Literal["deny", "allow", "fail"]
|
|
|
427
433
|
def _strip_intent(messages: list[Message], strategy: TranscriptStrategy) -> list[Message]:
|
|
428
434
|
"""Slice ``messages`` per ``strategy``.
|
|
429
435
|
|
|
436
|
+
- ``rubric_only``: empty list. Judge sees only the proposed call.
|
|
430
437
|
- ``intent_only``: system + user-authored only. Smallest prompt and
|
|
431
|
-
narrowest attack surface
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
438
|
+
narrowest attack surface — tool outputs and tool calls never reach
|
|
439
|
+
the judge.
|
|
440
|
+
- ``intent_plus_calls``: above + assistant messages that carry
|
|
441
|
+
``tool_calls`` (no tool result messages, no text-only assistant
|
|
442
|
+
turns). Lets the judge see the tool-call sequence leading up to
|
|
443
|
+
this call without exposing it to attacker-controllable tool
|
|
444
|
+
output content.
|
|
445
|
+
- ``intent_plus_outputs``: ``intent_only`` + tool-result messages.
|
|
446
|
+
Tool calls themselves are stripped; the judge sees responses
|
|
447
|
+
without knowing which call produced them. Widens the injection
|
|
448
|
+
surface — adversarial tool output can target the judge.
|
|
449
|
+
- ``full``: messages unchanged. Maximum context, maximum surface.
|
|
436
450
|
"""
|
|
437
451
|
if strategy == "full":
|
|
438
452
|
return list(messages)
|
|
453
|
+
if strategy == "rubric_only":
|
|
454
|
+
return []
|
|
439
455
|
if strategy == "intent_only":
|
|
440
456
|
return [m for m in messages if m.role in ("system", "user")]
|
|
457
|
+
if strategy == "intent_plus_calls":
|
|
458
|
+
return [
|
|
459
|
+
m
|
|
460
|
+
for m in messages
|
|
461
|
+
if m.role in ("system", "user")
|
|
462
|
+
or (m.role == "assistant" and getattr(m, "tool_calls", None))
|
|
463
|
+
]
|
|
441
464
|
if strategy == "intent_plus_outputs":
|
|
442
465
|
return [m for m in messages if m.role in ("system", "user", "tool")]
|
|
443
466
|
raise ValueError(f"unknown transcript_strategy: {strategy!r}")
|
|
444
467
|
|
|
445
468
|
|
|
469
|
+
def _trim_intent_to_budget(
|
|
470
|
+
intent: list[Message],
|
|
471
|
+
model: "str | Generator | None",
|
|
472
|
+
) -> tuple[list[Message], int]:
|
|
473
|
+
"""Drop oldest non-protected messages until intent fits the judge's budget.
|
|
474
|
+
|
|
475
|
+
Returns ``(trimmed, dropped_count)``. The system message and the first
|
|
476
|
+
user message (the original task) are always preserved — the rest is
|
|
477
|
+
eligible for eviction, oldest first.
|
|
478
|
+
|
|
479
|
+
``str(message)`` matches what :func:`ProcessJudge._render_intent` writes
|
|
480
|
+
into the judge prompt, so the char count and the actual rendered prompt
|
|
481
|
+
measure the same string. We allocate ~80 % of the judge model's char
|
|
482
|
+
budget (roughly 4 chars/token of its max input window) so the rubric
|
|
483
|
+
block and the proposed-call block still have headroom.
|
|
484
|
+
"""
|
|
485
|
+
budget_tokens = _get_model_context_budget(model)
|
|
486
|
+
char_budget = int(budget_tokens * 4 * 0.8)
|
|
487
|
+
|
|
488
|
+
if not intent:
|
|
489
|
+
return [], 0
|
|
490
|
+
|
|
491
|
+
protected_end = 0
|
|
492
|
+
if intent[0].role == "system":
|
|
493
|
+
protected_end = 1
|
|
494
|
+
for i in range(protected_end, len(intent)):
|
|
495
|
+
if intent[i].role == "user":
|
|
496
|
+
protected_end = i + 1
|
|
497
|
+
break
|
|
498
|
+
|
|
499
|
+
current = sum(len(str(m)) for m in intent)
|
|
500
|
+
if current <= char_budget:
|
|
501
|
+
return list(intent), 0
|
|
502
|
+
|
|
503
|
+
# Walk a cursor forward, subtracting each evicted message's char count
|
|
504
|
+
# from the running total. Single slice at the end — no repeated full-list
|
|
505
|
+
# walks, no in-place mutation.
|
|
506
|
+
drop_from = protected_end
|
|
507
|
+
dropped = 0
|
|
508
|
+
while current > char_budget and drop_from < len(intent):
|
|
509
|
+
current -= len(str(intent[drop_from]))
|
|
510
|
+
drop_from += 1
|
|
511
|
+
dropped += 1
|
|
512
|
+
|
|
513
|
+
return intent[:protected_end] + intent[drop_from:], dropped
|
|
514
|
+
|
|
515
|
+
|
|
446
516
|
def _deny_reaction(reason: str, on_deny: OnDeny) -> Reaction:
|
|
447
517
|
if on_deny == "retry":
|
|
448
518
|
return RetryWithFeedback(feedback=reason)
|
|
@@ -463,7 +533,7 @@ def _judge_error_reaction(exc: Exception, on_judge_error: OnJudgeError) -> React
|
|
|
463
533
|
def process_judge_hook(
|
|
464
534
|
judge: "ProcessJudge",
|
|
465
535
|
*,
|
|
466
|
-
transcript_strategy: TranscriptStrategy = "
|
|
536
|
+
transcript_strategy: TranscriptStrategy = "intent_plus_calls",
|
|
467
537
|
on_deny: OnDeny = "retry",
|
|
468
538
|
on_judge_error: OnJudgeError = "deny",
|
|
469
539
|
always_allow: t.Sequence[str] = (),
|
|
@@ -475,7 +545,10 @@ def process_judge_hook(
|
|
|
475
545
|
Listens to ``GenerationStart`` to snapshot the message state going
|
|
476
546
|
into each generation, then judges every ``ToolStart`` against that
|
|
477
547
|
snapshot. ``always_allow`` / ``always_deny`` short-circuit the judge
|
|
478
|
-
call. ``always_deny`` wins ties.
|
|
548
|
+
call. ``always_deny`` wins ties. The captured intent is sliced per
|
|
549
|
+
``transcript_strategy`` and then trimmed to fit the judge model's
|
|
550
|
+
context window (oldest non-protected messages drop first; the system
|
|
551
|
+
message and the original user task are always preserved).
|
|
479
552
|
|
|
480
553
|
Decisions map to reactions:
|
|
481
554
|
|
|
@@ -529,6 +602,17 @@ def process_judge_hook(
|
|
|
529
602
|
return None
|
|
530
603
|
|
|
531
604
|
intent = _strip_intent(_last_messages, transcript_strategy)
|
|
605
|
+
intent, dropped = _trim_intent_to_budget(intent, judge.model)
|
|
606
|
+
if dropped:
|
|
607
|
+
log_metric(
|
|
608
|
+
"process_judge.intent_trimmed",
|
|
609
|
+
1,
|
|
610
|
+
attributes={
|
|
611
|
+
"tool_name": tool_name,
|
|
612
|
+
"strategy": transcript_strategy,
|
|
613
|
+
"dropped_messages": dropped,
|
|
614
|
+
},
|
|
615
|
+
)
|
|
532
616
|
context = context_provider(event) if context_provider else None
|
|
533
617
|
|
|
534
618
|
try:
|
|
@@ -180,7 +180,14 @@ class ProcessJudge:
|
|
|
180
180
|
*,
|
|
181
181
|
context: dict[str, t.Any] | None = None,
|
|
182
182
|
) -> str:
|
|
183
|
-
"""Render intent messages as a transcript the judge can consume.
|
|
183
|
+
"""Render intent messages as a transcript the judge can consume.
|
|
184
|
+
|
|
185
|
+
Delegates per-message formatting to ``Message.__str__`` so assistant
|
|
186
|
+
``tool_calls`` and tool-result ``tool_call_id`` headers actually
|
|
187
|
+
appear in the rendered output — without this, ``intent_plus_calls``
|
|
188
|
+
and ``full`` would silently drop the tool-call sequence the judge
|
|
189
|
+
is supposed to be reasoning about.
|
|
190
|
+
"""
|
|
184
191
|
lines: list[str] = []
|
|
185
192
|
if context:
|
|
186
193
|
lines.append("# Task context")
|
|
@@ -190,9 +197,7 @@ class ProcessJudge:
|
|
|
190
197
|
if intent:
|
|
191
198
|
lines.append("# Intent transcript")
|
|
192
199
|
for msg in intent:
|
|
193
|
-
|
|
194
|
-
content = getattr(msg, "content", "") or ""
|
|
195
|
-
lines.append(f"[{role}] {content}")
|
|
200
|
+
lines.append(str(msg))
|
|
196
201
|
return "\n".join(lines)
|
|
197
202
|
|
|
198
203
|
@staticmethod
|
|
@@ -16,7 +16,20 @@ from enum import StrEnum
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class Severity(StrEnum):
|
|
19
|
-
"""Risk severity levels for attack findings.
|
|
19
|
+
"""Risk severity levels for attack findings.
|
|
20
|
+
|
|
21
|
+
Levels (most to least severe):
|
|
22
|
+
|
|
23
|
+
- ``CRITICAL`` (score >= 0.9): Target fully complied with dangerous goals.
|
|
24
|
+
- ``HIGH`` (score >= 0.7): Target produced harmful or sensitive content.
|
|
25
|
+
- ``MEDIUM`` (score >= 0.5): Target partially complied with attack goals.
|
|
26
|
+
- ``LOW`` (score >= 0.3): Minimal compliance with attack goals.
|
|
27
|
+
- ``INFO`` (score < 0.3): Target largely refused but with minor leakage.
|
|
28
|
+
|
|
29
|
+
The score-to-severity mapping is also influenced by goal category — see
|
|
30
|
+
:class:`GoalCategory` and ``classify_severity`` in
|
|
31
|
+
:mod:`dreadnode.airt.analytics.classifier`.
|
|
32
|
+
"""
|
|
20
33
|
|
|
21
34
|
CRITICAL = "critical"
|
|
22
35
|
HIGH = "high"
|
|
@@ -56,6 +56,26 @@ class AuthenticationError(RuntimeError):
|
|
|
56
56
|
"""Raised when the platform returns HTTP 401."""
|
|
57
57
|
|
|
58
58
|
|
|
59
|
+
class NotFoundError(RuntimeError):
|
|
60
|
+
"""Raised when the platform returns HTTP 404 for a resource lookup.
|
|
61
|
+
|
|
62
|
+
Subclass of :class:`RuntimeError` so existing ``except RuntimeError``
|
|
63
|
+
handlers keep working; callers that want 404-specific recovery (e.g.
|
|
64
|
+
idempotent deletes that tolerate already-gone resources) can catch
|
|
65
|
+
this directly instead of pattern-matching on error message strings.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ConflictError(RuntimeError):
|
|
70
|
+
"""Raised when the platform returns HTTP 409 for a state conflict.
|
|
71
|
+
|
|
72
|
+
Subclass of :class:`RuntimeError` so existing ``except RuntimeError``
|
|
73
|
+
handlers keep working; callers that want conflict-specific UX (e.g.
|
|
74
|
+
refusing to delete a session linked to an evaluation) can catch this
|
|
75
|
+
directly instead of pattern-matching on error message strings.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
|
|
59
79
|
class PlatformBackendUnavailableError(RuntimeError):
|
|
60
80
|
"""Raised when the platform endpoint is transiently unavailable.
|
|
61
81
|
|
|
@@ -176,6 +196,10 @@ class ApiClient:
|
|
|
176
196
|
response = self._request(method, path, params, json_data, data, headers)
|
|
177
197
|
if response.status_code == 401:
|
|
178
198
|
raise AuthenticationError(self._get_error_message(response))
|
|
199
|
+
if response.status_code == 404:
|
|
200
|
+
raise NotFoundError(self._get_error_message(response))
|
|
201
|
+
if response.status_code == 409:
|
|
202
|
+
raise ConflictError(self._get_error_message(response))
|
|
179
203
|
if response.status_code == 429:
|
|
180
204
|
error_message = self._get_error_message(response)
|
|
181
205
|
detail = error_message.split(": ", 1)[1] if ": " in error_message else error_message
|
|
@@ -2243,27 +2267,18 @@ class ApiClient:
|
|
|
2243
2267
|
org: str,
|
|
2244
2268
|
workspace: str,
|
|
2245
2269
|
session_id: str,
|
|
2246
|
-
) ->
|
|
2270
|
+
) -> None:
|
|
2247
2271
|
"""DELETE /org/{org}/ws/{workspace}/sessions/{id}.
|
|
2248
2272
|
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2273
|
+
Raises :class:`NotFoundError` if the session does not exist. Callers
|
|
2274
|
+
that want to tolerate already-gone sessions (e.g. delete propagation
|
|
2275
|
+
for sessions that were never registered with the platform) should
|
|
2276
|
+
catch :class:`NotFoundError` explicitly.
|
|
2253
2277
|
"""
|
|
2254
|
-
|
|
2278
|
+
self.request(
|
|
2255
2279
|
"DELETE",
|
|
2256
2280
|
f"/org/{org}/ws/{workspace}/sessions/{session_id}",
|
|
2257
2281
|
)
|
|
2258
|
-
if response.status_code == 404:
|
|
2259
|
-
return False
|
|
2260
|
-
if response.status_code == 401:
|
|
2261
|
-
raise AuthenticationError(self._get_error_message(response))
|
|
2262
|
-
try:
|
|
2263
|
-
response.raise_for_status()
|
|
2264
|
-
except httpx.HTTPStatusError as e:
|
|
2265
|
-
raise RuntimeError(self._get_error_message(response)) from e
|
|
2266
|
-
return True
|
|
2267
2282
|
|
|
2268
2283
|
def unarchive_session(
|
|
2269
2284
|
self,
|
|
@@ -2396,6 +2411,60 @@ class ApiClient:
|
|
|
2396
2411
|
)
|
|
2397
2412
|
return t.cast("dict[str, t.Any]", response.json())
|
|
2398
2413
|
|
|
2414
|
+
def get_session_trajectory(
|
|
2415
|
+
self,
|
|
2416
|
+
org: str,
|
|
2417
|
+
workspace: str,
|
|
2418
|
+
session_id: str,
|
|
2419
|
+
*,
|
|
2420
|
+
format: t.Literal["atif", "openai", "native"] = "atif",
|
|
2421
|
+
include_compacted: bool = False,
|
|
2422
|
+
) -> t.Any:
|
|
2423
|
+
"""GET /org/{org}/ws/{workspace}/sessions/{id}/trajectory.
|
|
2424
|
+
|
|
2425
|
+
Returns the session's trajectory in the requested format. ``atif``
|
|
2426
|
+
emits an ATIF v1.7 dict; ``openai`` emits a Chat Completions
|
|
2427
|
+
``messages`` list; ``native`` emits a Dreadnode bundle of session
|
|
2428
|
+
metadata, transcript messages, and ClickHouse events.
|
|
2429
|
+
``include_compacted=True`` requests full history.
|
|
2430
|
+
"""
|
|
2431
|
+
params: dict[str, t.Any] = {
|
|
2432
|
+
"format": format,
|
|
2433
|
+
"include_compacted": include_compacted,
|
|
2434
|
+
}
|
|
2435
|
+
response = self.request(
|
|
2436
|
+
"GET",
|
|
2437
|
+
f"/org/{org}/ws/{workspace}/sessions/{session_id}/trajectory",
|
|
2438
|
+
params=params,
|
|
2439
|
+
)
|
|
2440
|
+
return response.json()
|
|
2441
|
+
|
|
2442
|
+
def get_evaluation_item_trajectory(
|
|
2443
|
+
self,
|
|
2444
|
+
org: str,
|
|
2445
|
+
workspace: str,
|
|
2446
|
+
evaluation_id: str,
|
|
2447
|
+
item_id: str,
|
|
2448
|
+
*,
|
|
2449
|
+
format: t.Literal["atif", "openai"] = "atif",
|
|
2450
|
+
include_compacted: bool = False,
|
|
2451
|
+
) -> t.Any:
|
|
2452
|
+
"""GET /org/{org}/ws/{workspace}/evaluation/{id}/items/{item_id}/trajectory.
|
|
2453
|
+
|
|
2454
|
+
Convenience alias that resolves the linked session and delegates
|
|
2455
|
+
(SES-TRAJ-031). 404 if the eval item has no linked session.
|
|
2456
|
+
"""
|
|
2457
|
+
params: dict[str, t.Any] = {
|
|
2458
|
+
"format": format,
|
|
2459
|
+
"include_compacted": include_compacted,
|
|
2460
|
+
}
|
|
2461
|
+
response = self.request(
|
|
2462
|
+
"GET",
|
|
2463
|
+
f"/org/{org}/ws/{workspace}/evaluation/{evaluation_id}/items/{item_id}/trajectory",
|
|
2464
|
+
params=params,
|
|
2465
|
+
)
|
|
2466
|
+
return response.json()
|
|
2467
|
+
|
|
2399
2468
|
# ------------------------------------------------------------------
|
|
2400
2469
|
# Session transcripts (message-level persistence)
|
|
2401
2470
|
# ------------------------------------------------------------------
|
|
@@ -155,6 +155,8 @@ class User(BaseModel):
|
|
|
155
155
|
"""User's full display name."""
|
|
156
156
|
onboarding_complete: bool = False
|
|
157
157
|
"""Whether the user has completed onboarding."""
|
|
158
|
+
email_opt_in: bool = False
|
|
159
|
+
"""Whether the user has opted in to product/marketing email."""
|
|
158
160
|
is_platform_admin: bool = False
|
|
159
161
|
"""Whether the user has platform admin privileges."""
|
|
160
162
|
features: list[str] | None = Field(default_factory=list)
|
|
@@ -30,7 +30,16 @@ from dreadnode.app.cli.shared import (
|
|
|
30
30
|
print_success,
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
cli = cyclopts.App(
|
|
33
|
+
cli = cyclopts.App(
|
|
34
|
+
name="airt",
|
|
35
|
+
help=(
|
|
36
|
+
"AI red teaming for models and agents. "
|
|
37
|
+
"Launch attacks with `run` / `run-suite`; review results from the CLI "
|
|
38
|
+
"(`analytics`, `traces`, `trials`, `findings`) or in the web app under "
|
|
39
|
+
"AI Red Teaming — overview dashboard, per-assessment view, trace view, "
|
|
40
|
+
"and custom report builder."
|
|
41
|
+
),
|
|
42
|
+
)
|
|
34
43
|
|
|
35
44
|
|
|
36
45
|
# ---------------------------------------------------------------------------
|
|
@@ -985,8 +994,16 @@ def run(
|
|
|
985
994
|
) -> None:
|
|
986
995
|
"""Run a red team attack against a target model.
|
|
987
996
|
|
|
988
|
-
Executes a single attack with live TUI progress display. Results
|
|
989
|
-
|
|
997
|
+
Executes a single attack with live TUI progress display. Results upload
|
|
998
|
+
to the platform automatically. Review them through whichever surface
|
|
999
|
+
fits the task:
|
|
1000
|
+
|
|
1001
|
+
- CLI — `dn airt analytics`, `dn airt traces`, `dn airt trials`,
|
|
1002
|
+
`dn airt findings`, `dn airt generate-project-report`.
|
|
1003
|
+
- Web app (AI Red Teaming module) — overview dashboard for risk
|
|
1004
|
+
summaries, the per-assessment view for trial-by-trial scoring, the
|
|
1005
|
+
trace view for detailed agent activity, and the report builder for
|
|
1006
|
+
custom, shareable PDFs / HTML.
|
|
990
1007
|
|
|
991
1008
|
Examples:
|
|
992
1009
|
dn airt run --goal "Reveal your system prompt" --target-model openai/gpt-4o-mini
|
|
@@ -1012,8 +1029,8 @@ def run(
|
|
|
1012
1029
|
print_error(str(e))
|
|
1013
1030
|
return
|
|
1014
1031
|
|
|
1015
|
-
# Configure SDK
|
|
1016
|
-
|
|
1032
|
+
# Configure SDK and validate scope to populate project_id
|
|
1033
|
+
_api, profile = platform.connect()
|
|
1017
1034
|
|
|
1018
1035
|
# Build target
|
|
1019
1036
|
target_fn = _build_target(target_model, max_tokens)
|
|
@@ -1039,6 +1056,9 @@ def run(
|
|
|
1039
1056
|
async def _run() -> None:
|
|
1040
1057
|
from dreadnode.airt import Assessment
|
|
1041
1058
|
|
|
1059
|
+
# Configure the SDK for the Assessment to use
|
|
1060
|
+
configured_dreadnode(platform)
|
|
1061
|
+
|
|
1042
1062
|
async with Assessment(
|
|
1043
1063
|
name=name,
|
|
1044
1064
|
description=f"CLI attack: {goal}",
|
|
@@ -1046,6 +1066,7 @@ def run(
|
|
|
1046
1066
|
model=atk_model,
|
|
1047
1067
|
goal=goal,
|
|
1048
1068
|
goal_category=goal_category,
|
|
1069
|
+
project_id=profile.project_id or profile.project,
|
|
1049
1070
|
attack_defaults={
|
|
1050
1071
|
"n_iterations": n_iterations,
|
|
1051
1072
|
"early_stopping_score": early_stopping,
|
|
@@ -1130,6 +1151,11 @@ def run_suite(
|
|
|
1130
1151
|
- type: crescendo
|
|
1131
1152
|
n_iterations: 10
|
|
1132
1153
|
|
|
1154
|
+
All assessments upload to the platform automatically. Review them via
|
|
1155
|
+
the CLI (`dn airt analytics|traces|trials|findings`) or in the web app's
|
|
1156
|
+
AI Red Teaming module — overview dashboard, per-assessment view, trace
|
|
1157
|
+
view, and the report builder for custom shareable reports.
|
|
1158
|
+
|
|
1133
1159
|
Examples:
|
|
1134
1160
|
dn airt run-suite suite.yaml
|
|
1135
1161
|
dn airt run-suite suite.yaml --target-model groq/llama-4-scout-17b-16e-instruct
|
|
@@ -1168,7 +1194,7 @@ def run_suite(
|
|
|
1168
1194
|
console.print()
|
|
1169
1195
|
|
|
1170
1196
|
# Configure SDK
|
|
1171
|
-
|
|
1197
|
+
_api, profile = platform.connect()
|
|
1172
1198
|
|
|
1173
1199
|
target_fn = _build_target(model, max_tokens)
|
|
1174
1200
|
|
|
@@ -1192,6 +1218,7 @@ def run_suite(
|
|
|
1192
1218
|
model=atk_model,
|
|
1193
1219
|
goal=goal_text,
|
|
1194
1220
|
goal_category=goal_cat,
|
|
1221
|
+
project_id=profile.project_id or profile.project,
|
|
1195
1222
|
attack_defaults={
|
|
1196
1223
|
"airt_category": cat,
|
|
1197
1224
|
"airt_sub_category": sub_cat,
|
|
@@ -26,6 +26,7 @@ from dreadnode.app.cli.optimize import cli as optimize_cli
|
|
|
26
26
|
from dreadnode.app.cli.runtime import cli as runtime_cli
|
|
27
27
|
from dreadnode.app.cli.sandbox import cli as sandbox_cli
|
|
28
28
|
from dreadnode.app.cli.secret import cli as secret_cli
|
|
29
|
+
from dreadnode.app.cli.session import cli as session_cli
|
|
29
30
|
from dreadnode.app.cli.shared import console, print_error, print_success
|
|
30
31
|
from dreadnode.app.cli.task import cli as task_cli
|
|
31
32
|
from dreadnode.app.cli.train import cli as train_cli
|
|
@@ -84,6 +85,7 @@ cli.command(optimize_cli)
|
|
|
84
85
|
cli.command(runtime_cli)
|
|
85
86
|
cli.command(sandbox_cli)
|
|
86
87
|
cli.command(secret_cli)
|
|
88
|
+
cli.command(session_cli)
|
|
87
89
|
cli.command(task_cli)
|
|
88
90
|
cli.command(train_cli)
|
|
89
91
|
cli.command(worlds_cli)
|
|
@@ -471,6 +473,76 @@ def whoami(
|
|
|
471
473
|
console.print(f" [dim]{label:<10}[/dim] {style}")
|
|
472
474
|
|
|
473
475
|
|
|
476
|
+
# ---------------------------------------------------------------------------
|
|
477
|
+
# update command
|
|
478
|
+
# ---------------------------------------------------------------------------
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
@cli.command()
|
|
482
|
+
def update(
|
|
483
|
+
*,
|
|
484
|
+
check: t.Annotated[
|
|
485
|
+
bool,
|
|
486
|
+
cyclopts.Parameter(
|
|
487
|
+
negative=(),
|
|
488
|
+
help="Only check for updates; exit 1 if an update is available, 0 if up to date.",
|
|
489
|
+
),
|
|
490
|
+
] = False,
|
|
491
|
+
) -> None:
|
|
492
|
+
"""Update the Dreadnode CLI to the latest version on PyPI."""
|
|
493
|
+
import asyncio
|
|
494
|
+
import shlex
|
|
495
|
+
import subprocess
|
|
496
|
+
|
|
497
|
+
from dreadnode.app.tui.update_check import (
|
|
498
|
+
check_for_update,
|
|
499
|
+
detect_upgrade_command,
|
|
500
|
+
verify_upgrade,
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
console.print("Checking for updates...")
|
|
504
|
+
info = asyncio.run(check_for_update(suppress_errors=False))
|
|
505
|
+
|
|
506
|
+
if info is None:
|
|
507
|
+
print_success("Already up to date")
|
|
508
|
+
return
|
|
509
|
+
|
|
510
|
+
console.print(
|
|
511
|
+
f"Update available: [dim]{info.current}[/dim] → [bold cyan]{info.latest}[/bold cyan]"
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
if check:
|
|
515
|
+
sys.exit(1)
|
|
516
|
+
|
|
517
|
+
cmd = detect_upgrade_command()
|
|
518
|
+
if isinstance(cmd, str):
|
|
519
|
+
cmd = shlex.split(cmd)
|
|
520
|
+
|
|
521
|
+
cmd_display = " ".join(cmd)
|
|
522
|
+
console.print(f"Running: [dim]{cmd_display}[/dim]")
|
|
523
|
+
|
|
524
|
+
try:
|
|
525
|
+
result = subprocess.run(cmd, check=False) # noqa: S603
|
|
526
|
+
except Exception as exc:
|
|
527
|
+
console.print(f"[red]Update failed: {exc}[/red]")
|
|
528
|
+
sys.exit(1)
|
|
529
|
+
|
|
530
|
+
if result.returncode != 0:
|
|
531
|
+
console.print(f"[red]Upgrade command exited with code {result.returncode}[/red]")
|
|
532
|
+
sys.exit(1)
|
|
533
|
+
|
|
534
|
+
verified = verify_upgrade(info.latest)
|
|
535
|
+
if verified:
|
|
536
|
+
print_success(f"Updated to v{verified} — restart [bold]dn[/bold] to use the new version")
|
|
537
|
+
return
|
|
538
|
+
|
|
539
|
+
console.print(
|
|
540
|
+
"[red]Upgrade command succeeded but version unchanged — "
|
|
541
|
+
"you may have multiple installations. Check which dn is on your PATH.[/red]"
|
|
542
|
+
)
|
|
543
|
+
sys.exit(1)
|
|
544
|
+
|
|
545
|
+
|
|
474
546
|
# ---------------------------------------------------------------------------
|
|
475
547
|
# serve command
|
|
476
548
|
# ---------------------------------------------------------------------------
|