dreadnode 2.0.30__tar.gz → 2.0.31__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 (647) hide show
  1. {dreadnode-2.0.30 → dreadnode-2.0.31}/PKG-INFO +7 -4
  2. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/agent.py +36 -0
  3. dreadnode-2.0.31/dreadnode/agents/engines/AGENTS.md +27 -0
  4. dreadnode-2.0.31/dreadnode/agents/engines/__init__.py +89 -0
  5. dreadnode-2.0.31/dreadnode/agents/engines/base.py +166 -0
  6. dreadnode-2.0.31/dreadnode/agents/engines/claude_code.py +528 -0
  7. dreadnode-2.0.31/dreadnode/agents/engines/native.py +26 -0
  8. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/events.py +6 -0
  9. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/client.py +76 -2
  10. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/subagent.py +9 -2
  11. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/tools.py +4 -0
  12. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/assessment.py +11 -2
  13. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/client.py +272 -0
  14. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/models.py +18 -0
  15. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/airt.py +20 -5
  16. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/args.py +1 -0
  17. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/environment.py +20 -0
  18. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/evaluation.py +72 -0
  19. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/main.py +35 -5
  20. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/shared.py +46 -0
  21. dreadnode-2.0.31/dreadnode/app/cli/task_set.py +791 -0
  22. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/managed_client.py +4 -0
  23. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/runtime_client.py +6 -0
  24. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/print_mode.py +96 -1
  25. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/app.py +203 -3
  26. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/prompt.py +57 -0
  27. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/session_persistence.py +29 -1
  28. dreadnode-2.0.31/dreadnode/app/server/utils.py +59 -0
  29. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/websocket.py +14 -3
  30. dreadnode-2.0.31/dreadnode/app/server/ws_auth.py +76 -0
  31. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/app.py +22 -1
  32. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/command_dispatcher.py +4 -1
  33. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/dreadnode.tcss +11 -0
  34. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/model_manager.py +7 -2
  35. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/sessions_manager.py +16 -14
  36. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_reducer.py +8 -0
  37. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/context_bar.py +9 -1
  38. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/conversation.py +80 -30
  39. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tool.py +68 -6
  40. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/wire_events.py +4 -0
  41. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +2 -0
  42. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +10 -9
  43. dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +130 -0
  44. dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +109 -0
  45. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +2 -2
  46. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +20 -2
  47. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +20 -0
  48. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +24 -0
  49. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +1 -0
  50. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +1 -0
  51. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -0
  52. dreadnode-2.0.31/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +223 -0
  53. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +1 -0
  54. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +10 -0
  55. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +10 -0
  56. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +1 -1
  57. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +3 -0
  58. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
  59. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/loader.py +6 -0
  60. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/types.py +4 -0
  61. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/base.py +12 -5
  62. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/litellm_.py +158 -0
  63. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/proxy.py +22 -0
  64. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/trajectory.py +3 -39
  65. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/jobs.py +4 -27
  66. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/study.py +38 -3
  67. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/task_validation.py +83 -17
  68. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/__init__.py +23 -0
  69. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/guard.py +13 -0
  70. dreadnode-2.0.31/dreadnode/policies/reconciliation.py +138 -0
  71. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/__init__.py +9 -1
  72. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/interaction.py +54 -0
  73. dreadnode-2.0.31/dreadnode/tools/project_memory.py +318 -0
  74. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/read.py +12 -2
  75. {dreadnode-2.0.30 → dreadnode-2.0.31}/pyproject.toml +13 -4
  76. dreadnode-2.0.30/dreadnode/app/server/utils.py +0 -25
  77. {dreadnode-2.0.30 → dreadnode-2.0.31}/.gitignore +0 -0
  78. {dreadnode-2.0.30 → dreadnode-2.0.31}/LICENSE +0 -0
  79. {dreadnode-2.0.30 → dreadnode-2.0.31}/README.md +0 -0
  80. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/__init__.py +0 -0
  81. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/__main__.py +0 -0
  82. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/__init__.py +0 -0
  83. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/exceptions.py +0 -0
  84. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/format.py +0 -0
  85. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/hooks.py +0 -0
  86. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/judge.py +0 -0
  87. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/__init__.py +0 -0
  88. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/auth.py +0 -0
  89. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/config.py +0 -0
  90. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/mcp/server.py +0 -0
  91. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/process_judge.py +0 -0
  92. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/reactions.py +0 -0
  93. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/skills.py +0 -0
  94. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/stopping.py +0 -0
  95. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/tool_resolution.py +0 -0
  96. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/agents/trajectory.py +0 -0
  97. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/__init__.py +0 -0
  98. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/adversarial_reasoning.py +0 -0
  99. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/advpromptier.py +0 -0
  100. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/alignment_faking.py +0 -0
  101. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analogy_escalation.py +0 -0
  102. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/__init__.py +0 -0
  103. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/aggregator.py +0 -0
  104. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/classifier.py +0 -0
  105. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/compliance.py +0 -0
  106. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/engine.py +0 -0
  107. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/recommendations.py +0 -0
  108. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/analytics/types.py +0 -0
  109. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/aprt_progressive.py +0 -0
  110. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/attention_shifting.py +0 -0
  111. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/autodan_turbo.py +0 -0
  112. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/autoredteamer.py +0 -0
  113. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/beast.py +0 -0
  114. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/__init__.py +0 -0
  115. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/atlas.py +0 -0
  116. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/nist.py +0 -0
  117. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/owasp.py +0 -0
  118. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  119. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/compliance/saif.py +0 -0
  120. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/constants.py +0 -0
  121. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/cot_jailbreak.py +0 -0
  122. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/crescendo.py +0 -0
  123. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/__init__.py +0 -0
  124. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  125. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  126. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/assets/image/meth.png +0 -0
  127. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  128. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  129. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  130. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  131. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  132. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  133. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  134. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  135. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  136. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  137. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  138. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  139. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  140. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  141. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  142. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  143. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  144. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  145. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/deep_inception.py +0 -0
  146. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/drattack.py +0 -0
  147. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/echo_chamber.py +0 -0
  148. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/events.py +0 -0
  149. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/genetic_persona.py +0 -0
  150. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/goat.py +0 -0
  151. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/goat_v2.py +0 -0
  152. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/gptfuzzer.py +0 -0
  153. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/humor_bypass.py +0 -0
  154. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/image.py +0 -0
  155. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/j2_meta.py +0 -0
  156. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/jbdistill.py +0 -0
  157. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/jbfuzz.py +0 -0
  158. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/lrm_autonomous.py +0 -0
  159. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/mapf.py +0 -0
  160. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/multimodal.py +0 -0
  161. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/nexus.py +0 -0
  162. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/pair.py +0 -0
  163. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/persona_hijack.py +0 -0
  164. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/prompt.py +0 -0
  165. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/quantization_safety.py +0 -0
  166. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/rainbow.py +0 -0
  167. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/refusal_aware.py +0 -0
  168. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/renellm.py +0 -0
  169. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/__init__.py +0 -0
  170. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/json_report.py +0 -0
  171. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/llm_summary.py +0 -0
  172. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reporting/markdown.py +0 -0
  173. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/reward_hacking.py +0 -0
  174. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/salami_slicing.py +0 -0
  175. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/self_persuasion.py +0 -0
  176. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/siren.py +0 -0
  177. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/tap.py +0 -0
  178. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/templatefuzz.py +0 -0
  179. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/tmap_trajectory.py +0 -0
  180. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/trojail.py +0 -0
  181. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/airt/watermark_removal.py +0 -0
  182. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/__init__.py +0 -0
  183. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/api/__init__.py +0 -0
  184. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/__init__.py +0 -0
  185. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/capability.py +0 -0
  186. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/dataset.py +0 -0
  187. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/inference_model.py +0 -0
  188. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/judge.py +0 -0
  189. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/model.py +0 -0
  190. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/optimize.py +0 -0
  191. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/runtime.py +0 -0
  192. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/sandbox.py +0 -0
  193. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/secret.py +0 -0
  194. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/session.py +0 -0
  195. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/task.py +0 -0
  196. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/__init__.py +0 -0
  197. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  198. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  199. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  200. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  201. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  202. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  203. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  204. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  205. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  206. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/train.py +0 -0
  207. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/cli/worlds.py +0 -0
  208. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/__init__.py +0 -0
  209. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/interactive.py +0 -0
  210. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/models.py +0 -0
  211. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/client/transports.py +0 -0
  212. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/config.py +0 -0
  213. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/env.py +0 -0
  214. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/main.py +0 -0
  215. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/model_catalog.py +0 -0
  216. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/paths.py +0 -0
  217. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/__init__.py +0 -0
  218. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/auth.py +0 -0
  219. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/capability_manager.py +0 -0
  220. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/model_resolution.py +0 -0
  221. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/prompt_registry.py +0 -0
  222. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/runtime_events.py +0 -0
  223. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/session_hydrator.py +0 -0
  224. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/turn_coordinator.py +0 -0
  225. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/server/worker_manager.py +0 -0
  226. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/__init__.py +0 -0
  227. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/auth_flow.py +0 -0
  228. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/capabilities_manager.py +0 -0
  229. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/commands.py +0 -0
  230. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/connection.py +0 -0
  231. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/error_handler.py +0 -0
  232. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/model_variants.py +0 -0
  233. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/profile_manager.py +0 -0
  234. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/runtime_cache.py +0 -0
  235. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screen_router.py +0 -0
  236. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/__init__.py +0 -0
  237. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/auth.py +0 -0
  238. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/base.py +0 -0
  239. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/capabilities.py +0 -0
  240. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  241. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/connection_error.py +0 -0
  242. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/console.py +0 -0
  243. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/environments.py +0 -0
  244. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/evaluations.py +0 -0
  245. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/models.py +0 -0
  246. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  247. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/runtimes.py +0 -0
  248. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  249. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/secrets.py +0 -0
  250. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/services.py +0 -0
  251. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/sessions.py +0 -0
  252. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  253. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/traces.py +0 -0
  254. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/screens/workspaces.py +0 -0
  255. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/spans_reader.py +0 -0
  256. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/status_messages.py +0 -0
  257. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/theme.py +0 -0
  258. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/tool_format.py +0 -0
  259. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_coordinator.py +0 -0
  260. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  261. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/turn_state_phase.py +0 -0
  262. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/update_check.py +0 -0
  263. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/__init__.py +0 -0
  264. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  265. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  266. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/composer.py +0 -0
  267. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  268. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/flash.py +0 -0
  269. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  270. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  271. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  272. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  273. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  274. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  275. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  276. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  277. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  278. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  279. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  280. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  281. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  282. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  283. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  284. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/throbber.py +0 -0
  285. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  286. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  287. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/welcome.py +0 -0
  288. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/app/tui/widgets/whoami.py +0 -0
  289. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/__init__.py +0 -0
  290. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  291. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  292. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  293. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  294. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  295. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  296. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  297. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  298. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  299. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  300. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  301. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  302. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  303. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  304. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  305. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  306. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  307. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  308. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  309. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  310. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  311. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  312. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  313. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  314. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  315. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  316. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  317. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  318. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  319. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  320. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  321. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  322. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  323. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  324. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  325. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  326. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  327. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  328. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  329. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  330. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  331. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  332. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  333. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  334. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  335. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  336. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  337. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  338. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  339. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  340. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  341. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  342. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  343. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  344. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  345. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  346. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  347. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  348. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  349. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  350. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  351. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  352. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  353. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  354. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  355. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  356. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  357. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  358. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  359. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  360. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  361. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  362. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  363. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  364. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  365. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  366. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  367. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  368. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/__init__.py +0 -0
  369. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/capability.py +0 -0
  370. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/flags.py +0 -0
  371. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/install.py +0 -0
  372. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/sync.py +0 -0
  373. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/tool_rules.py +0 -0
  374. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/worker.py +0 -0
  375. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/capabilities/worker_runner.py +0 -0
  376. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/__init__.py +0 -0
  377. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/conditions.py +0 -0
  378. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/discovery.py +0 -0
  379. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/environment.py +0 -0
  380. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/exceptions.py +0 -0
  381. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/execution.py +0 -0
  382. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/hook.py +0 -0
  383. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/judge.py +0 -0
  384. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/load.py +0 -0
  385. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/log.py +0 -0
  386. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/__init__.py +0 -0
  387. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/config.py +0 -0
  388. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/context.py +0 -0
  389. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/hydrate.py +0 -0
  390. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/meta/introspect.py +0 -0
  391. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/metric.py +0 -0
  392. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/object.py +0 -0
  393. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/scorer.py +0 -0
  394. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/serialization.py +0 -0
  395. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/stopping.py +0 -0
  396. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/task.py +0 -0
  397. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/templating.py +0 -0
  398. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/transforms.py +0 -0
  399. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/__init__.py +0 -0
  400. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/audio.py +0 -0
  401. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/base.py +0 -0
  402. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/common.py +0 -0
  403. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/image.py +0 -0
  404. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/object_3d.py +0 -0
  405. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/table.py +0 -0
  406. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/text.py +0 -0
  407. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/types/video.py +0 -0
  408. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/core/util.py +0 -0
  409. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/__init__.py +0 -0
  410. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/dataset.py +0 -0
  411. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/hf.py +0 -0
  412. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/datasets/local.py +0 -0
  413. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/__init__.py +0 -0
  414. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/console.py +0 -0
  415. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/evaluation.py +0 -0
  416. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/events.py +0 -0
  417. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/format.py +0 -0
  418. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/result.py +0 -0
  419. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/evaluations/sample.py +0 -0
  420. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/__init__.py +0 -0
  421. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/caching.py +0 -0
  422. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/chat.py +0 -0
  423. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/data.py +0 -0
  424. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/exceptions.py +0 -0
  425. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/__init__.py +0 -0
  426. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/http.py +0 -0
  427. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/transformers_.py +0 -0
  428. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/generator/vllm_.py +0 -0
  429. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/message.py +0 -0
  430. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/models.py +0 -0
  431. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/parsing.py +0 -0
  432. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/__init__.py +0 -0
  433. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/base.py +0 -0
  434. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  435. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/generators/utils.py +0 -0
  436. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/__init__.py +0 -0
  437. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/outcome.py +0 -0
  438. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/judges/trajectory_tools.py +0 -0
  439. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/__init__.py +0 -0
  440. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/hf.py +0 -0
  441. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/local.py +0 -0
  442. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/models/model.py +0 -0
  443. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/__init__.py +0 -0
  444. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/__init__.py +0 -0
  445. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  446. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/agent.py +0 -0
  447. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/env.py +0 -0
  448. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/runtime.py +0 -0
  449. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/adapters/stack.py +0 -0
  450. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/api.py +0 -0
  451. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/__init__.py +0 -0
  452. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/base.py +0 -0
  453. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/backends/gepa.py +0 -0
  454. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/collectors.py +0 -0
  455. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/config.py +0 -0
  456. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/console.py +0 -0
  457. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/events.py +0 -0
  458. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/format.py +0 -0
  459. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/result.py +0 -0
  460. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/sampler.py +0 -0
  461. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/sampling.py +0 -0
  462. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/search.py +0 -0
  463. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/stopping.py +0 -0
  464. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/optimization/trial.py +0 -0
  465. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/__init__.py +0 -0
  466. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/loader.py +0 -0
  467. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/manifest.py +0 -0
  468. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/oci.py +0 -0
  469. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/packaging/package.py +0 -0
  470. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  471. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/py.typed +0 -0
  472. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/__init__.py +0 -0
  473. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/boundary.py +0 -0
  474. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/fuzzing.py +0 -0
  475. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/graph.py +0 -0
  476. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/grid.py +0 -0
  477. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/image.py +0 -0
  478. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/mapelites.py +0 -0
  479. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/optuna.py +0 -0
  480. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/random.py +0 -0
  481. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/registry.py +0 -0
  482. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/samplers/strategy.py +0 -0
  483. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/__init__.py +0 -0
  484. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  485. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agent_security.py +0 -0
  486. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agentic.py +0 -0
  487. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/agentic_workflow.py +0 -0
  488. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/attack_outcome.py +0 -0
  489. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/classification.py +0 -0
  490. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/consistency.py +0 -0
  491. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/contains.py +0 -0
  492. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/cosine_sim.py +0 -0
  493. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/credentials.py +0 -0
  494. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/crucible.py +0 -0
  495. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/documentation_security.py +0 -0
  496. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/exfiltration_detection.py +0 -0
  497. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/format.py +0 -0
  498. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/harm.py +0 -0
  499. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/ide_security.py +0 -0
  500. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/image.py +0 -0
  501. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/json.py +0 -0
  502. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/judge.py +0 -0
  503. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/judge_ensemble.py +0 -0
  504. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/length.py +0 -0
  505. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/lexical.py +0 -0
  506. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/mcp_security.py +0 -0
  507. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/memorization.py +0 -0
  508. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/multi_agent_security.py +0 -0
  509. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/pii.py +0 -0
  510. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/prompt_leak.py +0 -0
  511. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/readability.py +0 -0
  512. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/reasoning_security.py +0 -0
  513. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/sentiment.py +0 -0
  514. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/similarity.py +0 -0
  515. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/structural_detection.py +0 -0
  516. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/scorers/supply_chain_detection.py +0 -0
  517. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/__init__.py +0 -0
  518. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/providers.py +0 -0
  519. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/session_store.py +0 -0
  520. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/storage/storage.py +0 -0
  521. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/_ripgrep.py +0 -0
  522. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/apply_patch.py +0 -0
  523. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/dreadnode_cli.py +0 -0
  524. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/editing.py +0 -0
  525. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/execute.py +0 -0
  526. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/fetch.py +0 -0
  527. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/glob.py +0 -0
  528. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/grep.py +0 -0
  529. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/ls.py +0 -0
  530. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/memory.py +0 -0
  531. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/report.py +0 -0
  532. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/task.py +0 -0
  533. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/think.py +0 -0
  534. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/todo.py +0 -0
  535. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/trajectory_search.py +0 -0
  536. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/web_extract.py +0 -0
  537. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/web_search.py +0 -0
  538. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tools/write.py +0 -0
  539. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/__init__.py +0 -0
  540. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/constants.py +0 -0
  541. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/convert.py +0 -0
  542. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/exporter.py +0 -0
  543. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/exporters.py +0 -0
  544. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/span.py +0 -0
  545. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/spans.py +0 -0
  546. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/tracing/trace_converter.py +0 -0
  547. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/__init__.py +0 -0
  548. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/_progress.py +0 -0
  549. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/base.py +0 -0
  550. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/dpo.py +0 -0
  551. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/env_rollouts.py +0 -0
  552. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/__init__.py +0 -0
  553. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/_common.py +0 -0
  554. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/rl.py +0 -0
  555. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/sft.py +0 -0
  556. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/etl/worlds.py +0 -0
  557. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/events.py +0 -0
  558. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/grpo.py +0 -0
  559. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/jobs.py +0 -0
  560. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/models.py +0 -0
  561. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ppo.py +0 -0
  562. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/prime.py +0 -0
  563. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/__init__.py +0 -0
  564. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/async_trainer.py +0 -0
  565. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/config.py +0 -0
  566. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/coordinator.py +0 -0
  567. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/distributed.py +0 -0
  568. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/dpo.py +0 -0
  569. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/experience.py +0 -0
  570. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  571. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/inference.py +0 -0
  572. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/learner.py +0 -0
  573. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/multi_turn.py +0 -0
  574. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/ppo.py +0 -0
  575. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/reward_model.py +0 -0
  576. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/rollout_env.py +0 -0
  577. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/rollout_worker.py +0 -0
  578. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/sft.py +0 -0
  579. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/ray/trainer.py +0 -0
  580. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/recipes.py +0 -0
  581. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/__init__.py +0 -0
  582. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/aggregator.py +0 -0
  583. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/functions.py +0 -0
  584. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  585. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/shaping.py +0 -0
  586. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rewards/types.py +0 -0
  587. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/__init__.py +0 -0
  588. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/adapters.py +0 -0
  589. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  590. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/orchestrator.py +0 -0
  591. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/types.py +0 -0
  592. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/rollouts/worlds.py +0 -0
  593. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/serving/__init__.py +0 -0
  594. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/serving/vllm_client.py +0 -0
  595. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/sft.py +0 -0
  596. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/__init__.py +0 -0
  597. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/config.py +0 -0
  598. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/data.py +0 -0
  599. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/renderer.py +0 -0
  600. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/rl.py +0 -0
  601. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker/trainer.py +0 -0
  602. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/tinker_sft.py +0 -0
  603. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/training/utils.py +0 -0
  604. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/__init__.py +0 -0
  605. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  606. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/adversarial_suffix.py +0 -0
  607. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/agent_skill.py +0 -0
  608. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/agentic_workflow.py +0 -0
  609. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/audio.py +0 -0
  610. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/backdoor_finetune.py +0 -0
  611. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  612. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/cipher.py +0 -0
  613. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/competitive_parity.py +0 -0
  614. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/constitutional.py +0 -0
  615. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/document.py +0 -0
  616. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/documentation_poison.py +0 -0
  617. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/encoding.py +0 -0
  618. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/exfiltration.py +0 -0
  619. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/flip_attack.py +0 -0
  620. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/guardrail_bypass.py +0 -0
  621. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/ide_injection.py +0 -0
  622. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/image.py +0 -0
  623. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/injection.py +0 -0
  624. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/json_tools.py +0 -0
  625. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/language.py +0 -0
  626. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/logic_bomb.py +0 -0
  627. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/mcp_attacks.py +0 -0
  628. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  629. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/multimodal_attacks.py +0 -0
  630. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/persuasion.py +0 -0
  631. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/perturbation.py +0 -0
  632. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/pii_extraction.py +0 -0
  633. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/pythonic_tools.py +0 -0
  634. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/rag_poisoning.py +0 -0
  635. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/reasoning_attacks.py +0 -0
  636. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/refine.py +0 -0
  637. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/response_steering.py +0 -0
  638. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/structural_exploits.py +0 -0
  639. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/stylistic.py +0 -0
  640. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/substitution.py +0 -0
  641. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/supply_chain.py +0 -0
  642. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/swap.py +0 -0
  643. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  644. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/text.py +0 -0
  645. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/video.py +0 -0
  646. {dreadnode-2.0.30 → dreadnode-2.0.31}/dreadnode/transforms/xml_tools.py +0 -0
  647. {dreadnode-2.0.30 → dreadnode-2.0.31}/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.31
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -21,9 +21,10 @@ 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
30
  Requires-Dist: moviepy<3.0.0,>=2.1.2
@@ -33,7 +34,7 @@ Requires-Dist: optuna<5.0.0,>=4.5.0
33
34
  Requires-Dist: orjson>=3.11.5
34
35
  Requires-Dist: packaging>=24.0
35
36
  Requires-Dist: pandas<3.0.0,>=2.2.3
36
- Requires-Dist: pillow<12.0.0,>=11.2.1
37
+ Requires-Dist: pillow<12.3.0,>=12.2.0
37
38
  Requires-Dist: prompt-toolkit<4.0.0,>=3.0.52
38
39
  Requires-Dist: pyarrow>=4.0.0
39
40
  Requires-Dist: pydantic-xml>=2.14.0
@@ -41,7 +42,7 @@ Requires-Dist: pydantic<3.0.0,>=2.9.2
41
42
  Requires-Dist: pyyaml>=6.0.2
42
43
  Requires-Dist: scipy<2.0.0,>=1.11.0
43
44
  Requires-Dist: soundfile<1.0.0,>=0.13.1
44
- Requires-Dist: starlette<1.1.0,>=1.0.1
45
+ Requires-Dist: starlette<1.4.0,>=1.3.1
45
46
  Requires-Dist: textual>=8.0.2
46
47
  Requires-Dist: transformers>=4.57.1
47
48
  Requires-Dist: uvicorn>=0.34.0
@@ -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'
@@ -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,17 @@ 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
+ _permission_bridge: PermissionBridge | None = PrivateAttr(None, init=False)
198
+ """Tool-approval bridge injected by the runtime so foreign engines wire their
199
+ permission callback into the native HITL path. ``None`` for bare-SDK use."""
192
200
 
193
201
  # Discoverability namespace for the AgentJudge specialized construction.
194
202
  # Assigned at module-load time by ``dreadnode.agents.__init__._lazy_init``
@@ -660,6 +668,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
660
668
  # out of the result body.
661
669
  tool_error = message.metadata.get("error")
662
670
  tool_error_type = message.metadata.get("error_type")
671
+ tool_cost_usd = message.metadata.get("subagent_cost_usd")
663
672
 
664
673
  end_event = ToolEnd(
665
674
  agent_id=self.agent_id,
@@ -670,6 +679,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
670
679
  stop=stop,
671
680
  error=tool_error,
672
681
  error_type=tool_error_type,
682
+ cost_usd=tool_cost_usd,
673
683
  )
674
684
  async for event in self._dispatch(end_event):
675
685
  yield event
@@ -715,6 +725,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
715
725
 
716
726
  async def _stream(
717
727
  self, trajectory: Trajectory | None = None
728
+ ) -> t.AsyncGenerator[AgentEvent, None]:
729
+ """Drive the loop through the resolved :class:`AgentEngine`.
730
+
731
+ For the native engine this delegates straight to ``_native_run_loop``
732
+ (which dispatches its own hooks inline). Foreign engines yield translated
733
+ native events and call ``ctx.dispatch`` themselves for observational hooks.
734
+ This shim is the ``Executor._stream`` implementation; the surrounding span,
735
+ trajectory accumulation, and tool-context management stay in ``stream``.
736
+ """
737
+ engine = self._resolve_engine()
738
+ ctx = EngineContext(
739
+ agent=self,
740
+ trajectory=trajectory if trajectory is not None else self.trajectory,
741
+ goal=self._current_input,
742
+ dispatch=self._dispatch,
743
+ permission=self._permission_bridge,
744
+ )
745
+ async for event in engine.run_loop(ctx):
746
+ yield event
747
+
748
+ def _resolve_engine(self) -> AgentEngine:
749
+ """Resolve this agent's ``engine`` selector to a concrete engine instance."""
750
+ return resolve_engine(self.engine)
751
+
752
+ async def _native_run_loop(
753
+ self, trajectory: Trajectory | None = None
718
754
  ) -> t.AsyncGenerator[AgentEvent, None]:
719
755
  """
720
756
  Core agent execution loop with inline tracing.
@@ -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)