dreadnode 2.0.6__tar.gz → 2.0.7__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.6 → dreadnode-2.0.7}/PKG-INFO +1 -1
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/agent.py +12 -13
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/evaluation.py +5 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/app.py +19 -11
- dreadnode-2.0.7/dreadnode/app/server/prompt.py +182 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/app.py +181 -90
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/client.py +1 -1
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/commands.py +37 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/model_variants.py +154 -7
- dreadnode-2.0.7/dreadnode/app/tui/screens/connection_error.py +149 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/console.py +5 -2
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/turn_reducer.py +24 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/__init__.py +2 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/composer.py +2 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/context_bar.py +23 -6
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/conversation.py +38 -22
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/prompt_info.py +10 -4
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/status_bar.py +1 -1
- dreadnode-2.0.7/dreadnode/app/tui/widgets/tool.py +125 -0
- dreadnode-2.0.7/dreadnode/app/tui/widgets/whoami.py +74 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/log.py +1 -1
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/base.py +9 -1
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/litellm_.py +59 -1
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/jobs.py +2 -2
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/__init__.py +2 -6
- {dreadnode-2.0.6 → dreadnode-2.0.7}/pyproject.toml +1 -1
- dreadnode-2.0.6/dreadnode/app/server/system-prompt.md +0 -8
- dreadnode-2.0.6/dreadnode/app/tui/widgets/tool.py +0 -70
- {dreadnode-2.0.6 → dreadnode-2.0.7}/.gitignore +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/LICENSE +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/README.md +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/__main__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/events.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/exceptions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/format.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/hooks.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/auth.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/client.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/config.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/server.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/reactions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/skills.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/stopping.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/subagent.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/tools.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/trajectory.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/aggregator.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/classifier.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/compliance.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/engine.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/recommendations.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/types.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/assessment.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/autodan_turbo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/beast.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/atlas.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/nist.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/owasp.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/saif.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/constants.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/crescendo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/image/meth.png +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/deep_inception.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/drattack.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/events.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/goat.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/gptfuzzer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/image.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/multimodal.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/pair.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/prompt.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/rainbow.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/renellm.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/json_report.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/llm_summary.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/markdown.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/tap.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/client.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/models.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/airt.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/capability.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/dataset.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/main.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/model.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/optimize.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/runtime.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/shared.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/task.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/train.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/worlds.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/main.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/print_mode.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/auth.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/default-agent/tools/coding.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/default-agent/tools/subagent.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/session.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/utils.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/connection.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/dreadnode.tcss +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/event_contract.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/runtime_cache.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/auth.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/base.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/capabilities.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/environments.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/evaluations.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/mcp.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/model_picker.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/runtimes.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/sandboxes.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/secrets.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/sessions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/traces.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/workspaces.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/theme.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/update_check.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/flash.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/header_bar.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/help_panel.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/message_queue.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/throbber.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/welcome.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/capability.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/loader.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/sync.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/tool_rules.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/types.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/conditions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/discovery.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/environment.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/exceptions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/execution.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/hook.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/judge.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/load.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/config.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/context.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/hydrate.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/introspect.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/metric.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/object.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/scorer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/serialization.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/stopping.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/task.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/transforms.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/audio.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/base.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/common.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/image.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/object_3d.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/table.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/text.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/video.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/util.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/dataset.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/hf.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/local.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/console.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/evaluation.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/events.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/format.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/result.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/sample.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/caching.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/chat.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/data.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/exceptions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/http.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/transformers_.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/vllm_.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/message.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/models.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/parsing.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/base.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/transformers_.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/utils.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/hf.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/local.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/model.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/adapters/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/adapters/agent.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/api.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/base.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/gepa.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/collectors.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/config.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/console.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/events.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/format.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/result.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/sampler.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/sampling.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/search.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/stopping.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/study.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/trial.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/loader.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/manifest.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/oci.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/package.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/task_validation.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/py.typed +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/boundary.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/fuzzing.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/graph.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/grid.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/image.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/mapelites.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/optuna.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/random.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/registry.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/strategy.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agent_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agentic.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agentic_workflow.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/classification.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/consistency.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/contains.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/cosine_sim.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/credentials.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/crucible.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/documentation_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/exfiltration_detection.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/format.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/harm.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/ide_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/image.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/json.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/judge.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/length.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/lexical.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/mcp_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/memorization.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/multi_agent_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/pii.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/prompt_leak.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/readability.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/reasoning_security.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/sentiment.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/similarity.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/providers.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/session_store.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/storage.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/_ripgrep.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/apply_patch.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/editing.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/execute.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/fetch.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/glob.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/grep.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/interaction.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/ls.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/memory.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/read.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/task.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/think.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/todo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/web_search.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/write.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/constants.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/convert.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/exporter.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/exporters.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/span.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/spans.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/trace_converter.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/base.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/dpo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/_common.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/rl.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/sft.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/worlds.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/events.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/grpo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/jobs.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ppo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/prime.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/async_trainer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/config.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/coordinator.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/distributed.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/dpo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/experience.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/fsdp2_learner.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/inference.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/learner.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/multi_turn.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/ppo.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/reward_model.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/rollout_env.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/rollout_worker.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/sft.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/trainer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/recipes.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/aggregator.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/functions.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/scorer_bridge.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/shaping.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/types.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/adapters.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/orchestrator.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/types.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/worlds.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/serving/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/serving/vllm_client.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/sft.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/config.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/data.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/renderer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/rl.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/trainer.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker_sft.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/utils.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/__init__.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/advanced_jailbreak.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/adversarial_suffix.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/agent_skill.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/agentic_workflow.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/audio.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/browser_agent_attacks.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/cipher.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/constitutional.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/document.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/documentation_poison.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/encoding.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/exfiltration.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/flip_attack.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/guardrail_bypass.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/ide_injection.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/image.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/injection.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/json_tools.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/language.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/logic_bomb.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/mcp_attacks.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/multi_agent_attacks.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/persuasion.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/perturbation.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/pii_extraction.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/pythonic_tools.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/rag_poisoning.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/reasoning_attacks.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/refine.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/response_steering.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/stylistic.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/substitution.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/swap.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/system_prompt_extraction.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/text.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/video.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/xml_tools.py +0 -0
- {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/version.py +0 -0
|
@@ -669,6 +669,18 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
669
669
|
msg.metadata.setdefault("model", self.model_name)
|
|
670
670
|
messages.extend(step_chat.generated)
|
|
671
671
|
|
|
672
|
+
# Emit content for TUI rendering BEFORE tools/stop-checks
|
|
673
|
+
# so text is visible immediately (ENG-5879)
|
|
674
|
+
last_msg = step_chat.generated[-1] if step_chat.generated else None
|
|
675
|
+
if last_msg and last_msg.content:
|
|
676
|
+
yield GenerationContent(
|
|
677
|
+
agent_id=self.agent_id,
|
|
678
|
+
agent_name=self.name,
|
|
679
|
+
step=step_count,
|
|
680
|
+
content=str(last_msg.content),
|
|
681
|
+
extra=step_chat.extra,
|
|
682
|
+
)
|
|
683
|
+
|
|
672
684
|
# Check stop conditions INSIDE span
|
|
673
685
|
if any(cond(self.trajectory.steps) for cond in self.stop_conditions):
|
|
674
686
|
logger.info("A stop condition was met. Ending run.")
|
|
@@ -794,19 +806,6 @@ class Agent(Executor[AgentEvent, Trajectory]):
|
|
|
794
806
|
finally:
|
|
795
807
|
await _event_queue.put(None) # Signal done
|
|
796
808
|
|
|
797
|
-
# Emit generation content BEFORE tools so TUI can
|
|
798
|
-
# render text immediately (ENG-5879)
|
|
799
|
-
last_msg = step_chat.generated[-1] if step_chat.generated else None
|
|
800
|
-
if last_msg and last_msg.content:
|
|
801
|
-
content_event = GenerationContent(
|
|
802
|
-
agent_id=self.agent_id,
|
|
803
|
-
agent_name=self.name,
|
|
804
|
-
step=step_count,
|
|
805
|
-
content=str(last_msg.content)[:4000],
|
|
806
|
-
extra=step_chat.extra,
|
|
807
|
-
)
|
|
808
|
-
yield content_event
|
|
809
|
-
|
|
810
809
|
# Start tools in background
|
|
811
810
|
tools_task = asyncio.create_task(run_all_tools())
|
|
812
811
|
|
|
@@ -35,6 +35,9 @@ def create(
|
|
|
35
35
|
],
|
|
36
36
|
runtime_id: t.Annotated[str | None, cyclopts.Parameter(help="Runtime environment ID")] = None,
|
|
37
37
|
model: t.Annotated[str | None, cyclopts.Parameter(help="Model identifier")] = None,
|
|
38
|
+
capability: t.Annotated[
|
|
39
|
+
str | None, cyclopts.Parameter(help="Capability to load for the evaluation")
|
|
40
|
+
] = None,
|
|
38
41
|
concurrency: t.Annotated[
|
|
39
42
|
int | None, cyclopts.Parameter(help="Maximum concurrent evaluation jobs")
|
|
40
43
|
] = None,
|
|
@@ -55,6 +58,8 @@ def create(
|
|
|
55
58
|
request["runtime_id"] = runtime_id
|
|
56
59
|
if model:
|
|
57
60
|
request["model"] = model
|
|
61
|
+
if capability:
|
|
62
|
+
request["capability"] = capability
|
|
58
63
|
if concurrency is not None:
|
|
59
64
|
request["concurrency"] = concurrency
|
|
60
65
|
if task_timeout_sec is not None:
|
|
@@ -14,7 +14,6 @@ from collections import deque
|
|
|
14
14
|
from contextlib import asynccontextmanager, suppress
|
|
15
15
|
from dataclasses import dataclass, field
|
|
16
16
|
from datetime import UTC, datetime
|
|
17
|
-
from functools import cache
|
|
18
17
|
from pathlib import Path
|
|
19
18
|
from uuid import UUID, uuid4
|
|
20
19
|
|
|
@@ -47,6 +46,7 @@ from dreadnode.app.api.models import (
|
|
|
47
46
|
SkillInfo as SkillInfoModel,
|
|
48
47
|
)
|
|
49
48
|
from dreadnode.app.server.auth import SandboxAuthMiddleware
|
|
49
|
+
from dreadnode.app.server.prompt import get_core_system_prompt, get_platform_context
|
|
50
50
|
from dreadnode.app.server.utils import safe_json_dumps
|
|
51
51
|
from dreadnode.tracing.span import bind_session_id
|
|
52
52
|
|
|
@@ -802,13 +802,6 @@ def _make_agent_link_tool(
|
|
|
802
802
|
return Tool.from_callable(_link_tool, description=description)
|
|
803
803
|
|
|
804
804
|
|
|
805
|
-
@cache
|
|
806
|
-
def _get_core_system_prompt() -> str:
|
|
807
|
-
"""Read the core system prompt, cached after first load."""
|
|
808
|
-
prompt_path = Path(__file__).parent / "system-prompt.md"
|
|
809
|
-
return prompt_path.read_text().strip() if prompt_path.exists() else ""
|
|
810
|
-
|
|
811
|
-
|
|
812
805
|
def _final_assistant_message(trajectory: t.Any) -> str:
|
|
813
806
|
"""Extract the last assistant message text from a trajectory."""
|
|
814
807
|
for message in reversed(trajectory.messages):
|
|
@@ -854,10 +847,16 @@ def create_agent(
|
|
|
854
847
|
context = f"\nYour working directory is {working_dir}.\nYour home directory is {home_dir}.\n"
|
|
855
848
|
|
|
856
849
|
# System prompt: agent_def overrides core prompt; capability prompt layers on top
|
|
857
|
-
core_prompt =
|
|
850
|
+
core_prompt = get_core_system_prompt()
|
|
858
851
|
agent_prompt = agent_def.system_prompt if agent_def and agent_def.system_prompt else ""
|
|
859
852
|
base_prompt = agent_prompt or core_prompt
|
|
860
853
|
instructions = base_prompt + context
|
|
854
|
+
|
|
855
|
+
# Inject dynamic platform context (org/workspace/project) if available
|
|
856
|
+
platform_context = get_platform_context()
|
|
857
|
+
if platform_context:
|
|
858
|
+
instructions = instructions + platform_context
|
|
859
|
+
|
|
861
860
|
capability_system_prompt = (
|
|
862
861
|
_read_capability_system_prompt(capability.path) if capability is not None else ""
|
|
863
862
|
)
|
|
@@ -1562,7 +1561,7 @@ class SessionRuntime:
|
|
|
1562
1561
|
model_config.generator_model,
|
|
1563
1562
|
params=GenerateParams(
|
|
1564
1563
|
api_base=model_config.api_base,
|
|
1565
|
-
extra={"custom_llm_provider": "
|
|
1564
|
+
extra={"custom_llm_provider": "litellm_proxy"},
|
|
1566
1565
|
),
|
|
1567
1566
|
)
|
|
1568
1567
|
generator.api_key = model_config.api_key
|
|
@@ -1722,7 +1721,7 @@ class SessionRuntime:
|
|
|
1722
1721
|
model_config.generator_model,
|
|
1723
1722
|
params=GenerateParams(
|
|
1724
1723
|
api_base=model_config.api_base,
|
|
1725
|
-
extra={"custom_llm_provider": "
|
|
1724
|
+
extra={"custom_llm_provider": "litellm_proxy"},
|
|
1726
1725
|
),
|
|
1727
1726
|
)
|
|
1728
1727
|
gen.api_key = model_config.api_key
|
|
@@ -2293,6 +2292,14 @@ async def get_session_messages(session_id: str) -> JSONResponse:
|
|
|
2293
2292
|
if session is None:
|
|
2294
2293
|
raise HTTPException(status_code=404, detail=f"Session not found: {session_id}")
|
|
2295
2294
|
messages = session._trajectory.messages if session._trajectory is not None else []
|
|
2295
|
+
|
|
2296
|
+
# Build tool_call_id → tool name map from assistant messages
|
|
2297
|
+
tool_call_names: dict[str, str] = {}
|
|
2298
|
+
for msg in messages:
|
|
2299
|
+
if msg.role == "assistant" and msg.tool_calls:
|
|
2300
|
+
for tc in msg.tool_calls:
|
|
2301
|
+
tool_call_names[tc.id] = tc.function.name
|
|
2302
|
+
|
|
2296
2303
|
return JSONResponse(
|
|
2297
2304
|
content=[
|
|
2298
2305
|
{
|
|
@@ -2300,6 +2307,7 @@ async def get_session_messages(session_id: str) -> JSONResponse:
|
|
|
2300
2307
|
"content": msg.content or "",
|
|
2301
2308
|
"metadata": msg.metadata or None,
|
|
2302
2309
|
"tool_call_id": msg.tool_call_id,
|
|
2310
|
+
"tool_name": tool_call_names.get(msg.tool_call_id or ""),
|
|
2303
2311
|
}
|
|
2304
2312
|
for msg in messages
|
|
2305
2313
|
]
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""System prompt generation for the Dreadnode agent runtime."""
|
|
2
|
+
|
|
3
|
+
from functools import cache
|
|
4
|
+
from textwrap import dedent
|
|
5
|
+
|
|
6
|
+
from loguru import logger
|
|
7
|
+
|
|
8
|
+
__all__ = ["get_core_system_prompt", "get_platform_context"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _get_cli_commands() -> str:
|
|
12
|
+
"""Extract CLI commands dynamically from cyclopts registry.
|
|
13
|
+
|
|
14
|
+
Note: Accesses cyclopts internal `_commands` dict. If cyclopts changes
|
|
15
|
+
its internals, the CLI section will be omitted from the system prompt.
|
|
16
|
+
"""
|
|
17
|
+
try:
|
|
18
|
+
from dreadnode.app.cli.main import cli
|
|
19
|
+
|
|
20
|
+
# Access internal command registry — guarded by try/except
|
|
21
|
+
command_registry = getattr(cli, "_commands", None)
|
|
22
|
+
if command_registry is None:
|
|
23
|
+
return ""
|
|
24
|
+
|
|
25
|
+
commands: list[str] = []
|
|
26
|
+
for name, sub_app in command_registry.items():
|
|
27
|
+
# Skip flags like --help, --version
|
|
28
|
+
if name.startswith("-"):
|
|
29
|
+
continue
|
|
30
|
+
|
|
31
|
+
help_text = getattr(sub_app, "help", "") or ""
|
|
32
|
+
if not help_text:
|
|
33
|
+
default_cmd = getattr(sub_app, "default_command", None)
|
|
34
|
+
if default_cmd and hasattr(default_cmd, "__doc__") and default_cmd.__doc__:
|
|
35
|
+
help_text = default_cmd.__doc__.strip().split("\n")[0]
|
|
36
|
+
|
|
37
|
+
if help_text:
|
|
38
|
+
commands.append(f"- `dreadnode {name}` — {help_text}")
|
|
39
|
+
|
|
40
|
+
return "\n".join(sorted(commands)) if commands else ""
|
|
41
|
+
except Exception:
|
|
42
|
+
logger.debug("CLI command introspection failed", exc_info=True)
|
|
43
|
+
return ""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _get_slash_commands() -> str:
|
|
47
|
+
"""Extract TUI slash commands from the commands registry."""
|
|
48
|
+
try:
|
|
49
|
+
from dreadnode.app.tui.commands import SLASH_COMMANDS
|
|
50
|
+
|
|
51
|
+
lines: list[str] = []
|
|
52
|
+
for cmd in SLASH_COMMANDS:
|
|
53
|
+
hint = f" {cmd.hint}" if cmd.hint else ""
|
|
54
|
+
lines.append(f"- `{cmd.name}{hint}` — {cmd.description}")
|
|
55
|
+
|
|
56
|
+
return "\n".join(lines) if lines else ""
|
|
57
|
+
except Exception:
|
|
58
|
+
logger.debug("Slash command introspection failed", exc_info=True)
|
|
59
|
+
return ""
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_platform_context() -> str:
|
|
63
|
+
"""Build dynamic platform context string if credentials are available."""
|
|
64
|
+
try:
|
|
65
|
+
from dreadnode import _get_default_instance
|
|
66
|
+
|
|
67
|
+
instance = _get_default_instance()
|
|
68
|
+
if not instance.can_sync:
|
|
69
|
+
return ""
|
|
70
|
+
|
|
71
|
+
session = instance.session
|
|
72
|
+
parts: list[str] = []
|
|
73
|
+
|
|
74
|
+
org_key = getattr(session, "org_key", None)
|
|
75
|
+
workspace_key = getattr(session, "workspace_key", None)
|
|
76
|
+
project_key = getattr(session, "project_key", None)
|
|
77
|
+
|
|
78
|
+
if org_key:
|
|
79
|
+
parts.append(f"- Organization: {org_key}")
|
|
80
|
+
if workspace_key:
|
|
81
|
+
parts.append(f"- Workspace: {workspace_key}")
|
|
82
|
+
if project_key:
|
|
83
|
+
parts.append(f"- Project: {project_key}")
|
|
84
|
+
|
|
85
|
+
if not parts:
|
|
86
|
+
return ""
|
|
87
|
+
return "\n## Current platform context\n\n" + "\n".join(parts) + "\n"
|
|
88
|
+
except Exception:
|
|
89
|
+
logger.debug("Platform context extraction failed", exc_info=True)
|
|
90
|
+
return ""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@cache
|
|
94
|
+
def get_core_system_prompt() -> str:
|
|
95
|
+
"""Build the core system prompt dynamically with CLI and slash command info."""
|
|
96
|
+
sections: list[str] = [
|
|
97
|
+
dedent("""\
|
|
98
|
+
You are a security research agent running inside an isolated Dreadnode sandbox. You have access to tools for file operations, code search, shell execution, and web research.
|
|
99
|
+
|
|
100
|
+
Dreadnode is a platform for building, testing, and evaluating AI agents for security research, penetration testing, and AI red teaming.
|
|
101
|
+
|
|
102
|
+
Approach tasks like a security professional:
|
|
103
|
+
1. Enumerate — Understand the target before acting. Read files, scan surfaces, map the environment.
|
|
104
|
+
2. Plan — Form a hypothesis or attack plan. Think in chains, not checklists — compose multiple findings into higher-impact results.
|
|
105
|
+
3. Execute — One variable at a time so you can attribute results. Capture evidence as you go.
|
|
106
|
+
4. Validate — Confirm findings before reporting. A lead is not a vulnerability until you have proof.
|
|
107
|
+
5. Adapt — When something fails, the failure itself is signal. Update your mental model and try a different approach.
|
|
108
|
+
|
|
109
|
+
When reporting findings:
|
|
110
|
+
- Show the full tool invocation and output that demonstrates the issue.
|
|
111
|
+
- State the security impact concretely: "admin account takeover via IDOR" not "this could be bad."
|
|
112
|
+
- For multi-step exploits, document each step and explain the causal chain.
|
|
113
|
+
- A reader should be able to reproduce the finding from your evidence alone.
|
|
114
|
+
|
|
115
|
+
You are running in an isolated sandbox. You can freely modify files and run any command — the environment is disposable and safe to experiment in. When installing packages, verify sources to avoid supply chain attacks. Network access may be scoped to the target environment.
|
|
116
|
+
|
|
117
|
+
Use bash for security tools and system commands. Use python for exploit scripting and data analysis. If available, use memory to track credentials, open ports, and findings across tool calls; use todo to maintain an attack plan; use think for reasoning through complex decisions without acting. Tool availability depends on the active capability.
|
|
118
|
+
|
|
119
|
+
Capabilities add domain-specific agents, tools, and prompts. When a capability is active, delegate domain-specific work to its specialized agents.
|
|
120
|
+
|
|
121
|
+
Persist results: traces are sent automatically, use dreadnode dataset publish to save data, dreadnode model push for models, and /export for conversation transcripts.""")
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
# Dynamic CLI commands (omit section entirely if introspection fails)
|
|
125
|
+
cli_commands = _get_cli_commands()
|
|
126
|
+
if cli_commands:
|
|
127
|
+
sections.append(
|
|
128
|
+
"## Dreadnode CLI\n\n"
|
|
129
|
+
"The user may ask about Dreadnode commands. Available commands:\n\n"
|
|
130
|
+
f"{cli_commands}\n\n"
|
|
131
|
+
"Run `dreadnode --help` or `dreadnode <command> --help` for detailed usage."
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Dynamic slash commands (omit section entirely if introspection fails)
|
|
135
|
+
slash_commands = _get_slash_commands()
|
|
136
|
+
if slash_commands:
|
|
137
|
+
sections.append(
|
|
138
|
+
"## In-app slash commands\n\n"
|
|
139
|
+
"When running in the TUI, these slash commands are available:\n\n"
|
|
140
|
+
f"{slash_commands}"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
sections.append(
|
|
144
|
+
dedent("""\
|
|
145
|
+
## Key directories
|
|
146
|
+
|
|
147
|
+
- `~/.dreadnode/` — User configuration and local data
|
|
148
|
+
- `~/.dreadnode/config.yaml` — Platform profiles and authentication
|
|
149
|
+
- `~/.dreadnode/capabilities/` — Locally installed capabilities
|
|
150
|
+
- `~/.dreadnode/cache/` — Cached data and sessions
|
|
151
|
+
- `.dreadnode/` (in project root) — Project-local configuration
|
|
152
|
+
- `.dreadnode/capabilities/` — Project-scoped capabilities
|
|
153
|
+
|
|
154
|
+
## Capabilities
|
|
155
|
+
|
|
156
|
+
Capabilities bundle agents, tools, skills, and system prompts into reusable packages. They can be:
|
|
157
|
+
- **Local**: Created in `~/.dreadnode/capabilities/` or `.dreadnode/capabilities/`
|
|
158
|
+
- **Platform**: Published via `dreadnode capability push` and installed via the TUI
|
|
159
|
+
|
|
160
|
+
A capability directory contains:
|
|
161
|
+
- `capability.yaml` — Manifest with name, version, description
|
|
162
|
+
- `agents/` — Agent definitions as markdown files with YAML frontmatter
|
|
163
|
+
- `tools/` — Python tool implementations
|
|
164
|
+
- `skills/` — SKILL.md workflow definitions
|
|
165
|
+
- `system-prompt.md` — Optional capability-level system prompt
|
|
166
|
+
|
|
167
|
+
## Platform concepts
|
|
168
|
+
|
|
169
|
+
The Dreadnode platform organizes work hierarchically:
|
|
170
|
+
- **Organizations** — Top-level containers for teams
|
|
171
|
+
- **Workspaces** — Isolated environments within an organization
|
|
172
|
+
- **Projects** — Group related experiments, evaluations, and traces
|
|
173
|
+
|
|
174
|
+
## Getting help
|
|
175
|
+
|
|
176
|
+
If the user asks about Dreadnode features and you're unsure:
|
|
177
|
+
1. Run `dreadnode --help` or `dreadnode <command> --help` for CLI usage
|
|
178
|
+
2. Look at capability manifests in `~/.dreadnode/capabilities/` for examples
|
|
179
|
+
3. Fetch documentation from https://docs.dreadnode.io""")
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
return "\n\n".join(sections)
|