dreadnode 2.0.32__tar.gz → 2.0.34__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 (665) hide show
  1. {dreadnode-2.0.32 → dreadnode-2.0.34}/PKG-INFO +9 -1
  2. {dreadnode-2.0.32 → dreadnode-2.0.34}/README.md +3 -0
  3. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/agent.py +7 -0
  4. dreadnode-2.0.34/dreadnode/agents/sanitize.py +150 -0
  5. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/subagent.py +16 -0
  6. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/tools.py +9 -2
  7. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/__init__.py +10 -0
  8. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/assessment.py +25 -0
  9. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/message_parts.py +81 -1
  10. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/multimodal.py +214 -18
  11. dreadnode-2.0.34/dreadnode/airt/targets/__init__.py +39 -0
  12. dreadnode-2.0.34/dreadnode/airt/targets/auth.py +74 -0
  13. dreadnode-2.0.34/dreadnode/airt/targets/factory.py +39 -0
  14. dreadnode-2.0.34/dreadnode/airt/targets/http.py +45 -0
  15. dreadnode-2.0.34/dreadnode/airt/targets/message.py +38 -0
  16. dreadnode-2.0.34/dreadnode/airt/targets/spec.py +57 -0
  17. dreadnode-2.0.34/dreadnode/airt/targets/streaming/__init__.py +9 -0
  18. dreadnode-2.0.34/dreadnode/airt/targets/streaming/nova_sonic.py +312 -0
  19. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/api/client.py +38 -3
  20. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/evaluation.py +15 -0
  21. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/transports.py +1 -0
  22. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/model_catalog.py +34 -1
  23. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/app.py +23 -2
  24. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/websocket.py +7 -0
  25. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/app.py +6 -2
  26. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/capabilities_manager.py +1 -0
  27. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/dreadnode.tcss +48 -18
  28. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/model_variants.py +32 -0
  29. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/sessions_manager.py +57 -10
  30. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/theme.py +24 -8
  31. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_dialog.py +7 -2
  32. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/conversation.py +116 -20
  33. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool.py +85 -8
  34. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  35. dreadnode-2.0.34/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +139 -0
  36. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +1 -0
  37. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
  38. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +1 -1
  39. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -1
  40. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +1 -1
  41. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +6 -2
  42. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +6 -2
  43. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +15 -15
  44. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +8 -12
  45. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +1 -1
  46. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +3 -17
  47. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +2 -0
  48. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +2 -13
  49. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +2 -2
  50. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/loader.py +2 -0
  51. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/litellm_.py +97 -4
  52. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/message.py +11 -10
  53. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/oci.py +24 -13
  54. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/policies/__init__.py +14 -8
  55. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/__init__.py +3 -1
  56. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/judge.py +195 -1
  57. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/report_items.py +21 -9
  58. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/constants.py +6 -0
  59. dreadnode-2.0.34/dreadnode/transforms/audio.py +2098 -0
  60. dreadnode-2.0.34/dreadnode/transforms/image.py +2293 -0
  61. dreadnode-2.0.34/dreadnode/transforms/video.py +949 -0
  62. {dreadnode-2.0.32 → dreadnode-2.0.34}/pyproject.toml +11 -1
  63. dreadnode-2.0.32/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -92
  64. dreadnode-2.0.32/dreadnode/transforms/audio.py +0 -990
  65. dreadnode-2.0.32/dreadnode/transforms/image.py +0 -895
  66. dreadnode-2.0.32/dreadnode/transforms/video.py +0 -234
  67. {dreadnode-2.0.32 → dreadnode-2.0.34}/.gitignore +0 -0
  68. {dreadnode-2.0.32 → dreadnode-2.0.34}/LICENSE +0 -0
  69. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/__init__.py +0 -0
  70. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/__main__.py +0 -0
  71. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/__init__.py +0 -0
  72. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/engines/AGENTS.md +0 -0
  73. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/engines/__init__.py +0 -0
  74. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/engines/base.py +0 -0
  75. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/engines/claude_code.py +0 -0
  76. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/engines/native.py +0 -0
  77. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/events.py +0 -0
  78. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/exceptions.py +0 -0
  79. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/format.py +0 -0
  80. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/hooks.py +0 -0
  81. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/judge.py +0 -0
  82. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/mcp/__init__.py +0 -0
  83. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/mcp/auth.py +0 -0
  84. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/mcp/client.py +0 -0
  85. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/mcp/config.py +0 -0
  86. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/mcp/server.py +0 -0
  87. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/process_judge.py +0 -0
  88. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/reactions.py +0 -0
  89. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/skills.py +0 -0
  90. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/stopping.py +0 -0
  91. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/tool_resolution.py +0 -0
  92. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/agents/trajectory.py +0 -0
  93. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/adversarial_reasoning.py +0 -0
  94. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/advpromptier.py +0 -0
  95. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/alignment_faking.py +0 -0
  96. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analogy_escalation.py +0 -0
  97. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/__init__.py +0 -0
  98. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/aggregator.py +0 -0
  99. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/classifier.py +0 -0
  100. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/compliance.py +0 -0
  101. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/engine.py +0 -0
  102. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/recommendations.py +0 -0
  103. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/analytics/types.py +0 -0
  104. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/aprt_progressive.py +0 -0
  105. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/attention_shifting.py +0 -0
  106. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/autodan_turbo.py +0 -0
  107. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/autoredteamer.py +0 -0
  108. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/beast.py +0 -0
  109. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/__init__.py +0 -0
  110. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/atlas.py +0 -0
  111. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/nist.py +0 -0
  112. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp.py +0 -0
  113. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  114. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/compliance/saif.py +0 -0
  115. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/constants.py +0 -0
  116. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/cot_jailbreak.py +0 -0
  117. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/crescendo.py +0 -0
  118. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/__init__.py +0 -0
  119. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  120. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  121. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/meth.png +0 -0
  122. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  123. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  124. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  125. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  126. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  127. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  128. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  129. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  130. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  131. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  132. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  133. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  134. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  135. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  136. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  137. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  138. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  139. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  140. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/deep_inception.py +0 -0
  141. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/drattack.py +0 -0
  142. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/echo_chamber.py +0 -0
  143. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/events.py +0 -0
  144. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/genetic_persona.py +0 -0
  145. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/goat.py +0 -0
  146. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/goat_v2.py +0 -0
  147. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/gptfuzzer.py +0 -0
  148. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/humor_bypass.py +0 -0
  149. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/image.py +0 -0
  150. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/j2_meta.py +0 -0
  151. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/jbdistill.py +0 -0
  152. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/jbfuzz.py +0 -0
  153. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/lrm_autonomous.py +0 -0
  154. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/mapf.py +0 -0
  155. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/nexus.py +0 -0
  156. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/pair.py +0 -0
  157. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/persona_hijack.py +0 -0
  158. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/prompt.py +0 -0
  159. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/quantization_safety.py +0 -0
  160. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/rainbow.py +0 -0
  161. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/refusal_aware.py +0 -0
  162. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/renellm.py +0 -0
  163. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/reporting/__init__.py +0 -0
  164. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/reporting/json_report.py +0 -0
  165. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/reporting/llm_summary.py +0 -0
  166. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/reporting/markdown.py +0 -0
  167. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/reward_hacking.py +0 -0
  168. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/salami_slicing.py +0 -0
  169. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/self_persuasion.py +0 -0
  170. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/siren.py +0 -0
  171. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/tap.py +0 -0
  172. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/templatefuzz.py +0 -0
  173. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/tmap_trajectory.py +0 -0
  174. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/trojail.py +0 -0
  175. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/airt/watermark_removal.py +0 -0
  176. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/__init__.py +0 -0
  177. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/api/__init__.py +0 -0
  178. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/api/models.py +0 -0
  179. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/__init__.py +0 -0
  180. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/airt.py +0 -0
  181. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/args.py +0 -0
  182. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/capability.py +0 -0
  183. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/dataset.py +0 -0
  184. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/environment.py +0 -0
  185. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/inference_model.py +0 -0
  186. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/judge.py +0 -0
  187. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/main.py +0 -0
  188. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/model.py +0 -0
  189. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/optimize.py +0 -0
  190. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/runtime.py +0 -0
  191. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/sandbox.py +0 -0
  192. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/secret.py +0 -0
  193. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/session.py +0 -0
  194. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/shared.py +0 -0
  195. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/task.py +0 -0
  196. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/task_set.py +0 -0
  197. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/__init__.py +0 -0
  198. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  199. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  200. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  201. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  202. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  203. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  204. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  205. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  206. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  207. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/train.py +0 -0
  208. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/cli/worlds.py +0 -0
  209. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/__init__.py +0 -0
  210. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/interactive.py +0 -0
  211. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/managed_client.py +0 -0
  212. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/models.py +0 -0
  213. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/client/runtime_client.py +0 -0
  214. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/config.py +0 -0
  215. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/env.py +0 -0
  216. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/main.py +0 -0
  217. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/paths.py +0 -0
  218. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/print_mode.py +0 -0
  219. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/__init__.py +0 -0
  220. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/auth.py +0 -0
  221. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/capability_manager.py +0 -0
  222. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/model_resolution.py +0 -0
  223. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/prompt.py +0 -0
  224. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/prompt_registry.py +0 -0
  225. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/runtime_events.py +0 -0
  226. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/session_hydrator.py +0 -0
  227. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/session_persistence.py +0 -0
  228. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/turn_coordinator.py +0 -0
  229. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/utils.py +0 -0
  230. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/worker_manager.py +0 -0
  231. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/server/ws_auth.py +0 -0
  232. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/__init__.py +0 -0
  233. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/auth_flow.py +0 -0
  234. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/command_dispatcher.py +0 -0
  235. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/commands.py +0 -0
  236. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/connection.py +0 -0
  237. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/error_handler.py +0 -0
  238. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/model_manager.py +0 -0
  239. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/profile_manager.py +0 -0
  240. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/runtime_cache.py +0 -0
  241. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screen_router.py +0 -0
  242. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/__init__.py +0 -0
  243. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/auth.py +0 -0
  244. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/base.py +0 -0
  245. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capabilities.py +0 -0
  246. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  247. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/connection_error.py +0 -0
  248. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/console.py +0 -0
  249. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/environments.py +0 -0
  250. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/evaluations.py +0 -0
  251. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/models.py +0 -0
  252. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  253. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/readme.py +0 -0
  254. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/runtimes.py +0 -0
  255. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  256. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/secrets.py +0 -0
  257. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/services.py +0 -0
  258. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sessions.py +0 -0
  259. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  260. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/traces.py +0 -0
  261. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/screens/workspaces.py +0 -0
  262. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/spans_reader.py +0 -0
  263. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/status_messages.py +0 -0
  264. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/tool_format.py +0 -0
  265. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/turn_coordinator.py +0 -0
  266. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  267. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/turn_reducer.py +0 -0
  268. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/turn_state_phase.py +0 -0
  269. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/update_check.py +0 -0
  270. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/__init__.py +0 -0
  271. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  272. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/composer.py +0 -0
  273. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  274. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  275. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/flash.py +0 -0
  276. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  277. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  278. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  279. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  280. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  281. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  282. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  283. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  284. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  285. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  286. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  287. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  288. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  289. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  290. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  291. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/throbber.py +0 -0
  292. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  293. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  294. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/welcome.py +0 -0
  295. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/whoami.py +0 -0
  296. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/app/tui/wire_events.py +0 -0
  297. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/__init__.py +0 -0
  298. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  299. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  300. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  301. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  302. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  303. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  304. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  305. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  306. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  307. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  308. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  309. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  310. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  311. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  312. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  313. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  314. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  315. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  316. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  317. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  318. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  319. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  320. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  321. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  322. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  323. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  324. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  325. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  326. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  327. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  328. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  329. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  330. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  331. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  332. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  333. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  334. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  335. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  336. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  337. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  338. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  339. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  340. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  341. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  342. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  343. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  344. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  345. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  346. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  347. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  348. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  349. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  350. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  351. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  352. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  353. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  354. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  355. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  356. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  357. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  358. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  359. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  360. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  361. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  362. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  363. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  364. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  365. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  366. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  367. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  368. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  369. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  370. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  371. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  372. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  373. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  374. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  375. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  376. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  377. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  378. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/__init__.py +0 -0
  379. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/capability.py +0 -0
  380. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/flags.py +0 -0
  381. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/install.py +0 -0
  382. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/sync.py +0 -0
  383. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/tool_rules.py +0 -0
  384. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/types.py +0 -0
  385. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/worker.py +0 -0
  386. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/capabilities/worker_runner.py +0 -0
  387. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/__init__.py +0 -0
  388. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/conditions.py +0 -0
  389. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/discovery.py +0 -0
  390. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/environment.py +0 -0
  391. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/exceptions.py +0 -0
  392. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/execution.py +0 -0
  393. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/hook.py +0 -0
  394. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/judge.py +0 -0
  395. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/load.py +0 -0
  396. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/log.py +0 -0
  397. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/meta/__init__.py +0 -0
  398. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/meta/config.py +0 -0
  399. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/meta/context.py +0 -0
  400. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/meta/hydrate.py +0 -0
  401. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/meta/introspect.py +0 -0
  402. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/metric.py +0 -0
  403. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/object.py +0 -0
  404. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/scorer.py +0 -0
  405. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/serialization.py +0 -0
  406. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/stopping.py +0 -0
  407. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/task.py +0 -0
  408. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/templating.py +0 -0
  409. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/transforms.py +0 -0
  410. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/__init__.py +0 -0
  411. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/audio.py +0 -0
  412. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/base.py +0 -0
  413. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/common.py +0 -0
  414. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/image.py +0 -0
  415. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/object_3d.py +0 -0
  416. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/table.py +0 -0
  417. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/text.py +0 -0
  418. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/types/video.py +0 -0
  419. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/core/util.py +0 -0
  420. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/datasets/__init__.py +0 -0
  421. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/datasets/dataset.py +0 -0
  422. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/datasets/hf.py +0 -0
  423. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/datasets/local.py +0 -0
  424. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/__init__.py +0 -0
  425. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/console.py +0 -0
  426. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/evaluation.py +0 -0
  427. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/events.py +0 -0
  428. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/format.py +0 -0
  429. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/result.py +0 -0
  430. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/evaluations/sample.py +0 -0
  431. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/__init__.py +0 -0
  432. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/caching.py +0 -0
  433. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/chat.py +0 -0
  434. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/data.py +0 -0
  435. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/exceptions.py +0 -0
  436. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/__init__.py +0 -0
  437. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/base.py +0 -0
  438. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/http.py +0 -0
  439. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/transformers_.py +0 -0
  440. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/generator/vllm_.py +0 -0
  441. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/models.py +0 -0
  442. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/parsing.py +0 -0
  443. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/proxy.py +0 -0
  444. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/__init__.py +0 -0
  445. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/base.py +0 -0
  446. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  447. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/generators/utils.py +0 -0
  448. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/items/__init__.py +0 -0
  449. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/items/config.py +0 -0
  450. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/items/models.py +0 -0
  451. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/judges/__init__.py +0 -0
  452. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/judges/outcome.py +0 -0
  453. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/judges/trajectory.py +0 -0
  454. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/judges/trajectory_tools.py +0 -0
  455. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/models/__init__.py +0 -0
  456. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/models/hf.py +0 -0
  457. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/models/local.py +0 -0
  458. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/models/model.py +0 -0
  459. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/__init__.py +0 -0
  460. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/__init__.py +0 -0
  461. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  462. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/agent.py +0 -0
  463. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/env.py +0 -0
  464. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/runtime.py +0 -0
  465. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/adapters/stack.py +0 -0
  466. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/api.py +0 -0
  467. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/backends/__init__.py +0 -0
  468. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/backends/base.py +0 -0
  469. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/backends/gepa.py +0 -0
  470. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/collectors.py +0 -0
  471. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/config.py +0 -0
  472. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/console.py +0 -0
  473. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/events.py +0 -0
  474. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/format.py +0 -0
  475. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/jobs.py +0 -0
  476. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/result.py +0 -0
  477. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/sampler.py +0 -0
  478. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/sampling.py +0 -0
  479. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/search.py +0 -0
  480. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/stopping.py +0 -0
  481. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/study.py +0 -0
  482. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/optimization/trial.py +0 -0
  483. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/__init__.py +0 -0
  484. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/loader.py +0 -0
  485. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/manifest.py +0 -0
  486. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/package.py +0 -0
  487. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/packaging/task_validation.py +0 -0
  488. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/policies/guard.py +0 -0
  489. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/policies/reconciliation.py +0 -0
  490. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  491. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/py.typed +0 -0
  492. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/__init__.py +0 -0
  493. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/boundary.py +0 -0
  494. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/fuzzing.py +0 -0
  495. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/graph.py +0 -0
  496. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/grid.py +0 -0
  497. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/image.py +0 -0
  498. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/mapelites.py +0 -0
  499. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/optuna.py +0 -0
  500. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/random.py +0 -0
  501. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/registry.py +0 -0
  502. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/samplers/strategy.py +0 -0
  503. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  504. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/agent_security.py +0 -0
  505. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/agentic.py +0 -0
  506. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/agentic_workflow.py +0 -0
  507. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/attack_outcome.py +0 -0
  508. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/classification.py +0 -0
  509. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/consistency.py +0 -0
  510. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/contains.py +0 -0
  511. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/cosine_sim.py +0 -0
  512. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/credentials.py +0 -0
  513. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/crucible.py +0 -0
  514. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/documentation_security.py +0 -0
  515. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/exfiltration_detection.py +0 -0
  516. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/format.py +0 -0
  517. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/harm.py +0 -0
  518. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/ide_security.py +0 -0
  519. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/image.py +0 -0
  520. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/json.py +0 -0
  521. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/judge_ensemble.py +0 -0
  522. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/length.py +0 -0
  523. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/lexical.py +0 -0
  524. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/mcp_security.py +0 -0
  525. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/memorization.py +0 -0
  526. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/multi_agent_security.py +0 -0
  527. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/pii.py +0 -0
  528. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/prompt_leak.py +0 -0
  529. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/readability.py +0 -0
  530. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/reasoning_security.py +0 -0
  531. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/sentiment.py +0 -0
  532. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/similarity.py +0 -0
  533. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/structural_detection.py +0 -0
  534. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/scorers/supply_chain_detection.py +0 -0
  535. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/storage/__init__.py +0 -0
  536. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/storage/providers.py +0 -0
  537. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/storage/session_store.py +0 -0
  538. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/storage/storage.py +0 -0
  539. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/__init__.py +0 -0
  540. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/_ripgrep.py +0 -0
  541. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/apply_patch.py +0 -0
  542. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/dreadnode_cli.py +0 -0
  543. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/editing.py +0 -0
  544. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/execute.py +0 -0
  545. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/fetch.py +0 -0
  546. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/glob.py +0 -0
  547. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/grep.py +0 -0
  548. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/interaction.py +0 -0
  549. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/ls.py +0 -0
  550. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/memory.py +0 -0
  551. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/project_memory.py +0 -0
  552. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/read.py +0 -0
  553. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/report.py +0 -0
  554. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/task.py +0 -0
  555. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/think.py +0 -0
  556. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/todo.py +0 -0
  557. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/trajectory_search.py +0 -0
  558. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/web_extract.py +0 -0
  559. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/web_search.py +0 -0
  560. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tools/write.py +0 -0
  561. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/__init__.py +0 -0
  562. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/convert.py +0 -0
  563. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/exporter.py +0 -0
  564. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/exporters.py +0 -0
  565. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/span.py +0 -0
  566. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/spans.py +0 -0
  567. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/tracing/trace_converter.py +0 -0
  568. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/__init__.py +0 -0
  569. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/_progress.py +0 -0
  570. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/base.py +0 -0
  571. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/dpo.py +0 -0
  572. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/env_rollouts.py +0 -0
  573. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/etl/__init__.py +0 -0
  574. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/etl/_common.py +0 -0
  575. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/etl/rl.py +0 -0
  576. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/etl/sft.py +0 -0
  577. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/etl/worlds.py +0 -0
  578. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/events.py +0 -0
  579. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/grpo.py +0 -0
  580. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/jobs.py +0 -0
  581. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/models.py +0 -0
  582. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ppo.py +0 -0
  583. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/prime.py +0 -0
  584. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/__init__.py +0 -0
  585. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/async_trainer.py +0 -0
  586. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/config.py +0 -0
  587. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/coordinator.py +0 -0
  588. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/distributed.py +0 -0
  589. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/dpo.py +0 -0
  590. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/experience.py +0 -0
  591. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  592. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/inference.py +0 -0
  593. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/learner.py +0 -0
  594. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/multi_turn.py +0 -0
  595. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/ppo.py +0 -0
  596. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/reward_model.py +0 -0
  597. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_env.py +0 -0
  598. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_worker.py +0 -0
  599. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/sft.py +0 -0
  600. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/ray/trainer.py +0 -0
  601. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/recipes.py +0 -0
  602. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/__init__.py +0 -0
  603. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/aggregator.py +0 -0
  604. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/functions.py +0 -0
  605. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  606. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/shaping.py +0 -0
  607. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rewards/types.py +0 -0
  608. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/__init__.py +0 -0
  609. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/adapters.py +0 -0
  610. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  611. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/orchestrator.py +0 -0
  612. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/types.py +0 -0
  613. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/rollouts/worlds.py +0 -0
  614. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/serving/__init__.py +0 -0
  615. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/serving/vllm_client.py +0 -0
  616. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/sft.py +0 -0
  617. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/__init__.py +0 -0
  618. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/config.py +0 -0
  619. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/data.py +0 -0
  620. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/renderer.py +0 -0
  621. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/rl.py +0 -0
  622. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker/trainer.py +0 -0
  623. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/tinker_sft.py +0 -0
  624. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/training/utils.py +0 -0
  625. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/__init__.py +0 -0
  626. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  627. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/adversarial_suffix.py +0 -0
  628. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/agent_skill.py +0 -0
  629. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/agentic_workflow.py +0 -0
  630. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/backdoor_finetune.py +0 -0
  631. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  632. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/cipher.py +0 -0
  633. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/competitive_parity.py +0 -0
  634. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/constitutional.py +0 -0
  635. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/document.py +0 -0
  636. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/documentation_poison.py +0 -0
  637. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/encoding.py +0 -0
  638. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/exfiltration.py +0 -0
  639. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/flip_attack.py +0 -0
  640. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/guardrail_bypass.py +0 -0
  641. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/ide_injection.py +0 -0
  642. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/injection.py +0 -0
  643. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/json_tools.py +0 -0
  644. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/language.py +0 -0
  645. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/logic_bomb.py +0 -0
  646. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/mcp_attacks.py +0 -0
  647. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  648. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/multimodal_attacks.py +0 -0
  649. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/persuasion.py +0 -0
  650. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/perturbation.py +0 -0
  651. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/pii_extraction.py +0 -0
  652. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/pythonic_tools.py +0 -0
  653. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/rag_poisoning.py +0 -0
  654. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/reasoning_attacks.py +0 -0
  655. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/refine.py +0 -0
  656. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/response_steering.py +0 -0
  657. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/structural_exploits.py +0 -0
  658. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/stylistic.py +0 -0
  659. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/substitution.py +0 -0
  660. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/supply_chain.py +0 -0
  661. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/swap.py +0 -0
  662. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  663. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/text.py +0 -0
  664. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/transforms/xml_tools.py +0 -0
  665. {dreadnode-2.0.32 → dreadnode-2.0.34}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.32
3
+ Version: 2.0.34
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -62,6 +62,11 @@ Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'all'
62
62
  Requires-Dist: torch>=2.9.0; extra == 'all'
63
63
  Provides-Extra: claude-code
64
64
  Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'claude-code'
65
+ Provides-Extra: nova-sonic
66
+ Requires-Dist: aws-sdk-bedrock-runtime>=0.7.0; (python_version >= '3.12') and extra == 'nova-sonic'
67
+ Requires-Dist: awscrt>=0.27.0; extra == 'nova-sonic'
68
+ Requires-Dist: boto3>=1.40.0; extra == 'nova-sonic'
69
+ Requires-Dist: smithy-aws-core>=0.7.0; (python_version >= '3.12') and extra == 'nova-sonic'
65
70
  Provides-Extra: scoring
66
71
  Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'scoring'
67
72
  Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'scoring'
@@ -379,6 +384,9 @@ pip install -U "dreadnode[scoring]"
379
384
  # Optional training and serving stack
380
385
  pip install -U "dreadnode[training]"
381
386
 
387
+ # Amazon Nova Sonic speech-to-speech target (requires Python >=3.12)
388
+ pip install -U "dreadnode[nova-sonic]"
389
+
382
390
  # All optional features
383
391
  pip install -U "dreadnode[all]"
384
392
  ```
@@ -298,6 +298,9 @@ pip install -U "dreadnode[scoring]"
298
298
  # Optional training and serving stack
299
299
  pip install -U "dreadnode[training]"
300
300
 
301
+ # Amazon Nova Sonic speech-to-speech target (requires Python >=3.12)
302
+ pip install -U "dreadnode[nova-sonic]"
303
+
301
304
  # All optional features
302
305
  pip install -U "dreadnode[all]"
303
306
  ```
@@ -50,6 +50,7 @@ from dreadnode.agents.reactions import (
50
50
  Retry,
51
51
  RetryWithFeedback,
52
52
  )
53
+ from dreadnode.agents.sanitize import sanitize_orphan_tool_messages
53
54
  from dreadnode.agents.tools import Tool, ToolCall, ToolMode, Toolset, discover_tools_on_obj
54
55
  from dreadnode.agents.trajectory import Trajectory
55
56
  from dreadnode.core.exceptions import warn_at_user_stacklevel
@@ -329,6 +330,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
329
330
  messages, params, post_transform = await transform_callback(messages, params)
330
331
  post_transforms.append(post_transform)
331
332
 
333
+ # ENG-7343 / ENG-6214: general tool-call repair at the provider boundary.
334
+ # Strip orphan tool_results and synthesize placeholders for tool_use
335
+ # blocks whose results were lost (cancel mid-tool, compaction split).
336
+ # Anthropic + OpenAI both 400 on the orphan shape.
337
+ messages = sanitize_orphan_tool_messages(messages)
338
+
332
339
  try:
333
340
  if self.cache is not None and self.generator.supports_prompt_caching():
334
341
  messages = caching.apply_cache_mode_to_messages(self.cache, [messages])[0]
@@ -0,0 +1,150 @@
1
+ """Trajectory sanitization for tool-call/tool-result integrity (ENG-7343, ENG-6214).
2
+
3
+ Strict providers (Anthropic, OpenAI, and OpenAI-compatible gateways) reject
4
+ requests whose tool-call structure is malformed. Mid-tool cancellation,
5
+ compaction, session resume, and weak-model output can all produce shapes that
6
+ 400 the entire request and leave a session unrecoverable. This module is the
7
+ single pre-provider chokepoint that repairs them.
8
+
9
+ Two failure families, both surfacing as request-fatal 400s, are handled here:
10
+
11
+ 1. **Orphan pairs.** An assistant ``tool_call`` with no matching ``tool_result``
12
+ (or the inverse). Anthropic 400s with "unexpected tool_use_id ... must have a
13
+ corresponding tool_use block". Cause: cancel mid-tool, or compaction splitting
14
+ a pair across the summarization boundary.
15
+
16
+ 2. **Malformed tool_calls that the adapter silently drops.** A ``tool_call`` with
17
+ a blank ``function.name`` is dropped by Responses-API adapters while its
18
+ ``function_call_output`` survives, producing OpenAI's
19
+ "No tool call found for function call output with call_id ..." 400 — the same
20
+ symptom as (1) but a different root cause the orphan pass cannot see (the id
21
+ is present on both sides, so the pair *looks* complete). An empty
22
+ ``tool_calls`` array is likewise rejected by some gateways (DeepSeek). These
23
+ are normalized *before* the orphan analysis. Reference: hermes-agent
24
+ ``agent/agent_runtime_helpers.py`` pre-call sanitizer.
25
+
26
+ None of these passes mutate the input messages or the persisted trajectory —
27
+ repaired messages are shallow copies, so stored history and prompt caching stay
28
+ byte-stable.
29
+ """
30
+
31
+ from collections import Counter
32
+
33
+ from loguru import logger
34
+
35
+ from dreadnode.generators.message import Message
36
+
37
+ _INTERRUPTED_TOOL_RESULT = "[Tool execution was interrupted]"
38
+ # A blank tool-call name is invalid anyway; a non-empty sentinel keeps the call
39
+ # paired with its result through Responses-API adapters that would otherwise drop
40
+ # the nameless call and orphan its output.
41
+ _EMPTY_NAME_SENTINEL = "invalid_tool_call"
42
+
43
+
44
+ def _repair_tool_calls(messages: list[Message]) -> tuple[list[Message], int, int]:
45
+ """Normalize assistant ``tool_calls`` that strict providers reject.
46
+
47
+ - Empty ``tool_calls`` list → ``None`` (some gateways 400 on empty arrays).
48
+ - Blank ``function.name`` → ``_EMPTY_NAME_SENTINEL`` so the call is not
49
+ silently dropped by the adapter and orphaned from its output (ENG-7343).
50
+
51
+ Returns ``(messages, emptied, renamed)``. Never mutates the input.
52
+ """
53
+ result: list[Message] = []
54
+ emptied = 0
55
+ renamed = 0
56
+
57
+ for m in messages:
58
+ if m.role != "assistant" or not m.tool_calls:
59
+ # Collapse an empty (but non-None) tool_calls array to None.
60
+ if m.role == "assistant" and m.tool_calls is not None and not m.tool_calls:
61
+ result.append(m.model_copy(update={"tool_calls": None}))
62
+ emptied += 1
63
+ else:
64
+ result.append(m)
65
+ continue
66
+
67
+ new_calls = []
68
+ changed = False
69
+ for tc in m.tool_calls:
70
+ if (tc.function.name or "").strip():
71
+ new_calls.append(tc)
72
+ continue
73
+ new_calls.append(
74
+ tc.model_copy(
75
+ update={
76
+ "function": tc.function.model_copy(update={"name": _EMPTY_NAME_SENTINEL})
77
+ }
78
+ )
79
+ )
80
+ renamed += 1
81
+ changed = True
82
+
83
+ result.append(m.model_copy(update={"tool_calls": new_calls}) if changed else m)
84
+
85
+ return result, emptied, renamed
86
+
87
+
88
+ def sanitize_orphan_tool_messages(messages: list[Message]) -> list[Message]:
89
+ """Return ``messages`` with tool-call/result integrity restored.
90
+
91
+ Runs the malformed-tool_call repair, then resolves orphan pairs. Does not
92
+ mutate the input list. Idempotent: ``f(f(x)) == f(x)``.
93
+ """
94
+ messages, emptied, renamed = _repair_tool_calls(messages)
95
+
96
+ tool_use_ids: set[str] = {
97
+ tc.id for m in messages if m.role == "assistant" and m.tool_calls for tc in m.tool_calls
98
+ }
99
+ # A *count* of available results per id, not a set: duplicate or blank ids
100
+ # (weak models behind OpenAI-compatible gateways emit both) would collapse
101
+ # in a set, so a second same-id call whose result is missing would never be
102
+ # synthesized and reach the provider unmatched. Each call consumes one
103
+ # available result; a call with none left gets a synthesized result.
104
+ available_results: Counter[str] = Counter(
105
+ m.tool_call_id for m in messages if m.role == "tool" and m.tool_call_id is not None
106
+ )
107
+
108
+ result: list[Message] = []
109
+ synthesized = 0
110
+ stripped = 0
111
+
112
+ for m in messages:
113
+ if m.role == "tool" and m.tool_call_id is not None and m.tool_call_id not in tool_use_ids:
114
+ stripped += 1
115
+ continue
116
+
117
+ result.append(m)
118
+
119
+ if m.role == "assistant" and m.tool_calls:
120
+ for tc in m.tool_calls:
121
+ if available_results[tc.id] > 0:
122
+ # Reserve one real result for this call; the rest of the loop
123
+ # keeps it in place when it is reached.
124
+ available_results[tc.id] -= 1
125
+ continue
126
+ result.append(
127
+ Message(
128
+ role="tool",
129
+ tool_call_id=tc.id,
130
+ content=_INTERRUPTED_TOOL_RESULT,
131
+ )
132
+ )
133
+ synthesized += 1
134
+
135
+ if synthesized or stripped or emptied or renamed:
136
+ # INFO, not DEBUG: any repair here means a malformed/orphan tool shape
137
+ # reached the provider boundary — a signal the compaction boundary
138
+ # detector, a cancel path, or a weak model let something through. We
139
+ # want to see this firing in the wild, not silently paper over it.
140
+ # See ENG-7343 / ENG-6551 Phase 2.
141
+ logger.info(
142
+ "sanitize_orphan_tool_messages: synthesized={}, stripped={}, "
143
+ "emptied_tool_calls={}, renamed_blank_tool_calls={}",
144
+ synthesized,
145
+ stripped,
146
+ emptied,
147
+ renamed,
148
+ )
149
+
150
+ return result
@@ -11,6 +11,7 @@ from textwrap import dedent
11
11
 
12
12
  from loguru import logger
13
13
 
14
+ from dreadnode.agents.events import AgentEnd
14
15
  from dreadnode.agents.tools import Toolset, tool_method
15
16
  from dreadnode.core.meta import Config
16
17
  from dreadnode.generators.message import Message
@@ -207,6 +208,21 @@ class SubAgentToolset(Toolset):
207
208
  logger.error(f"Sub-agent failed: {e}")
208
209
  return f"Sub-agent failed: {e}"
209
210
  else:
211
+ terminal_event = next(
212
+ (event for event in reversed(trajectory.events) if isinstance(event, AgentEnd)),
213
+ None,
214
+ )
215
+ if terminal_event is not None and terminal_event.error:
216
+ error_text = str(terminal_event.error)
217
+ logger.error(
218
+ "Sub-agent ended with error | type={} | message={}",
219
+ type(terminal_event.error).__name__
220
+ if isinstance(terminal_event.error, BaseException)
221
+ else "error",
222
+ error_text,
223
+ )
224
+ return f"Sub-agent failed: {error_text}"
225
+
210
226
  # Get the last assistant message content as the response
211
227
  last_message = trajectory.messages[-1] if trajectory.messages else None
212
228
  response = str(last_message.content) if last_message else ""
@@ -121,8 +121,15 @@ class FunctionDefinition(BaseModel):
121
121
  if not isinstance(value, dict):
122
122
  return value
123
123
 
124
- if value.get("type") == "object" and value.get("properties") == {}:
125
- return None
124
+ # A function definition must always carry a parameters object with a
125
+ # `properties` key so it survives model_dump(exclude_none=True) and satisfies
126
+ # strict providers (e.g. Together, DeepInfra) that reject tool definitions
127
+ # missing the `parameters` field. Fill in an empty `properties` when absent
128
+ # while preserving any sibling schema keys (additionalProperties,
129
+ # patternProperties, required, $defs, ...) so free-form-map and strict
130
+ # no-arg schemas are not silently flattened.
131
+ if value.get("type") == "object" and not value.get("properties"):
132
+ return {**value, "properties": value.get("properties") or {}}
126
133
 
127
134
  return value
128
135
 
@@ -101,6 +101,12 @@ from dreadnode.airt.salami_slicing import salami_slicing_attack
101
101
  from dreadnode.airt.self_persuasion import self_persuasion_attack
102
102
  from dreadnode.airt.siren import siren_attack
103
103
  from dreadnode.airt.tap import tap_attack
104
+ from dreadnode.airt.targets import (
105
+ TargetAuth,
106
+ TargetSpec,
107
+ build_target,
108
+ nova_sonic_target,
109
+ )
104
110
  from dreadnode.airt.templatefuzz import templatefuzz_attack
105
111
  from dreadnode.airt.tmap_trajectory import tmap_trajectory_attack
106
112
  from dreadnode.airt.trojail import trojail_attack
@@ -108,6 +114,8 @@ from dreadnode.airt.watermark_removal import watermark_removal_attack
108
114
 
109
115
  __all__ = [
110
116
  "Assessment",
117
+ "TargetAuth",
118
+ "TargetSpec",
111
119
  "adversarial_reasoning_attack",
112
120
  "advpromptier_attack",
113
121
  "alignment_faking_attack",
@@ -117,6 +125,7 @@ __all__ = [
117
125
  "autodan_turbo_attack",
118
126
  "autoredteamer_attack",
119
127
  "beast_attack",
128
+ "build_target",
120
129
  "cot_jailbreak_attack",
121
130
  "crescendo_attack",
122
131
  "deep_inception_attack",
@@ -136,6 +145,7 @@ __all__ = [
136
145
  "multimodal_attack",
137
146
  "nes_attack",
138
147
  "nexus_attack",
148
+ "nova_sonic_target",
139
149
  "pair_attack",
140
150
  "persona_hijack_attack",
141
151
  "prompt_attack",
@@ -138,6 +138,22 @@ class Assessment:
138
138
 
139
139
  self.target_config = target_config
140
140
  self.attacker_config = attacker_config
141
+
142
+ # Infer first-class model ids from the configs when not passed explicitly,
143
+ # so a user who only provides target_config / attacker_config still gets
144
+ # model metadata on the assessment header AND findings (mirrors the
145
+ # platform-side backfill). Keys match the capability/TUI convention.
146
+ if self.target_model is None and self.target_config:
147
+ self.target_model = self.target_config.get("model")
148
+ if self.attacker_model is None and self.attacker_config:
149
+ self.attacker_model = self.attacker_config.get("model") or self.attacker_config.get(
150
+ "attacker_model"
151
+ )
152
+ if self.judge_model is None and self.attacker_config:
153
+ self.judge_model = self.attacker_config.get(
154
+ "evaluator_model"
155
+ ) or self.attacker_config.get("judge")
156
+
141
157
  self._attack_manifest = attack_manifest
142
158
  self._workflow_run_id = workflow_run_id
143
159
  self._workflow_script = workflow_script
@@ -350,6 +366,15 @@ class Assessment:
350
366
  study.airt_category = self.goal_category
351
367
  if self.goal_category and not study.airt_sub_category:
352
368
  study.airt_sub_category = self.goal_category
369
+ # Propagate the assessment's model identifiers so findings carry the
370
+ # target/judge metadata without the caller passing airt_* kwargs to the
371
+ # attack factory (e.g. multimodal_attack, which the user builds directly).
372
+ if self.target_model and not study.airt_target_model:
373
+ study.airt_target_model = self.target_model
374
+ if self.judge_model and not study.airt_evaluator_model:
375
+ study.airt_evaluator_model = self.judge_model
376
+ if self.attacker_model and not study.airt_attacker_model:
377
+ study.airt_attacker_model = self.attacker_model
353
378
 
354
379
  from dreadnode.airt.analytics.types import GoalCategory
355
380
 
@@ -46,6 +46,18 @@ def _mime_for_extension(ext: str | None, default: str) -> str:
46
46
  return _MIME_BY_EXT.get(ext.lower().lstrip("."), default)
47
47
 
48
48
 
49
+ # Legacy/alias MIME types that browsers handle poorly, mapped to the standard.
50
+ _MIME_ALIASES = {
51
+ "audio/x-wav": "audio/wav",
52
+ "audio/wave": "audio/wav",
53
+ "audio/x-pn-wav": "audio/wav",
54
+ }
55
+
56
+
57
+ def _normalize_mime(mime: str | None) -> str | None:
58
+ return _MIME_ALIASES.get(mime, mime) if mime else mime
59
+
60
+
49
61
  def text_part(
50
62
  text: str,
51
63
  *,
@@ -106,9 +118,14 @@ def _media_part(
106
118
  ) -> dict[str, t.Any]:
107
119
  """Build a media message part, storing bytes as a content-addressed artifact."""
108
120
  meta = _store_bytes_as_artifact(span, data, filename=filename)
121
+ # Prefer the caller's canonical media_type over log_artifact's guessed MIME:
122
+ # Python's mimetypes maps `.wav` to the legacy `audio/x-wav`, which some
123
+ # browsers refuse to play in an <audio> element. `_normalize_mime` maps such
124
+ # aliases back to the standard type.
125
+ resolved_mime = _normalize_mime(media_type or (meta.get("mime_type") if meta else None))
109
126
  source: dict[str, t.Any] = {
110
127
  "ref": "artifact",
111
- "media_type": (meta.get("mime_type") if meta else None) or media_type,
128
+ "media_type": resolved_mime,
112
129
  "byte_size": (meta.get("size") if meta else None) or len(data),
113
130
  "filename": (meta.get("name") if meta else None) or filename,
114
131
  }
@@ -226,12 +243,75 @@ def response_to_parts(
226
243
  content-addressed artifacts; text is inlined.
227
244
  """
228
245
  from dreadnode.core.types import Audio, Image, Video
246
+ from dreadnode.generators.message import (
247
+ ContentAudioInput,
248
+ ContentImageUrl,
249
+ ContentText,
250
+ ContentVideoUrl,
251
+ )
229
252
 
230
253
  parts: list[dict[str, t.Any]] = []
231
254
 
232
255
  def _walk(value: t.Any) -> None:
233
256
  if value is None:
234
257
  return
258
+ # SDK message content-part types (media-out responses: image/audio/video
259
+ # generated by the target land here). Extract the real bytes/text instead
260
+ # of stringifying the part's repr.
261
+ if isinstance(value, ContentText):
262
+ if value.text:
263
+ parts.append(text_part(value.text))
264
+ return
265
+ if isinstance(value, ContentImageUrl):
266
+ url = value.image_url.url
267
+ mime = "image/png"
268
+ if url.startswith("data:") and ";" in url:
269
+ mime = url[5:].split(";", 1)[0] or mime
270
+ parts.append(
271
+ _media_part(
272
+ span,
273
+ value.to_bytes(),
274
+ kind="image",
275
+ media_type=mime,
276
+ filename="response_image.png",
277
+ transform=None,
278
+ variant="output",
279
+ caption=None,
280
+ )
281
+ )
282
+ return
283
+ if isinstance(value, ContentAudioInput):
284
+ fmt = getattr(value.input_audio, "format", "wav") or "wav"
285
+ parts.append(
286
+ _media_part(
287
+ span,
288
+ value.to_bytes(),
289
+ kind="audio",
290
+ media_type=_mime_for_extension(fmt, "audio/wav"),
291
+ filename=f"response_audio.{fmt}",
292
+ transform=None,
293
+ variant="output",
294
+ caption=None,
295
+ )
296
+ )
297
+ return
298
+ if isinstance(value, ContentVideoUrl):
299
+ import base64 as _b64
300
+
301
+ data = _b64.b64decode(value.file.file_data.split(",", 1)[-1])
302
+ parts.append(
303
+ _media_part(
304
+ span,
305
+ data,
306
+ kind="video",
307
+ media_type=value.file.mimetype or "video/mp4",
308
+ filename=value.file.filename or "response_video.mp4",
309
+ transform=None,
310
+ variant="output",
311
+ caption=None,
312
+ )
313
+ )
314
+ return
235
315
  if isinstance(value, str):
236
316
  if value:
237
317
  parts.append(text_part(value))