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.
Files changed (422) hide show
  1. {dreadnode-2.0.6 → dreadnode-2.0.7}/PKG-INFO +1 -1
  2. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/agent.py +12 -13
  3. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/evaluation.py +5 -0
  4. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/app.py +19 -11
  5. dreadnode-2.0.7/dreadnode/app/server/prompt.py +182 -0
  6. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/app.py +181 -90
  7. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/client.py +1 -1
  8. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/commands.py +37 -0
  9. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/model_variants.py +154 -7
  10. dreadnode-2.0.7/dreadnode/app/tui/screens/connection_error.py +149 -0
  11. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/console.py +5 -2
  12. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/turn_reducer.py +24 -0
  13. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/__init__.py +2 -0
  14. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/composer.py +2 -0
  15. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/context_bar.py +23 -6
  16. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/conversation.py +38 -22
  17. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/prompt_info.py +10 -4
  18. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/status_bar.py +1 -1
  19. dreadnode-2.0.7/dreadnode/app/tui/widgets/tool.py +125 -0
  20. dreadnode-2.0.7/dreadnode/app/tui/widgets/whoami.py +74 -0
  21. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/log.py +1 -1
  22. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/base.py +9 -1
  23. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/litellm_.py +59 -1
  24. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/jobs.py +2 -2
  25. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/__init__.py +2 -6
  26. {dreadnode-2.0.6 → dreadnode-2.0.7}/pyproject.toml +1 -1
  27. dreadnode-2.0.6/dreadnode/app/server/system-prompt.md +0 -8
  28. dreadnode-2.0.6/dreadnode/app/tui/widgets/tool.py +0 -70
  29. {dreadnode-2.0.6 → dreadnode-2.0.7}/.gitignore +0 -0
  30. {dreadnode-2.0.6 → dreadnode-2.0.7}/LICENSE +0 -0
  31. {dreadnode-2.0.6 → dreadnode-2.0.7}/README.md +0 -0
  32. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/__init__.py +0 -0
  33. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/__main__.py +0 -0
  34. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/__init__.py +0 -0
  35. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/events.py +0 -0
  36. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/exceptions.py +0 -0
  37. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/format.py +0 -0
  38. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/hooks.py +0 -0
  39. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/__init__.py +0 -0
  40. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/auth.py +0 -0
  41. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/client.py +0 -0
  42. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/config.py +0 -0
  43. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/mcp/server.py +0 -0
  44. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/reactions.py +0 -0
  45. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/skills.py +0 -0
  46. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/stopping.py +0 -0
  47. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/subagent.py +0 -0
  48. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/tools.py +0 -0
  49. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/agents/trajectory.py +0 -0
  50. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/__init__.py +0 -0
  51. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/__init__.py +0 -0
  52. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/aggregator.py +0 -0
  53. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/classifier.py +0 -0
  54. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/compliance.py +0 -0
  55. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/engine.py +0 -0
  56. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/recommendations.py +0 -0
  57. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/analytics/types.py +0 -0
  58. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/assessment.py +0 -0
  59. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/autodan_turbo.py +0 -0
  60. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/beast.py +0 -0
  61. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/__init__.py +0 -0
  62. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/atlas.py +0 -0
  63. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/nist.py +0 -0
  64. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/owasp.py +0 -0
  65. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  66. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/compliance/saif.py +0 -0
  67. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/constants.py +0 -0
  68. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/crescendo.py +0 -0
  69. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/__init__.py +0 -0
  70. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  71. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  72. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/assets/image/meth.png +0 -0
  73. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  74. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  75. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  76. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  77. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  78. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  79. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  80. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  81. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  82. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  83. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  84. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  85. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  86. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  87. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  88. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  89. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  90. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/deep_inception.py +0 -0
  91. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/drattack.py +0 -0
  92. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/events.py +0 -0
  93. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/goat.py +0 -0
  94. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/gptfuzzer.py +0 -0
  95. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/image.py +0 -0
  96. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/multimodal.py +0 -0
  97. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/pair.py +0 -0
  98. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/prompt.py +0 -0
  99. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/rainbow.py +0 -0
  100. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/renellm.py +0 -0
  101. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/__init__.py +0 -0
  102. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/json_report.py +0 -0
  103. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/llm_summary.py +0 -0
  104. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/reporting/markdown.py +0 -0
  105. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/airt/tap.py +0 -0
  106. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/__init__.py +0 -0
  107. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/__init__.py +0 -0
  108. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/client.py +0 -0
  109. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/api/models.py +0 -0
  110. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/__init__.py +0 -0
  111. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/airt.py +0 -0
  112. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/capability.py +0 -0
  113. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/dataset.py +0 -0
  114. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/main.py +0 -0
  115. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/model.py +0 -0
  116. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/optimize.py +0 -0
  117. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/runtime.py +0 -0
  118. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/shared.py +0 -0
  119. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/task.py +0 -0
  120. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/train.py +0 -0
  121. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/cli/worlds.py +0 -0
  122. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/main.py +0 -0
  123. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/print_mode.py +0 -0
  124. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/__init__.py +0 -0
  125. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/auth.py +0 -0
  126. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/default-agent/tools/coding.py +0 -0
  127. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/default-agent/tools/subagent.py +0 -0
  128. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/session.py +0 -0
  129. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/server/utils.py +0 -0
  130. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/__init__.py +0 -0
  131. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/connection.py +0 -0
  132. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/dreadnode.tcss +0 -0
  133. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/event_contract.py +0 -0
  134. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/runtime_cache.py +0 -0
  135. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/__init__.py +0 -0
  136. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/auth.py +0 -0
  137. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/base.py +0 -0
  138. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/capabilities.py +0 -0
  139. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/environments.py +0 -0
  140. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/evaluations.py +0 -0
  141. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/mcp.py +0 -0
  142. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/model_picker.py +0 -0
  143. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/runtimes.py +0 -0
  144. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  145. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/secrets.py +0 -0
  146. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/sessions.py +0 -0
  147. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  148. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/traces.py +0 -0
  149. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/screens/workspaces.py +0 -0
  150. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/theme.py +0 -0
  151. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/update_check.py +0 -0
  152. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  153. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  154. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/flash.py +0 -0
  155. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  156. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  157. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  158. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  159. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  160. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  161. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  162. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  163. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  164. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/throbber.py +0 -0
  165. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  166. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  167. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/app/tui/widgets/welcome.py +0 -0
  168. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/__init__.py +0 -0
  169. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/capability.py +0 -0
  170. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/loader.py +0 -0
  171. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/sync.py +0 -0
  172. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/tool_rules.py +0 -0
  173. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/capabilities/types.py +0 -0
  174. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/__init__.py +0 -0
  175. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/conditions.py +0 -0
  176. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/discovery.py +0 -0
  177. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/environment.py +0 -0
  178. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/exceptions.py +0 -0
  179. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/execution.py +0 -0
  180. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/hook.py +0 -0
  181. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/judge.py +0 -0
  182. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/load.py +0 -0
  183. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/__init__.py +0 -0
  184. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/config.py +0 -0
  185. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/context.py +0 -0
  186. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/hydrate.py +0 -0
  187. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/meta/introspect.py +0 -0
  188. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/metric.py +0 -0
  189. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/object.py +0 -0
  190. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/scorer.py +0 -0
  191. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/serialization.py +0 -0
  192. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/stopping.py +0 -0
  193. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/task.py +0 -0
  194. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/transforms.py +0 -0
  195. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/__init__.py +0 -0
  196. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/audio.py +0 -0
  197. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/base.py +0 -0
  198. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/common.py +0 -0
  199. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/image.py +0 -0
  200. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/object_3d.py +0 -0
  201. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/table.py +0 -0
  202. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/text.py +0 -0
  203. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/types/video.py +0 -0
  204. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/core/util.py +0 -0
  205. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/__init__.py +0 -0
  206. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/dataset.py +0 -0
  207. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/hf.py +0 -0
  208. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/datasets/local.py +0 -0
  209. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/__init__.py +0 -0
  210. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/console.py +0 -0
  211. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/evaluation.py +0 -0
  212. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/events.py +0 -0
  213. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/format.py +0 -0
  214. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/result.py +0 -0
  215. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/evaluations/sample.py +0 -0
  216. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/__init__.py +0 -0
  217. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/caching.py +0 -0
  218. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/chat.py +0 -0
  219. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/data.py +0 -0
  220. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/exceptions.py +0 -0
  221. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/__init__.py +0 -0
  222. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/http.py +0 -0
  223. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/transformers_.py +0 -0
  224. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/generator/vllm_.py +0 -0
  225. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/message.py +0 -0
  226. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/models.py +0 -0
  227. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/parsing.py +0 -0
  228. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/__init__.py +0 -0
  229. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/base.py +0 -0
  230. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  231. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/generators/utils.py +0 -0
  232. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/__init__.py +0 -0
  233. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/hf.py +0 -0
  234. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/local.py +0 -0
  235. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/models/model.py +0 -0
  236. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/__init__.py +0 -0
  237. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/adapters/__init__.py +0 -0
  238. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/adapters/agent.py +0 -0
  239. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/api.py +0 -0
  240. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/__init__.py +0 -0
  241. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/base.py +0 -0
  242. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/backends/gepa.py +0 -0
  243. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/collectors.py +0 -0
  244. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/config.py +0 -0
  245. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/console.py +0 -0
  246. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/events.py +0 -0
  247. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/format.py +0 -0
  248. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/result.py +0 -0
  249. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/sampler.py +0 -0
  250. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/sampling.py +0 -0
  251. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/search.py +0 -0
  252. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/stopping.py +0 -0
  253. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/study.py +0 -0
  254. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/optimization/trial.py +0 -0
  255. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/__init__.py +0 -0
  256. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/loader.py +0 -0
  257. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/manifest.py +0 -0
  258. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/oci.py +0 -0
  259. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/package.py +0 -0
  260. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/packaging/task_validation.py +0 -0
  261. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/py.typed +0 -0
  262. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/__init__.py +0 -0
  263. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/boundary.py +0 -0
  264. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/fuzzing.py +0 -0
  265. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/graph.py +0 -0
  266. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/grid.py +0 -0
  267. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/image.py +0 -0
  268. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/mapelites.py +0 -0
  269. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/optuna.py +0 -0
  270. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/random.py +0 -0
  271. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/registry.py +0 -0
  272. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/samplers/strategy.py +0 -0
  273. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/__init__.py +0 -0
  274. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  275. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agent_security.py +0 -0
  276. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agentic.py +0 -0
  277. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/agentic_workflow.py +0 -0
  278. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/classification.py +0 -0
  279. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/consistency.py +0 -0
  280. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/contains.py +0 -0
  281. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/cosine_sim.py +0 -0
  282. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/credentials.py +0 -0
  283. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/crucible.py +0 -0
  284. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/documentation_security.py +0 -0
  285. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/exfiltration_detection.py +0 -0
  286. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/format.py +0 -0
  287. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/harm.py +0 -0
  288. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/ide_security.py +0 -0
  289. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/image.py +0 -0
  290. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/json.py +0 -0
  291. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/judge.py +0 -0
  292. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/length.py +0 -0
  293. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/lexical.py +0 -0
  294. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/mcp_security.py +0 -0
  295. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/memorization.py +0 -0
  296. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/multi_agent_security.py +0 -0
  297. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/pii.py +0 -0
  298. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/prompt_leak.py +0 -0
  299. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/readability.py +0 -0
  300. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/reasoning_security.py +0 -0
  301. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/sentiment.py +0 -0
  302. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/scorers/similarity.py +0 -0
  303. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/__init__.py +0 -0
  304. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/providers.py +0 -0
  305. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/session_store.py +0 -0
  306. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/storage/storage.py +0 -0
  307. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/_ripgrep.py +0 -0
  308. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/apply_patch.py +0 -0
  309. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/editing.py +0 -0
  310. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/execute.py +0 -0
  311. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/fetch.py +0 -0
  312. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/glob.py +0 -0
  313. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/grep.py +0 -0
  314. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/interaction.py +0 -0
  315. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/ls.py +0 -0
  316. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/memory.py +0 -0
  317. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/read.py +0 -0
  318. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/task.py +0 -0
  319. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/think.py +0 -0
  320. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/todo.py +0 -0
  321. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/web_search.py +0 -0
  322. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tools/write.py +0 -0
  323. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/__init__.py +0 -0
  324. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/constants.py +0 -0
  325. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/convert.py +0 -0
  326. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/exporter.py +0 -0
  327. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/exporters.py +0 -0
  328. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/span.py +0 -0
  329. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/spans.py +0 -0
  330. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/tracing/trace_converter.py +0 -0
  331. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/__init__.py +0 -0
  332. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/base.py +0 -0
  333. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/dpo.py +0 -0
  334. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/__init__.py +0 -0
  335. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/_common.py +0 -0
  336. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/rl.py +0 -0
  337. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/sft.py +0 -0
  338. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/etl/worlds.py +0 -0
  339. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/events.py +0 -0
  340. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/grpo.py +0 -0
  341. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/jobs.py +0 -0
  342. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ppo.py +0 -0
  343. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/prime.py +0 -0
  344. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/__init__.py +0 -0
  345. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/async_trainer.py +0 -0
  346. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/config.py +0 -0
  347. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/coordinator.py +0 -0
  348. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/distributed.py +0 -0
  349. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/dpo.py +0 -0
  350. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/experience.py +0 -0
  351. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  352. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/inference.py +0 -0
  353. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/learner.py +0 -0
  354. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/multi_turn.py +0 -0
  355. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/ppo.py +0 -0
  356. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/reward_model.py +0 -0
  357. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/rollout_env.py +0 -0
  358. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/rollout_worker.py +0 -0
  359. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/sft.py +0 -0
  360. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/ray/trainer.py +0 -0
  361. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/recipes.py +0 -0
  362. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/__init__.py +0 -0
  363. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/aggregator.py +0 -0
  364. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/functions.py +0 -0
  365. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  366. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/shaping.py +0 -0
  367. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rewards/types.py +0 -0
  368. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/__init__.py +0 -0
  369. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/adapters.py +0 -0
  370. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/orchestrator.py +0 -0
  371. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/types.py +0 -0
  372. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/rollouts/worlds.py +0 -0
  373. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/serving/__init__.py +0 -0
  374. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/serving/vllm_client.py +0 -0
  375. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/sft.py +0 -0
  376. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/__init__.py +0 -0
  377. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/config.py +0 -0
  378. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/data.py +0 -0
  379. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/renderer.py +0 -0
  380. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/rl.py +0 -0
  381. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker/trainer.py +0 -0
  382. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/tinker_sft.py +0 -0
  383. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/training/utils.py +0 -0
  384. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/__init__.py +0 -0
  385. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  386. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/adversarial_suffix.py +0 -0
  387. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/agent_skill.py +0 -0
  388. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/agentic_workflow.py +0 -0
  389. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/audio.py +0 -0
  390. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  391. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/cipher.py +0 -0
  392. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/constitutional.py +0 -0
  393. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/document.py +0 -0
  394. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/documentation_poison.py +0 -0
  395. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/encoding.py +0 -0
  396. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/exfiltration.py +0 -0
  397. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/flip_attack.py +0 -0
  398. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/guardrail_bypass.py +0 -0
  399. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/ide_injection.py +0 -0
  400. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/image.py +0 -0
  401. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/injection.py +0 -0
  402. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/json_tools.py +0 -0
  403. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/language.py +0 -0
  404. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/logic_bomb.py +0 -0
  405. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/mcp_attacks.py +0 -0
  406. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  407. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/persuasion.py +0 -0
  408. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/perturbation.py +0 -0
  409. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/pii_extraction.py +0 -0
  410. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/pythonic_tools.py +0 -0
  411. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/rag_poisoning.py +0 -0
  412. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/reasoning_attacks.py +0 -0
  413. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/refine.py +0 -0
  414. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/response_steering.py +0 -0
  415. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/stylistic.py +0 -0
  416. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/substitution.py +0 -0
  417. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/swap.py +0 -0
  418. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  419. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/text.py +0 -0
  420. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/video.py +0 -0
  421. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/transforms/xml_tools.py +0 -0
  422. {dreadnode-2.0.6 → dreadnode-2.0.7}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.6
3
+ Version: 2.0.7
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -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 = _get_core_system_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": "openai"},
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": "openai"},
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)