dreadnode 2.0.33__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.33 → dreadnode-2.0.34}/PKG-INFO +9 -1
  2. {dreadnode-2.0.33 → dreadnode-2.0.34}/README.md +3 -0
  3. {dreadnode-2.0.33 → 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.33 → dreadnode-2.0.34}/dreadnode/agents/subagent.py +16 -0
  6. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/tools.py +9 -2
  7. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/assessment.py +25 -0
  8. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/streaming/nova_sonic.py +41 -8
  9. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/client.py +38 -3
  10. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/evaluation.py +15 -0
  11. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/transports.py +1 -0
  12. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/app.py +5 -2
  13. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/app.py +7 -4
  14. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/capabilities_manager.py +1 -0
  15. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/dreadnode.tcss +48 -18
  16. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/sessions_manager.py +26 -9
  17. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/theme.py +24 -8
  18. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_dialog.py +7 -2
  19. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/conversation.py +101 -21
  20. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool.py +85 -8
  21. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  22. dreadnode-2.0.34/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +139 -0
  23. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +1 -0
  24. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
  25. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +1 -1
  26. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -1
  27. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +1 -1
  28. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +6 -2
  29. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +6 -2
  30. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +15 -15
  31. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +8 -12
  32. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +1 -1
  33. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +3 -17
  34. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +2 -13
  35. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +2 -2
  36. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/loader.py +2 -0
  37. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/litellm_.py +15 -0
  38. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/oci.py +24 -13
  39. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/__init__.py +14 -8
  40. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/report_items.py +21 -9
  41. dreadnode-2.0.34/dreadnode/transforms/audio.py +2098 -0
  42. dreadnode-2.0.34/dreadnode/transforms/image.py +2293 -0
  43. dreadnode-2.0.34/dreadnode/transforms/video.py +949 -0
  44. {dreadnode-2.0.33 → dreadnode-2.0.34}/pyproject.toml +11 -1
  45. dreadnode-2.0.33/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -92
  46. dreadnode-2.0.33/dreadnode/transforms/audio.py +0 -990
  47. dreadnode-2.0.33/dreadnode/transforms/image.py +0 -895
  48. dreadnode-2.0.33/dreadnode/transforms/video.py +0 -234
  49. {dreadnode-2.0.33 → dreadnode-2.0.34}/.gitignore +0 -0
  50. {dreadnode-2.0.33 → dreadnode-2.0.34}/LICENSE +0 -0
  51. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/__init__.py +0 -0
  52. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/__main__.py +0 -0
  53. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/__init__.py +0 -0
  54. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/AGENTS.md +0 -0
  55. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/__init__.py +0 -0
  56. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/base.py +0 -0
  57. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/claude_code.py +0 -0
  58. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/engines/native.py +0 -0
  59. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/events.py +0 -0
  60. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/exceptions.py +0 -0
  61. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/format.py +0 -0
  62. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/hooks.py +0 -0
  63. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/judge.py +0 -0
  64. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/__init__.py +0 -0
  65. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/auth.py +0 -0
  66. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/client.py +0 -0
  67. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/config.py +0 -0
  68. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/mcp/server.py +0 -0
  69. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/process_judge.py +0 -0
  70. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/reactions.py +0 -0
  71. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/skills.py +0 -0
  72. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/stopping.py +0 -0
  73. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/tool_resolution.py +0 -0
  74. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/agents/trajectory.py +0 -0
  75. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/__init__.py +0 -0
  76. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/adversarial_reasoning.py +0 -0
  77. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/advpromptier.py +0 -0
  78. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/alignment_faking.py +0 -0
  79. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analogy_escalation.py +0 -0
  80. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/__init__.py +0 -0
  81. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/aggregator.py +0 -0
  82. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/classifier.py +0 -0
  83. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/compliance.py +0 -0
  84. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/engine.py +0 -0
  85. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/recommendations.py +0 -0
  86. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/analytics/types.py +0 -0
  87. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/aprt_progressive.py +0 -0
  88. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/attention_shifting.py +0 -0
  89. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/autodan_turbo.py +0 -0
  90. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/autoredteamer.py +0 -0
  91. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/beast.py +0 -0
  92. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/__init__.py +0 -0
  93. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/atlas.py +0 -0
  94. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/nist.py +0 -0
  95. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp.py +0 -0
  96. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  97. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/compliance/saif.py +0 -0
  98. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/constants.py +0 -0
  99. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/cot_jailbreak.py +0 -0
  100. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/crescendo.py +0 -0
  101. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/__init__.py +0 -0
  102. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  103. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  104. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/assets/image/meth.png +0 -0
  105. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  106. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  107. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  108. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  109. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  110. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  111. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  112. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  113. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  114. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  115. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  116. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  117. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  118. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  119. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  120. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  121. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  122. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  123. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/deep_inception.py +0 -0
  124. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/drattack.py +0 -0
  125. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/echo_chamber.py +0 -0
  126. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/events.py +0 -0
  127. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/genetic_persona.py +0 -0
  128. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/goat.py +0 -0
  129. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/goat_v2.py +0 -0
  130. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/gptfuzzer.py +0 -0
  131. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/humor_bypass.py +0 -0
  132. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/image.py +0 -0
  133. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/j2_meta.py +0 -0
  134. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/jbdistill.py +0 -0
  135. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/jbfuzz.py +0 -0
  136. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/lrm_autonomous.py +0 -0
  137. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/mapf.py +0 -0
  138. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/message_parts.py +0 -0
  139. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/multimodal.py +0 -0
  140. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/nexus.py +0 -0
  141. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/pair.py +0 -0
  142. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/persona_hijack.py +0 -0
  143. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/prompt.py +0 -0
  144. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/quantization_safety.py +0 -0
  145. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/rainbow.py +0 -0
  146. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/refusal_aware.py +0 -0
  147. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/renellm.py +0 -0
  148. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/__init__.py +0 -0
  149. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/json_report.py +0 -0
  150. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/llm_summary.py +0 -0
  151. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reporting/markdown.py +0 -0
  152. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/reward_hacking.py +0 -0
  153. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/salami_slicing.py +0 -0
  154. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/self_persuasion.py +0 -0
  155. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/siren.py +0 -0
  156. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/tap.py +0 -0
  157. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/__init__.py +0 -0
  158. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/auth.py +0 -0
  159. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/factory.py +0 -0
  160. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/http.py +0 -0
  161. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/message.py +0 -0
  162. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/spec.py +0 -0
  163. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  164. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/templatefuzz.py +0 -0
  165. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/tmap_trajectory.py +0 -0
  166. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/trojail.py +0 -0
  167. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/airt/watermark_removal.py +0 -0
  168. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/__init__.py +0 -0
  169. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/__init__.py +0 -0
  170. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/api/models.py +0 -0
  171. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/__init__.py +0 -0
  172. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/airt.py +0 -0
  173. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/args.py +0 -0
  174. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/capability.py +0 -0
  175. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/dataset.py +0 -0
  176. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/environment.py +0 -0
  177. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/inference_model.py +0 -0
  178. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/judge.py +0 -0
  179. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/main.py +0 -0
  180. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/model.py +0 -0
  181. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/optimize.py +0 -0
  182. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/runtime.py +0 -0
  183. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/sandbox.py +0 -0
  184. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/secret.py +0 -0
  185. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/session.py +0 -0
  186. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/shared.py +0 -0
  187. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/task.py +0 -0
  188. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/task_set.py +0 -0
  189. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/__init__.py +0 -0
  190. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  191. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  192. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  193. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  194. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  195. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  196. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  197. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  198. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  199. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/train.py +0 -0
  200. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/cli/worlds.py +0 -0
  201. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/__init__.py +0 -0
  202. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/interactive.py +0 -0
  203. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/managed_client.py +0 -0
  204. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/models.py +0 -0
  205. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/client/runtime_client.py +0 -0
  206. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/config.py +0 -0
  207. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/env.py +0 -0
  208. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/main.py +0 -0
  209. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/model_catalog.py +0 -0
  210. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/paths.py +0 -0
  211. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/print_mode.py +0 -0
  212. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/__init__.py +0 -0
  213. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/auth.py +0 -0
  214. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/capability_manager.py +0 -0
  215. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/model_resolution.py +0 -0
  216. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/prompt.py +0 -0
  217. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/prompt_registry.py +0 -0
  218. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/runtime_events.py +0 -0
  219. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/session_hydrator.py +0 -0
  220. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/session_persistence.py +0 -0
  221. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/turn_coordinator.py +0 -0
  222. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/utils.py +0 -0
  223. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/websocket.py +0 -0
  224. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/worker_manager.py +0 -0
  225. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/server/ws_auth.py +0 -0
  226. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/__init__.py +0 -0
  227. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/auth_flow.py +0 -0
  228. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/command_dispatcher.py +0 -0
  229. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/commands.py +0 -0
  230. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/connection.py +0 -0
  231. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/error_handler.py +0 -0
  232. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/model_manager.py +0 -0
  233. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/model_variants.py +0 -0
  234. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/profile_manager.py +0 -0
  235. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/runtime_cache.py +0 -0
  236. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screen_router.py +0 -0
  237. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/__init__.py +0 -0
  238. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/auth.py +0 -0
  239. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/base.py +0 -0
  240. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capabilities.py +0 -0
  241. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  242. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/connection_error.py +0 -0
  243. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/console.py +0 -0
  244. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/environments.py +0 -0
  245. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/evaluations.py +0 -0
  246. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/models.py +0 -0
  247. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  248. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/readme.py +0 -0
  249. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/runtimes.py +0 -0
  250. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  251. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/secrets.py +0 -0
  252. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/services.py +0 -0
  253. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/sessions.py +0 -0
  254. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  255. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/traces.py +0 -0
  256. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/screens/workspaces.py +0 -0
  257. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/spans_reader.py +0 -0
  258. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/status_messages.py +0 -0
  259. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/tool_format.py +0 -0
  260. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_coordinator.py +0 -0
  261. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  262. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_reducer.py +0 -0
  263. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/turn_state_phase.py +0 -0
  264. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/update_check.py +0 -0
  265. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/__init__.py +0 -0
  266. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  267. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/composer.py +0 -0
  268. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  269. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  270. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/flash.py +0 -0
  271. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  272. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  273. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  274. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  275. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  276. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  277. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  278. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  279. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  280. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  281. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  282. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  283. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  284. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  285. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  286. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/throbber.py +0 -0
  287. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  288. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  289. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/welcome.py +0 -0
  290. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/widgets/whoami.py +0 -0
  291. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/app/tui/wire_events.py +0 -0
  292. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/__init__.py +0 -0
  293. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  294. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  295. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  296. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  297. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  298. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  299. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  300. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  301. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  302. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  303. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  304. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  305. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  306. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  307. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  308. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  309. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  310. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  311. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  312. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  313. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  314. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  315. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  316. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  317. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  318. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  319. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  320. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  321. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  322. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  323. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  324. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  325. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  326. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  327. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  328. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  329. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  330. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  331. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  332. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  333. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  334. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  335. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  336. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  337. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  338. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  339. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  340. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  341. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  342. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  343. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  344. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  345. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  346. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  347. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  348. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  349. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  350. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  351. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  352. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  353. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  354. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  355. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  356. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  357. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  358. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  359. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  360. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  361. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  362. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  363. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  364. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  365. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  366. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  367. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  368. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  369. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  370. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  371. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  372. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  373. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  374. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/__init__.py +0 -0
  375. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/capability.py +0 -0
  376. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/flags.py +0 -0
  377. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/install.py +0 -0
  378. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/sync.py +0 -0
  379. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/tool_rules.py +0 -0
  380. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/types.py +0 -0
  381. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/worker.py +0 -0
  382. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/capabilities/worker_runner.py +0 -0
  383. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/__init__.py +0 -0
  384. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/conditions.py +0 -0
  385. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/discovery.py +0 -0
  386. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/environment.py +0 -0
  387. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/exceptions.py +0 -0
  388. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/execution.py +0 -0
  389. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/hook.py +0 -0
  390. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/judge.py +0 -0
  391. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/load.py +0 -0
  392. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/log.py +0 -0
  393. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/__init__.py +0 -0
  394. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/config.py +0 -0
  395. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/context.py +0 -0
  396. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/hydrate.py +0 -0
  397. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/meta/introspect.py +0 -0
  398. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/metric.py +0 -0
  399. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/object.py +0 -0
  400. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/scorer.py +0 -0
  401. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/serialization.py +0 -0
  402. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/stopping.py +0 -0
  403. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/task.py +0 -0
  404. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/templating.py +0 -0
  405. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/transforms.py +0 -0
  406. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/__init__.py +0 -0
  407. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/audio.py +0 -0
  408. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/base.py +0 -0
  409. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/common.py +0 -0
  410. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/image.py +0 -0
  411. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/object_3d.py +0 -0
  412. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/table.py +0 -0
  413. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/text.py +0 -0
  414. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/types/video.py +0 -0
  415. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/core/util.py +0 -0
  416. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/__init__.py +0 -0
  417. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/dataset.py +0 -0
  418. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/hf.py +0 -0
  419. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/datasets/local.py +0 -0
  420. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/__init__.py +0 -0
  421. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/console.py +0 -0
  422. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/evaluation.py +0 -0
  423. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/events.py +0 -0
  424. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/format.py +0 -0
  425. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/result.py +0 -0
  426. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/evaluations/sample.py +0 -0
  427. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/__init__.py +0 -0
  428. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/caching.py +0 -0
  429. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/chat.py +0 -0
  430. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/data.py +0 -0
  431. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/exceptions.py +0 -0
  432. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/__init__.py +0 -0
  433. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/base.py +0 -0
  434. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/http.py +0 -0
  435. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/transformers_.py +0 -0
  436. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/generator/vllm_.py +0 -0
  437. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/message.py +0 -0
  438. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/models.py +0 -0
  439. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/parsing.py +0 -0
  440. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/proxy.py +0 -0
  441. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/__init__.py +0 -0
  442. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/base.py +0 -0
  443. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  444. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/generators/utils.py +0 -0
  445. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/__init__.py +0 -0
  446. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/config.py +0 -0
  447. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/items/models.py +0 -0
  448. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/__init__.py +0 -0
  449. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/outcome.py +0 -0
  450. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/trajectory.py +0 -0
  451. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/judges/trajectory_tools.py +0 -0
  452. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/__init__.py +0 -0
  453. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/hf.py +0 -0
  454. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/local.py +0 -0
  455. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/models/model.py +0 -0
  456. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/__init__.py +0 -0
  457. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/__init__.py +0 -0
  458. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  459. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/agent.py +0 -0
  460. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/env.py +0 -0
  461. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/runtime.py +0 -0
  462. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/adapters/stack.py +0 -0
  463. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/api.py +0 -0
  464. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/__init__.py +0 -0
  465. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/base.py +0 -0
  466. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/backends/gepa.py +0 -0
  467. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/collectors.py +0 -0
  468. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/config.py +0 -0
  469. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/console.py +0 -0
  470. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/events.py +0 -0
  471. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/format.py +0 -0
  472. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/jobs.py +0 -0
  473. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/result.py +0 -0
  474. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/sampler.py +0 -0
  475. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/sampling.py +0 -0
  476. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/search.py +0 -0
  477. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/stopping.py +0 -0
  478. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/study.py +0 -0
  479. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/optimization/trial.py +0 -0
  480. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/__init__.py +0 -0
  481. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/loader.py +0 -0
  482. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/manifest.py +0 -0
  483. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/package.py +0 -0
  484. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/packaging/task_validation.py +0 -0
  485. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/guard.py +0 -0
  486. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/reconciliation.py +0 -0
  487. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  488. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/py.typed +0 -0
  489. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/__init__.py +0 -0
  490. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/boundary.py +0 -0
  491. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/fuzzing.py +0 -0
  492. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/graph.py +0 -0
  493. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/grid.py +0 -0
  494. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/image.py +0 -0
  495. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/mapelites.py +0 -0
  496. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/optuna.py +0 -0
  497. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/random.py +0 -0
  498. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/registry.py +0 -0
  499. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/samplers/strategy.py +0 -0
  500. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/__init__.py +0 -0
  501. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  502. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agent_security.py +0 -0
  503. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agentic.py +0 -0
  504. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/agentic_workflow.py +0 -0
  505. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/attack_outcome.py +0 -0
  506. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/classification.py +0 -0
  507. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/consistency.py +0 -0
  508. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/contains.py +0 -0
  509. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/cosine_sim.py +0 -0
  510. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/credentials.py +0 -0
  511. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/crucible.py +0 -0
  512. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/documentation_security.py +0 -0
  513. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/exfiltration_detection.py +0 -0
  514. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/format.py +0 -0
  515. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/harm.py +0 -0
  516. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/ide_security.py +0 -0
  517. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/image.py +0 -0
  518. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/json.py +0 -0
  519. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/judge.py +0 -0
  520. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/judge_ensemble.py +0 -0
  521. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/length.py +0 -0
  522. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/lexical.py +0 -0
  523. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/mcp_security.py +0 -0
  524. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/memorization.py +0 -0
  525. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/multi_agent_security.py +0 -0
  526. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/pii.py +0 -0
  527. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/prompt_leak.py +0 -0
  528. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/readability.py +0 -0
  529. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/reasoning_security.py +0 -0
  530. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/sentiment.py +0 -0
  531. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/similarity.py +0 -0
  532. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/structural_detection.py +0 -0
  533. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/scorers/supply_chain_detection.py +0 -0
  534. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/__init__.py +0 -0
  535. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/providers.py +0 -0
  536. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/session_store.py +0 -0
  537. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/storage/storage.py +0 -0
  538. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/__init__.py +0 -0
  539. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/_ripgrep.py +0 -0
  540. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/apply_patch.py +0 -0
  541. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/dreadnode_cli.py +0 -0
  542. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/editing.py +0 -0
  543. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/execute.py +0 -0
  544. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/fetch.py +0 -0
  545. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/glob.py +0 -0
  546. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/grep.py +0 -0
  547. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/interaction.py +0 -0
  548. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/ls.py +0 -0
  549. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/memory.py +0 -0
  550. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/project_memory.py +0 -0
  551. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/read.py +0 -0
  552. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/report.py +0 -0
  553. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/task.py +0 -0
  554. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/think.py +0 -0
  555. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/todo.py +0 -0
  556. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/trajectory_search.py +0 -0
  557. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/web_extract.py +0 -0
  558. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/web_search.py +0 -0
  559. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tools/write.py +0 -0
  560. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/__init__.py +0 -0
  561. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/constants.py +0 -0
  562. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/convert.py +0 -0
  563. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/exporter.py +0 -0
  564. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/exporters.py +0 -0
  565. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/span.py +0 -0
  566. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/spans.py +0 -0
  567. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/tracing/trace_converter.py +0 -0
  568. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/__init__.py +0 -0
  569. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/_progress.py +0 -0
  570. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/base.py +0 -0
  571. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/dpo.py +0 -0
  572. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/env_rollouts.py +0 -0
  573. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/__init__.py +0 -0
  574. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/_common.py +0 -0
  575. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/rl.py +0 -0
  576. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/sft.py +0 -0
  577. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/etl/worlds.py +0 -0
  578. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/events.py +0 -0
  579. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/grpo.py +0 -0
  580. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/jobs.py +0 -0
  581. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/models.py +0 -0
  582. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ppo.py +0 -0
  583. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/prime.py +0 -0
  584. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/__init__.py +0 -0
  585. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/async_trainer.py +0 -0
  586. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/config.py +0 -0
  587. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/coordinator.py +0 -0
  588. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/distributed.py +0 -0
  589. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/dpo.py +0 -0
  590. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/experience.py +0 -0
  591. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  592. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/inference.py +0 -0
  593. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/learner.py +0 -0
  594. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/multi_turn.py +0 -0
  595. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/ppo.py +0 -0
  596. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/reward_model.py +0 -0
  597. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_env.py +0 -0
  598. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/rollout_worker.py +0 -0
  599. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/sft.py +0 -0
  600. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/ray/trainer.py +0 -0
  601. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/recipes.py +0 -0
  602. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/__init__.py +0 -0
  603. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/aggregator.py +0 -0
  604. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/functions.py +0 -0
  605. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  606. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/shaping.py +0 -0
  607. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rewards/types.py +0 -0
  608. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/__init__.py +0 -0
  609. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/adapters.py +0 -0
  610. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  611. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/orchestrator.py +0 -0
  612. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/types.py +0 -0
  613. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/rollouts/worlds.py +0 -0
  614. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/serving/__init__.py +0 -0
  615. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/serving/vllm_client.py +0 -0
  616. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/sft.py +0 -0
  617. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/__init__.py +0 -0
  618. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/config.py +0 -0
  619. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/data.py +0 -0
  620. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/renderer.py +0 -0
  621. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/rl.py +0 -0
  622. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker/trainer.py +0 -0
  623. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/tinker_sft.py +0 -0
  624. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/training/utils.py +0 -0
  625. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/__init__.py +0 -0
  626. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  627. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/adversarial_suffix.py +0 -0
  628. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/agent_skill.py +0 -0
  629. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/agentic_workflow.py +0 -0
  630. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/backdoor_finetune.py +0 -0
  631. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  632. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/cipher.py +0 -0
  633. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/competitive_parity.py +0 -0
  634. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/constitutional.py +0 -0
  635. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/document.py +0 -0
  636. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/documentation_poison.py +0 -0
  637. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/encoding.py +0 -0
  638. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/exfiltration.py +0 -0
  639. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/flip_attack.py +0 -0
  640. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/guardrail_bypass.py +0 -0
  641. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/ide_injection.py +0 -0
  642. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/injection.py +0 -0
  643. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/json_tools.py +0 -0
  644. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/language.py +0 -0
  645. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/logic_bomb.py +0 -0
  646. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/mcp_attacks.py +0 -0
  647. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  648. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/multimodal_attacks.py +0 -0
  649. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/persuasion.py +0 -0
  650. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/perturbation.py +0 -0
  651. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/pii_extraction.py +0 -0
  652. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/pythonic_tools.py +0 -0
  653. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/rag_poisoning.py +0 -0
  654. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/reasoning_attacks.py +0 -0
  655. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/refine.py +0 -0
  656. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/response_steering.py +0 -0
  657. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/structural_exploits.py +0 -0
  658. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/stylistic.py +0 -0
  659. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/substitution.py +0 -0
  660. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/supply_chain.py +0 -0
  661. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/swap.py +0 -0
  662. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  663. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/text.py +0 -0
  664. {dreadnode-2.0.33 → dreadnode-2.0.34}/dreadnode/transforms/xml_tools.py +0 -0
  665. {dreadnode-2.0.33 → 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.33
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
 
@@ -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
 
@@ -12,12 +12,30 @@ dynamically. Auth is AWS IAM/SigV4 via the credential chain — no API key.
12
12
  import base64
13
13
  import contextlib
14
14
  import importlib
15
+ import importlib.util
15
16
  import os
16
17
  import typing as t
17
18
 
18
19
  from dreadnode.core.task import Task, task
19
20
  from dreadnode.generators.message import ContentAudioInput, ContentText, Message
20
21
 
22
+ _NOVA_DEPS = ("aws_sdk_bedrock_runtime", "awscrt", "smithy_aws_core")
23
+
24
+
25
+ def _require_nova_deps() -> None:
26
+ """Fail fast if the Nova Sonic streaming deps are missing.
27
+
28
+ Called at target-construction time so a missing ``dreadnode[nova-sonic]``
29
+ stops the run up front instead of surfacing as a mid-stream error finding.
30
+ """
31
+ for mod in _NOVA_DEPS:
32
+ if importlib.util.find_spec(mod) is None:
33
+ raise RuntimeError(
34
+ "Nova Sonic speech-to-speech needs the optional streaming "
35
+ 'dependencies. Install them with: pip install "dreadnode[nova-sonic]"'
36
+ f" (requires Python >=3.12). Missing module: {mod}."
37
+ )
38
+
21
39
 
22
40
  def _ensure_aws_credentials(region: str) -> None:
23
41
  """Resolve AWS credentials up front and seed the environment for Nova Sonic.
@@ -69,9 +87,12 @@ def nova_sonic_target(
69
87
  decodes to it). Streams it to Nova Sonic and returns a :class:`Message` with the
70
88
  model's spoken reply (audio) and its transcript (text).
71
89
 
72
- Prerequisites (see docs): ``pip install aws-sdk-bedrock-runtime awscrt``, AWS
73
- credentials (env vars / profile / role), and Nova Sonic model access in the region.
90
+ Prerequisites (see docs): ``pip install "dreadnode[nova-sonic]"`` (Python >=3.12),
91
+ AWS credentials (env vars / profile / role), and Nova Sonic model access in the region.
74
92
  """
93
+ # Fail fast at construction so a missing dependency doesn't register a doomed
94
+ # assessment that only errors mid-stream.
95
+ _require_nova_deps()
75
96
 
76
97
  async def target(message: Message) -> Message:
77
98
  pcm = _first_audio_pcm(message)
@@ -128,10 +149,17 @@ async def _roundtrip(
128
149
  # fast with a clear error instead of hanging on the Bedrock handshake.
129
150
  _ensure_aws_credentials(region)
130
151
 
131
- bedrock = importlib.import_module("aws_sdk_bedrock_runtime.client")
132
- models = importlib.import_module("aws_sdk_bedrock_runtime.models")
133
- config_mod = importlib.import_module("aws_sdk_bedrock_runtime.config")
134
- smithy_env = importlib.import_module("smithy_aws_core.identity.environment")
152
+ try:
153
+ bedrock = importlib.import_module("aws_sdk_bedrock_runtime.client")
154
+ models = importlib.import_module("aws_sdk_bedrock_runtime.models")
155
+ config_mod = importlib.import_module("aws_sdk_bedrock_runtime.config")
156
+ smithy_env = importlib.import_module("smithy_aws_core.identity.environment")
157
+ except ModuleNotFoundError as e:
158
+ raise RuntimeError(
159
+ "Nova Sonic speech-to-speech needs the optional streaming dependencies. "
160
+ 'Install them with: pip install "dreadnode[nova-sonic]" (requires Python '
161
+ f">=3.12). Missing module: {e.name}."
162
+ ) from e
135
163
 
136
164
  prompt_id, sys_id, audio_id = (str(uuid.uuid4()) for _ in range(3))
137
165
  text_out: list[str] = []
@@ -161,9 +189,14 @@ async def _roundtrip(
161
189
  while not done.is_set():
162
190
  output = await stream.await_output()
163
191
  result = await output[1].receive()
164
- if not (result.value and result.value.bytes_):
192
+ # `result` is a union of chunk + error types; only the chunk variant
193
+ # carries `.value.bytes_`. Access defensively so the type checker
194
+ # doesn't flag the error variants (which have no such attribute).
195
+ value = getattr(result, "value", None)
196
+ payload = getattr(value, "bytes_", None)
197
+ if not payload:
165
198
  continue
166
- ev = json.loads(result.value.bytes_.decode("utf-8")).get("event", {})
199
+ ev = json.loads(payload.decode("utf-8")).get("event", {})
167
200
  if "contentStart" in ev:
168
201
  role["v"] = ev["contentStart"].get("role")
169
202
  elif "textOutput" in ev and role["v"] == "ASSISTANT":
@@ -172,8 +172,20 @@ class ApiClient:
172
172
  json_data: dict[str, t.Any] | None = None,
173
173
  data: dict[str, t.Any] | None = None,
174
174
  headers: dict[str, str] | None = None,
175
+ *,
176
+ timeout: float | None = None,
175
177
  ) -> httpx.Response:
176
178
  """Make a raw HTTP request without raising on errors."""
179
+ if timeout is not None:
180
+ return self._client.request(
181
+ method,
182
+ path,
183
+ params=params,
184
+ json=json_data,
185
+ data=data,
186
+ headers=headers,
187
+ timeout=timeout,
188
+ )
177
189
  return self._client.request(
178
190
  method,
179
191
  path,
@@ -191,9 +203,22 @@ class ApiClient:
191
203
  json_data: dict[str, t.Any] | None = None,
192
204
  data: dict[str, t.Any] | None = None,
193
205
  headers: dict[str, str] | None = None,
206
+ *,
207
+ timeout: float | None = None,
194
208
  ) -> httpx.Response:
195
209
  """Make an HTTP request and raise on errors."""
196
- response = self._request(method, path, params, json_data, data, headers)
210
+ if timeout is None:
211
+ response = self._request(method, path, params, json_data, data, headers)
212
+ else:
213
+ response = self._request(
214
+ method,
215
+ path,
216
+ params,
217
+ json_data,
218
+ data,
219
+ headers,
220
+ timeout=timeout,
221
+ )
197
222
  if response.status_code == 401:
198
223
  raise AuthenticationError(self._get_error_message(response))
199
224
  if response.status_code == 404:
@@ -2249,10 +2274,20 @@ class ApiClient:
2249
2274
  response = self.request("GET", f"/org/{org}/capabilities/facets", params=params)
2250
2275
  return t.cast("dict[str, t.Any]", response.json())
2251
2276
 
2252
- def list_capability_versions(self, org: str, name: str) -> dict[str, t.Any]:
2277
+ def list_capability_versions(
2278
+ self,
2279
+ org: str,
2280
+ name: str,
2281
+ *,
2282
+ timeout: float | None = None,
2283
+ ) -> dict[str, t.Any]:
2253
2284
  """GET /org/{org}/capabilities/{name}/versions - List all versions."""
2254
2285
  safe_name = _url_quote(name, safe="")
2255
- response = self.request("GET", f"/org/{org}/capabilities/{safe_name}/versions")
2286
+ response = self.request(
2287
+ "GET",
2288
+ f"/org/{org}/capabilities/{safe_name}/versions",
2289
+ timeout=timeout,
2290
+ )
2256
2291
  return t.cast("dict[str, t.Any]", response.json())
2257
2292
 
2258
2293
  def get_capability(self, org: str, name: str, version: str | None = None) -> dict[str, t.Any]:
@@ -670,6 +670,16 @@ def create(
670
670
  ] = None,
671
671
  concurrency: int | None = None,
672
672
  task_timeout_sec: int | None = None,
673
+ max_steps: t.Annotated[
674
+ int | None,
675
+ cyclopts.Parameter(
676
+ help=(
677
+ "Maximum agent tool/generation steps per sample. "
678
+ "Enforced via a headless session policy; the task timeout "
679
+ "still applies as a wall-clock bound."
680
+ ),
681
+ ),
682
+ ] = None,
673
683
  cleanup_policy: CleanupPolicy | None = None,
674
684
  judge_model: str | None = None,
675
685
  env_model: t.Annotated[
@@ -726,6 +736,9 @@ def create(
726
736
  `dn secret list` to discover configured names.
727
737
  concurrency: Maximum concurrent evaluation samples.
728
738
  task_timeout_sec: Timeout per task in seconds.
739
+ max_steps: Maximum agent tool/generation steps per sample.
740
+ Enforced via a headless session policy; the task timeout still
741
+ applies as a wall-clock bound.
729
742
  cleanup_policy: Sandbox cleanup policy.
730
743
  judge_model: Override the judge model for all tasks in this evaluation.
731
744
  wait: Block until the evaluation reaches a terminal state.
@@ -758,6 +771,8 @@ def create(
758
771
  request["concurrency"] = concurrency
759
772
  if task_timeout_sec is not None:
760
773
  request["task_timeout_sec"] = task_timeout_sec
774
+ if max_steps is not None:
775
+ request["max_steps"] = max_steps
761
776
  if cleanup_policy:
762
777
  request["cleanup_policy"] = cleanup_policy
763
778
  if judge_model:
@@ -122,6 +122,7 @@ class StreamingASGITransport(httpx.AsyncBaseTransport):
122
122
  if tasks:
123
123
  await asyncio.gather(*tasks, return_exceptions=True)
124
124
  await loop.shutdown_asyncgens()
125
+ await loop.shutdown_default_executor()
125
126
 
126
127
  async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
127
128
  server_loop = self.require_server_loop()
@@ -657,6 +657,9 @@ async def server_lifecycle() -> t.AsyncIterator[None]:
657
657
  try:
658
658
  yield
659
659
  finally:
660
+ if not synchronous:
661
+ with suppress(Exception):
662
+ await asyncio.wait_for(asyncio.shield(warm_future), timeout=2)
660
663
  # Workers stop BEFORE MCP teardown
661
664
  if registry and registry.worker_manager:
662
665
  await registry.worker_manager.stop()
@@ -4327,7 +4330,7 @@ def _check_capability_updates(
4327
4330
  ) -> tuple[str, str | None, str]:
4328
4331
  identity, owner, name, installed_ver, _source = item
4329
4332
  try:
4330
- resp = api.list_capability_versions(owner, name)
4333
+ resp = api.list_capability_versions(owner, name, timeout=timeout)
4331
4334
  latest = resp.get("latest")
4332
4335
  if isinstance(latest, dict):
4333
4336
  return identity, latest.get("version"), installed_ver
@@ -4356,7 +4359,7 @@ def _check_capability_updates(
4356
4359
  except Exception:
4357
4360
  logger.debug("Capability update check failed", exc_info=True)
4358
4361
  finally:
4359
- executor.shutdown(wait=False, cancel_futures=True)
4362
+ executor.shutdown(wait=True, cancel_futures=True)
4360
4363
 
4361
4364
  return updates
4362
4365
 
@@ -3643,12 +3643,13 @@ class DreadnodeTextualApp(App[None]):
3643
3643
  "expanded" if self.output_mode == "compact" else "compact"
3644
3644
  )
3645
3645
  self.output_mode = new_mode
3646
- from dreadnode.app.tui.widgets.conversation import CompactionSummary
3646
+ from dreadnode.app.tui.widgets.conversation import CompactionSummary, ThinkingBlock
3647
3647
  from dreadnode.app.tui.widgets.tool import ToolCall as ToolCallWidget
3648
3648
 
3649
- # ^O controls tool-output verbosity only. Reasoning (ThinkingBlock) is a
3650
- # separate concern shown inline regardless of this toggle (ENG-6108), so
3651
- # it is intentionally not touched here.
3649
+ # ^O drives every expandable surface: tool output, compaction summaries,
3650
+ # and reasoning. Reasoning was previously excluded (ENG-6108) but that
3651
+ # left long traces filling the viewport with no way to shorten them, so
3652
+ # ^O now shortens/expands ThinkingBlocks too (ENG-7463).
3652
3653
  try:
3653
3654
  conv = self.query_one("#conversation", ConversationView)
3654
3655
  for tc in conv.query(ToolCallWidget):
@@ -3656,6 +3657,8 @@ class DreadnodeTextualApp(App[None]):
3656
3657
  expanded = new_mode == "expanded"
3657
3658
  for cs in conv.query(CompactionSummary):
3658
3659
  cs.display = expanded
3660
+ for tb in conv.query(ThinkingBlock):
3661
+ tb.set_output_mode(new_mode)
3659
3662
  except Exception:
3660
3663
  logger.debug("Could not refresh output mode widgets")
3661
3664
  self._flash(f"Output: {new_mode}", severity="info")
@@ -224,6 +224,7 @@ class CapabilitiesManager:
224
224
  "description": agent.description or "",
225
225
  "model": agent.model or "inherit",
226
226
  "capability": cap.name,
227
+ "capability_version": getattr(cap, "version", None) or "",
227
228
  }
228
229
  )
229
230
  seen.add(agent.name)