dreadnode 2.0.44__tar.gz → 2.0.45__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.44 → dreadnode-2.0.45}/PKG-INFO +1 -1
  2. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/_base.py +74 -13
  3. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/evaluation.py +3 -1
  4. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/main.py +150 -35
  5. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/app.py +44 -21
  6. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/prompt.py +7 -1
  7. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/app.py +36 -2
  8. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/dreadnode.tcss +37 -34
  9. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/raw_spans.py +2 -2
  10. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/theme.py +54 -31
  11. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tool.py +2 -1
  12. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -3
  13. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -3
  14. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +1 -2
  15. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +59 -26
  16. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +4 -4
  17. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/tls.py +1 -1
  18. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/storage.py +4 -3
  19. {dreadnode-2.0.44 → dreadnode-2.0.45}/pyproject.toml +1 -1
  20. {dreadnode-2.0.44 → dreadnode-2.0.45}/.gitignore +0 -0
  21. {dreadnode-2.0.44 → dreadnode-2.0.45}/LICENSE +0 -0
  22. {dreadnode-2.0.44 → dreadnode-2.0.45}/README.md +0 -0
  23. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/__init__.py +0 -0
  24. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/__main__.py +0 -0
  25. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/__init__.py +0 -0
  26. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/agent.py +0 -0
  27. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/AGENTS.md +0 -0
  28. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/__init__.py +0 -0
  29. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/base.py +0 -0
  30. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/claude_code.py +0 -0
  31. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/engines/native.py +0 -0
  32. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/events.py +0 -0
  33. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/exceptions.py +0 -0
  34. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/format.py +0 -0
  35. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/hooks.py +0 -0
  36. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/judge.py +0 -0
  37. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/__init__.py +0 -0
  38. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/auth.py +0 -0
  39. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/client.py +0 -0
  40. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/config.py +0 -0
  41. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/mcp/server.py +0 -0
  42. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/process_judge.py +0 -0
  43. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/reactions.py +0 -0
  44. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/sanitize.py +0 -0
  45. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/skills.py +0 -0
  46. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/stopping.py +0 -0
  47. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/subagent.py +0 -0
  48. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/tool_resolution.py +0 -0
  49. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/tools.py +0 -0
  50. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/agents/trajectory.py +0 -0
  51. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/__init__.py +0 -0
  52. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/adversarial_reasoning.py +0 -0
  53. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/advpromptier.py +0 -0
  54. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/agent_suite.py +0 -0
  55. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/agentic_suite.py +0 -0
  56. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/alignment_faking.py +0 -0
  57. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analogy_escalation.py +0 -0
  58. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/__init__.py +0 -0
  59. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/aggregator.py +0 -0
  60. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/classifier.py +0 -0
  61. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/compliance.py +0 -0
  62. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/engine.py +0 -0
  63. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/recommendations.py +0 -0
  64. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/analytics/types.py +0 -0
  65. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/approval_bypass.py +0 -0
  66. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/aprt_progressive.py +0 -0
  67. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/art_engine.py +0 -0
  68. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/assessment.py +0 -0
  69. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/__init__.py +0 -0
  70. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/defense.py +0 -0
  71. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/failure.py +0 -0
  72. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/gate.py +0 -0
  73. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/memory.py +0 -0
  74. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/modes.py +0 -0
  75. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/probes.py +0 -0
  76. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/recon.py +0 -0
  77. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/router.py +0 -0
  78. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/atlas/strategy.py +0 -0
  79. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/attention_shifting.py +0 -0
  80. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/authz.py +0 -0
  81. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/autodan_turbo.py +0 -0
  82. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/autoredteamer.py +0 -0
  83. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/beast.py +0 -0
  84. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/browser_probes.py +0 -0
  85. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/__init__.py +0 -0
  86. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/atlas.py +0 -0
  87. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/nist.py +0 -0
  88. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/owasp.py +0 -0
  89. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  90. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/compliance/saif.py +0 -0
  91. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/constants.py +0 -0
  92. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/cot_jailbreak.py +0 -0
  93. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/crescendo.py +0 -0
  94. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/__init__.py +0 -0
  95. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  96. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  97. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/assets/image/meth.png +0 -0
  98. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  99. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  100. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  101. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  102. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  103. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  104. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  105. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  106. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  107. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  108. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  109. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  110. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  111. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  112. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  113. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  114. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  115. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  116. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/deep_inception.py +0 -0
  117. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/detect.py +0 -0
  118. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/drattack.py +0 -0
  119. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/echo_chamber.py +0 -0
  120. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/__init__.py +0 -0
  121. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/_base.py +0 -0
  122. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/_text_common.py +0 -0
  123. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/bae.py +0 -0
  124. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/boundary.py +0 -0
  125. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  126. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  127. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/pwws.py +0 -0
  128. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/simba.py +0 -0
  129. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/square.py +0 -0
  130. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/text.py +0 -0
  131. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/textbugger.py +0 -0
  132. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/textfooler.py +0 -0
  133. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/evasion/zoo.py +0 -0
  134. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/events.py +0 -0
  135. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/__init__.py +0 -0
  136. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/_base.py +0 -0
  137. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/activethief.py +0 -0
  138. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/copycat.py +0 -0
  139. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/distillation.py +0 -0
  140. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/equation_solving.py +0 -0
  141. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/jacobian.py +0 -0
  142. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/extraction/knockoff.py +0 -0
  143. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/genetic_persona.py +0 -0
  144. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/goat.py +0 -0
  145. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/goat_v2.py +0 -0
  146. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/gptfuzzer.py +0 -0
  147. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/honeytoken.py +0 -0
  148. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/humor_bypass.py +0 -0
  149. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/image.py +0 -0
  150. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/injection_channels.py +0 -0
  151. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/__init__.py +0 -0
  152. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/_base.py +0 -0
  153. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/confidence.py +0 -0
  154. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  155. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/j2_meta.py +0 -0
  156. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/jbdistill.py +0 -0
  157. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/jbfuzz.py +0 -0
  158. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/lrm_autonomous.py +0 -0
  159. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/mapf.py +0 -0
  160. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/mcp_probes.py +0 -0
  161. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/__init__.py +0 -0
  162. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/_base.py +0 -0
  163. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/entropy.py +0 -0
  164. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/label_only.py +0 -0
  165. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/lira.py +0 -0
  166. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/loss.py +0 -0
  167. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/shadow_model.py +0 -0
  168. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/membership/threshold.py +0 -0
  169. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/message_parts.py +0 -0
  170. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/model_export.py +0 -0
  171. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/multimodal.py +0 -0
  172. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/nexus.py +0 -0
  173. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/oast.py +0 -0
  174. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/pair.py +0 -0
  175. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/persona_hijack.py +0 -0
  176. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/policies.py +0 -0
  177. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/probe_planner.py +0 -0
  178. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/prompt.py +0 -0
  179. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/propagation.py +0 -0
  180. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/quantization_safety.py +0 -0
  181. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/rainbow.py +0 -0
  182. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/refusal_aware.py +0 -0
  183. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/renellm.py +0 -0
  184. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/__init__.py +0 -0
  185. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/json_report.py +0 -0
  186. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/llm_summary.py +0 -0
  187. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reporting/markdown.py +0 -0
  188. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/resource_abuse.py +0 -0
  189. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/reward_hacking.py +0 -0
  190. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/salami_slicing.py +0 -0
  191. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/self_persuasion.py +0 -0
  192. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/siren.py +0 -0
  193. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tap.py +0 -0
  194. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/target.py +0 -0
  195. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/__init__.py +0 -0
  196. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/auth.py +0 -0
  197. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/factory.py +0 -0
  198. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/http.py +0 -0
  199. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/message.py +0 -0
  200. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/prediction.py +0 -0
  201. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/spec.py +0 -0
  202. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  203. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  204. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/templatefuzz.py +0 -0
  205. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tmap_trajectory.py +0 -0
  206. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/tool_attack.py +0 -0
  207. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/trojail.py +0 -0
  208. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/airt/watermark_removal.py +0 -0
  209. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/__init__.py +0 -0
  210. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/__init__.py +0 -0
  211. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/client.py +0 -0
  212. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/api/models.py +0 -0
  213. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/__init__.py +0 -0
  214. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/airt.py +0 -0
  215. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/args.py +0 -0
  216. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/capability.py +0 -0
  217. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/dataset.py +0 -0
  218. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/environment.py +0 -0
  219. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/inference_model.py +0 -0
  220. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/judge.py +0 -0
  221. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/model.py +0 -0
  222. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/optimize.py +0 -0
  223. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/runtime.py +0 -0
  224. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/sandbox.py +0 -0
  225. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/secret.py +0 -0
  226. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/session.py +0 -0
  227. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/shared.py +0 -0
  228. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/task.py +0 -0
  229. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/task_set.py +0 -0
  230. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/__init__.py +0 -0
  231. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  232. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  233. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  234. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  235. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  236. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  237. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  238. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  239. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  240. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/train.py +0 -0
  241. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/cli/worlds.py +0 -0
  242. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/__init__.py +0 -0
  243. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/interactive.py +0 -0
  244. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/managed_client.py +0 -0
  245. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/models.py +0 -0
  246. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/runtime_client.py +0 -0
  247. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/client/transports.py +0 -0
  248. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/config.py +0 -0
  249. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/env.py +0 -0
  250. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/main.py +0 -0
  251. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/model_catalog.py +0 -0
  252. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/paths.py +0 -0
  253. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/print_mode.py +0 -0
  254. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/__init__.py +0 -0
  255. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/auth.py +0 -0
  256. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/capability_manager.py +0 -0
  257. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/model_resolution.py +0 -0
  258. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/prompt_registry.py +0 -0
  259. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/runtime_credentials.py +0 -0
  260. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/runtime_events.py +0 -0
  261. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/session_hydrator.py +0 -0
  262. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/session_persistence.py +0 -0
  263. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/turn_coordinator.py +0 -0
  264. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/utils.py +0 -0
  265. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/websocket.py +0 -0
  266. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/worker_manager.py +0 -0
  267. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/server/ws_auth.py +0 -0
  268. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/__init__.py +0 -0
  269. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/auth_flow.py +0 -0
  270. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/bug_report.py +0 -0
  271. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/capabilities_manager.py +0 -0
  272. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/command_dispatcher.py +0 -0
  273. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/commands.py +0 -0
  274. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/connection.py +0 -0
  275. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/error_handler.py +0 -0
  276. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/model_manager.py +0 -0
  277. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/model_variants.py +0 -0
  278. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/profile_manager.py +0 -0
  279. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screen_router.py +0 -0
  280. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/__init__.py +0 -0
  281. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/auth.py +0 -0
  282. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/base.py +0 -0
  283. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/capabilities.py +0 -0
  284. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  285. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/connection_error.py +0 -0
  286. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/console.py +0 -0
  287. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/environments.py +0 -0
  288. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/evaluations.py +0 -0
  289. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/models.py +0 -0
  290. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/readme.py +0 -0
  291. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/report_bug.py +0 -0
  292. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/runtimes.py +0 -0
  293. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  294. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/secrets.py +0 -0
  295. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/services.py +0 -0
  296. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/sessions.py +0 -0
  297. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  298. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/traces.py +0 -0
  299. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/screens/workspaces.py +0 -0
  300. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/sessions_manager.py +0 -0
  301. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/spans_reader.py +0 -0
  302. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/status_messages.py +0 -0
  303. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/tool_format.py +0 -0
  304. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_coordinator.py +0 -0
  305. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  306. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_reducer.py +0 -0
  307. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/turn_state_phase.py +0 -0
  308. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/update_check.py +0 -0
  309. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/__init__.py +0 -0
  310. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  311. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  312. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/composer.py +0 -0
  313. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  314. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  315. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/conversation.py +0 -0
  316. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/flash.py +0 -0
  317. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  318. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  319. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  320. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  321. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  322. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  323. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  324. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  325. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  326. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  327. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  328. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
  329. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  330. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  331. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  332. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  333. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/throbber.py +0 -0
  334. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  335. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  336. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/welcome.py +0 -0
  337. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/widgets/whoami.py +0 -0
  338. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/app/tui/wire_events.py +0 -0
  339. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/__init__.py +0 -0
  340. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  341. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  342. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  343. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  344. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  345. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  346. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  347. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  348. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  349. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  350. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -0
  351. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  352. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  353. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  354. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  355. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  356. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  357. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  358. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  359. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  360. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
  361. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  362. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  363. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  364. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  365. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  366. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  367. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  368. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  369. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  370. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  371. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
  372. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  373. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  374. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  375. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  376. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  377. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  378. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  379. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  380. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  381. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  382. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  383. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  384. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +0 -0
  385. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  386. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  387. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  388. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  389. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  390. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  391. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  392. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
  393. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  394. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  395. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  396. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  397. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  398. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  399. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  400. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  401. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  402. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  403. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  404. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  405. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  406. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  407. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  408. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  409. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  410. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  411. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  412. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  413. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  414. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  415. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  416. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  417. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  418. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  419. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  420. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  421. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
  422. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  423. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  424. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  425. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  426. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  427. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  428. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  429. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  430. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  431. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  432. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  433. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  434. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  435. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  436. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  437. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/__init__.py +0 -0
  438. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/capability.py +0 -0
  439. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/command_tools.py +0 -0
  440. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/flags.py +0 -0
  441. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/install.py +0 -0
  442. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/loader.py +0 -0
  443. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/sync.py +0 -0
  444. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/tool_rules.py +0 -0
  445. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/types.py +0 -0
  446. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/worker.py +0 -0
  447. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/capabilities/worker_runner.py +0 -0
  448. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/__init__.py +0 -0
  449. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/conditions.py +0 -0
  450. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/discovery.py +0 -0
  451. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/environment.py +0 -0
  452. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/exceptions.py +0 -0
  453. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/execution.py +0 -0
  454. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/hook.py +0 -0
  455. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/judge.py +0 -0
  456. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/load.py +0 -0
  457. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/log.py +0 -0
  458. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/__init__.py +0 -0
  459. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/config.py +0 -0
  460. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/context.py +0 -0
  461. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/hydrate.py +0 -0
  462. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/meta/introspect.py +0 -0
  463. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/metric.py +0 -0
  464. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/object.py +0 -0
  465. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/scorer.py +0 -0
  466. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/serialization.py +0 -0
  467. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/startup_clock.py +0 -0
  468. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/stopping.py +0 -0
  469. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/task.py +0 -0
  470. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/templating.py +0 -0
  471. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/transforms.py +0 -0
  472. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/__init__.py +0 -0
  473. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/audio.py +0 -0
  474. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/base.py +0 -0
  475. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/common.py +0 -0
  476. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/image.py +0 -0
  477. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/object_3d.py +0 -0
  478. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/table.py +0 -0
  479. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/text.py +0 -0
  480. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/types/video.py +0 -0
  481. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/core/util.py +0 -0
  482. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/__init__.py +0 -0
  483. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/dataset.py +0 -0
  484. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/hf.py +0 -0
  485. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/datasets/local.py +0 -0
  486. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/__init__.py +0 -0
  487. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/console.py +0 -0
  488. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/evaluation.py +0 -0
  489. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/events.py +0 -0
  490. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/format.py +0 -0
  491. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/result.py +0 -0
  492. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/evaluations/sample.py +0 -0
  493. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/__init__.py +0 -0
  494. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/caching.py +0 -0
  495. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/chat.py +0 -0
  496. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/data.py +0 -0
  497. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/exceptions.py +0 -0
  498. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/__init__.py +0 -0
  499. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/base.py +0 -0
  500. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/http.py +0 -0
  501. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/litellm_.py +0 -0
  502. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/transformers_.py +0 -0
  503. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/generator/vllm_.py +0 -0
  504. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/message.py +0 -0
  505. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/models.py +0 -0
  506. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/parsing.py +0 -0
  507. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/proxy.py +0 -0
  508. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/__init__.py +0 -0
  509. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/base.py +0 -0
  510. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  511. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/generators/utils.py +0 -0
  512. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/__init__.py +0 -0
  513. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/config.py +0 -0
  514. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/items/models.py +0 -0
  515. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/__init__.py +0 -0
  516. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/outcome.py +0 -0
  517. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/trajectory.py +0 -0
  518. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/judges/trajectory_tools.py +0 -0
  519. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/__init__.py +0 -0
  520. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/hf.py +0 -0
  521. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/local.py +0 -0
  522. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/models/model.py +0 -0
  523. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/__init__.py +0 -0
  524. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/__init__.py +0 -0
  525. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  526. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/agent.py +0 -0
  527. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/env.py +0 -0
  528. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/runtime.py +0 -0
  529. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/adapters/stack.py +0 -0
  530. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/api.py +0 -0
  531. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/__init__.py +0 -0
  532. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/base.py +0 -0
  533. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/backends/gepa.py +0 -0
  534. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/collectors.py +0 -0
  535. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/config.py +0 -0
  536. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/console.py +0 -0
  537. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/events.py +0 -0
  538. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/format.py +0 -0
  539. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/jobs.py +0 -0
  540. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/result.py +0 -0
  541. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/sampler.py +0 -0
  542. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/sampling.py +0 -0
  543. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/search.py +0 -0
  544. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/stopping.py +0 -0
  545. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/study.py +0 -0
  546. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/optimization/trial.py +0 -0
  547. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/__init__.py +0 -0
  548. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/egress.py +0 -0
  549. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/loader.py +0 -0
  550. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/manifest.py +0 -0
  551. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/oci.py +0 -0
  552. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/package.py +0 -0
  553. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/packaging/task_validation.py +0 -0
  554. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/__init__.py +0 -0
  555. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/guard.py +0 -0
  556. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/reconciliation.py +0 -0
  557. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  558. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/policies/scope.py +0 -0
  559. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/py.typed +0 -0
  560. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/__init__.py +0 -0
  561. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/boundary.py +0 -0
  562. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/fuzzing.py +0 -0
  563. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/graph.py +0 -0
  564. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/grid.py +0 -0
  565. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/image.py +0 -0
  566. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/mapelites.py +0 -0
  567. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/optuna.py +0 -0
  568. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/random.py +0 -0
  569. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/registry.py +0 -0
  570. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/samplers/strategy.py +0 -0
  571. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/__init__.py +0 -0
  572. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  573. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agent_security.py +0 -0
  574. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agentic.py +0 -0
  575. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/agentic_workflow.py +0 -0
  576. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/attack_outcome.py +0 -0
  577. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/browser_security.py +0 -0
  578. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/classification.py +0 -0
  579. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/consistency.py +0 -0
  580. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/contains.py +0 -0
  581. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/cosine_sim.py +0 -0
  582. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/credentials.py +0 -0
  583. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/crucible.py +0 -0
  584. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/documentation_security.py +0 -0
  585. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/exfiltration_detection.py +0 -0
  586. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/format.py +0 -0
  587. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/harm.py +0 -0
  588. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/ide_security.py +0 -0
  589. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/image.py +0 -0
  590. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/json.py +0 -0
  591. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/judge.py +0 -0
  592. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/judge_ensemble.py +0 -0
  593. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/length.py +0 -0
  594. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/lexical.py +0 -0
  595. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/mcp_security.py +0 -0
  596. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/memorization.py +0 -0
  597. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/multi_agent_security.py +0 -0
  598. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/pii.py +0 -0
  599. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/prompt_leak.py +0 -0
  600. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/readability.py +0 -0
  601. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/reasoning_security.py +0 -0
  602. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/sentiment.py +0 -0
  603. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/similarity.py +0 -0
  604. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/structural_detection.py +0 -0
  605. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/scorers/supply_chain_detection.py +0 -0
  606. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/__init__.py +0 -0
  607. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/providers.py +0 -0
  608. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/storage/session_store.py +0 -0
  609. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/__init__.py +0 -0
  610. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/_ripgrep.py +0 -0
  611. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/apply_patch.py +0 -0
  612. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/dreadnode_cli.py +0 -0
  613. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/editing.py +0 -0
  614. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/execute.py +0 -0
  615. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/fetch.py +0 -0
  616. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/glob.py +0 -0
  617. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/grep.py +0 -0
  618. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/interaction.py +0 -0
  619. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/ls.py +0 -0
  620. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/memory.py +0 -0
  621. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/project_memory.py +0 -0
  622. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/read.py +0 -0
  623. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/report.py +0 -0
  624. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/report_items.py +0 -0
  625. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/submission.py +0 -0
  626. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/task.py +0 -0
  627. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/think.py +0 -0
  628. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/todo.py +0 -0
  629. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/trajectory_search.py +0 -0
  630. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/web_extract.py +0 -0
  631. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/web_search.py +0 -0
  632. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tools/write.py +0 -0
  633. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/__init__.py +0 -0
  634. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/constants.py +0 -0
  635. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/convert.py +0 -0
  636. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/exporter.py +0 -0
  637. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/exporters.py +0 -0
  638. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/span.py +0 -0
  639. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/spans.py +0 -0
  640. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/tracing/trace_converter.py +0 -0
  641. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/__init__.py +0 -0
  642. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/_progress.py +0 -0
  643. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/base.py +0 -0
  644. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/dpo.py +0 -0
  645. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/env_rollouts.py +0 -0
  646. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/__init__.py +0 -0
  647. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/_common.py +0 -0
  648. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/rl.py +0 -0
  649. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/sft.py +0 -0
  650. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/etl/worlds.py +0 -0
  651. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/events.py +0 -0
  652. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/grpo.py +0 -0
  653. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/jobs.py +0 -0
  654. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/models.py +0 -0
  655. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ppo.py +0 -0
  656. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/prime.py +0 -0
  657. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/__init__.py +0 -0
  658. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/async_trainer.py +0 -0
  659. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/config.py +0 -0
  660. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/coordinator.py +0 -0
  661. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/distributed.py +0 -0
  662. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/dpo.py +0 -0
  663. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/experience.py +0 -0
  664. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  665. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/inference.py +0 -0
  666. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/learner.py +0 -0
  667. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/multi_turn.py +0 -0
  668. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/ppo.py +0 -0
  669. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/reward_model.py +0 -0
  670. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/rollout_env.py +0 -0
  671. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/rollout_worker.py +0 -0
  672. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/sft.py +0 -0
  673. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/ray/trainer.py +0 -0
  674. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/recipes.py +0 -0
  675. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/__init__.py +0 -0
  676. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/aggregator.py +0 -0
  677. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/functions.py +0 -0
  678. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  679. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/shaping.py +0 -0
  680. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rewards/types.py +0 -0
  681. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/__init__.py +0 -0
  682. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/adapters.py +0 -0
  683. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  684. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/orchestrator.py +0 -0
  685. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/types.py +0 -0
  686. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/rollouts/worlds.py +0 -0
  687. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/serving/__init__.py +0 -0
  688. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/serving/vllm_client.py +0 -0
  689. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/sft.py +0 -0
  690. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/__init__.py +0 -0
  691. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/config.py +0 -0
  692. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/data.py +0 -0
  693. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/renderer.py +0 -0
  694. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/rl.py +0 -0
  695. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker/trainer.py +0 -0
  696. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/tinker_sft.py +0 -0
  697. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/training/utils.py +0 -0
  698. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/__init__.py +0 -0
  699. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  700. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/adversarial_suffix.py +0 -0
  701. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/agent_skill.py +0 -0
  702. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/agentic_workflow.py +0 -0
  703. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/art_prompt.py +0 -0
  704. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/audio.py +0 -0
  705. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/backdoor_finetune.py +0 -0
  706. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  707. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/cipher.py +0 -0
  708. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/competitive_parity.py +0 -0
  709. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/constitutional.py +0 -0
  710. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/document.py +0 -0
  711. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/documentation_poison.py +0 -0
  712. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/encoding.py +0 -0
  713. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/exfiltration.py +0 -0
  714. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/flip_attack.py +0 -0
  715. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/guardrail_bypass.py +0 -0
  716. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/ide_injection.py +0 -0
  717. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/image.py +0 -0
  718. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/injection.py +0 -0
  719. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/json_tools.py +0 -0
  720. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/language.py +0 -0
  721. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/logic_bomb.py +0 -0
  722. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/mcp_attacks.py +0 -0
  723. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  724. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/multimodal_attacks.py +0 -0
  725. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/past_tense.py +0 -0
  726. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/persuasion.py +0 -0
  727. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/perturbation.py +0 -0
  728. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/pii_extraction.py +0 -0
  729. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/pythonic_tools.py +0 -0
  730. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/rag_poisoning.py +0 -0
  731. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/reasoning_attacks.py +0 -0
  732. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/refine.py +0 -0
  733. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/response_steering.py +0 -0
  734. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/structural_exploits.py +0 -0
  735. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/stylistic.py +0 -0
  736. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/substitution.py +0 -0
  737. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/supply_chain.py +0 -0
  738. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/swap.py +0 -0
  739. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  740. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/text.py +0 -0
  741. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/video.py +0 -0
  742. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/transforms/xml_tools.py +0 -0
  743. {dreadnode-2.0.44 → dreadnode-2.0.45}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.44
3
+ Version: 2.0.45
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -89,12 +89,27 @@ class BlackBoxAttack:
89
89
  self.rng = np.random.default_rng(seed)
90
90
  self.airt_assessment_id = airt_assessment_id
91
91
  self.airt_target_model = airt_target_model or target.name
92
- self.airt_goal = airt_goal or self.default_goal
92
+ # Make the default goal target-aware so the same objective against
93
+ # different models counts as distinct goals on the dashboard (e.g. evasion
94
+ # of the fraud, digits, and sentiment classifiers = 3 goals, not 1). An
95
+ # explicit airt_goal is respected verbatim; only the default is suffixed.
96
+ self.airt_goal = airt_goal or (
97
+ f"{self.default_goal} on {self.airt_target_model}"
98
+ if self.airt_target_model
99
+ else self.default_goal
100
+ )
93
101
  self.airt_goal_category = airt_goal_category or self.default_goal_category
94
102
  self._query_count = 0
95
103
  #: A sample of real (input -> prediction) pairs so the finding can show
96
104
  #: the actual queries the attacker sent, not just the total count.
97
105
  self._query_samples: list[dict[str, t.Any]] = []
106
+ #: Count of trial spans emitted this run. Each algorithm iteration is one
107
+ #: trial (mirroring how a generative Study counts a trial per step), so the
108
+ #: platform can count trials / incurred budget for traditional-ML attacks.
109
+ self._trials_emitted = 0
110
+ #: Hard safety cap on trial spans so a pathologically long loop cannot
111
+ #: explode the trace tree.
112
+ self._max_trial_spans = 1000
98
113
 
99
114
  # -- target I/O -------------------------------------------------------- #
100
115
  async def _query(self, xs: t.Sequence[QueryInput]) -> list[Prediction]:
@@ -146,28 +161,74 @@ class BlackBoxAttack:
146
161
  metrics: dict[str, float] | None = None,
147
162
  **attrs: t.Any,
148
163
  ) -> None:
149
- """Emit a point-in-time span for one algorithm iteration, recording the
164
+ """Emit a **trial** span for one algorithm iteration, recording the
150
165
  intermediate adversarial state so the full attack trajectory is
151
- inspectable in the Traces tab.
166
+ inspectable in the Traces tab and every iteration is counted as a trial.
167
+
168
+ One iteration == one trial: this mirrors how a generative ``Study`` emits
169
+ a trial span per refinement step, so the platform counts trials (and the
170
+ incurred query budget) for traditional-ML attacks the same way. The span
171
+ carries the AIRT assessment/attack attributes and is a child of the run's
172
+ ``study`` span (opened in :meth:`run`), which is how ClickHouse links a
173
+ trial to its assessment.
152
174
 
153
175
  ``input`` is the current candidate (perturbed text / feature vector /
154
176
  image preview) the attacker sent; ``output`` is the target's response at
155
- this step (predicted label + confidence); ``metrics`` are the scalar
156
- signals (distance, confidence, fidelity) plotted over the run. Capped
157
- (first 20 iterations, then every 10th) so a long run does not explode the
177
+ this step; ``metrics`` are the scalar signals (distance, confidence,
178
+ fidelity) plotted over the run. The lightweight trial span is emitted
179
+ every iteration; the heavier input/output previews are attached only for
180
+ the first 20 iterations then every 10th, so a long run does not bloat the
158
181
  trace tree."""
159
- if iteration >= 20 and iteration % 10 != 0:
182
+ if self._trials_emitted >= self._max_trial_spans:
160
183
  return
161
- with self._phase(f"step {iteration}", iteration=iteration, **attrs) as span:
162
- if span is None or not hasattr(span, "log_input"):
184
+ self._trials_emitted += 1
185
+ heavy = iteration < 20 or iteration % 10 == 0
186
+ with self._trial(iteration, **attrs) as span:
187
+ if span is None or not hasattr(span, "log_metric"):
163
188
  return
164
189
  with suppress(Exception):
165
- if input is not None:
166
- span.log_input("candidate", input)
167
- if output is not None:
168
- span.log_output("prediction", output)
169
190
  for key, value in (metrics or {}).items():
170
191
  span.log_metric(key, float(value), step=iteration)
192
+ if heavy and input is not None and hasattr(span, "log_input"):
193
+ span.log_input("candidate", input)
194
+ if heavy and output is not None and hasattr(span, "log_output"):
195
+ span.log_output("prediction", output)
196
+
197
+ def _trial(self, iteration: int, **attrs: t.Any) -> t.Any:
198
+ """Open a ``trial`` span for one iteration, tagged with the AIRT
199
+ assessment/attack attributes so it is counted against this assessment."""
200
+ try:
201
+ from dreadnode.tracing.spans import trial_span
202
+
203
+ ctx = trial_span(
204
+ trial_id=f"{self._attack_name}-{iteration}-{self._trials_emitted}",
205
+ step=int(iteration),
206
+ airt_assessment_id=self.airt_assessment_id,
207
+ airt_trial_index=int(iteration),
208
+ airt_attack_name=self._attack_name,
209
+ airt_attack_domain=self.attack_domain,
210
+ airt_target_model=self.airt_target_model,
211
+ airt_goal=self.airt_goal,
212
+ airt_goal_category=self.airt_goal_category,
213
+ airt_input_modality=self.modality,
214
+ )
215
+ except Exception:
216
+ return nullcontext()
217
+ if not attrs:
218
+ return ctx
219
+ # Fold any per-iteration attrs (e.g. distance norm) onto the span.
220
+ from contextlib import contextmanager
221
+
222
+ @contextmanager
223
+ def _wrapped() -> t.Iterator[t.Any]:
224
+ with ctx as span:
225
+ if span is not None and hasattr(span, "set_attribute"):
226
+ with suppress(Exception):
227
+ for key, value in attrs.items():
228
+ span.set_attribute(str(key), value)
229
+ yield span
230
+
231
+ return _wrapped()
171
232
 
172
233
  # -- run scaffold ------------------------------------------------------ #
173
234
  @property
@@ -792,7 +792,9 @@ def create(
792
792
  max_steps: Maximum agent tool/generation steps per sample.
793
793
  Enforced via a headless session policy; the task timeout still
794
794
  applies as a wall-clock bound.
795
- cleanup_policy: Sandbox cleanup policy.
795
+ cleanup_policy: Sandbox cleanup policy. Hosted E2B evaluations support
796
+ only ``always``; ``on_success`` is available on Docker and
797
+ OpenSandbox deployments.
796
798
  judge_model: Override the judge model for all tasks in this evaluation.
797
799
  egress: Additional outbound destination for this run's sandboxes, as an
798
800
  FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Unions
@@ -1,9 +1,11 @@
1
1
  """Root cyclopts App with top-level commands (tui, login, serve)."""
2
2
 
3
+ import importlib
3
4
  import importlib.metadata
4
5
  import os
5
6
  import secrets
6
7
  import sys
8
+ import threading
7
9
  import time
8
10
  import typing as t
9
11
 
@@ -14,25 +16,8 @@ import cyclopts
14
16
  from loguru import logger
15
17
  from rich.panel import Panel
16
18
 
17
- from dreadnode.app.cli.airt import cli as airt_cli
18
19
  from dreadnode.app.cli.args import RESUME_PICK_SENTINEL, PlatformArgs, TuiArgs
19
- from dreadnode.app.cli.capability import cli as capability_cli
20
- from dreadnode.app.cli.dataset import cli as dataset_cli
21
- from dreadnode.app.cli.environment import cli as environment_cli
22
- from dreadnode.app.cli.evaluation import cli as evaluation_cli
23
- from dreadnode.app.cli.inference_model import cli as inference_model_cli
24
- from dreadnode.app.cli.judge import cli as judge_cli
25
- from dreadnode.app.cli.model import cli as model_cli
26
- from dreadnode.app.cli.optimize import cli as optimize_cli
27
- from dreadnode.app.cli.runtime import cli as runtime_cli
28
- from dreadnode.app.cli.sandbox import cli as sandbox_cli
29
- from dreadnode.app.cli.secret import cli as secret_cli
30
- from dreadnode.app.cli.session import cli as session_cli
31
20
  from dreadnode.app.cli.shared import console, print_error, print_success
32
- from dreadnode.app.cli.task import cli as task_cli
33
- from dreadnode.app.cli.task_set import cli as task_set_cli
34
- from dreadnode.app.cli.train import cli as train_cli
35
- from dreadnode.app.cli.worlds import cli as worlds_cli
36
21
  from dreadnode.app.model_catalog import resolve_model
37
22
  from dreadnode.core.tls import format_tls_error
38
23
 
@@ -68,7 +53,55 @@ def _render_profile_context(profile: t.Any) -> str:
68
53
  # Root app
69
54
  # ---------------------------------------------------------------------------
70
55
 
71
- cli = cyclopts.App(
56
+
57
+ class _LazyCommandApp(cyclopts.App):
58
+ """Root app that resolves subcommands from the tokens it is handed.
59
+
60
+ Subcommands import on demand (see ``_LAZY_COMMANDS`` below), so anything
61
+ reaching this object directly rather than through ``run()`` would otherwise
62
+ see only the commands defined in this module. That failure is silent:
63
+ cyclopts answers an unregistered command by printing the *root* help and
64
+ exiting 0, so the caller gets a plausible wrong answer instead of an error.
65
+
66
+ Preparing inside the entry points covers every caller rather than the two
67
+ that happen to be known today — the agent's ``dreadnode_cli`` tool calls
68
+ ``cli(tokens)``, tests call ``parse_args``, and the next one has not been
69
+ written yet. Registration is idempotent, so the repeat calls cyclopts makes
70
+ internally cost a set lookup.
71
+ """
72
+
73
+ @staticmethod
74
+ def _as_tokens(tokens: "None | str | t.Iterable[str]") -> list[str]:
75
+ if tokens is None:
76
+ return sys.argv[1:]
77
+ if isinstance(tokens, str):
78
+ return tokens.split()
79
+ return list(tokens)
80
+
81
+ def __call__(self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any) -> t.Any:
82
+ _prepare_commands(self._as_tokens(tokens))
83
+ return super().__call__(tokens, **kwargs)
84
+
85
+ def parse_args( # type: ignore[override]
86
+ self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
87
+ ) -> t.Any:
88
+ _prepare_commands(self._as_tokens(tokens))
89
+ return super().parse_args(tokens, **kwargs)
90
+
91
+ def parse_known_args( # type: ignore[override]
92
+ self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
93
+ ) -> t.Any:
94
+ _prepare_commands(self._as_tokens(tokens))
95
+ return super().parse_known_args(tokens, **kwargs)
96
+
97
+ def parse_commands( # type: ignore[override]
98
+ self, tokens: "None | str | t.Iterable[str]" = None, **kwargs: t.Any
99
+ ) -> t.Any:
100
+ _prepare_commands(self._as_tokens(tokens))
101
+ return super().parse_commands(tokens, **kwargs)
102
+
103
+
104
+ cli = _LazyCommandApp(
72
105
  name="dreadnode",
73
106
  help="Dreadnode CLI — agent development and platform tooling.",
74
107
  version=_get_version_safe(),
@@ -85,23 +118,99 @@ cli["--install-completion"].group = "Meta"
85
118
  # Subcommands
86
119
  # ---------------------------------------------------------------------------
87
120
 
88
- cli.command(airt_cli)
89
- cli.command(capability_cli)
90
- cli.command(dataset_cli)
91
- cli.command(environment_cli, alias="env")
92
- cli.command(evaluation_cli)
93
- cli.command(inference_model_cli, alias="llm")
94
- cli.command(judge_cli)
95
- cli.command(model_cli)
96
- cli.command(optimize_cli)
97
- cli.command(runtime_cli)
98
- cli.command(sandbox_cli)
99
- cli.command(secret_cli)
100
- cli.command(session_cli)
101
- cli.command(task_cli)
102
- cli.command(task_set_cli)
103
- cli.command(train_cli)
104
- cli.command(worlds_cli)
121
+ # Subcommands are imported when one is invoked, not when the CLI loads.
122
+ #
123
+ # Registering them eagerly meant every invocation paid for every command:
124
+ # `dreadnode serve` imported the AIRT tree and, under it, pandas, pyarrow,
125
+ # numpy and optuna, none of which a running runtime uses. That was the
126
+ # majority of a runtime's cold start (ENG-8259).
127
+ #
128
+ # This is the same lazy-table shape the SDK already uses for its own
129
+ # subpackages (`__lazy_submodules__` and friends in `dreadnode/__init__.py`);
130
+ # cyclopts has no native support for deferred subcommands, so registration is
131
+ # driven from the invoked token instead.
132
+ #
133
+ # Keys are the command name as it is typed. The value is the module holding
134
+ # the sub-app and its alias, if it has one.
135
+ _LAZY_COMMANDS: dict[str, tuple[str, str | None]] = {
136
+ "airt": ("dreadnode.app.cli.airt", None),
137
+ "capability": ("dreadnode.app.cli.capability", None),
138
+ "dataset": ("dreadnode.app.cli.dataset", None),
139
+ "environment": ("dreadnode.app.cli.environment", "env"),
140
+ "evaluation": ("dreadnode.app.cli.evaluation", None),
141
+ "inference-model": ("dreadnode.app.cli.inference_model", "llm"),
142
+ "judge": ("dreadnode.app.cli.judge", None),
143
+ "model": ("dreadnode.app.cli.model", None),
144
+ "optimize": ("dreadnode.app.cli.optimize", None),
145
+ "runtime": ("dreadnode.app.cli.runtime", None),
146
+ "sandbox": ("dreadnode.app.cli.sandbox", None),
147
+ "secret": ("dreadnode.app.cli.secret", None),
148
+ "session": ("dreadnode.app.cli.session", None),
149
+ "task": ("dreadnode.app.cli.task", None),
150
+ "task-set": ("dreadnode.app.cli.task_set", None),
151
+ "train": ("dreadnode.app.cli.train", None),
152
+ "worlds": ("dreadnode.app.cli.worlds", None),
153
+ }
154
+
155
+ _COMMAND_ALIASES: dict[str, str] = {
156
+ alias: name for name, (_, alias) in _LAZY_COMMANDS.items() if alias
157
+ }
158
+
159
+ _registered_commands: set[str] = set()
160
+ # `dreadnode serve` hosts concurrent sessions and the agent's CLI tool is
161
+ # dispatched with asyncio.to_thread, so two threads can reach the same
162
+ # unregistered command at once. cyclopts raises CommandCollisionError on a
163
+ # duplicate name, which would fail the second caller's invocation.
164
+ _registration_lock = threading.Lock()
165
+
166
+
167
+ def register_command(name: str) -> bool:
168
+ """Register one lazy subcommand, importing its module. True if it exists.
169
+
170
+ Idempotent, so a caller may register a command that is already present.
171
+ """
172
+ primary = _COMMAND_ALIASES.get(name, name)
173
+ entry = _LAZY_COMMANDS.get(primary)
174
+ if entry is None:
175
+ return False
176
+ if primary in _registered_commands:
177
+ return True
178
+ with _registration_lock:
179
+ # Re-check under the lock: another thread may have registered it while
180
+ # this one waited, and registering twice raises.
181
+ if primary not in _registered_commands:
182
+ module_path, alias = entry
183
+ subapp = importlib.import_module(module_path).cli
184
+ if alias:
185
+ cli.command(subapp, alias=alias)
186
+ else:
187
+ cli.command(subapp)
188
+ _registered_commands.add(primary)
189
+ return True
190
+
191
+
192
+ def register_all_commands() -> None:
193
+ """Register every subcommand, importing all of them.
194
+
195
+ Needed whenever the whole command tree has to be visible at once: help,
196
+ shell completion, an unrecognised command that should be reported against
197
+ the full list, and tests that assert on the CLI surface.
198
+ """
199
+ for name in _LAZY_COMMANDS:
200
+ register_command(name)
201
+
202
+
203
+ def _prepare_commands(tokens: t.Sequence[str]) -> None:
204
+ """Import whatever the invocation needs, and nothing else."""
205
+ for token in tokens:
206
+ if token.startswith("-"):
207
+ continue # a flag before the command, e.g. `dreadnode --version`
208
+ if register_command(token):
209
+ return
210
+ if token in cli:
211
+ return # defined here rather than in a subcommand module
212
+ break # unknown: fall through so the error lists every command
213
+ register_all_commands()
105
214
 
106
215
 
107
216
  # ---------------------------------------------------------------------------
@@ -115,6 +224,7 @@ def _meta(
115
224
  ) -> None:
116
225
  try:
117
226
  console.print()
227
+ _prepare_commands(tokens)
118
228
  cli(tokens)
119
229
  except Exception as exc:
120
230
  if DEBUG:
@@ -645,6 +755,11 @@ def run(argv: list[str] | None = None) -> None:
645
755
  try:
646
756
  tokens = argv if argv is not None else sys.argv[1:]
647
757
  tokens = _rewrite_bare_resume(list(tokens))
758
+ # Before dispatch, not inside the meta handler: cyclopts answers
759
+ # `--help` and `--version` on the meta app itself and never runs the
760
+ # handler body, so registering there would leave the help listing
761
+ # showing only the commands defined in this module.
762
+ _prepare_commands(tokens)
648
763
  cli.meta(tokens)
649
764
  except SystemExit as exc:
650
765
  if exc.code not in (None, 0):
@@ -611,6 +611,31 @@ def create_agent(
611
611
  # =============================================================================
612
612
 
613
613
 
614
+ def _configure_litellm_env() -> None:
615
+ """Configure litellm through the environment, before anything imports it.
616
+
617
+ litellm reads these at import time:
618
+
619
+ drop_params = bool(os.getenv("LITELLM_DROP_PARAMS", False))
620
+ modify_params = bool(os.getenv("LITELLM_MODIFY_PARAMS", False))
621
+
622
+ so setting them configures whoever imports litellm first — the warm thread,
623
+ or a request that beats it. Going through the environment is what lets the
624
+ import itself come off the readiness path: this needs no import of its own.
625
+
626
+ ``suppress_debug_info`` has no environment hook and is set as an attribute
627
+ by the warm thread. It only silences debug prints, so the warm window costs
628
+ noise rather than correctness.
629
+
630
+ ``LITELLM_LOCAL_MODEL_COST_MAP`` stops litellm fetching its model-cost map
631
+ over the network on first import. The platform sets it in the sandbox
632
+ environment; this covers a local ``dreadnode serve``.
633
+ """
634
+ os.environ.setdefault("LITELLM_DROP_PARAMS", "True")
635
+ os.environ.setdefault("LITELLM_MODIFY_PARAMS", "True")
636
+ os.environ.setdefault("LITELLM_LOCAL_MODEL_COST_MAP", "True")
637
+
638
+
614
639
  def _warm_litellm() -> None:
615
640
  """Import litellm so the first chat turn doesn't pay the cold-import cost.
616
641
 
@@ -622,10 +647,13 @@ def _warm_litellm() -> None:
622
647
  """
623
648
  _t0 = time.perf_counter()
624
649
  try:
625
- # Skip the httpx.get() to GitHub for model pricing on import.
626
- os.environ.setdefault("LITELLM_LOCAL_MODEL_COST_MAP", "True")
627
- import litellm
628
- import litellm.exceptions
650
+ # Belt and braces: the lifecycle sets these, but this runs on other
651
+ # paths too and must never be the one that imports litellm unconfigured.
652
+ _configure_litellm_env()
653
+ with startup_clock.timed("litellm.import"):
654
+ import litellm
655
+ import litellm.exceptions
656
+ startup_clock.mark("litellm_imported")
629
657
 
630
658
  litellm.drop_params = True
631
659
  litellm.suppress_debug_info = True # ty: ignore[invalid-assignment]
@@ -695,23 +723,18 @@ async def server_lifecycle() -> t.AsyncIterator[None]:
695
723
  await registry.worker_manager.start(registry)
696
724
  state.startup.mark("workers_started")
697
725
 
698
- # Set critical litellm flags eagerly (before background import) so they
699
- # are active even if a chat request arrives before warmup completes.
700
- # This import is the whole litellm cost on the readiness path; the warm
701
- # thread below finds it already done. Timed so that shows up as its own
702
- # number rather than hiding inside "connecting".
703
- try:
704
- with startup_clock.timed("litellm.import"):
705
- import litellm
706
- state.startup.mark("litellm_imported")
707
-
708
- litellm.drop_params = True
709
- litellm.suppress_debug_info = True # ty: ignore[invalid-assignment]
710
- except Exception: # noqa: S110 - _warm_litellm will retry the full import
711
- pass
712
-
713
- # Warm litellm in a background thread so the health endpoint goes live
714
- # immediately while the ~2s import finishes in the background.
726
+ _configure_litellm_env()
727
+
728
+ # litellm is deliberately NOT imported here. It was the largest single item
729
+ # on the readiness path (~1.8s on a laptop, ~4.3s on a sandbox) and it ran
730
+ # last, so readiness waited on it (ENG-8259). The warm thread below still
731
+ # shifts the import cost off the first chat turn; it just no longer holds
732
+ # readiness open while it does.
733
+ #
734
+ # The flags this block used to import litellm to set are covered by the
735
+ # environment above. Note that LiteLLMGenerator.__post_model_init__ looks
736
+ # like it sets them too, but that is not a pydantic hook and never runs —
737
+ # see ENG-8259. Do not rely on it.
715
738
  warm_future = asyncio.get_running_loop().run_in_executor(None, _warm_litellm)
716
739
  warm_future.add_done_callback(lambda _future: state.startup.mark("litellm_warmed"))
717
740
 
@@ -38,7 +38,13 @@ def _get_cli_commands() -> str:
38
38
  its internals, the CLI section will be omitted from the system prompt.
39
39
  """
40
40
  try:
41
- from dreadnode.app.cli.main import cli
41
+ from dreadnode.app.cli.main import cli, register_all_commands
42
+
43
+ # Subcommands import on demand (ENG-8259), and this listing is built
44
+ # once per process behind a cache. Under `dreadnode serve` nothing else
45
+ # would have registered them, so the agent's system prompt would name
46
+ # only the handful of commands defined in main.py, permanently.
47
+ register_all_commands()
42
48
 
43
49
  # Access internal command registry — guarded by try/except
44
50
  command_registry = getattr(cli, "_commands", None)
@@ -75,14 +75,24 @@ from dreadnode.app.tui.status_messages import STATUS_READY, STATUS_STARTING
75
75
  from dreadnode.app.tui.theme import (
76
76
  ACCENT,
77
77
  BG,
78
+ BG_LIGHT,
79
+ BG_LIGHTER,
80
+ BORDER,
81
+ BORDER_LIGHT,
78
82
  BRAND,
83
+ CODE,
84
+ CODE_BG,
79
85
  ERROR,
80
86
  FG,
81
87
  FG_FAINTEST,
82
88
  FG_MUTED,
83
89
  FG_SUBTLE,
84
90
  INFO,
91
+ IS_LIGHT,
92
+ LINK,
93
+ PURPLE,
85
94
  SUCCESS,
95
+ TEAL,
86
96
  WARNING,
87
97
  )
88
98
  from dreadnode.app.tui.turn_lifecycle import TurnLifecycle
@@ -1731,11 +1741,35 @@ class DreadnodeTextualApp(App[None]):
1731
1741
  warning=WARNING,
1732
1742
  error=ERROR,
1733
1743
  success=SUCCESS,
1734
- dark=True,
1744
+ dark=not IS_LIGHT,
1735
1745
  background=BG,
1736
1746
  surface=BG,
1737
- panel=BG,
1747
+ # $panel is the raised tier Textual paints its own widgets on
1748
+ # (DataTable headers, tooltips, collapsibles). Dark flattens it
1749
+ # onto BG; light needs the real step up, because BG there is
1750
+ # pure white and the surface would otherwise disappear.
1751
+ panel=BG_LIGHT if IS_LIGHT else BG,
1738
1752
  variables={
1753
+ "dn-bg": BG,
1754
+ "dn-bg-light": BG_LIGHT,
1755
+ "dn-bg-lighter": BG_LIGHTER,
1756
+ "dn-fg": FG,
1757
+ "dn-fg-subtle": FG_SUBTLE,
1758
+ "dn-fg-muted": FG_MUTED,
1759
+ "dn-fg-faintest": FG_FAINTEST,
1760
+ "dn-border": BORDER,
1761
+ "dn-border-light": BORDER_LIGHT,
1762
+ "dn-code": CODE,
1763
+ "dn-code-bg": CODE_BG,
1764
+ "dn-link": LINK,
1765
+ "dn-info": INFO,
1766
+ "dn-success": SUCCESS,
1767
+ "dn-warning": WARNING,
1768
+ "dn-error": ERROR,
1769
+ "dn-brand": BRAND,
1770
+ "dn-accent": ACCENT,
1771
+ "dn-purple": PURPLE,
1772
+ "dn-teal": TEAL,
1739
1773
  # Calm markdown headers — avoid primary orange bleeding in.
1740
1774
  # H1-H4 share $fg so headings read against $fg-subtle body
1741
1775
  # copy; H5/H6 step down to $fg-muted.
@@ -1,4 +1,4 @@
1
- /* Dreadnode TUI — minimal dark theme
1
+ /* Dreadnode TUI — minimal theme, dark by default
2
2
  *
3
3
  * Design principles:
4
4
  * 1. Content is king — full width for conversation
@@ -7,41 +7,44 @@
7
7
  * 4. Minimal chrome — one status line, no sidebar, no hotkey bar
8
8
  * 5. Clear hierarchy — bullets + whitespace over bordered panels
9
9
  * 6. Quiet confidence — subtle indicators, not flashy gradients
10
+ *
11
+ * Every variable below aliases a `$dn-*` theme variable that app.py feeds from
12
+ * theme.py, which resolves the dark or light value. Edit the palette there;
13
+ * a literal hex here would be correct for only one theme.
10
14
  */
11
15
 
12
- $bg: #17191c;
13
- $bg-light: #1f2226;
14
- $bg-lighter: #292c31;
15
-
16
- $fg: #f2f7fc;
17
- $fg-subtle: #c2c7cc;
18
- $fg-muted: #95999e;
19
- $fg-faintest: #696d72;
20
-
21
- /* Inline code + fenced blocks: near-white text on a raised background "pill".
22
- * The pill carries the "code" affordance; tune $code / $code-bg to restyle all
23
- * code. Aliased to the palette by design; set to a literal hex to diverge.
24
- * Keep in sync with CODE / CODE_BG in theme.py. */
25
- $code: $fg;
26
- $code-bg: $bg-light;
27
-
28
- /* Links: near-white + underline (the underline is the affordance). Warm accent
29
- * is reserved for tool calls. Keep in sync with LINK in theme.py. */
30
- $link: $fg;
31
-
32
- $border: #2b343f;
33
- $border-light: #434a55;
34
-
35
- $info: #4689bf;
36
- $success: #68c147;
37
- $warning: #c8ac4a;
38
- $error: #e44f4f;
39
-
40
- /* Extended palette — keep in sync with theme.py */
41
- $brand: #ca5e44;
42
- $accent: #ef562f;
43
- $purple: #a650fb;
44
- $teal: #20dfc8;
16
+ $bg: $dn-bg;
17
+ $bg-light: $dn-bg-light;
18
+ $bg-lighter: $dn-bg-lighter;
19
+
20
+ $fg: $dn-fg;
21
+ $fg-subtle: $dn-fg-subtle;
22
+ $fg-muted: $dn-fg-muted;
23
+ $fg-faintest: $dn-fg-faintest;
24
+
25
+ /* Inline code + fenced blocks: prose-colored text on a raised background
26
+ * "pill". The pill carries the "code" affordance; tune CODE / CODE_BG in
27
+ * theme.py to restyle all code. */
28
+ $code: $dn-code;
29
+ $code-bg: $dn-code-bg;
30
+
31
+ /* Links: always underlined, colored by LINK in theme.py. Warm accent is
32
+ * reserved for tool calls. */
33
+ $link: $dn-link;
34
+
35
+ $border: $dn-border;
36
+ $border-light: $dn-border-light;
37
+
38
+ $info: $dn-info;
39
+ $success: $dn-success;
40
+ $warning: $dn-warning;
41
+ $error: $dn-error;
42
+
43
+ /* Extended palette — platform screens, data visualization */
44
+ $brand: $dn-brand;
45
+ $accent: $dn-accent;
46
+ $purple: $dn-purple;
47
+ $teal: $dn-teal;
45
48
 
46
49
  Screen {
47
50
  background: $bg;
@@ -17,7 +17,7 @@ from textual.widgets import DataTable, Static
17
17
 
18
18
  from dreadnode.app.tui.screens.base import DreadnodeScreen
19
19
  from dreadnode.app.tui.spans_reader import RawSpansReader, SpanLineSummary
20
- from dreadnode.app.tui.theme import FG, FG_FAINTEST, FG_MUTED, FG_SUBTLE, WARNING
20
+ from dreadnode.app.tui.theme import FG, FG_FAINTEST, FG_MUTED, FG_SUBTLE, SYNTAX_THEME, WARNING
21
21
 
22
22
  if t.TYPE_CHECKING:
23
23
  from pathlib import Path
@@ -185,6 +185,6 @@ class RawSpansScreen(DreadnodeScreen):
185
185
  renderable = Group(
186
186
  self._detail_header(summary),
187
187
  Text(""),
188
- Syntax(payload, "json", theme="ansi_dark", word_wrap=True),
188
+ Syntax(payload, "json", theme=SYNTAX_THEME, word_wrap=True),
189
189
  )
190
190
  self.query_one("#raw-spans-detail", Static).update(renderable)