dreadnode 2.0.30__tar.gz → 2.0.32__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 (654) hide show
  1. {dreadnode-2.0.30 → dreadnode-2.0.32}/PKG-INFO +10 -5
  2. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/agent.py +48 -0
  3. dreadnode-2.0.32/dreadnode/agents/engines/AGENTS.md +27 -0
  4. dreadnode-2.0.32/dreadnode/agents/engines/__init__.py +89 -0
  5. dreadnode-2.0.32/dreadnode/agents/engines/base.py +166 -0
  6. dreadnode-2.0.32/dreadnode/agents/engines/claude_code.py +528 -0
  7. dreadnode-2.0.32/dreadnode/agents/engines/native.py +26 -0
  8. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/events.py +6 -0
  9. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/mcp/client.py +76 -2
  10. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/subagent.py +50 -10
  11. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/tools.py +4 -0
  12. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/assessment.py +11 -2
  13. dreadnode-2.0.32/dreadnode/airt/message_parts.py +263 -0
  14. dreadnode-2.0.32/dreadnode/airt/multimodal.py +370 -0
  15. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/api/client.py +509 -0
  16. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/api/models.py +62 -0
  17. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/airt.py +20 -5
  18. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/args.py +1 -0
  19. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/capability.py +20 -0
  20. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/environment.py +20 -0
  21. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/evaluation.py +72 -0
  22. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/main.py +41 -10
  23. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/shared.py +57 -0
  24. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/task.py +21 -0
  25. dreadnode-2.0.32/dreadnode/app/cli/task_set.py +791 -0
  26. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/managed_client.py +6 -0
  27. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/models.py +2 -0
  28. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/runtime_client.py +106 -2
  29. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/print_mode.py +96 -1
  30. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/app.py +413 -19
  31. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/prompt.py +57 -0
  32. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/session_persistence.py +29 -1
  33. dreadnode-2.0.32/dreadnode/app/server/utils.py +59 -0
  34. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/websocket.py +14 -3
  35. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/worker_manager.py +16 -2
  36. dreadnode-2.0.32/dreadnode/app/server/ws_auth.py +76 -0
  37. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/app.py +43 -9
  38. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/command_dispatcher.py +4 -1
  39. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/dreadnode.tcss +11 -0
  40. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/model_manager.py +84 -5
  41. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/capabilities.py +43 -0
  42. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/environments.py +31 -1
  43. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/models.py +5 -21
  44. dreadnode-2.0.32/dreadnode/app/tui/screens/readme.py +101 -0
  45. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/sessions_manager.py +16 -14
  46. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/turn_reducer.py +8 -0
  47. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/update_check.py +54 -0
  48. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/context_bar.py +9 -1
  49. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/conversation.py +80 -30
  50. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/tool.py +68 -6
  51. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/wire_events.py +4 -0
  52. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +2 -0
  53. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +10 -9
  54. dreadnode-2.0.32/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +130 -0
  55. dreadnode-2.0.32/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +109 -0
  56. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +2 -2
  57. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +23 -6
  58. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +43 -0
  59. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +24 -0
  60. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +1 -0
  61. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +1 -0
  62. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +1 -0
  63. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -0
  64. dreadnode-2.0.32/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +223 -0
  65. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +2 -0
  66. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +10 -0
  67. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +10 -0
  68. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +1 -1
  69. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +3 -0
  70. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
  71. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/loader.py +6 -0
  72. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/types.py +4 -0
  73. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/worker_runner.py +32 -4
  74. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/video.py +29 -5
  75. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/base.py +12 -5
  76. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/litellm_.py +158 -0
  77. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/proxy.py +22 -0
  78. dreadnode-2.0.32/dreadnode/items/__init__.py +15 -0
  79. dreadnode-2.0.32/dreadnode/items/config.py +150 -0
  80. dreadnode-2.0.32/dreadnode/items/models.py +80 -0
  81. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/judges/trajectory.py +3 -39
  82. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/jobs.py +4 -27
  83. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/study.py +38 -3
  84. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/manifest.py +7 -0
  85. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/oci.py +57 -0
  86. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/task_validation.py +83 -17
  87. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/policies/__init__.py +23 -0
  88. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/policies/guard.py +13 -0
  89. dreadnode-2.0.32/dreadnode/policies/reconciliation.py +138 -0
  90. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/__init__.py +21 -1
  91. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/interaction.py +54 -0
  92. dreadnode-2.0.32/dreadnode/tools/project_memory.py +318 -0
  93. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/read.py +12 -2
  94. dreadnode-2.0.32/dreadnode/tools/report_items.py +662 -0
  95. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/constants.py +6 -0
  96. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/span.py +22 -0
  97. {dreadnode-2.0.30 → dreadnode-2.0.32}/pyproject.toml +18 -7
  98. dreadnode-2.0.30/dreadnode/airt/multimodal.py +0 -210
  99. dreadnode-2.0.30/dreadnode/app/server/utils.py +0 -25
  100. {dreadnode-2.0.30 → dreadnode-2.0.32}/.gitignore +0 -0
  101. {dreadnode-2.0.30 → dreadnode-2.0.32}/LICENSE +0 -0
  102. {dreadnode-2.0.30 → dreadnode-2.0.32}/README.md +0 -0
  103. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/__init__.py +0 -0
  104. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/__main__.py +0 -0
  105. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/__init__.py +0 -0
  106. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/exceptions.py +0 -0
  107. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/format.py +0 -0
  108. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/hooks.py +0 -0
  109. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/judge.py +0 -0
  110. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/mcp/__init__.py +0 -0
  111. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/mcp/auth.py +0 -0
  112. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/mcp/config.py +0 -0
  113. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/mcp/server.py +0 -0
  114. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/process_judge.py +0 -0
  115. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/reactions.py +0 -0
  116. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/skills.py +0 -0
  117. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/stopping.py +0 -0
  118. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/tool_resolution.py +0 -0
  119. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/agents/trajectory.py +0 -0
  120. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/__init__.py +0 -0
  121. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/adversarial_reasoning.py +0 -0
  122. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/advpromptier.py +0 -0
  123. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/alignment_faking.py +0 -0
  124. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analogy_escalation.py +0 -0
  125. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/__init__.py +0 -0
  126. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/aggregator.py +0 -0
  127. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/classifier.py +0 -0
  128. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/compliance.py +0 -0
  129. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/engine.py +0 -0
  130. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/recommendations.py +0 -0
  131. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/analytics/types.py +0 -0
  132. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/aprt_progressive.py +0 -0
  133. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/attention_shifting.py +0 -0
  134. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/autodan_turbo.py +0 -0
  135. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/autoredteamer.py +0 -0
  136. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/beast.py +0 -0
  137. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/__init__.py +0 -0
  138. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/atlas.py +0 -0
  139. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/nist.py +0 -0
  140. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/owasp.py +0 -0
  141. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  142. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/compliance/saif.py +0 -0
  143. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/constants.py +0 -0
  144. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/cot_jailbreak.py +0 -0
  145. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/crescendo.py +0 -0
  146. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/__init__.py +0 -0
  147. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  148. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  149. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/assets/image/meth.png +0 -0
  150. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  151. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  152. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  153. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  154. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  155. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  156. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  157. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  158. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  159. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  160. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  161. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  162. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  163. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  164. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  165. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  166. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  167. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  168. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/deep_inception.py +0 -0
  169. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/drattack.py +0 -0
  170. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/echo_chamber.py +0 -0
  171. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/events.py +0 -0
  172. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/genetic_persona.py +0 -0
  173. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/goat.py +0 -0
  174. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/goat_v2.py +0 -0
  175. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/gptfuzzer.py +0 -0
  176. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/humor_bypass.py +0 -0
  177. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/image.py +0 -0
  178. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/j2_meta.py +0 -0
  179. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/jbdistill.py +0 -0
  180. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/jbfuzz.py +0 -0
  181. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/lrm_autonomous.py +0 -0
  182. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/mapf.py +0 -0
  183. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/nexus.py +0 -0
  184. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/pair.py +0 -0
  185. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/persona_hijack.py +0 -0
  186. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/prompt.py +0 -0
  187. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/quantization_safety.py +0 -0
  188. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/rainbow.py +0 -0
  189. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/refusal_aware.py +0 -0
  190. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/renellm.py +0 -0
  191. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/reporting/__init__.py +0 -0
  192. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/reporting/json_report.py +0 -0
  193. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/reporting/llm_summary.py +0 -0
  194. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/reporting/markdown.py +0 -0
  195. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/reward_hacking.py +0 -0
  196. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/salami_slicing.py +0 -0
  197. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/self_persuasion.py +0 -0
  198. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/siren.py +0 -0
  199. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/tap.py +0 -0
  200. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/templatefuzz.py +0 -0
  201. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/tmap_trajectory.py +0 -0
  202. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/trojail.py +0 -0
  203. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/airt/watermark_removal.py +0 -0
  204. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/__init__.py +0 -0
  205. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/api/__init__.py +0 -0
  206. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/__init__.py +0 -0
  207. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/dataset.py +0 -0
  208. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/inference_model.py +0 -0
  209. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/judge.py +0 -0
  210. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/model.py +0 -0
  211. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/optimize.py +0 -0
  212. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/runtime.py +0 -0
  213. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/sandbox.py +0 -0
  214. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/secret.py +0 -0
  215. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/session.py +0 -0
  216. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/__init__.py +0 -0
  217. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  218. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  219. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  220. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  221. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  222. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  223. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  224. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  225. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  226. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/train.py +0 -0
  227. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/cli/worlds.py +0 -0
  228. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/__init__.py +0 -0
  229. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/interactive.py +0 -0
  230. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/client/transports.py +0 -0
  231. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/config.py +0 -0
  232. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/env.py +0 -0
  233. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/main.py +0 -0
  234. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/model_catalog.py +0 -0
  235. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/paths.py +0 -0
  236. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/__init__.py +0 -0
  237. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/auth.py +0 -0
  238. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/capability_manager.py +0 -0
  239. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/model_resolution.py +0 -0
  240. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/prompt_registry.py +0 -0
  241. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/runtime_events.py +0 -0
  242. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/session_hydrator.py +0 -0
  243. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/server/turn_coordinator.py +0 -0
  244. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/__init__.py +0 -0
  245. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/auth_flow.py +0 -0
  246. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/capabilities_manager.py +0 -0
  247. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/commands.py +0 -0
  248. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/connection.py +0 -0
  249. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/error_handler.py +0 -0
  250. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/model_variants.py +0 -0
  251. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/profile_manager.py +0 -0
  252. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/runtime_cache.py +0 -0
  253. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screen_router.py +0 -0
  254. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/__init__.py +0 -0
  255. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/auth.py +0 -0
  256. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/base.py +0 -0
  257. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  258. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/connection_error.py +0 -0
  259. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/console.py +0 -0
  260. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/evaluations.py +0 -0
  261. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  262. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/runtimes.py +0 -0
  263. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  264. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/secrets.py +0 -0
  265. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/services.py +0 -0
  266. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/sessions.py +0 -0
  267. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  268. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/traces.py +0 -0
  269. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/screens/workspaces.py +0 -0
  270. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/spans_reader.py +0 -0
  271. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/status_messages.py +0 -0
  272. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/theme.py +0 -0
  273. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/tool_format.py +0 -0
  274. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/turn_coordinator.py +0 -0
  275. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  276. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/turn_state_phase.py +0 -0
  277. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/__init__.py +0 -0
  278. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  279. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  280. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/composer.py +0 -0
  281. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  282. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/flash.py +0 -0
  283. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  284. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  285. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  286. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  287. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  288. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  289. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  290. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  291. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  292. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  293. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  294. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  295. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  296. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  297. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  298. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/throbber.py +0 -0
  299. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  300. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  301. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/welcome.py +0 -0
  302. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/app/tui/widgets/whoami.py +0 -0
  303. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/__init__.py +0 -0
  304. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  305. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  306. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  307. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  308. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  309. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  310. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  311. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  312. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  313. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  314. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  315. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  316. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  317. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  318. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  319. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  320. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  321. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  322. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  323. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  324. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  325. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  326. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  327. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  328. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  329. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  330. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  331. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  332. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  333. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  334. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  335. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  336. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  337. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  338. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  339. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  340. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  341. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  342. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  343. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  344. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  345. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  346. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  347. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  348. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  349. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  350. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  351. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  352. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  353. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  354. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  355. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  356. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  357. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  358. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  359. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  360. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  361. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  362. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  363. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  364. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  365. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  366. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  367. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  368. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  369. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  370. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  371. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  372. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  373. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  374. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  375. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  376. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  377. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  378. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  379. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  380. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  381. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/__init__.py +0 -0
  382. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/capability.py +0 -0
  383. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/flags.py +0 -0
  384. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/install.py +0 -0
  385. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/sync.py +0 -0
  386. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/tool_rules.py +0 -0
  387. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/capabilities/worker.py +0 -0
  388. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/__init__.py +0 -0
  389. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/conditions.py +0 -0
  390. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/discovery.py +0 -0
  391. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/environment.py +0 -0
  392. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/exceptions.py +0 -0
  393. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/execution.py +0 -0
  394. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/hook.py +0 -0
  395. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/judge.py +0 -0
  396. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/load.py +0 -0
  397. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/log.py +0 -0
  398. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/meta/__init__.py +0 -0
  399. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/meta/config.py +0 -0
  400. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/meta/context.py +0 -0
  401. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/meta/hydrate.py +0 -0
  402. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/meta/introspect.py +0 -0
  403. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/metric.py +0 -0
  404. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/object.py +0 -0
  405. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/scorer.py +0 -0
  406. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/serialization.py +0 -0
  407. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/stopping.py +0 -0
  408. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/task.py +0 -0
  409. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/templating.py +0 -0
  410. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/transforms.py +0 -0
  411. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/__init__.py +0 -0
  412. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/audio.py +0 -0
  413. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/base.py +0 -0
  414. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/common.py +0 -0
  415. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/image.py +0 -0
  416. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/object_3d.py +0 -0
  417. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/table.py +0 -0
  418. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/types/text.py +0 -0
  419. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/core/util.py +0 -0
  420. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/datasets/__init__.py +0 -0
  421. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/datasets/dataset.py +0 -0
  422. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/datasets/hf.py +0 -0
  423. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/datasets/local.py +0 -0
  424. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/__init__.py +0 -0
  425. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/console.py +0 -0
  426. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/evaluation.py +0 -0
  427. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/events.py +0 -0
  428. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/format.py +0 -0
  429. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/result.py +0 -0
  430. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/evaluations/sample.py +0 -0
  431. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/__init__.py +0 -0
  432. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/caching.py +0 -0
  433. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/chat.py +0 -0
  434. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/data.py +0 -0
  435. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/exceptions.py +0 -0
  436. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/__init__.py +0 -0
  437. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/http.py +0 -0
  438. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/transformers_.py +0 -0
  439. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/generator/vllm_.py +0 -0
  440. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/message.py +0 -0
  441. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/models.py +0 -0
  442. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/parsing.py +0 -0
  443. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/tokenizer/__init__.py +0 -0
  444. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/tokenizer/base.py +0 -0
  445. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  446. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/generators/utils.py +0 -0
  447. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/judges/__init__.py +0 -0
  448. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/judges/outcome.py +0 -0
  449. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/judges/trajectory_tools.py +0 -0
  450. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/models/__init__.py +0 -0
  451. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/models/hf.py +0 -0
  452. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/models/local.py +0 -0
  453. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/models/model.py +0 -0
  454. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/__init__.py +0 -0
  455. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/__init__.py +0 -0
  456. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  457. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/agent.py +0 -0
  458. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/env.py +0 -0
  459. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/runtime.py +0 -0
  460. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/adapters/stack.py +0 -0
  461. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/api.py +0 -0
  462. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/backends/__init__.py +0 -0
  463. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/backends/base.py +0 -0
  464. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/backends/gepa.py +0 -0
  465. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/collectors.py +0 -0
  466. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/config.py +0 -0
  467. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/console.py +0 -0
  468. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/events.py +0 -0
  469. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/format.py +0 -0
  470. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/result.py +0 -0
  471. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/sampler.py +0 -0
  472. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/sampling.py +0 -0
  473. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/search.py +0 -0
  474. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/stopping.py +0 -0
  475. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/optimization/trial.py +0 -0
  476. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/__init__.py +0 -0
  477. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/loader.py +0 -0
  478. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/packaging/package.py +0 -0
  479. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  480. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/py.typed +0 -0
  481. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/__init__.py +0 -0
  482. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/boundary.py +0 -0
  483. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/fuzzing.py +0 -0
  484. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/graph.py +0 -0
  485. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/grid.py +0 -0
  486. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/image.py +0 -0
  487. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/mapelites.py +0 -0
  488. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/optuna.py +0 -0
  489. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/random.py +0 -0
  490. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/registry.py +0 -0
  491. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/samplers/strategy.py +0 -0
  492. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/__init__.py +0 -0
  493. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  494. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/agent_security.py +0 -0
  495. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/agentic.py +0 -0
  496. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/agentic_workflow.py +0 -0
  497. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/attack_outcome.py +0 -0
  498. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/classification.py +0 -0
  499. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/consistency.py +0 -0
  500. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/contains.py +0 -0
  501. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/cosine_sim.py +0 -0
  502. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/credentials.py +0 -0
  503. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/crucible.py +0 -0
  504. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/documentation_security.py +0 -0
  505. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/exfiltration_detection.py +0 -0
  506. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/format.py +0 -0
  507. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/harm.py +0 -0
  508. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/ide_security.py +0 -0
  509. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/image.py +0 -0
  510. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/json.py +0 -0
  511. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/judge.py +0 -0
  512. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/judge_ensemble.py +0 -0
  513. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/length.py +0 -0
  514. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/lexical.py +0 -0
  515. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/mcp_security.py +0 -0
  516. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/memorization.py +0 -0
  517. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/multi_agent_security.py +0 -0
  518. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/pii.py +0 -0
  519. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/prompt_leak.py +0 -0
  520. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/readability.py +0 -0
  521. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/reasoning_security.py +0 -0
  522. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/sentiment.py +0 -0
  523. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/similarity.py +0 -0
  524. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/structural_detection.py +0 -0
  525. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/scorers/supply_chain_detection.py +0 -0
  526. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/storage/__init__.py +0 -0
  527. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/storage/providers.py +0 -0
  528. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/storage/session_store.py +0 -0
  529. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/storage/storage.py +0 -0
  530. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/_ripgrep.py +0 -0
  531. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/apply_patch.py +0 -0
  532. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/dreadnode_cli.py +0 -0
  533. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/editing.py +0 -0
  534. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/execute.py +0 -0
  535. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/fetch.py +0 -0
  536. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/glob.py +0 -0
  537. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/grep.py +0 -0
  538. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/ls.py +0 -0
  539. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/memory.py +0 -0
  540. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/report.py +0 -0
  541. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/task.py +0 -0
  542. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/think.py +0 -0
  543. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/todo.py +0 -0
  544. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/trajectory_search.py +0 -0
  545. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/web_extract.py +0 -0
  546. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/web_search.py +0 -0
  547. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tools/write.py +0 -0
  548. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/__init__.py +0 -0
  549. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/convert.py +0 -0
  550. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/exporter.py +0 -0
  551. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/exporters.py +0 -0
  552. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/spans.py +0 -0
  553. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/tracing/trace_converter.py +0 -0
  554. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/__init__.py +0 -0
  555. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/_progress.py +0 -0
  556. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/base.py +0 -0
  557. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/dpo.py +0 -0
  558. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/env_rollouts.py +0 -0
  559. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/etl/__init__.py +0 -0
  560. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/etl/_common.py +0 -0
  561. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/etl/rl.py +0 -0
  562. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/etl/sft.py +0 -0
  563. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/etl/worlds.py +0 -0
  564. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/events.py +0 -0
  565. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/grpo.py +0 -0
  566. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/jobs.py +0 -0
  567. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/models.py +0 -0
  568. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ppo.py +0 -0
  569. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/prime.py +0 -0
  570. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/__init__.py +0 -0
  571. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/async_trainer.py +0 -0
  572. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/config.py +0 -0
  573. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/coordinator.py +0 -0
  574. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/distributed.py +0 -0
  575. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/dpo.py +0 -0
  576. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/experience.py +0 -0
  577. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  578. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/inference.py +0 -0
  579. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/learner.py +0 -0
  580. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/multi_turn.py +0 -0
  581. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/ppo.py +0 -0
  582. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/reward_model.py +0 -0
  583. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/rollout_env.py +0 -0
  584. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/rollout_worker.py +0 -0
  585. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/sft.py +0 -0
  586. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/ray/trainer.py +0 -0
  587. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/recipes.py +0 -0
  588. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/__init__.py +0 -0
  589. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/aggregator.py +0 -0
  590. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/functions.py +0 -0
  591. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  592. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/shaping.py +0 -0
  593. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rewards/types.py +0 -0
  594. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/__init__.py +0 -0
  595. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/adapters.py +0 -0
  596. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  597. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/orchestrator.py +0 -0
  598. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/types.py +0 -0
  599. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/rollouts/worlds.py +0 -0
  600. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/serving/__init__.py +0 -0
  601. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/serving/vllm_client.py +0 -0
  602. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/sft.py +0 -0
  603. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/__init__.py +0 -0
  604. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/config.py +0 -0
  605. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/data.py +0 -0
  606. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/renderer.py +0 -0
  607. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/rl.py +0 -0
  608. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker/trainer.py +0 -0
  609. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/tinker_sft.py +0 -0
  610. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/training/utils.py +0 -0
  611. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/__init__.py +0 -0
  612. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  613. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/adversarial_suffix.py +0 -0
  614. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/agent_skill.py +0 -0
  615. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/agentic_workflow.py +0 -0
  616. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/audio.py +0 -0
  617. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/backdoor_finetune.py +0 -0
  618. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  619. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/cipher.py +0 -0
  620. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/competitive_parity.py +0 -0
  621. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/constitutional.py +0 -0
  622. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/document.py +0 -0
  623. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/documentation_poison.py +0 -0
  624. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/encoding.py +0 -0
  625. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/exfiltration.py +0 -0
  626. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/flip_attack.py +0 -0
  627. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/guardrail_bypass.py +0 -0
  628. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/ide_injection.py +0 -0
  629. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/image.py +0 -0
  630. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/injection.py +0 -0
  631. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/json_tools.py +0 -0
  632. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/language.py +0 -0
  633. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/logic_bomb.py +0 -0
  634. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/mcp_attacks.py +0 -0
  635. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  636. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/multimodal_attacks.py +0 -0
  637. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/persuasion.py +0 -0
  638. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/perturbation.py +0 -0
  639. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/pii_extraction.py +0 -0
  640. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/pythonic_tools.py +0 -0
  641. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/rag_poisoning.py +0 -0
  642. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/reasoning_attacks.py +0 -0
  643. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/refine.py +0 -0
  644. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/response_steering.py +0 -0
  645. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/structural_exploits.py +0 -0
  646. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/stylistic.py +0 -0
  647. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/substitution.py +0 -0
  648. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/supply_chain.py +0 -0
  649. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/swap.py +0 -0
  650. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  651. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/text.py +0 -0
  652. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/video.py +0 -0
  653. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/transforms/xml_tools.py +0 -0
  654. {dreadnode-2.0.30 → dreadnode-2.0.32}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.30
3
+ Version: 2.0.32
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -21,19 +21,19 @@ Requires-Dist: gepa>=0.1.1
21
21
  Requires-Dist: httpx<1.0.0,>=0.28.0
22
22
  Requires-Dist: jsonpath-ng>=1.7.0
23
23
  Requires-Dist: jsonref>=1.1.0
24
- Requires-Dist: litellm<=1.83.14,>=1.83.14
24
+ Requires-Dist: litellm<=1.84.0,>=1.84.0
25
25
  Requires-Dist: logfire<=3.20.0,>=3.5.3
26
26
  Requires-Dist: loguru>=0.7.3
27
+ Requires-Dist: markdown-it-py[linkify]>=2.1.0
27
28
  Requires-Dist: markdownify<2.0.0,>=1.1.0
28
29
  Requires-Dist: mcp<2.0.0,>=1.25.0
29
- Requires-Dist: moviepy<3.0.0,>=2.1.2
30
30
  Requires-Dist: networkx>=3.6.1
31
31
  Requires-Dist: numpy<=2.3.5,>=2.3.0
32
32
  Requires-Dist: optuna<5.0.0,>=4.5.0
33
33
  Requires-Dist: orjson>=3.11.5
34
34
  Requires-Dist: packaging>=24.0
35
35
  Requires-Dist: pandas<3.0.0,>=2.2.3
36
- Requires-Dist: pillow<12.0.0,>=11.2.1
36
+ Requires-Dist: pillow<13.0.0,>=11.0.0
37
37
  Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
38
38
  Requires-Dist: pyarrow>=4.0.0
39
39
  Requires-Dist: pydantic-xml>=2.14.0
@@ -41,7 +41,7 @@ Requires-Dist: pydantic<3.0.0,>=2.9.2
41
41
  Requires-Dist: pyyaml>=6.0.2
42
42
  Requires-Dist: scipy<2.0.0,>=1.11.0
43
43
  Requires-Dist: soundfile<1.0.0,>=0.13.1
44
- Requires-Dist: starlette<1.1.0,>=1.0.1
44
+ Requires-Dist: starlette<1.4.0,>=1.3.1
45
45
  Requires-Dist: textual>=8.0.2
46
46
  Requires-Dist: transformers>=4.57.1
47
47
  Requires-Dist: uvicorn>=0.34.0
@@ -49,6 +49,7 @@ Requires-Dist: websockets>=14.0
49
49
  Requires-Dist: xmltodict>=1.0.2
50
50
  Provides-Extra: all
51
51
  Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'all'
52
+ Requires-Dist: moviepy<3.0.0,>=2.1.2; extra == 'all'
52
53
  Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'all'
53
54
  Requires-Dist: presidio-analyzer<3.0.0,>=2.2.359; extra == 'all'
54
55
  Requires-Dist: python-jsonpath>=2.0.1; extra == 'all'
@@ -59,6 +60,8 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == 'all'
59
60
  Requires-Dist: textblob<1.0.0,>=0.19.0; extra == 'all'
60
61
  Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'all'
61
62
  Requires-Dist: torch>=2.9.0; extra == 'all'
63
+ Provides-Extra: claude-code
64
+ Requires-Dist: claude-agent-sdk>=0.1.0; extra == 'claude-code'
62
65
  Provides-Extra: scoring
63
66
  Requires-Dist: confusables<2.0.0,>=1.2.0; extra == 'scoring'
64
67
  Requires-Dist: nltk<4.0.0,>=3.9.1; extra == 'scoring'
@@ -72,6 +75,8 @@ Requires-Dist: textstat<1.0.0,>=0.7.10; extra == 'scoring'
72
75
  Provides-Extra: training
73
76
  Requires-Dist: ray[default,serve]<3.0.0,>=2.10.0; extra == 'training'
74
77
  Requires-Dist: torch>=2.9.0; extra == 'training'
78
+ Provides-Extra: video
79
+ Requires-Dist: moviepy<3.0.0,>=2.1.2; extra == 'video'
75
80
  Description-Content-Type: text/markdown
76
81
 
77
82
  <p align="center">
@@ -20,6 +20,7 @@ from pydantic import (
20
20
  )
21
21
 
22
22
  import dreadnode
23
+ from dreadnode.agents.engines import AgentEngine, EngineContext, PermissionBridge, resolve_engine
23
24
  from dreadnode.agents.events import (
24
25
  AgentEnd,
25
26
  AgentError,
@@ -185,10 +186,22 @@ class Agent(Executor[AgentEvent, Trajectory]):
185
186
  """Base factor for exponential backoff: wait = base_factor * 2 ** (attempt - 1)."""
186
187
  backoff_jitter: bool = Config(default=True)
187
188
  """Whether to add up to ``backoff_base_factor`` seconds of random jitter to each wait."""
189
+ engine: str | AgentEngine | None = Config(default=None, expose_as=str | None)
190
+ """Owner of the agent loop. ``None``/``"native"`` runs the in-process loop; a
191
+ built-in name (e.g. ``"claude-code"``) or a ``mod:attr`` reference delegates the
192
+ loop to a foreign harness while sessions/eval/optimization/policy keep working."""
188
193
 
189
194
  # Private state
190
195
  _generator: Generator | None = PrivateAttr(None, init=False)
191
196
  _current_input: str = PrivateAttr("", init=False)
197
+ _capability: tuple[str, str] | None = PrivateAttr(None, init=False)
198
+ """The (name, version) capability this agent runs under, if any. Bound to
199
+ ``current_capability`` for the duration of a run (and reset afterward) so
200
+ runtime tools attribute emitted items to the right producer without leaking
201
+ attribution into later agents that share the async context."""
202
+ _permission_bridge: PermissionBridge | None = PrivateAttr(None, init=False)
203
+ """Tool-approval bridge injected by the runtime so foreign engines wire their
204
+ permission callback into the native HITL path. ``None`` for bare-SDK use."""
192
205
 
193
206
  # Discoverability namespace for the AgentJudge specialized construction.
194
207
  # Assigned at module-load time by ``dreadnode.agents.__init__._lazy_init``
@@ -660,6 +673,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
660
673
  # out of the result body.
661
674
  tool_error = message.metadata.get("error")
662
675
  tool_error_type = message.metadata.get("error_type")
676
+ tool_cost_usd = message.metadata.get("subagent_cost_usd")
663
677
 
664
678
  end_event = ToolEnd(
665
679
  agent_id=self.agent_id,
@@ -670,6 +684,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
670
684
  stop=stop,
671
685
  error=tool_error,
672
686
  error_type=tool_error_type,
687
+ cost_usd=tool_cost_usd,
673
688
  )
674
689
  async for event in self._dispatch(end_event):
675
690
  yield event
@@ -715,6 +730,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
715
730
 
716
731
  async def _stream(
717
732
  self, trajectory: Trajectory | None = None
733
+ ) -> t.AsyncGenerator[AgentEvent, None]:
734
+ """Drive the loop through the resolved :class:`AgentEngine`.
735
+
736
+ For the native engine this delegates straight to ``_native_run_loop``
737
+ (which dispatches its own hooks inline). Foreign engines yield translated
738
+ native events and call ``ctx.dispatch`` themselves for observational hooks.
739
+ This shim is the ``Executor._stream`` implementation; the surrounding span,
740
+ trajectory accumulation, and tool-context management stay in ``stream``.
741
+ """
742
+ engine = self._resolve_engine()
743
+ ctx = EngineContext(
744
+ agent=self,
745
+ trajectory=trajectory if trajectory is not None else self.trajectory,
746
+ goal=self._current_input,
747
+ dispatch=self._dispatch,
748
+ permission=self._permission_bridge,
749
+ )
750
+ async for event in engine.run_loop(ctx):
751
+ yield event
752
+
753
+ def _resolve_engine(self) -> AgentEngine:
754
+ """Resolve this agent's ``engine`` selector to a concrete engine instance."""
755
+ return resolve_engine(self.engine)
756
+
757
+ async def _native_run_loop(
758
+ self, trajectory: Trajectory | None = None
718
759
  ) -> t.AsyncGenerator[AgentEvent, None]:
719
760
  """
720
761
  Core agent execution loop with inline tracing.
@@ -1168,6 +1209,13 @@ class Agent(Executor[AgentEvent, Trajectory]):
1168
1209
  active_trajectory = self.trajectory
1169
1210
 
1170
1211
  async with AsyncExitStack() as stack:
1212
+ # Scope capability attribution to THIS run (reset on exit) so it never
1213
+ # leaks into a later agent sharing the async context.
1214
+ if self._capability is not None:
1215
+ from dreadnode.tracing.span import bind_capability
1216
+
1217
+ stack.enter_context(bind_capability(self._capability))
1218
+
1171
1219
  # Enter tool contexts
1172
1220
  for tool_container in self.tools:
1173
1221
  if hasattr(tool_container, "__aenter__") and hasattr(tool_container, "__aexit__"):
@@ -0,0 +1,27 @@
1
+ # AGENTS.md — agent engines
2
+
3
+ An **engine** owns the agent loop. The native engine is the default; foreign
4
+ engines (e.g. `claude-code`) delegate the loop to an external harness while the
5
+ agent stays a first-class `Agent`. Canonical contract: `specs/capabilities/engines.md`
6
+ (`CAP-ENG-*`, `CAP-ERES-*`, `CAP-EGOV-*`, `CAP-EBIND-*`).
7
+
8
+ ## Files
9
+
10
+ - `base.py` — `AgentEngine` ABC, `EngineContext`, `EnforcementSurface`, `PolicyFacet`, `PermissionBridge`.
11
+ - `native.py` — `NativeEngine`, a thin delegate to `Agent._native_run_loop` (the historical loop body). Keep native byte-for-byte: the loop logic stays on `Agent`.
12
+ - `__init__.py` — registry (`register_engine`) + `resolve_engine` (built-in name / class / instance / `module.path:ClassName`).
13
+
14
+ ## Authoring a built-in engine
15
+
16
+ 1. Subclass `AgentEngine`, set a stable `name`, implement `async def run_loop(self, ctx)` yielding native `AgentEvent`s and exactly one terminal `AgentEnd`.
17
+ 2. Call `register_engine(YourEngine)` in `__init__.py`.
18
+ 3. Translate the harness's activity into native events; do **not** invent a new event schema.
19
+ 4. If you do not dispatch inline, call `ctx.dispatch(event)` on every translated event so observational hooks run (leave `dispatches_internally = False`).
20
+ 5. Override `describe_enforcement(policy)` with an **honest** `EnforcementSurface` — do not claim `enforces` for a facet you only observe. Override `honored_config()` with the explicit set of `Agent` fields you respect, and `consumed_components()` with the capability component kinds you actually use (Decision A: a harness with its own tools consumes none of ours — don't claim `python_tools` you don't inject; see `CAP-ENG-020..025`).
21
+
22
+ ## MUST / NEVER
23
+
24
+ - **MUST** keep the `native` path unchanged — the existing agent-loop test suite is the regression gate.
25
+ - **MUST** spawn third-party / subprocess engines inside the runtime sandbox, never in-process in the runtime (`CAP-EBIND-002`).
26
+ - **NEVER** let an engine silently downgrade governance: an un-enforceable required policy facet must surface as a refusal/warning via reconciliation, not be ignored.
27
+ - **NEVER** import `Agent` at module load (cycle): use `if TYPE_CHECKING` and reach the agent through `ctx.agent`.
@@ -0,0 +1,89 @@
1
+ """Agent engines — pluggable, overridable owners of the agent loop.
2
+
3
+ Built-ins are resolved by name (``native``, ``claude-code``); customer engines
4
+ are resolved from a ``mod:attr`` reference (mirroring ``WorkerDef`` import refs).
5
+ Resolution precedence for the ``engine`` selector itself lives in
6
+ ``create_agent`` and mirrors how ``model`` resolves.
7
+ """
8
+
9
+ import importlib
10
+
11
+ from dreadnode.agents.engines.base import (
12
+ AgentEngine,
13
+ CapabilityComponent,
14
+ EnforcementSurface,
15
+ EngineContext,
16
+ PermissionBridge,
17
+ PolicyFacet,
18
+ )
19
+ from dreadnode.agents.engines.claude_code import ClaudeCodeEngine, ClaudeCodeTranslationState
20
+ from dreadnode.agents.engines.native import NativeEngine
21
+
22
+ __all__ = [
23
+ "AgentEngine",
24
+ "CapabilityComponent",
25
+ "ClaudeCodeEngine",
26
+ "ClaudeCodeTranslationState",
27
+ "EnforcementSurface",
28
+ "EngineContext",
29
+ "NativeEngine",
30
+ "PermissionBridge",
31
+ "PolicyFacet",
32
+ "register_engine",
33
+ "resolve_engine",
34
+ ]
35
+
36
+ _REGISTRY: dict[str, type[AgentEngine]] = {}
37
+
38
+
39
+ def register_engine(cls: type[AgentEngine]) -> type[AgentEngine]:
40
+ """Register a built-in engine class under its ``name`` (usable as a decorator)."""
41
+ name = getattr(cls, "name", None)
42
+ if not name:
43
+ raise ValueError(f"Engine {cls!r} must define a non-empty 'name'.")
44
+ _REGISTRY[name] = cls
45
+ return cls
46
+
47
+
48
+ register_engine(NativeEngine)
49
+ register_engine(ClaudeCodeEngine)
50
+
51
+
52
+ def _load_engine_from_ref(ref: str) -> type[AgentEngine]:
53
+ """Import an engine class from a ``module.path:Attr`` or ``module.path.Attr`` ref."""
54
+ module_path, _, attr = ref.partition(":")
55
+ if not attr:
56
+ module_path, _, attr = ref.rpartition(".")
57
+ if not module_path or not attr:
58
+ raise ValueError(f"Invalid engine reference {ref!r}; expected 'module.path:ClassName'.")
59
+ try:
60
+ module = importlib.import_module(module_path)
61
+ except ImportError as exc:
62
+ raise ValueError(f"Could not import engine module '{module_path}' from {ref!r}.") from exc
63
+ obj = getattr(module, attr, None)
64
+ if obj is None or not (isinstance(obj, type) and issubclass(obj, AgentEngine)):
65
+ raise ValueError(f"Engine reference {ref!r} did not resolve to an AgentEngine subclass.")
66
+ return obj
67
+
68
+
69
+ def resolve_engine(spec: "str | AgentEngine | type[AgentEngine] | None") -> AgentEngine:
70
+ """Resolve an ``engine`` selector to a concrete :class:`AgentEngine` instance.
71
+
72
+ Accepts ``None`` (→ native), an instance, a class, a built-in name, or a
73
+ ``mod:attr`` reference. A fresh instance is returned for class/name/ref specs
74
+ so stateful engines (subprocess-backed) don't leak state across turns.
75
+ """
76
+ if spec is None:
77
+ return NativeEngine()
78
+ if isinstance(spec, AgentEngine):
79
+ return spec
80
+ if isinstance(spec, type) and issubclass(spec, AgentEngine):
81
+ return spec()
82
+ if isinstance(spec, str):
83
+ if spec in _REGISTRY:
84
+ return _REGISTRY[spec]()
85
+ if ":" in spec or "." in spec:
86
+ return _load_engine_from_ref(spec)()
87
+ known = ", ".join(sorted(_REGISTRY)) or "(none)"
88
+ raise ValueError(f"Unknown engine '{spec}'. Known built-ins: {known}.")
89
+ raise TypeError(f"Unsupported engine selector: {spec!r}")
@@ -0,0 +1,166 @@
1
+ """Engine contract for the agent loop.
2
+
3
+ An :class:`AgentEngine` owns the *interior* of an agent — the loop that turns a
4
+ goal into generation/tool events. The native engine is the default; foreign
5
+ engines (e.g. ``claude-code``) delegate the loop to an external harness while the
6
+ rest of the stack (sessions, eval, optimization, policy, telemetry, TUI) keeps
7
+ working because the foreign agent is still an :class:`~dreadnode.agents.agent.Agent`.
8
+
9
+ See ``specs/capabilities/engines.md`` (ENG-*) for the canonical contract.
10
+ """
11
+
12
+ import typing as t
13
+ from abc import ABC, abstractmethod
14
+ from dataclasses import dataclass, field
15
+ from enum import StrEnum
16
+
17
+ if t.TYPE_CHECKING:
18
+ from dreadnode.agents.agent import Agent
19
+ from dreadnode.agents.events import AgentEvent
20
+ from dreadnode.agents.trajectory import Trajectory
21
+
22
+
23
+ class PolicyFacet(StrEnum):
24
+ """A single governable dimension of a session policy.
25
+
26
+ An engine declares, per facet, whether it *enforces* it, *bridges* it via a
27
+ harness callback, can only *observe* it, or has *no equivalent* mechanism.
28
+ The runtime reconciles the session policy against that declaration (ENG-REC-*).
29
+ """
30
+
31
+ AUTONOMY = "autonomy"
32
+ """Block-vs-auto-allow (native ``is_autonomous`` / harness ``permission_mode``)."""
33
+ TOOL_APPROVAL = "tool_approval"
34
+ """Human-in-the-loop tool approval (``ask_user`` → ``prompt.required``)."""
35
+ STEP_BUDGET = "step_budget"
36
+ """Step/turn ceiling (``max_steps`` / harness ``max_turns``)."""
37
+ TOKEN_BUDGET = "token_budget" # noqa: S105 (facet name, not a secret)
38
+ """Token ceiling (no harness equivalent — enforced by killing the run)."""
39
+ COST_BUDGET = "cost_budget"
40
+ """Cost ceiling (no harness equivalent — enforced by killing the run)."""
41
+ TIME_BUDGET = "time_budget"
42
+ """Wall-clock ceiling (no harness equivalent — enforced by killing the run)."""
43
+ GUARD_STEERING = "guard_steering"
44
+ """Mid-loop prevention/steering via hook ``Reaction`` (in-loop only)."""
45
+ SCORERS = "scorers"
46
+ """Observational scorers/detectors/metrics (attach to events after the fact)."""
47
+
48
+
49
+ class CapabilityComponent(StrEnum):
50
+ """A kind of capability-declared resource an engine may or may not consume.
51
+
52
+ The native engine consumes all kinds (it executes our tools in-loop and
53
+ surfaces our skills). A foreign engine that brings its own tools declares a
54
+ subset; the runtime informs the author which declared components are inert
55
+ under that engine (CAP-ENG-022). See ``specs/capabilities/engines.md``.
56
+ """
57
+
58
+ PYTHON_TOOLS = "python_tools"
59
+ """Capability ``@tool`` / MCP tools from our registry, executed in-loop."""
60
+ MCP_SERVERS = "mcp_servers"
61
+ """MCP servers the capability declares (folded with python_tools today)."""
62
+ SKILLS = "skills"
63
+ """``SKILL.md`` directories (the shared Agent Skills standard)."""
64
+
65
+
66
+ @dataclass(frozen=True)
67
+ class EnforcementSurface:
68
+ """What an engine can actually do about each policy facet.
69
+
70
+ A facet absent from all four sets is treated as ``observes_only`` by the
71
+ reconciler (the conservative default).
72
+ """
73
+
74
+ enforces: frozenset[PolicyFacet] = field(default_factory=frozenset)
75
+ """Enforced natively or by translatable config (e.g. ``permission_mode``)."""
76
+ bridges: frozenset[PolicyFacet] = field(default_factory=frozenset)
77
+ """Enforced by wiring a harness callback back into our control plane."""
78
+ observes_only: frozenset[PolicyFacet] = field(default_factory=frozenset)
79
+ """Visible after the harness acted — can record, cannot prevent."""
80
+ no_equivalent: frozenset[PolicyFacet] = field(default_factory=frozenset)
81
+ """No mechanism in the harness — enforceable only by killing the run."""
82
+
83
+ @classmethod
84
+ def all_enforced(cls) -> "EnforcementSurface":
85
+ """The native engine's surface: it owns the loop, so it enforces everything."""
86
+ return cls(enforces=frozenset(PolicyFacet))
87
+
88
+
89
+ @t.runtime_checkable
90
+ class PermissionBridge(t.Protocol):
91
+ """Bridges a harness tool-approval callback into the native HITL path.
92
+
93
+ Implemented by the runtime over ``_human_prompt_handler`` so a foreign
94
+ engine's ``can_use_tool`` reuses the existing ``prompt.required`` /
95
+ ``prompt.respond`` protocol (TUI widget, eval-worker auto-deny). Wired in M1.
96
+ """
97
+
98
+ async def request_tool_approval(
99
+ self, *, tool_name: str, tool_input: dict[str, t.Any]
100
+ ) -> bool: ...
101
+
102
+
103
+ @dataclass
104
+ class EngineContext:
105
+ """Everything an engine needs to run one turn.
106
+
107
+ The native engine uses only ``agent`` + ``trajectory`` (it reaches the rest
108
+ through ``agent``). Foreign engines additionally use ``goal``, ``dispatch``
109
+ (to run observational hooks on translated events), and ``permission``.
110
+ """
111
+
112
+ agent: "Agent"
113
+ trajectory: "Trajectory"
114
+ goal: str
115
+ dispatch: "t.Callable[[AgentEvent], t.AsyncIterator[AgentEvent]]"
116
+ """Run an event through the agent's hooks (metrics + reactions). Foreign
117
+ engines call this per translated event; the native engine dispatches inline."""
118
+ permission: "PermissionBridge | None" = None
119
+
120
+
121
+ class AgentEngine(ABC):
122
+ """Pluggable owner of the agent loop.
123
+
124
+ Implementations live in this package (built-ins) or are supplied by a
125
+ customer via a ``mod:attr`` reference. Built-ins register via
126
+ :func:`~dreadnode.agents.engines.register_engine`.
127
+ """
128
+
129
+ name: t.ClassVar[str]
130
+ """Stable identifier used in ``engine:`` declarations and the registry."""
131
+
132
+ dispatches_internally: t.ClassVar[bool] = False
133
+ """True when ``run_loop`` already routes its events through ``ctx.dispatch``
134
+ (the native engine does, inline). Foreign engines leave this False and call
135
+ ``ctx.dispatch`` themselves on translated events."""
136
+
137
+ @abstractmethod
138
+ def run_loop(self, ctx: EngineContext) -> "t.AsyncIterator[AgentEvent]":
139
+ """Drive one turn, yielding native ``AgentEvent``s as it progresses."""
140
+ ...
141
+
142
+ def describe_enforcement(self, policy: t.Any) -> EnforcementSurface: # noqa: ARG002
143
+ """Declare which policy facets this engine can enforce for ``policy``.
144
+
145
+ Defaults to fully-enforced (correct for any engine that owns a native
146
+ loop). Foreign engines override with an honest, partial surface.
147
+ """
148
+ return EnforcementSurface.all_enforced()
149
+
150
+ def honored_config(self) -> set[str] | None:
151
+ """Which ``Agent`` config fields this engine respects.
152
+
153
+ ``None`` means "all" (the native engine). A foreign engine returns the
154
+ explicit set it honors so the runtime can warn about ignored config.
155
+ """
156
+ return None
157
+
158
+ def consumed_components(self) -> set[CapabilityComponent]:
159
+ """Which capability component kinds this engine consumes.
160
+
161
+ Defaults to all (the native engine executes our tools in-loop and
162
+ surfaces our skills). A foreign engine that uses its own tools returns a
163
+ subset; the runtime informs the author about the unconsumed components
164
+ a capability declares (CAP-ENG-022).
165
+ """
166
+ return set(CapabilityComponent)