dreadnode 2.0.18__tar.gz → 2.0.19__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.19}/PKG-INFO +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/hooks.py +92 -8
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/process_judge.py +9 -4
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/api/client.py +84 -15
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/api/models.py +2 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/main.py +72 -0
- dreadnode-2.0.19/dreadnode/app/cli/session.py +677 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/shared.py +5 -1
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/app.py +10 -2
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/update_check.py +11 -3
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +15 -1
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/policies/guard.py +31 -1
- {dreadnode-2.0.18 → dreadnode-2.0.19}/pyproject.toml +2 -2
- {dreadnode-2.0.18 → dreadnode-2.0.19}/.gitignore +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/LICENSE +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/README.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/agent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/args.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/evaluation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/capability_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/app.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/dreadnode.tcss +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/error_handler.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/model_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/sessions_manager.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/adapters/stack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/policies/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/policies/rubrics/process/default.yaml +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.18 → dreadnode-2.0.19}/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.19
|
|
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
|
|
@@ -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)
|
|
@@ -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
|
# ---------------------------------------------------------------------------
|