dreadnode 2.0.42__tar.gz → 2.0.43__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 (743) hide show
  1. {dreadnode-2.0.42 → dreadnode-2.0.43}/PKG-INFO +1 -1
  2. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/agent.py +4 -2
  3. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/events.py +13 -10
  4. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/tools.py +1 -1
  5. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/owasp_agentic.py +7 -0
  6. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/evaluation.py +41 -3
  7. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/runtime.py +231 -7
  8. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/shared.py +24 -0
  9. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/task.py +13 -0
  10. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/capability_manager.py +6 -24
  11. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +54 -0
  12. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +2 -0
  13. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +58 -4
  14. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -3
  15. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
  16. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +43 -1
  17. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +58 -1
  18. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +3 -0
  19. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +26 -11
  20. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +2 -0
  21. dreadnode-2.0.43/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +188 -0
  22. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/capability.py +16 -0
  23. dreadnode-2.0.43/dreadnode/capabilities/command_tools.py +388 -0
  24. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/loader.py +3 -1
  25. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/sync.py +7 -0
  26. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/trajectory.py +20 -14
  27. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/trajectory_tools.py +50 -15
  28. dreadnode-2.0.43/dreadnode/packaging/egress.py +193 -0
  29. dreadnode-2.0.43/dreadnode/packaging/manifest.py +193 -0
  30. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/oci.py +5 -0
  31. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/task_validation.py +26 -0
  32. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/__init__.py +14 -0
  33. dreadnode-2.0.43/dreadnode/scorers/browser_security.py +173 -0
  34. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/exfiltration_detection.py +111 -0
  35. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/exfiltration.py +122 -0
  36. {dreadnode-2.0.42 → dreadnode-2.0.43}/pyproject.toml +1 -1
  37. dreadnode-2.0.42/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +0 -94
  38. dreadnode-2.0.42/dreadnode/packaging/manifest.py +0 -93
  39. {dreadnode-2.0.42 → dreadnode-2.0.43}/.gitignore +0 -0
  40. {dreadnode-2.0.42 → dreadnode-2.0.43}/LICENSE +0 -0
  41. {dreadnode-2.0.42 → dreadnode-2.0.43}/README.md +0 -0
  42. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/__init__.py +0 -0
  43. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/__main__.py +0 -0
  44. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/__init__.py +0 -0
  45. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/AGENTS.md +0 -0
  46. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/__init__.py +0 -0
  47. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/base.py +0 -0
  48. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/claude_code.py +0 -0
  49. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/engines/native.py +0 -0
  50. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/exceptions.py +0 -0
  51. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/format.py +0 -0
  52. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/hooks.py +0 -0
  53. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/judge.py +0 -0
  54. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/__init__.py +0 -0
  55. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/auth.py +0 -0
  56. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/client.py +0 -0
  57. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/config.py +0 -0
  58. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/mcp/server.py +0 -0
  59. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/process_judge.py +0 -0
  60. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/reactions.py +0 -0
  61. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/sanitize.py +0 -0
  62. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/skills.py +0 -0
  63. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/stopping.py +0 -0
  64. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/subagent.py +0 -0
  65. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/tool_resolution.py +0 -0
  66. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/agents/trajectory.py +0 -0
  67. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/__init__.py +0 -0
  68. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/_base.py +0 -0
  69. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/adversarial_reasoning.py +0 -0
  70. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/advpromptier.py +0 -0
  71. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/agent_suite.py +0 -0
  72. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/agentic_suite.py +0 -0
  73. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/alignment_faking.py +0 -0
  74. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analogy_escalation.py +0 -0
  75. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/__init__.py +0 -0
  76. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/aggregator.py +0 -0
  77. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/classifier.py +0 -0
  78. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/compliance.py +0 -0
  79. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/engine.py +0 -0
  80. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/recommendations.py +0 -0
  81. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/analytics/types.py +0 -0
  82. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/approval_bypass.py +0 -0
  83. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/aprt_progressive.py +0 -0
  84. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/art_engine.py +0 -0
  85. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/assessment.py +0 -0
  86. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/__init__.py +0 -0
  87. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/defense.py +0 -0
  88. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/failure.py +0 -0
  89. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/gate.py +0 -0
  90. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/memory.py +0 -0
  91. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/modes.py +0 -0
  92. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/probes.py +0 -0
  93. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/recon.py +0 -0
  94. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/router.py +0 -0
  95. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/atlas/strategy.py +0 -0
  96. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/attention_shifting.py +0 -0
  97. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/authz.py +0 -0
  98. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/autodan_turbo.py +0 -0
  99. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/autoredteamer.py +0 -0
  100. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/beast.py +0 -0
  101. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/browser_probes.py +0 -0
  102. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/__init__.py +0 -0
  103. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/atlas.py +0 -0
  104. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/nist.py +0 -0
  105. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/owasp.py +0 -0
  106. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/compliance/saif.py +0 -0
  107. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/constants.py +0 -0
  108. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/cot_jailbreak.py +0 -0
  109. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/crescendo.py +0 -0
  110. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/__init__.py +0 -0
  111. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  112. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  113. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/assets/image/meth.png +0 -0
  114. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  115. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  116. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  117. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  118. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  119. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  120. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  121. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  122. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  123. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  124. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  125. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  126. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  127. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  128. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  129. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  130. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  131. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  132. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/deep_inception.py +0 -0
  133. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/detect.py +0 -0
  134. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/drattack.py +0 -0
  135. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/echo_chamber.py +0 -0
  136. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/__init__.py +0 -0
  137. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/_base.py +0 -0
  138. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/_text_common.py +0 -0
  139. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/bae.py +0 -0
  140. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/boundary.py +0 -0
  141. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  142. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  143. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/pwws.py +0 -0
  144. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/simba.py +0 -0
  145. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/square.py +0 -0
  146. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/text.py +0 -0
  147. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/textbugger.py +0 -0
  148. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/textfooler.py +0 -0
  149. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/evasion/zoo.py +0 -0
  150. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/events.py +0 -0
  151. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/__init__.py +0 -0
  152. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/_base.py +0 -0
  153. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/activethief.py +0 -0
  154. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/copycat.py +0 -0
  155. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/distillation.py +0 -0
  156. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/equation_solving.py +0 -0
  157. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/jacobian.py +0 -0
  158. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/extraction/knockoff.py +0 -0
  159. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/genetic_persona.py +0 -0
  160. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/goat.py +0 -0
  161. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/goat_v2.py +0 -0
  162. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/gptfuzzer.py +0 -0
  163. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/honeytoken.py +0 -0
  164. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/humor_bypass.py +0 -0
  165. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/image.py +0 -0
  166. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/injection_channels.py +0 -0
  167. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/__init__.py +0 -0
  168. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/_base.py +0 -0
  169. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/confidence.py +0 -0
  170. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  171. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/j2_meta.py +0 -0
  172. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/jbdistill.py +0 -0
  173. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/jbfuzz.py +0 -0
  174. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/lrm_autonomous.py +0 -0
  175. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/mapf.py +0 -0
  176. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/mcp_probes.py +0 -0
  177. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/__init__.py +0 -0
  178. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/_base.py +0 -0
  179. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/entropy.py +0 -0
  180. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/label_only.py +0 -0
  181. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/lira.py +0 -0
  182. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/loss.py +0 -0
  183. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/shadow_model.py +0 -0
  184. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/membership/threshold.py +0 -0
  185. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/message_parts.py +0 -0
  186. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/model_export.py +0 -0
  187. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/multimodal.py +0 -0
  188. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/nexus.py +0 -0
  189. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/oast.py +0 -0
  190. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/pair.py +0 -0
  191. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/persona_hijack.py +0 -0
  192. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/policies.py +0 -0
  193. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/probe_planner.py +0 -0
  194. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/prompt.py +0 -0
  195. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/propagation.py +0 -0
  196. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/quantization_safety.py +0 -0
  197. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/rainbow.py +0 -0
  198. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/refusal_aware.py +0 -0
  199. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/renellm.py +0 -0
  200. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/__init__.py +0 -0
  201. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/json_report.py +0 -0
  202. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/llm_summary.py +0 -0
  203. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reporting/markdown.py +0 -0
  204. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/resource_abuse.py +0 -0
  205. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/reward_hacking.py +0 -0
  206. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/salami_slicing.py +0 -0
  207. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/self_persuasion.py +0 -0
  208. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/siren.py +0 -0
  209. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/tap.py +0 -0
  210. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/target.py +0 -0
  211. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/__init__.py +0 -0
  212. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/auth.py +0 -0
  213. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/factory.py +0 -0
  214. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/http.py +0 -0
  215. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/message.py +0 -0
  216. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/prediction.py +0 -0
  217. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/spec.py +0 -0
  218. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  219. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  220. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/templatefuzz.py +0 -0
  221. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/tmap_trajectory.py +0 -0
  222. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/trojail.py +0 -0
  223. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/airt/watermark_removal.py +0 -0
  224. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/__init__.py +0 -0
  225. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/__init__.py +0 -0
  226. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/client.py +0 -0
  227. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/api/models.py +0 -0
  228. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/__init__.py +0 -0
  229. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/airt.py +0 -0
  230. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/args.py +0 -0
  231. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/capability.py +0 -0
  232. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/dataset.py +0 -0
  233. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/environment.py +0 -0
  234. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/inference_model.py +0 -0
  235. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/judge.py +0 -0
  236. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/main.py +0 -0
  237. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/model.py +0 -0
  238. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/optimize.py +0 -0
  239. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/sandbox.py +0 -0
  240. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/secret.py +0 -0
  241. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/session.py +0 -0
  242. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/task_set.py +0 -0
  243. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/__init__.py +0 -0
  244. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  245. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  246. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  247. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  248. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  249. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  250. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  251. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  252. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  253. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/train.py +0 -0
  254. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/cli/worlds.py +0 -0
  255. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/__init__.py +0 -0
  256. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/interactive.py +0 -0
  257. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/managed_client.py +0 -0
  258. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/models.py +0 -0
  259. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/runtime_client.py +0 -0
  260. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/client/transports.py +0 -0
  261. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/config.py +0 -0
  262. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/env.py +0 -0
  263. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/main.py +0 -0
  264. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/model_catalog.py +0 -0
  265. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/paths.py +0 -0
  266. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/print_mode.py +0 -0
  267. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/__init__.py +0 -0
  268. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/app.py +0 -0
  269. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/auth.py +0 -0
  270. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/model_resolution.py +0 -0
  271. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/prompt.py +0 -0
  272. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/prompt_registry.py +0 -0
  273. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/runtime_credentials.py +0 -0
  274. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/runtime_events.py +0 -0
  275. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/session_hydrator.py +0 -0
  276. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/session_persistence.py +0 -0
  277. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/turn_coordinator.py +0 -0
  278. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/utils.py +0 -0
  279. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/websocket.py +0 -0
  280. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/worker_manager.py +0 -0
  281. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/server/ws_auth.py +0 -0
  282. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/__init__.py +0 -0
  283. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/app.py +0 -0
  284. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/auth_flow.py +0 -0
  285. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/bug_report.py +0 -0
  286. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/capabilities_manager.py +0 -0
  287. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/command_dispatcher.py +0 -0
  288. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/commands.py +0 -0
  289. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/connection.py +0 -0
  290. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/dreadnode.tcss +0 -0
  291. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/error_handler.py +0 -0
  292. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/model_manager.py +0 -0
  293. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/model_variants.py +0 -0
  294. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/profile_manager.py +0 -0
  295. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screen_router.py +0 -0
  296. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/__init__.py +0 -0
  297. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/auth.py +0 -0
  298. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/base.py +0 -0
  299. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/capabilities.py +0 -0
  300. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  301. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/connection_error.py +0 -0
  302. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/console.py +0 -0
  303. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/environments.py +0 -0
  304. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/evaluations.py +0 -0
  305. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/models.py +0 -0
  306. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  307. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/readme.py +0 -0
  308. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/report_bug.py +0 -0
  309. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/runtimes.py +0 -0
  310. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  311. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/secrets.py +0 -0
  312. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/services.py +0 -0
  313. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/sessions.py +0 -0
  314. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  315. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/traces.py +0 -0
  316. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/screens/workspaces.py +0 -0
  317. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/sessions_manager.py +0 -0
  318. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/spans_reader.py +0 -0
  319. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/status_messages.py +0 -0
  320. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/theme.py +0 -0
  321. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/tool_format.py +0 -0
  322. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_coordinator.py +0 -0
  323. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  324. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_reducer.py +0 -0
  325. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/turn_state_phase.py +0 -0
  326. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/update_check.py +0 -0
  327. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/__init__.py +0 -0
  328. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  329. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  330. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/composer.py +0 -0
  331. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  332. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  333. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/conversation.py +0 -0
  334. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/flash.py +0 -0
  335. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  336. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  337. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  338. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  339. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  340. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  341. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  342. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  343. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  344. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  345. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  346. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
  347. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  348. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  349. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  350. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  351. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/throbber.py +0 -0
  352. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tool.py +0 -0
  353. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  354. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  355. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/welcome.py +0 -0
  356. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/widgets/whoami.py +0 -0
  357. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/app/tui/wire_events.py +0 -0
  358. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/__init__.py +0 -0
  359. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  360. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  361. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  362. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  363. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  364. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  365. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  366. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  367. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  368. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  369. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -0
  370. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  371. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  372. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  373. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  374. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  375. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  376. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  377. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  378. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  379. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  380. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  381. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  382. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  383. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  384. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  385. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  386. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  387. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
  388. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  389. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  390. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  391. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  392. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  393. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  394. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  395. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  396. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  397. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  398. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  399. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +0 -0
  400. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  401. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  402. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  403. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  404. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  405. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  406. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
  407. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  408. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  409. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  410. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  411. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  412. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  413. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  414. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  415. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  416. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  417. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  418. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  419. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  420. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  421. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  422. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  423. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  424. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  425. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  426. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  427. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  428. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  429. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  430. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  431. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  432. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  433. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +0 -0
  434. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
  435. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  436. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  437. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  438. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  439. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  440. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  441. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  442. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  443. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  444. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  445. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  446. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  447. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  448. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  449. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  450. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/__init__.py +0 -0
  451. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/flags.py +0 -0
  452. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/install.py +0 -0
  453. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/tool_rules.py +0 -0
  454. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/types.py +0 -0
  455. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/worker.py +0 -0
  456. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/capabilities/worker_runner.py +0 -0
  457. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/__init__.py +0 -0
  458. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/conditions.py +0 -0
  459. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/discovery.py +0 -0
  460. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/environment.py +0 -0
  461. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/exceptions.py +0 -0
  462. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/execution.py +0 -0
  463. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/hook.py +0 -0
  464. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/judge.py +0 -0
  465. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/load.py +0 -0
  466. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/log.py +0 -0
  467. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/__init__.py +0 -0
  468. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/config.py +0 -0
  469. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/context.py +0 -0
  470. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/hydrate.py +0 -0
  471. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/meta/introspect.py +0 -0
  472. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/metric.py +0 -0
  473. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/object.py +0 -0
  474. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/scorer.py +0 -0
  475. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/serialization.py +0 -0
  476. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/stopping.py +0 -0
  477. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/task.py +0 -0
  478. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/templating.py +0 -0
  479. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/tls.py +0 -0
  480. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/transforms.py +0 -0
  481. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/__init__.py +0 -0
  482. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/audio.py +0 -0
  483. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/base.py +0 -0
  484. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/common.py +0 -0
  485. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/image.py +0 -0
  486. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/object_3d.py +0 -0
  487. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/table.py +0 -0
  488. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/text.py +0 -0
  489. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/types/video.py +0 -0
  490. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/core/util.py +0 -0
  491. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/__init__.py +0 -0
  492. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/dataset.py +0 -0
  493. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/hf.py +0 -0
  494. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/datasets/local.py +0 -0
  495. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/__init__.py +0 -0
  496. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/console.py +0 -0
  497. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/evaluation.py +0 -0
  498. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/events.py +0 -0
  499. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/format.py +0 -0
  500. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/result.py +0 -0
  501. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/evaluations/sample.py +0 -0
  502. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/__init__.py +0 -0
  503. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/caching.py +0 -0
  504. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/chat.py +0 -0
  505. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/data.py +0 -0
  506. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/exceptions.py +0 -0
  507. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/__init__.py +0 -0
  508. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/base.py +0 -0
  509. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/http.py +0 -0
  510. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/litellm_.py +0 -0
  511. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/transformers_.py +0 -0
  512. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/generator/vllm_.py +0 -0
  513. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/message.py +0 -0
  514. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/models.py +0 -0
  515. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/parsing.py +0 -0
  516. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/proxy.py +0 -0
  517. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/__init__.py +0 -0
  518. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/base.py +0 -0
  519. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  520. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/generators/utils.py +0 -0
  521. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/__init__.py +0 -0
  522. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/config.py +0 -0
  523. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/items/models.py +0 -0
  524. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/__init__.py +0 -0
  525. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/judges/outcome.py +0 -0
  526. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/__init__.py +0 -0
  527. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/hf.py +0 -0
  528. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/local.py +0 -0
  529. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/models/model.py +0 -0
  530. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/__init__.py +0 -0
  531. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/__init__.py +0 -0
  532. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  533. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/agent.py +0 -0
  534. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/env.py +0 -0
  535. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/runtime.py +0 -0
  536. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/adapters/stack.py +0 -0
  537. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/api.py +0 -0
  538. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/__init__.py +0 -0
  539. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/base.py +0 -0
  540. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/backends/gepa.py +0 -0
  541. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/collectors.py +0 -0
  542. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/config.py +0 -0
  543. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/console.py +0 -0
  544. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/events.py +0 -0
  545. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/format.py +0 -0
  546. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/jobs.py +0 -0
  547. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/result.py +0 -0
  548. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/sampler.py +0 -0
  549. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/sampling.py +0 -0
  550. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/search.py +0 -0
  551. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/stopping.py +0 -0
  552. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/study.py +0 -0
  553. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/optimization/trial.py +0 -0
  554. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/__init__.py +0 -0
  555. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/loader.py +0 -0
  556. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/packaging/package.py +0 -0
  557. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/__init__.py +0 -0
  558. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/guard.py +0 -0
  559. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/reconciliation.py +0 -0
  560. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  561. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/policies/scope.py +0 -0
  562. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/py.typed +0 -0
  563. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/__init__.py +0 -0
  564. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/boundary.py +0 -0
  565. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/fuzzing.py +0 -0
  566. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/graph.py +0 -0
  567. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/grid.py +0 -0
  568. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/image.py +0 -0
  569. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/mapelites.py +0 -0
  570. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/optuna.py +0 -0
  571. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/random.py +0 -0
  572. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/registry.py +0 -0
  573. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/samplers/strategy.py +0 -0
  574. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  575. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agent_security.py +0 -0
  576. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agentic.py +0 -0
  577. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/agentic_workflow.py +0 -0
  578. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/attack_outcome.py +0 -0
  579. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/classification.py +0 -0
  580. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/consistency.py +0 -0
  581. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/contains.py +0 -0
  582. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/cosine_sim.py +0 -0
  583. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/credentials.py +0 -0
  584. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/crucible.py +0 -0
  585. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/documentation_security.py +0 -0
  586. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/format.py +0 -0
  587. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/harm.py +0 -0
  588. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/ide_security.py +0 -0
  589. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/image.py +0 -0
  590. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/json.py +0 -0
  591. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/judge.py +0 -0
  592. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/judge_ensemble.py +0 -0
  593. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/length.py +0 -0
  594. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/lexical.py +0 -0
  595. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/mcp_security.py +0 -0
  596. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/memorization.py +0 -0
  597. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/multi_agent_security.py +0 -0
  598. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/pii.py +0 -0
  599. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/prompt_leak.py +0 -0
  600. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/readability.py +0 -0
  601. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/reasoning_security.py +0 -0
  602. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/sentiment.py +0 -0
  603. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/similarity.py +0 -0
  604. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/structural_detection.py +0 -0
  605. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/scorers/supply_chain_detection.py +0 -0
  606. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/__init__.py +0 -0
  607. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/providers.py +0 -0
  608. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/session_store.py +0 -0
  609. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/storage/storage.py +0 -0
  610. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/__init__.py +0 -0
  611. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/_ripgrep.py +0 -0
  612. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/apply_patch.py +0 -0
  613. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/dreadnode_cli.py +0 -0
  614. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/editing.py +0 -0
  615. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/execute.py +0 -0
  616. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/fetch.py +0 -0
  617. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/glob.py +0 -0
  618. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/grep.py +0 -0
  619. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/interaction.py +0 -0
  620. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/ls.py +0 -0
  621. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/memory.py +0 -0
  622. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/project_memory.py +0 -0
  623. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/read.py +0 -0
  624. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/report.py +0 -0
  625. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/report_items.py +0 -0
  626. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/submission.py +0 -0
  627. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/task.py +0 -0
  628. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/think.py +0 -0
  629. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/todo.py +0 -0
  630. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/trajectory_search.py +0 -0
  631. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/web_extract.py +0 -0
  632. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/web_search.py +0 -0
  633. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tools/write.py +0 -0
  634. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/__init__.py +0 -0
  635. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/constants.py +0 -0
  636. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/convert.py +0 -0
  637. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/exporter.py +0 -0
  638. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/exporters.py +0 -0
  639. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/span.py +0 -0
  640. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/spans.py +0 -0
  641. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/tracing/trace_converter.py +0 -0
  642. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/__init__.py +0 -0
  643. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/_progress.py +0 -0
  644. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/base.py +0 -0
  645. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/dpo.py +0 -0
  646. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/env_rollouts.py +0 -0
  647. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/__init__.py +0 -0
  648. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/_common.py +0 -0
  649. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/rl.py +0 -0
  650. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/sft.py +0 -0
  651. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/etl/worlds.py +0 -0
  652. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/events.py +0 -0
  653. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/grpo.py +0 -0
  654. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/jobs.py +0 -0
  655. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/models.py +0 -0
  656. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ppo.py +0 -0
  657. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/prime.py +0 -0
  658. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/__init__.py +0 -0
  659. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/async_trainer.py +0 -0
  660. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/config.py +0 -0
  661. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/coordinator.py +0 -0
  662. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/distributed.py +0 -0
  663. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/dpo.py +0 -0
  664. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/experience.py +0 -0
  665. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  666. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/inference.py +0 -0
  667. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/learner.py +0 -0
  668. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/multi_turn.py +0 -0
  669. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/ppo.py +0 -0
  670. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/reward_model.py +0 -0
  671. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/rollout_env.py +0 -0
  672. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/rollout_worker.py +0 -0
  673. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/sft.py +0 -0
  674. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/ray/trainer.py +0 -0
  675. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/recipes.py +0 -0
  676. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/__init__.py +0 -0
  677. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/aggregator.py +0 -0
  678. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/functions.py +0 -0
  679. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  680. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/shaping.py +0 -0
  681. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rewards/types.py +0 -0
  682. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/__init__.py +0 -0
  683. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/adapters.py +0 -0
  684. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  685. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/orchestrator.py +0 -0
  686. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/types.py +0 -0
  687. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/rollouts/worlds.py +0 -0
  688. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/serving/__init__.py +0 -0
  689. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/serving/vllm_client.py +0 -0
  690. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/sft.py +0 -0
  691. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/__init__.py +0 -0
  692. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/config.py +0 -0
  693. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/data.py +0 -0
  694. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/renderer.py +0 -0
  695. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/rl.py +0 -0
  696. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker/trainer.py +0 -0
  697. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/tinker_sft.py +0 -0
  698. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/training/utils.py +0 -0
  699. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/__init__.py +0 -0
  700. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  701. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/adversarial_suffix.py +0 -0
  702. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/agent_skill.py +0 -0
  703. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/agentic_workflow.py +0 -0
  704. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/art_prompt.py +0 -0
  705. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/audio.py +0 -0
  706. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/backdoor_finetune.py +0 -0
  707. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  708. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/cipher.py +0 -0
  709. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/competitive_parity.py +0 -0
  710. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/constitutional.py +0 -0
  711. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/document.py +0 -0
  712. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/documentation_poison.py +0 -0
  713. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/encoding.py +0 -0
  714. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/flip_attack.py +0 -0
  715. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/guardrail_bypass.py +0 -0
  716. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/ide_injection.py +0 -0
  717. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/image.py +0 -0
  718. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/injection.py +0 -0
  719. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/json_tools.py +0 -0
  720. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/language.py +0 -0
  721. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/logic_bomb.py +0 -0
  722. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/mcp_attacks.py +0 -0
  723. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  724. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/multimodal_attacks.py +0 -0
  725. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/past_tense.py +0 -0
  726. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/persuasion.py +0 -0
  727. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/perturbation.py +0 -0
  728. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/pii_extraction.py +0 -0
  729. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/pythonic_tools.py +0 -0
  730. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/rag_poisoning.py +0 -0
  731. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/reasoning_attacks.py +0 -0
  732. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/refine.py +0 -0
  733. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/response_steering.py +0 -0
  734. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/structural_exploits.py +0 -0
  735. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/stylistic.py +0 -0
  736. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/substitution.py +0 -0
  737. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/supply_chain.py +0 -0
  738. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/swap.py +0 -0
  739. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  740. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/text.py +0 -0
  741. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/video.py +0 -0
  742. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/transforms/xml_tools.py +0 -0
  743. {dreadnode-2.0.42 → dreadnode-2.0.43}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.42
3
+ Version: 2.0.43
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -710,6 +710,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
710
710
  self, tool_call: "ToolCall", step_count: int
711
711
  ) -> t.AsyncGenerator[AgentEvent, None]:
712
712
  """Process a single tool call with its own span."""
713
+ tool = next((t for t in self.all_tools if t.wire_name == tool_call.name), None)
714
+ redact_telemetry = tool is not None and tool.source == "command"
713
715
  with dreadnode.task_span(
714
716
  f"tool:{tool_call.name}",
715
717
  type="tool",
@@ -721,13 +723,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
721
723
  agent_name=self.name,
722
724
  status="running",
723
725
  tool_call=tool_call,
726
+ redact_telemetry=redact_telemetry,
724
727
  )
725
728
  start_event.emit(t_span)
726
729
  async for event in self._dispatch(start_event):
727
730
  yield event
728
731
 
729
- tool = next((t for t in self.all_tools if t.wire_name == tool_call.name), None)
730
-
731
732
  if tool is None:
732
733
  error_msg = f"Tool '{tool_call.name}' not found."
733
734
  logger.warning(error_msg)
@@ -791,6 +792,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
791
792
  error_type=tool_error_type,
792
793
  cost_usd=tool_cost_usd,
793
794
  policy_decision=start_event.policy_decision,
795
+ redact_telemetry=redact_telemetry,
794
796
  )
795
797
  async for event in self._dispatch(end_event):
796
798
  yield event
@@ -457,6 +457,7 @@ class ToolStart(AgentEvent):
457
457
 
458
458
  tool_call: ToolCall
459
459
  policy_decision: dict[str, t.Any] | None = None
460
+ redact_telemetry: bool = Field(default=False, exclude=True)
460
461
 
461
462
  def _get_data(self) -> dict[str, t.Any]:
462
463
  try:
@@ -480,14 +481,15 @@ class ToolStart(AgentEvent):
480
481
  span.set_attribute(TOOL_ATTRIBUTE_NAME, self.tool_call.name)
481
482
  span.set_attribute(TOOL_ATTRIBUTE_CALL_ID, self.tool_call.id)
482
483
 
483
- # Parse and set arguments
484
- try:
485
- args = json.loads(self.tool_call.function.arguments)
486
- except (json.JSONDecodeError, TypeError):
487
- args = self.tool_call.function.arguments
484
+ if not self.redact_telemetry:
485
+ # Parse and set arguments
486
+ try:
487
+ args = json.loads(self.tool_call.function.arguments)
488
+ except (json.JSONDecodeError, TypeError):
489
+ args = self.tool_call.function.arguments
488
490
 
489
- span.set_attribute(TOOL_ATTRIBUTE_ARGUMENTS, args)
490
- span.log_input("arguments", args)
491
+ span.set_attribute(TOOL_ATTRIBUTE_ARGUMENTS, args)
492
+ span.log_input("arguments", args)
491
493
 
492
494
  super().emit(span)
493
495
 
@@ -544,11 +546,12 @@ class ToolEnd(AgentEvent):
544
546
  error: str | None = None
545
547
  error_type: str | None = None
546
548
  cost_usd: float | None = None
547
- policy_decision: dict[str, t.Any] | None = None
548
549
  """Estimated USD cost contributed by this tool call, when the tool
549
550
  ran an internal LLM (e.g. ``spawn_agent``). ``None`` for ordinary
550
551
  tools — the TUI only accumulates this into the sub-agent cost
551
552
  display, never the main session cost."""
553
+ policy_decision: dict[str, t.Any] | None = None
554
+ redact_telemetry: bool = Field(default=False, exclude=True)
552
555
 
553
556
  def _get_data(self) -> dict[str, t.Any]:
554
557
  return {
@@ -571,13 +574,13 @@ class ToolEnd(AgentEvent):
571
574
 
572
575
  def emit(self, span: "TaskSpan") -> None:
573
576
  # Attributes
574
- if self.result:
577
+ if self.result and not self.redact_telemetry:
575
578
  span.set_attribute(TOOL_ATTRIBUTE_RESULT, self.result)
576
579
  span.log_output("result", self.result)
577
580
 
578
581
  span.set_attribute(TOOL_ATTRIBUTE_STOPPED, self.stop)
579
582
 
580
- if self.error:
583
+ if self.error and not self.redact_telemetry:
581
584
  span.set_attribute(TOOL_ATTRIBUTE_ERROR, self.error)
582
585
  span.log_metric(f"tool/{self.tool_call.name}/error", 1)
583
586
 
@@ -201,7 +201,7 @@ async def offload_tool_output(
201
201
  return truncated, file_path
202
202
 
203
203
 
204
- ToolSource = t.Literal["builtin", "python", "mcp", "synthetic", "bundled"]
204
+ ToolSource = t.Literal["builtin", "python", "command", "mcp", "synthetic", "bundled"]
205
205
  """The origin of a tool. See CAP-IDENT-001 in specs/capabilities/runtime.md."""
206
206
 
207
207
  _WIRE_NAME_MAX = 64
@@ -128,6 +128,8 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
128
128
  "indirect_injection_success",
129
129
  "echo_chamber_detected",
130
130
  "sycophancy_detected",
131
+ "visual_injection_followed",
132
+ "navigation_hijacked",
131
133
  ],
132
134
  "rubrics": ["goal_hijacking"],
133
135
  },
@@ -144,6 +146,8 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
144
146
  "tool_description_poisoned",
145
147
  "implicit_tool_poison_detected",
146
148
  "tool_output_injected",
149
+ "clickfix_executed",
150
+ "domain_validation_bypassed",
147
151
  ],
148
152
  "rubrics": ["tool_selection_safety", "tool_chaining"],
149
153
  },
@@ -166,6 +170,9 @@ OWASP_AGENTIC_CAPABILITY_MAP: dict[OWASPAgenticCategory, dict[str, list[str]]] =
166
170
  "markdown_exfil_detected",
167
171
  "dns_exfil_detected",
168
172
  "unicode_exfil_detected",
173
+ "ssrf_exfil_detected",
174
+ "search_query_exfil_detected",
175
+ "trusted_domain_exfil_detected",
169
176
  ],
170
177
  "rubrics": [],
171
178
  },
@@ -29,10 +29,12 @@ from dreadnode.app.cli.shared import (
29
29
  confirm_destructive,
30
30
  console,
31
31
  merge_env_model_overrides,
32
+ parse_egress_targets,
32
33
  parse_env_model_overrides,
33
34
  print_link,
34
35
  )
35
36
  from dreadnode.app.model_catalog import resolve_model
37
+ from dreadnode.packaging.egress import merge_targets as merge_egress_targets
36
38
 
37
39
  cli = cyclopts.App(
38
40
  name="evaluation",
@@ -724,6 +726,23 @@ def create(
724
726
  negative_iterable=(),
725
727
  ),
726
728
  ] = None,
729
+ egress: t.Annotated[
730
+ list[str] | None,
731
+ cyclopts.Parameter(
732
+ name="--egress",
733
+ help=(
734
+ "Additional outbound destination for this run's sandboxes "
735
+ "(e.g. --egress staging.example.com, --egress '*.internal.corp', "
736
+ "--egress 10.20.0.0/16; repeatable). Targets union with the "
737
+ "task's own egress.allow and are checked against the "
738
+ "deployment's egress floor identically, so they grant no reach "
739
+ "a task declaration could not. Supplying any target makes this "
740
+ "run a declaration, restricting it to what is named plus the "
741
+ "platform destinations the platform derives."
742
+ ),
743
+ negative_iterable=(),
744
+ ),
745
+ ] = None,
727
746
  wait: t.Annotated[bool, cyclopts.Parameter(negative=())] = False,
728
747
  poll_interval_sec: t.Annotated[
729
748
  float,
@@ -775,6 +794,12 @@ def create(
775
794
  applies as a wall-clock bound.
776
795
  cleanup_policy: Sandbox cleanup policy.
777
796
  judge_model: Override the judge model for all tasks in this evaluation.
797
+ egress: Additional outbound destination for this run's sandboxes, as an
798
+ FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Unions
799
+ with the task's own `egress.allow` and is checked against the
800
+ deployment's egress floor identically. Supplying any target makes
801
+ this run a declaration, restricting it to what is named plus the
802
+ platform destinations the platform derives.
778
803
  wait: Block until the evaluation reaches a terminal state.
779
804
  poll_interval_sec: Seconds between status polls when --wait is set.
780
805
  timeout_sec: Maximum seconds to wait before timing out.
@@ -818,6 +843,17 @@ def create(
818
843
  if merged_env_models is not None:
819
844
  request["model_overrides"] = merged_env_models
820
845
 
846
+ # TSK-EGR-007: --egress adds to any egress_overrides block from --file
847
+ # rather than replacing it, the same way --env-model merges per role.
848
+ # Both sides are validated here so a bad target is named before the round
849
+ # trip, whichever of the two the author wrote it in.
850
+ merged_egress = merge_egress_targets(
851
+ parse_egress_targets(request.get("egress_overrides"), where="egress_overrides"),
852
+ parse_egress_targets(egress),
853
+ )
854
+ if merged_egress is not None:
855
+ request["egress_overrides"] = merged_egress
856
+
821
857
  if not request.get("name"):
822
858
  raise ValueError(
823
859
  "dn evaluation create requires a name. Pass one positionally or in --file."
@@ -1494,10 +1530,12 @@ def retry(
1494
1530
  as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
1495
1531
  platform: PlatformScopeArgs = PlatformScopeArgs(),
1496
1532
  ) -> None:
1497
- """Retry failed and errored samples in an evaluation.
1533
+ """Retry failed samples in an evaluation.
1498
1534
 
1499
- Resets samples that ended in failed, timed_out, or infra_error
1500
- back to queued so they are picked up by workers again.
1535
+ Resets samples that ended in failed, timed_out, cancelled, or infra_error
1536
+ back to queued so they are picked up by workers again. Samples whose judge
1537
+ errored are not requeued: rerunning the agent would produce a different
1538
+ trajectory.
1501
1539
 
1502
1540
  Args:
1503
1541
  evaluation_id: The evaluation ID.
@@ -7,10 +7,11 @@ from pathlib import Path
7
7
  import cyclopts
8
8
  import yaml
9
9
 
10
- from dreadnode.app.api.client import NotFoundError
10
+ from dreadnode.app.api.client import ConflictError, NotFoundError
11
11
  from dreadnode.app.cli.args import PlatformScopeArgs
12
12
  from dreadnode.app.cli.shared import (
13
13
  _FLAG_STATE,
14
+ _LABEL_W,
14
15
  _collect_cursor_pages,
15
16
  _hint,
16
17
  _render,
@@ -19,9 +20,11 @@ from dreadnode.app.cli.shared import (
19
20
  _status_color,
20
21
  confirm_destructive,
21
22
  console,
23
+ parse_egress_targets,
22
24
  print_info,
23
25
  print_success,
24
26
  )
27
+ from dreadnode.packaging.egress import merge_targets, normalize_declaration
25
28
 
26
29
  RuntimeStatus = t.Literal["idle", "running", "paused"]
27
30
 
@@ -217,6 +220,35 @@ def _split_runtime_manifest(
217
220
  return identity, (config or None)
218
221
 
219
222
 
223
+ def _apply_egress_targets(
224
+ config: dict[str, t.Any] | None,
225
+ cli_targets: list[str] | None,
226
+ ) -> dict[str, t.Any] | None:
227
+ """Merge ``--egress`` targets into ``sandbox.egress.allow`` (`RT-SBX-006`).
228
+
229
+ Also validates a ``sandbox.egress`` block loaded from ``runtime.yaml``, so a
230
+ malformed target is named here rather than after a round trip.
231
+
232
+ Absent stays absent (`RT-SBX-009`): with no declaration on either side the
233
+ sandbox inherits the operator's floor unchanged, which is not the same as
234
+ an empty allow list restricting it to the platform's own destinations.
235
+ """
236
+ sandbox_raw = (config or {}).get("sandbox")
237
+ if sandbox_raw is not None and not isinstance(sandbox_raw, dict):
238
+ raise TypeError("runtime.yaml sandbox must be a mapping")
239
+
240
+ declared = normalize_declaration((sandbox_raw or {}).get("egress"))
241
+ merged = merge_targets(declared, cli_targets)
242
+ if merged is None:
243
+ return config
244
+
245
+ updated = dict(config or {})
246
+ sandbox = dict(sandbox_raw or {})
247
+ sandbox["egress"] = {"allow": merged}
248
+ updated["sandbox"] = sandbox
249
+ return updated
250
+
251
+
220
252
  def _coalesce_manifest_value(
221
253
  explicit: str | None,
222
254
  manifest_identity: dict[str, t.Any],
@@ -365,12 +397,30 @@ def create(
365
397
  Path | None,
366
398
  cyclopts.Parameter(name="--file", help="Load runtime.yaml from a file or directory."),
367
399
  ] = None,
400
+ egress: t.Annotated[
401
+ list[str] | None,
402
+ cyclopts.Parameter(
403
+ name="--egress",
404
+ help=(
405
+ "Outbound destination this runtime's sandbox may reach "
406
+ "(e.g. --egress target.example.com, --egress '*.internal.corp', "
407
+ "--egress 10.20.0.0/16; repeatable). Adds to any "
408
+ "sandbox.egress.allow from --file. A declaration can only "
409
+ "narrow what the deployment already permits, and declaring "
410
+ "anything restricts the sandbox to what is named plus the "
411
+ "platform destinations the platform derives. Pass "
412
+ "--empty-egress to declare a scope that names nothing, "
413
+ "restricting the sandbox to the platform destinations alone."
414
+ ),
415
+ ),
416
+ ] = None,
368
417
  as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
369
418
  platform: PlatformScopeArgs = PlatformScopeArgs(),
370
419
  ) -> None:
371
420
  """Ensure a runtime exists for a project or the workspace default project.
372
421
 
373
422
  Idempotent — re-running against an existing runtime returns it unchanged.
423
+ Re-running with a *different* config is a conflict, not an update.
374
424
 
375
425
  Args:
376
426
  project_ref: Project key or UUID. Defaults to the active project scope,
@@ -379,6 +429,10 @@ def create(
379
429
  name: Runtime display name. Required with --key when no project is resolved.
380
430
  description: Optional runtime description.
381
431
  file: Load runtime.yaml from a file or directory.
432
+ egress: Outbound destination this runtime's sandbox may reach, as an
433
+ FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Adds to
434
+ any `sandbox.egress.allow` from --file. Narrowing only, so it needs
435
+ no permission beyond owning the runtime.
382
436
  as_json: Output as JSON.
383
437
  """
384
438
  api, profile = platform.connect()
@@ -386,6 +440,7 @@ def create(
386
440
  manifest_config: dict[str, t.Any] | None = None
387
441
  if file is not None:
388
442
  manifest_identity, manifest_config = _split_runtime_manifest(api, file)
443
+ manifest_config = _apply_egress_targets(manifest_config, parse_egress_targets(egress))
389
444
 
390
445
  resolved_project = (
391
446
  project_ref
@@ -414,12 +469,23 @@ def create(
414
469
  if manifest_config is not None:
415
470
  create_kwargs["config"] = manifest_config
416
471
 
417
- payload = api.create_runtime(
418
- profile.org_key,
419
- profile.workspace_key,
420
- resolved_project,
421
- **create_kwargs,
422
- )
472
+ try:
473
+ payload = api.create_runtime(
474
+ profile.org_key,
475
+ profile.workspace_key,
476
+ resolved_project,
477
+ **create_kwargs,
478
+ )
479
+ except ConflictError as exc:
480
+ # The runtime exists with a different configuration. Create is ensure,
481
+ # not update, so say where updates go rather than leaving the user
482
+ # to re-run the same command.
483
+ runtime_ref = resolved_key or "<runtime-id>"
484
+ raise ConflictError(
485
+ f"{exc} To change a runtime's configuration, run "
486
+ f"`dn runtime config-set {runtime_ref} --egress <target>` or "
487
+ f"`dn runtime config-set {runtime_ref} --file runtime.yaml`."
488
+ ) from exc
423
489
  if as_json:
424
490
  _render(payload, as_json=True, summary=_summarize_runtime)
425
491
  return
@@ -699,3 +765,161 @@ def reset(
699
765
  return
700
766
  _print_lifecycle_result(str(result.get("id", runtime_id)), "reset", "red")
701
767
  _hint(f"dn runtime start {runtime_id}")
768
+
769
+
770
+ # ---------------------------------------------------------------------------
771
+ # Durable configuration (RT-API-023 / RT-API-024)
772
+ # ---------------------------------------------------------------------------
773
+
774
+
775
+ def _summarize_runtime_config(payload: dict[str, t.Any]) -> str:
776
+ config = payload.get("config") or {}
777
+ sandbox = config.get("sandbox") or {}
778
+ egress = sandbox.get("egress")
779
+
780
+ if egress is None:
781
+ # RT-SBX-009: absent is not empty. Say which one this is, because the
782
+ # difference decides whether the sandbox inherits the deployment's
783
+ # floor or is restricted to the platform's own destinations.
784
+ egress_line = "[dim]inherits the deployment's floor[/dim]"
785
+ else:
786
+ allowed = egress.get("allow") or []
787
+ egress_line = (
788
+ ", ".join(str(target) for target in allowed)
789
+ if allowed
790
+ else "[dim]declared, names nothing (platform destinations only)[/dim]"
791
+ )
792
+
793
+ capabilities = config.get("capabilities") or []
794
+ return "\n".join(
795
+ [
796
+ f"[dim]{'runtime':<{_LABEL_W}}[/dim]{payload.get('runtime_id', 'unknown')}",
797
+ f"[dim]{'version':<{_LABEL_W}}[/dim]{config.get('version', 'unknown')}",
798
+ f"[dim]{'capabilities':<{_LABEL_W}}[/dim]{len(capabilities)}",
799
+ f"[dim]{'egress':<{_LABEL_W}}[/dim]{egress_line}",
800
+ f"[dim]{'digest':<{_LABEL_W}}[/dim]{payload.get('config_digest', 'unknown')}",
801
+ ]
802
+ )
803
+
804
+
805
+ @cli.command(name="config-get", alias="config")
806
+ def config_get(
807
+ runtime_id: t.Annotated[str, cyclopts.Parameter(name="runtime-id")],
808
+ *,
809
+ as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
810
+ platform: PlatformScopeArgs = PlatformScopeArgs(),
811
+ ) -> None:
812
+ """Show a runtime's durable configuration.
813
+
814
+ Workspace read access is enough to read a config; only the owner may
815
+ replace one. Use --json for the full document — the summary shows the
816
+ fields with a CLI surface.
817
+
818
+ Args:
819
+ runtime_id: Runtime key or UUID, as shown by `dn runtime list`.
820
+ as_json: Output as JSON.
821
+ """
822
+ api, profile = platform.connect()
823
+ payload = api.get_runtime_config(profile.org_key, profile.workspace_key, runtime_id)
824
+ _render(payload, as_json=as_json, summary=_summarize_runtime_config)
825
+ if not as_json:
826
+ _hint(f"dn runtime config-set {runtime_id} --egress <target>")
827
+
828
+
829
+ @cli.command(name="config-set")
830
+ def config_set(
831
+ runtime_id: t.Annotated[str, cyclopts.Parameter(name="runtime-id")],
832
+ *,
833
+ file: t.Annotated[
834
+ Path | None,
835
+ cyclopts.Parameter(
836
+ name="--file",
837
+ help=(
838
+ "Replace the whole configuration with this runtime.yaml. "
839
+ "Wholesale, not a merge: a field the file omits is reset to "
840
+ "its default. Without --file the stored configuration is "
841
+ "edited in place and every other field is preserved."
842
+ ),
843
+ ),
844
+ ] = None,
845
+ egress: t.Annotated[
846
+ list[str] | None,
847
+ cyclopts.Parameter(
848
+ name="--egress",
849
+ help=(
850
+ "Outbound destination this runtime's sandbox may reach "
851
+ "(e.g. --egress target.example.com, --egress '*.internal.corp', "
852
+ "--egress 10.20.0.0/16; repeatable). Adds to the scope already "
853
+ "stored, or to --file's when given. Pass --empty-egress to "
854
+ "declare a scope that names nothing, restricting the sandbox "
855
+ "to the platform destinations alone."
856
+ ),
857
+ ),
858
+ ] = None,
859
+ yes: t.Annotated[bool, cyclopts.Parameter(name="--yes", alias="-y", negative=())] = False,
860
+ as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
861
+ platform: PlatformScopeArgs = PlatformScopeArgs(),
862
+ ) -> None:
863
+ """Replace a runtime's durable configuration.
864
+
865
+ Only the runtime's owner may call this, and it does not alter an already
866
+ running sandbox — the new configuration applies from the next start.
867
+
868
+ A narrowing egress declaration needs no permission beyond owning the
869
+ runtime, and is re-checked against the deployment's egress floor at start,
870
+ so a target the floor denies fails the start naming the target rather than
871
+ starting without it.
872
+
873
+ Args:
874
+ runtime_id: Runtime key or UUID, as shown by `dn runtime list`.
875
+ file: Replace the whole configuration with this runtime.yaml. Wholesale,
876
+ not a merge — a field the file omits is reset to its default.
877
+ egress: Outbound destination this runtime's sandbox may reach, as an
878
+ FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable).
879
+ yes: Skip the confirmation prompt when replacing wholesale with --file.
880
+ as_json: Output as JSON.
881
+ """
882
+ if file is None and egress is None:
883
+ raise ValueError(
884
+ "dn runtime config-set requires --file or --egress. "
885
+ "Run `dn runtime config-get <runtime-id>` to see the current configuration."
886
+ )
887
+
888
+ api, profile = platform.connect()
889
+
890
+ if file is not None:
891
+ manifest_identity, base = _split_runtime_manifest(api, file)
892
+ if manifest_identity:
893
+ # Identity is not part of the configuration document, so silently
894
+ # dropping these would look like they had been applied.
895
+ raise ValueError(
896
+ "runtime.yaml passed to config-set may not carry identity fields: "
897
+ + ", ".join(sorted(manifest_identity))
898
+ + ". Set those with `dn runtime create`."
899
+ )
900
+ base = base or {}
901
+ if not confirm_destructive(
902
+ f"Replace the configuration of runtime '{runtime_id}' wholesale? "
903
+ "Fields absent from the file are reset to their defaults.",
904
+ yes=yes,
905
+ ):
906
+ print_info("Aborted")
907
+ return
908
+ else:
909
+ current = api.get_runtime_config(profile.org_key, profile.workspace_key, runtime_id)
910
+ base = dict(current.get("config") or {})
911
+
912
+ updated = _apply_egress_targets(base, parse_egress_targets(egress)) or {}
913
+ payload = api.update_runtime_config(
914
+ profile.org_key,
915
+ profile.workspace_key,
916
+ runtime_id,
917
+ updated,
918
+ )
919
+
920
+ if as_json:
921
+ _render(payload, as_json=True, summary=_summarize_runtime_config)
922
+ return
923
+ print_success(f"Updated configuration for runtime '{runtime_id}'")
924
+ console.print(_summarize_runtime_config(payload))
925
+ _hint(f"dn runtime start {runtime_id}")
@@ -16,6 +16,7 @@ if t.TYPE_CHECKING:
16
16
  from dreadnode.app.main import Dreadnode
17
17
 
18
18
  from dreadnode.core.log import console
19
+ from dreadnode.packaging.egress import validate_target_list
19
20
 
20
21
  # Label-column width for detail views (2-space indent + label text + padding).
21
22
  # Shared so every domain renders key/value blocks with consistent alignment.
@@ -279,6 +280,29 @@ def merge_env_model_overrides(
279
280
  return merged or None
280
281
 
281
282
 
283
+ def parse_egress_targets(
284
+ values: list[str] | None,
285
+ *,
286
+ where: str = "--egress",
287
+ ) -> list[str] | None:
288
+ """Parse repeatable ``--egress TARGET`` flags into a canonical target list.
289
+
290
+ Also used for the equivalent block loaded from a manifest -- pass ``where``
291
+ so the error names the field the author actually wrote.
292
+
293
+ Validated against the same grammar the task contract uses (``TSK-EGR-002``)
294
+ so a bad target is named here rather than after a round trip. Whether a
295
+ target is *reachable* depends on the deployment's egress floor, which only
296
+ the platform can judge, so that check stays at provision (``TSK-EGR-005``).
297
+
298
+ Returns ``None`` when no flags are given -- distinct from an empty list,
299
+ which is a declaration in its own right.
300
+ """
301
+ if values is None:
302
+ return None
303
+ return validate_target_list(values, where=where)
304
+
305
+
282
306
  def _parse_ref(value: str) -> tuple[str | None, str, str | None]:
283
307
  """Shared parsing logic for artifact references."""
284
308
  version: str | None = None
@@ -754,6 +754,19 @@ def info(
754
754
  if tags and isinstance(tags, list):
755
755
  console.print(f" [dim]tags:[/dim] {', '.join(str(tag) for tag in tags)}")
756
756
 
757
+ # Shown only when declared: absent means the task inherits the deployment's
758
+ # floor, and an empty allow list is a declaration in its own right, so the
759
+ # two must not read alike (TSK-EGR-003).
760
+ egress = task.get("egress")
761
+ if isinstance(egress, dict):
762
+ allowed = egress.get("allow") or []
763
+ egress_line = (
764
+ ", ".join(str(target) for target in allowed)
765
+ if allowed
766
+ else "[dim]declared, names nothing (platform destinations only)[/dim]"
767
+ )
768
+ console.print(f" [dim]egress:[/dim] {egress_line}")
769
+
757
770
  instruction = task.get("instruction")
758
771
  if instruction:
759
772
  console.print()
@@ -25,11 +25,6 @@ if t.TYPE_CHECKING:
25
25
  from dreadnode.capabilities.types import AgentDef
26
26
 
27
27
 
28
- def _tool_name(tool: t.Any) -> str:
29
- """Get the name of a tool object."""
30
- return getattr(tool, "name", "")
31
-
32
-
33
28
  _COMPONENT_KINDS: frozenset[str] = frozenset(t.get_args(ComponentKind))
34
29
  _LOGGED_MALFORMED_ENTRIES: set[str] = set()
35
30
 
@@ -163,28 +158,15 @@ class CapabilityRegistry:
163
158
  return capability_name, capability, agent_def
164
159
 
165
160
  def all_tools(self) -> list[t.Any]:
166
- """All tools from all capabilities + MCP servers, deduped by name."""
167
- seen: set[str] = set()
161
+ """Return every tool with a unique computed wire name."""
162
+ from dreadnode.capabilities.tool_rules import validate_wire_names
163
+
168
164
  tools: list[t.Any] = []
169
165
  for cap in self.capabilities.values():
170
- for tool in cap.tools:
171
- name = _tool_name(tool)
172
- if name and name not in seen:
173
- tools.append(tool)
174
- seen.add(name)
175
- elif name in seen:
176
- logger.debug(
177
- "Tool '{}' already registered, skipping duplicate",
178
- name,
179
- )
166
+ tools.extend(cap.tools)
180
167
  if self.mcp_manager:
181
- for tool in self.mcp_manager.all_tools():
182
- name = _tool_name(tool)
183
- if name and name not in seen:
184
- tools.append(tool)
185
- seen.add(name)
186
- elif name in seen:
187
- logger.debug("Tool '{}' already registered (MCP), skipping", name)
168
+ tools.extend(self.mcp_manager.all_tools())
169
+ validate_wire_names(tools)
188
170
  return tools
189
171
 
190
172
  def all_hooks(self) -> list[t.Any]: