dreadnode 2.0.17__tar.gz → 2.0.18__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.17 → dreadnode-2.0.18}/PKG-INFO +1 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/__init__.py +12 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/hooks.py +168 -1
- dreadnode-2.0.18/dreadnode/agents/process_judge.py +207 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/args.py +16 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/main.py +14 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/app.py +44 -67
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/capability_manager.py +5 -5
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/app.py +1 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/error_handler.py +10 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/model_manager.py +7 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/base.py +18 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/capabilities.py +16 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/environments.py +14 -2
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/models.py +156 -105
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/runtimes.py +16 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/sessions.py +14 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/workspaces.py +16 -1
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +2 -0
- dreadnode-2.0.18/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +220 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +14 -7
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +1 -0
- dreadnode-2.0.18/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +169 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +29 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +1 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/loader.py +9 -8
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/hook.py +22 -44
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/stack.py +4 -4
- dreadnode-2.0.18/dreadnode/policies/__init__.py +229 -0
- dreadnode-2.0.18/dreadnode/policies/guard.py +124 -0
- dreadnode-2.0.18/dreadnode/policies/rubrics/process/default.yaml +38 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/pyproject.toml +1 -1
- dreadnode-2.0.17/dreadnode/app/server/session_policy.py +0 -425
- {dreadnode-2.0.17 → dreadnode-2.0.18}/.gitignore +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/LICENSE +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/README.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/agent.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/judge.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/tool_resolution.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/adversarial_reasoning.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/advpromptier.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/alignment_faking.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analogy_escalation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/aprt_progressive.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/attention_shifting.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/autoredteamer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/cot_jailbreak.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/echo_chamber.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/genetic_persona.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/goat_v2.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/humor_bypass.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/j2_meta.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/jbdistill.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/jbfuzz.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/lrm_autonomous.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/mapf.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/nexus.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/persona_hijack.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/quantization_safety.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/refusal_aware.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/reward_hacking.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/salami_slicing.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/self_persuasion.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/siren.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/templatefuzz.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/tmap_trajectory.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/trojail.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/airt/watermark_removal.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/environment.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/evaluation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/inference_model.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/sandbox.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/secret.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/provision.sh +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/solution.sh +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/templates/init/verify.sh +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/interactive.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/managed_client.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/models.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/runtime_client.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/client/transports.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/env.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/model_catalog.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/paths.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/model_resolution.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/prompt.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/prompt_registry.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/runtime_events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/session_hydrator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/session_persistence.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/turn_coordinator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/websocket.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/server/worker_manager.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/auth_flow.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/capabilities_manager.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/command_dispatcher.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/commands.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/dreadnode.tcss +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/model_variants.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/profile_manager.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screen_router.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/capability_docs.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/connection_error.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/console.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/raw_spans.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/services.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/sessions_manager.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/spans_reader.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/status_messages.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/tool_format.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/turn_coordinator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/turn_lifecycle.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/turn_reducer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/turn_state_phase.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/composer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/context_bar.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/conversation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/status_bar.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/tool.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/widgets/whoami.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/app/tui/wire_events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/flags.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/worker.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/capabilities/worker_runner.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/log.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/templating.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/base.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/litellm_.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/_env_eval.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/env.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/adapters/runtime.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/jobs.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/attack_outcome.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/judge_ensemble.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/structural_detection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/scorers/supply_chain_detection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/dreadnode_cli.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/report.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/trajectory_search.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/web_extract.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/_progress.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/env_rollouts.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/models.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/agent_rollout.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/backdoor_finetune.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/competitive_parity.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/multimodal_attacks.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/structural_exploits.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/supply_chain.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.17 → dreadnode-2.0.18}/dreadnode/version.py +0 -0
|
@@ -28,6 +28,8 @@ __all__ = [
|
|
|
28
28
|
"FunctionDefinition",
|
|
29
29
|
"Hook",
|
|
30
30
|
"JudgeResult",
|
|
31
|
+
"ProcessDecision",
|
|
32
|
+
"ProcessJudge",
|
|
31
33
|
"Reaction",
|
|
32
34
|
"Retry",
|
|
33
35
|
"RetryWithFeedback",
|
|
@@ -44,6 +46,7 @@ __all__ = [
|
|
|
44
46
|
"exceptions",
|
|
45
47
|
"hooks",
|
|
46
48
|
"mcp",
|
|
49
|
+
"process_judge_hook",
|
|
47
50
|
"reactions",
|
|
48
51
|
"skills",
|
|
49
52
|
"stopping",
|
|
@@ -63,6 +66,9 @@ _LAZY_NAMES = frozenset(
|
|
|
63
66
|
"Agent",
|
|
64
67
|
"AgentJudge",
|
|
65
68
|
"JudgeResult",
|
|
69
|
+
"ProcessDecision",
|
|
70
|
+
"ProcessJudge",
|
|
71
|
+
"process_judge_hook",
|
|
66
72
|
"Trajectory",
|
|
67
73
|
"Continue",
|
|
68
74
|
"Fail",
|
|
@@ -94,6 +100,9 @@ def _lazy_init() -> None:
|
|
|
94
100
|
# construction mirror for trajectory-scoring use cases.
|
|
95
101
|
_Agent.Judge = _judge.AgentJudge
|
|
96
102
|
|
|
103
|
+
_process_judge = importlib.import_module("dreadnode.agents.process_judge")
|
|
104
|
+
_hooks = importlib.import_module("dreadnode.agents.hooks")
|
|
105
|
+
|
|
97
106
|
g = globals()
|
|
98
107
|
g["events"] = _events
|
|
99
108
|
g["reactions"] = _reactions
|
|
@@ -101,6 +110,9 @@ def _lazy_init() -> None:
|
|
|
101
110
|
g["Agent"] = _Agent
|
|
102
111
|
g["AgentJudge"] = _judge.AgentJudge
|
|
103
112
|
g["JudgeResult"] = _judge.JudgeResult
|
|
113
|
+
g["ProcessDecision"] = _process_judge.ProcessDecision
|
|
114
|
+
g["ProcessJudge"] = _process_judge.ProcessJudge
|
|
115
|
+
g["process_judge_hook"] = _hooks.process_judge_hook
|
|
104
116
|
g["Trajectory"] = _Trajectory
|
|
105
117
|
g["Continue"] = _reactions.Continue
|
|
106
118
|
g["Fail"] = _reactions.Fail
|
|
@@ -12,10 +12,11 @@ from dataclasses import dataclass
|
|
|
12
12
|
from dreadnode.agents.events import (
|
|
13
13
|
AgentEvent,
|
|
14
14
|
AgentStep,
|
|
15
|
+
GenerationStart,
|
|
15
16
|
ToolEnd,
|
|
16
17
|
ToolStart,
|
|
17
18
|
)
|
|
18
|
-
from dreadnode.agents.reactions import Reaction, Retry
|
|
19
|
+
from dreadnode.agents.reactions import Fail, Finish, Reaction, Retry, RetryWithFeedback
|
|
19
20
|
from dreadnode.core.hook import Hook, hook
|
|
20
21
|
from dreadnode.generators.generator import Generator
|
|
21
22
|
from dreadnode.generators.message import Message, make_compaction_message
|
|
@@ -23,6 +24,8 @@ from dreadnode.generators.message import Message, make_compaction_message
|
|
|
23
24
|
if t.TYPE_CHECKING:
|
|
24
25
|
from datetime import datetime
|
|
25
26
|
|
|
27
|
+
from dreadnode.agents.process_judge import ProcessJudge
|
|
28
|
+
|
|
26
29
|
|
|
27
30
|
# =============================================================================
|
|
28
31
|
# Tool Metrics
|
|
@@ -410,3 +413,167 @@ def _make_summarize_hook(
|
|
|
410
413
|
|
|
411
414
|
# Pre-instantiated with defaults -- this is what the wrapper discovers
|
|
412
415
|
summarize_when_long = _make_summarize_hook()
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
# =============================================================================
|
|
419
|
+
# Process Judge (guard policy)
|
|
420
|
+
# =============================================================================
|
|
421
|
+
|
|
422
|
+
TranscriptStrategy = t.Literal["intent_only", "intent_plus_outputs", "full"]
|
|
423
|
+
OnDeny = t.Literal["retry", "finish"]
|
|
424
|
+
OnJudgeError = t.Literal["deny", "allow", "fail"]
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def _strip_intent(messages: list[Message], strategy: TranscriptStrategy) -> list[Message]:
|
|
428
|
+
"""Slice ``messages`` per ``strategy``.
|
|
429
|
+
|
|
430
|
+
- ``intent_only``: system + user-authored only. Smallest prompt and
|
|
431
|
+
narrowest attack surface (tool outputs never reach the judge).
|
|
432
|
+
- ``intent_plus_outputs``: above + tool-result messages. Catches
|
|
433
|
+
state drift but widens the surface — a malicious tool response
|
|
434
|
+
can carry prompt injection aimed at the judge.
|
|
435
|
+
- ``full``: messages unchanged.
|
|
436
|
+
"""
|
|
437
|
+
if strategy == "full":
|
|
438
|
+
return list(messages)
|
|
439
|
+
if strategy == "intent_only":
|
|
440
|
+
return [m for m in messages if m.role in ("system", "user")]
|
|
441
|
+
if strategy == "intent_plus_outputs":
|
|
442
|
+
return [m for m in messages if m.role in ("system", "user", "tool")]
|
|
443
|
+
raise ValueError(f"unknown transcript_strategy: {strategy!r}")
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def _deny_reaction(reason: str, on_deny: OnDeny) -> Reaction:
|
|
447
|
+
if on_deny == "retry":
|
|
448
|
+
return RetryWithFeedback(feedback=reason)
|
|
449
|
+
return Finish(reason=f"policy denied: {reason}")
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def _judge_error_reaction(exc: Exception, on_judge_error: OnJudgeError) -> Reaction | None:
|
|
453
|
+
from loguru import logger
|
|
454
|
+
|
|
455
|
+
if on_judge_error == "deny":
|
|
456
|
+
return Finish(reason=f"process judge unreachable: {exc}")
|
|
457
|
+
if on_judge_error == "allow":
|
|
458
|
+
logger.warning("process judge errored, allowing tool call: {}", exc)
|
|
459
|
+
return None
|
|
460
|
+
return Fail(error=exc)
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def process_judge_hook(
|
|
464
|
+
judge: "ProcessJudge",
|
|
465
|
+
*,
|
|
466
|
+
transcript_strategy: TranscriptStrategy = "intent_only",
|
|
467
|
+
on_deny: OnDeny = "retry",
|
|
468
|
+
on_judge_error: OnJudgeError = "deny",
|
|
469
|
+
always_allow: t.Sequence[str] = (),
|
|
470
|
+
always_deny: t.Sequence[str] = (),
|
|
471
|
+
context_provider: t.Callable[[ToolStart], dict[str, t.Any]] | None = None,
|
|
472
|
+
) -> Hook:
|
|
473
|
+
"""Pre-tool-call gating hook backed by a :class:`ProcessJudge`.
|
|
474
|
+
|
|
475
|
+
Listens to ``GenerationStart`` to snapshot the message state going
|
|
476
|
+
into each generation, then judges every ``ToolStart`` against that
|
|
477
|
+
snapshot. ``always_allow`` / ``always_deny`` short-circuit the judge
|
|
478
|
+
call. ``always_deny`` wins ties.
|
|
479
|
+
|
|
480
|
+
Decisions map to reactions:
|
|
481
|
+
|
|
482
|
+
- allow → ``None`` (tool runs).
|
|
483
|
+
- deny + ``on_deny="retry"`` → :class:`RetryWithFeedback`.
|
|
484
|
+
- deny + ``on_deny="finish"`` → :class:`Finish` with ``"policy denied: …"``.
|
|
485
|
+
- judge raises + ``on_judge_error="deny"`` → :class:`Finish`.
|
|
486
|
+
- judge raises + ``on_judge_error="allow"`` → ``None`` plus warn-level log.
|
|
487
|
+
- judge raises + ``on_judge_error="fail"`` → :class:`Fail`.
|
|
488
|
+
"""
|
|
489
|
+
import time
|
|
490
|
+
|
|
491
|
+
deny_set = set(always_deny)
|
|
492
|
+
allow_set = set(always_allow) - deny_set
|
|
493
|
+
|
|
494
|
+
_last_messages: list[Message] = []
|
|
495
|
+
|
|
496
|
+
@hook(AgentEvent)
|
|
497
|
+
async def process_judge_hook_inner(event: AgentEvent) -> Reaction | None:
|
|
498
|
+
nonlocal _last_messages
|
|
499
|
+
from dreadnode import log_metric
|
|
500
|
+
|
|
501
|
+
if isinstance(event, GenerationStart):
|
|
502
|
+
_last_messages = list(event.messages)
|
|
503
|
+
return None
|
|
504
|
+
|
|
505
|
+
if not isinstance(event, ToolStart):
|
|
506
|
+
return None
|
|
507
|
+
|
|
508
|
+
tool_name = event.tool_call.name
|
|
509
|
+
start = time.monotonic()
|
|
510
|
+
|
|
511
|
+
if tool_name in deny_set:
|
|
512
|
+
log_metric(
|
|
513
|
+
"process_judge.deny",
|
|
514
|
+
1,
|
|
515
|
+
attributes={
|
|
516
|
+
"tool_name": tool_name,
|
|
517
|
+
"short_circuit": True,
|
|
518
|
+
"reason": "always_deny",
|
|
519
|
+
},
|
|
520
|
+
)
|
|
521
|
+
return _deny_reaction(f"tool {tool_name!r} is in always_deny list", on_deny)
|
|
522
|
+
|
|
523
|
+
if tool_name in allow_set:
|
|
524
|
+
log_metric(
|
|
525
|
+
"process_judge.allow",
|
|
526
|
+
1,
|
|
527
|
+
attributes={"tool_name": tool_name, "short_circuit": True},
|
|
528
|
+
)
|
|
529
|
+
return None
|
|
530
|
+
|
|
531
|
+
intent = _strip_intent(_last_messages, transcript_strategy)
|
|
532
|
+
context = context_provider(event) if context_provider else None
|
|
533
|
+
|
|
534
|
+
try:
|
|
535
|
+
decision = await judge.evaluate(
|
|
536
|
+
intent=intent,
|
|
537
|
+
proposed_call=event.tool_call,
|
|
538
|
+
context=context,
|
|
539
|
+
)
|
|
540
|
+
except Exception as exc:
|
|
541
|
+
latency_ms = int((time.monotonic() - start) * 1000)
|
|
542
|
+
log_metric(
|
|
543
|
+
"process_judge.error",
|
|
544
|
+
1,
|
|
545
|
+
attributes={
|
|
546
|
+
"tool_name": tool_name,
|
|
547
|
+
"error_type": type(exc).__name__,
|
|
548
|
+
"error_message": str(exc),
|
|
549
|
+
"latency_ms": latency_ms,
|
|
550
|
+
},
|
|
551
|
+
)
|
|
552
|
+
return _judge_error_reaction(exc, on_judge_error)
|
|
553
|
+
|
|
554
|
+
latency_ms = int((time.monotonic() - start) * 1000)
|
|
555
|
+
if decision.allow:
|
|
556
|
+
log_metric(
|
|
557
|
+
"process_judge.allow",
|
|
558
|
+
1,
|
|
559
|
+
attributes={
|
|
560
|
+
"tool_name": tool_name,
|
|
561
|
+
"short_circuit": False,
|
|
562
|
+
"latency_ms": latency_ms,
|
|
563
|
+
},
|
|
564
|
+
)
|
|
565
|
+
return None
|
|
566
|
+
|
|
567
|
+
log_metric(
|
|
568
|
+
"process_judge.deny",
|
|
569
|
+
1,
|
|
570
|
+
attributes={
|
|
571
|
+
"tool_name": tool_name,
|
|
572
|
+
"short_circuit": False,
|
|
573
|
+
"reason": decision.reason,
|
|
574
|
+
"latency_ms": latency_ms,
|
|
575
|
+
},
|
|
576
|
+
)
|
|
577
|
+
return _deny_reaction(decision.reason, on_deny)
|
|
578
|
+
|
|
579
|
+
return process_judge_hook_inner
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"""ProcessJudge — LLM-backed gate over (intent, proposed tool call) pairs.
|
|
2
|
+
|
|
3
|
+
The primitive layer of the guard policy. ``ProcessJudge`` knows
|
|
4
|
+
nothing about ``Trajectory``, ``Hook``, or ``SessionPolicy`` — it takes
|
|
5
|
+
pre-shaped inputs (a list of :class:`Message` plus a :class:`ToolCall`)
|
|
6
|
+
and returns a :class:`ProcessDecision`. Hook code is responsible for the
|
|
7
|
+
trajectory-to-intent transformation.
|
|
8
|
+
|
|
9
|
+
Composition: reuses the lower-level :func:`dreadnode.scorers.judge.judge`
|
|
10
|
+
function so XML response parsing and the regex fallback stay in one
|
|
11
|
+
place. The default safety-floor rubric ships at
|
|
12
|
+
``dreadnode/policies/rubrics/process/default.yaml`` and is layered with
|
|
13
|
+
any user-supplied rubric under a ``## Project-specific scope`` header
|
|
14
|
+
unless ``replace_default_rubric=True``.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import typing as t
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from dreadnode.generators.generator import GenerateParams, Generator, get_generator
|
|
22
|
+
|
|
23
|
+
if t.TYPE_CHECKING:
|
|
24
|
+
from dreadnode.agents.tools import ToolCall
|
|
25
|
+
from dreadnode.generators.message import Message
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_DEFAULT_RUBRIC_PATH: Path = (
|
|
29
|
+
Path(__file__).parent.parent / "policies" / "rubrics" / "process" / "default.yaml"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
_USER_RUBRIC_HEADER = "## Project-specific scope"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(slots=True)
|
|
36
|
+
class ProcessDecision:
|
|
37
|
+
"""Outcome of one :class:`ProcessJudge` invocation.
|
|
38
|
+
|
|
39
|
+
Two-valued by design — the agent will run an allowed call or won't run
|
|
40
|
+
a denied one. A "warn" mode is deliberately absent; the gating layer
|
|
41
|
+
cannot usefully half-allow a tool call.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
allow: bool
|
|
45
|
+
reason: str
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ProcessJudge:
|
|
49
|
+
"""LLM-backed gate over (intent, proposed tool call) pairs.
|
|
50
|
+
|
|
51
|
+
Example::
|
|
52
|
+
|
|
53
|
+
from dreadnode.agents.process_judge import ProcessJudge
|
|
54
|
+
|
|
55
|
+
judge = ProcessJudge(
|
|
56
|
+
model="anthropic/claude-haiku-4-5",
|
|
57
|
+
rubric="In-scope domains: api.example.com",
|
|
58
|
+
)
|
|
59
|
+
decision = await judge.evaluate(
|
|
60
|
+
intent=session_messages,
|
|
61
|
+
proposed_call=tool_call,
|
|
62
|
+
)
|
|
63
|
+
if not decision.allow:
|
|
64
|
+
print("denied:", decision.reason)
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def __init__(
|
|
68
|
+
self,
|
|
69
|
+
*,
|
|
70
|
+
model: str | Generator,
|
|
71
|
+
rubric: str | Path | None = None,
|
|
72
|
+
replace_default_rubric: bool = False,
|
|
73
|
+
model_params: dict[str, t.Any] | None = None,
|
|
74
|
+
system_prompt: str | None = None,
|
|
75
|
+
) -> None:
|
|
76
|
+
if rubric is None and replace_default_rubric:
|
|
77
|
+
raise ValueError("replace_default_rubric=True requires a user-supplied rubric")
|
|
78
|
+
|
|
79
|
+
from dreadnode.scorers.judge import _load_rubric_from_yaml
|
|
80
|
+
|
|
81
|
+
default_text, default_system_prompt, _ = _load_rubric_from_yaml(
|
|
82
|
+
_DEFAULT_RUBRIC_PATH, system_prompt=None, name="process_default"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if rubric is None:
|
|
86
|
+
final_rubric = default_text
|
|
87
|
+
else:
|
|
88
|
+
user_text = self._resolve_user_rubric(rubric)
|
|
89
|
+
final_rubric = (
|
|
90
|
+
user_text
|
|
91
|
+
if replace_default_rubric
|
|
92
|
+
else f"{default_text}\n\n{_USER_RUBRIC_HEADER}\n{user_text}"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
self._model = model
|
|
96
|
+
self._rubric = final_rubric
|
|
97
|
+
self._system_prompt = system_prompt or default_system_prompt
|
|
98
|
+
self._model_params = model_params
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def model(self) -> str | Generator:
|
|
102
|
+
return self._model
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def rubric(self) -> str:
|
|
106
|
+
return self._rubric
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def system_prompt(self) -> str | None:
|
|
110
|
+
return self._system_prompt
|
|
111
|
+
|
|
112
|
+
async def evaluate(
|
|
113
|
+
self,
|
|
114
|
+
*,
|
|
115
|
+
intent: "list[Message]",
|
|
116
|
+
proposed_call: "ToolCall",
|
|
117
|
+
context: dict[str, t.Any] | None = None,
|
|
118
|
+
) -> ProcessDecision:
|
|
119
|
+
"""Evaluate a proposed tool call against the rubric.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
intent: Trajectory-stripped messages representing the user's
|
|
123
|
+
intent (typically system + user-authored, optionally tool
|
|
124
|
+
outputs depending on the hook's strategy).
|
|
125
|
+
proposed_call: The tool call about to execute. Wire name and
|
|
126
|
+
arguments are passed verbatim — argument redaction is a
|
|
127
|
+
separate concern.
|
|
128
|
+
context: Optional per-call context (task instruction, scope
|
|
129
|
+
metadata) merged into the rendered intent.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
A :class:`ProcessDecision` with ``allow`` and a short reason.
|
|
133
|
+
"""
|
|
134
|
+
from dreadnode.scorers.judge import JudgeInput, judge
|
|
135
|
+
|
|
136
|
+
intent_text = self._render_intent(intent, context=context)
|
|
137
|
+
proposed_call_text = self._render_proposed_call(proposed_call)
|
|
138
|
+
|
|
139
|
+
generator = self._resolve_generator()
|
|
140
|
+
input_data = JudgeInput(
|
|
141
|
+
input=intent_text,
|
|
142
|
+
output=proposed_call_text,
|
|
143
|
+
rubric=self._rubric,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
judgement = await judge(generator, input_data, system_prompt=self._system_prompt)
|
|
147
|
+
return ProcessDecision(allow=judgement.passing, reason=judgement.reason)
|
|
148
|
+
|
|
149
|
+
def _resolve_generator(self) -> Generator:
|
|
150
|
+
if isinstance(self._model, Generator):
|
|
151
|
+
return self._model
|
|
152
|
+
if not isinstance(self._model, str):
|
|
153
|
+
raise TypeError("model must be a string identifier or a Generator instance.")
|
|
154
|
+
params: GenerateParams | None
|
|
155
|
+
if self._model_params is None:
|
|
156
|
+
params = None
|
|
157
|
+
elif isinstance(self._model_params, GenerateParams):
|
|
158
|
+
params = self._model_params
|
|
159
|
+
else:
|
|
160
|
+
params = GenerateParams.model_validate(self._model_params)
|
|
161
|
+
return get_generator(self._model, params=params)
|
|
162
|
+
|
|
163
|
+
@staticmethod
|
|
164
|
+
def _resolve_user_rubric(rubric: str | Path) -> str:
|
|
165
|
+
"""Resolve a user rubric to its body text.
|
|
166
|
+
|
|
167
|
+
Path or YAML-shaped string → load the YAML and read its ``rubric``
|
|
168
|
+
field. Anything else → treat as a plain string and return as-is.
|
|
169
|
+
"""
|
|
170
|
+
from dreadnode.scorers.judge import _is_yaml_rubric, _load_rubric_from_yaml
|
|
171
|
+
|
|
172
|
+
if isinstance(rubric, Path) or _is_yaml_rubric(rubric):
|
|
173
|
+
text, _, _ = _load_rubric_from_yaml(rubric, system_prompt=None, name="user")
|
|
174
|
+
return text
|
|
175
|
+
return rubric
|
|
176
|
+
|
|
177
|
+
@staticmethod
|
|
178
|
+
def _render_intent(
|
|
179
|
+
intent: "list[Message]",
|
|
180
|
+
*,
|
|
181
|
+
context: dict[str, t.Any] | None = None,
|
|
182
|
+
) -> str:
|
|
183
|
+
"""Render intent messages as a transcript the judge can consume."""
|
|
184
|
+
lines: list[str] = []
|
|
185
|
+
if context:
|
|
186
|
+
lines.append("# Task context")
|
|
187
|
+
for key, value in context.items():
|
|
188
|
+
lines.append(f"- {key}: {value}")
|
|
189
|
+
lines.append("")
|
|
190
|
+
if intent:
|
|
191
|
+
lines.append("# Intent transcript")
|
|
192
|
+
for msg in intent:
|
|
193
|
+
role = getattr(msg, "role", "unknown")
|
|
194
|
+
content = getattr(msg, "content", "") or ""
|
|
195
|
+
lines.append(f"[{role}] {content}")
|
|
196
|
+
return "\n".join(lines)
|
|
197
|
+
|
|
198
|
+
@staticmethod
|
|
199
|
+
def _render_proposed_call(proposed_call: "ToolCall") -> str:
|
|
200
|
+
"""Render the proposed tool call in a structured XML block."""
|
|
201
|
+
return (
|
|
202
|
+
f"<tool>{proposed_call.name}</tool>\n"
|
|
203
|
+
f"<arguments>{proposed_call.function.arguments}</arguments>"
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
__all__ = ["ProcessDecision", "ProcessJudge"]
|
|
@@ -246,3 +246,19 @@ class TuiArgs(PlatformScopeArgs):
|
|
|
246
246
|
help="Step budget for autonomous mode (defaults to 30)",
|
|
247
247
|
),
|
|
248
248
|
] = None
|
|
249
|
+
policy: t.Annotated[
|
|
250
|
+
str | None,
|
|
251
|
+
cyclopts.Parameter(
|
|
252
|
+
group=TUI_GROUP,
|
|
253
|
+
help="Session policy to launch with (e.g. 'guard'). Overrides --auto when set.",
|
|
254
|
+
),
|
|
255
|
+
] = None
|
|
256
|
+
policy_arg: t.Annotated[
|
|
257
|
+
list[str] | None,
|
|
258
|
+
cyclopts.Parameter(
|
|
259
|
+
name="--policy-arg",
|
|
260
|
+
group=TUI_GROUP,
|
|
261
|
+
negative_iterable=(),
|
|
262
|
+
help="Policy parameter as key=value (repeatable). Forwarded to the policy spec.",
|
|
263
|
+
),
|
|
264
|
+
] = None
|
|
@@ -157,7 +157,20 @@ def create_app(tui_args: TuiArgs) -> "DreadnodeTextualApp":
|
|
|
157
157
|
profile = None
|
|
158
158
|
|
|
159
159
|
initial_policy: dict[str, t.Any] | None = None
|
|
160
|
-
if tui_args.
|
|
160
|
+
if tui_args.policy:
|
|
161
|
+
from dreadnode.app.tui.app import _coerce_policy_arg
|
|
162
|
+
|
|
163
|
+
initial_policy = {"name": tui_args.policy}
|
|
164
|
+
for kv in tui_args.policy_arg or []:
|
|
165
|
+
if "=" not in kv:
|
|
166
|
+
raise ValueError(f"--policy-arg expects key=value, got {kv!r}")
|
|
167
|
+
key, _, value = kv.partition("=")
|
|
168
|
+
initial_policy[key.strip()] = _coerce_policy_arg(value.strip())
|
|
169
|
+
# `--max-steps` is a long-standing shortcut; honor it when the policy
|
|
170
|
+
# accepts a step budget but the user didn't explicitly pass it.
|
|
171
|
+
if tui_args.max_steps is not None and "max_steps" not in initial_policy:
|
|
172
|
+
initial_policy["max_steps"] = tui_args.max_steps
|
|
173
|
+
elif tui_args.auto:
|
|
161
174
|
initial_policy = {"name": "headless"}
|
|
162
175
|
if tui_args.max_steps is not None:
|
|
163
176
|
initial_policy["max_steps"] = tui_args.max_steps
|