dreadnode 2.0.24__tar.gz → 2.0.25__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 (630) hide show
  1. {dreadnode-2.0.24 → dreadnode-2.0.25}/PKG-INFO +1 -1
  2. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/agent.py +10 -1
  3. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/skills.py +3 -3
  4. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/subagent.py +1 -1
  5. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/tools.py +20 -15
  6. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/assessment.py +5 -2
  7. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/airt.py +6 -0
  8. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/capability.py +9 -2
  9. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/runtime_client.py +0 -7
  10. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/app.py +16 -21
  11. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/app.py +18 -41
  12. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/command_dispatcher.py +2 -4
  13. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/commands.py +1 -2
  14. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/dreadnode.tcss +8 -15
  15. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capabilities.py +12 -5
  16. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/console.py +15 -3
  17. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/sessions_manager.py +22 -0
  18. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/tool_format.py +68 -8
  19. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_coordinator.py +22 -6
  20. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/composer.py +23 -16
  21. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/conversation.py +47 -0
  22. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/help_panel.py +1 -1
  23. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool.py +6 -6
  24. dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +299 -0
  25. dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +74 -0
  26. dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +91 -0
  27. dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +90 -0
  28. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +2 -0
  29. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +35 -20
  30. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -1
  31. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -12
  32. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -8
  33. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +1 -1
  34. dreadnode-2.0.25/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +100 -0
  35. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +12 -1
  36. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/loader.py +36 -10
  37. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/base.py +7 -0
  38. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/litellm_.py +20 -0
  39. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/_ripgrep.py +7 -6
  40. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/apply_patch.py +1 -1
  41. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/dreadnode_cli.py +1 -1
  42. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/editing.py +4 -4
  43. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/execute.py +3 -3
  44. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/fetch.py +1 -1
  45. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/glob.py +1 -1
  46. dreadnode-2.0.25/dreadnode/tools/grep.py +764 -0
  47. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/interaction.py +8 -8
  48. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/ls.py +1 -1
  49. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/memory.py +2 -2
  50. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/read.py +7 -3
  51. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/report.py +1 -1
  52. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/todo.py +1 -1
  53. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/trajectory_search.py +1 -1
  54. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/web_extract.py +1 -1
  55. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/web_search.py +1 -1
  56. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/write.py +1 -1
  57. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/jobs.py +3 -3
  58. {dreadnode-2.0.24 → dreadnode-2.0.25}/pyproject.toml +1 -1
  59. dreadnode-2.0.24/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -175
  60. dreadnode-2.0.24/dreadnode/tools/grep.py +0 -285
  61. {dreadnode-2.0.24 → dreadnode-2.0.25}/.gitignore +0 -0
  62. {dreadnode-2.0.24 → dreadnode-2.0.25}/LICENSE +0 -0
  63. {dreadnode-2.0.24 → dreadnode-2.0.25}/README.md +0 -0
  64. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/__init__.py +0 -0
  65. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/__main__.py +0 -0
  66. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/__init__.py +0 -0
  67. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/events.py +0 -0
  68. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/exceptions.py +0 -0
  69. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/format.py +0 -0
  70. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/hooks.py +0 -0
  71. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/judge.py +0 -0
  72. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/__init__.py +0 -0
  73. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/auth.py +0 -0
  74. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/client.py +0 -0
  75. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/config.py +0 -0
  76. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/mcp/server.py +0 -0
  77. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/process_judge.py +0 -0
  78. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/reactions.py +0 -0
  79. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/stopping.py +0 -0
  80. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/tool_resolution.py +0 -0
  81. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/agents/trajectory.py +0 -0
  82. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/__init__.py +0 -0
  83. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/adversarial_reasoning.py +0 -0
  84. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/advpromptier.py +0 -0
  85. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/alignment_faking.py +0 -0
  86. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analogy_escalation.py +0 -0
  87. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/__init__.py +0 -0
  88. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/aggregator.py +0 -0
  89. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/classifier.py +0 -0
  90. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/compliance.py +0 -0
  91. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/engine.py +0 -0
  92. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/recommendations.py +0 -0
  93. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/analytics/types.py +0 -0
  94. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/aprt_progressive.py +0 -0
  95. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/attention_shifting.py +0 -0
  96. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/autodan_turbo.py +0 -0
  97. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/autoredteamer.py +0 -0
  98. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/beast.py +0 -0
  99. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/__init__.py +0 -0
  100. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/atlas.py +0 -0
  101. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/nist.py +0 -0
  102. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp.py +0 -0
  103. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  104. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/compliance/saif.py +0 -0
  105. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/constants.py +0 -0
  106. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/cot_jailbreak.py +0 -0
  107. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/crescendo.py +0 -0
  108. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/__init__.py +0 -0
  109. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  110. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  111. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/meth.png +0 -0
  112. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  113. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  114. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  115. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  116. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  117. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  118. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  119. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  120. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  121. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  122. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  123. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  124. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  125. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  126. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  127. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  128. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  129. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/deep_inception.py +0 -0
  130. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/drattack.py +0 -0
  131. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/echo_chamber.py +0 -0
  132. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/events.py +0 -0
  133. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/genetic_persona.py +0 -0
  134. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/goat.py +0 -0
  135. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/goat_v2.py +0 -0
  136. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/gptfuzzer.py +0 -0
  137. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/humor_bypass.py +0 -0
  138. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/image.py +0 -0
  139. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/j2_meta.py +0 -0
  140. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/jbdistill.py +0 -0
  141. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/jbfuzz.py +0 -0
  142. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/lrm_autonomous.py +0 -0
  143. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/mapf.py +0 -0
  144. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/multimodal.py +0 -0
  145. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/nexus.py +0 -0
  146. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/pair.py +0 -0
  147. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/persona_hijack.py +0 -0
  148. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/prompt.py +0 -0
  149. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/quantization_safety.py +0 -0
  150. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/rainbow.py +0 -0
  151. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/refusal_aware.py +0 -0
  152. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/renellm.py +0 -0
  153. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/__init__.py +0 -0
  154. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/json_report.py +0 -0
  155. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/llm_summary.py +0 -0
  156. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reporting/markdown.py +0 -0
  157. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/reward_hacking.py +0 -0
  158. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/salami_slicing.py +0 -0
  159. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/self_persuasion.py +0 -0
  160. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/siren.py +0 -0
  161. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/tap.py +0 -0
  162. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/templatefuzz.py +0 -0
  163. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/tmap_trajectory.py +0 -0
  164. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/trojail.py +0 -0
  165. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/airt/watermark_removal.py +0 -0
  166. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/__init__.py +0 -0
  167. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/__init__.py +0 -0
  168. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/client.py +0 -0
  169. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/api/models.py +0 -0
  170. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/__init__.py +0 -0
  171. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/args.py +0 -0
  172. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/dataset.py +0 -0
  173. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/environment.py +0 -0
  174. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/evaluation.py +0 -0
  175. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/inference_model.py +0 -0
  176. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/main.py +0 -0
  177. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/model.py +0 -0
  178. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/optimize.py +0 -0
  179. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/runtime.py +0 -0
  180. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/sandbox.py +0 -0
  181. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/secret.py +0 -0
  182. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/session.py +0 -0
  183. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/shared.py +0 -0
  184. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/task.py +0 -0
  185. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/__init__.py +0 -0
  186. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  187. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  188. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  189. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  190. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  191. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  192. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  193. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  194. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  195. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/train.py +0 -0
  196. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/cli/worlds.py +0 -0
  197. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/__init__.py +0 -0
  198. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/interactive.py +0 -0
  199. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/managed_client.py +0 -0
  200. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/models.py +0 -0
  201. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/client/transports.py +0 -0
  202. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/config.py +0 -0
  203. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/env.py +0 -0
  204. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/main.py +0 -0
  205. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/model_catalog.py +0 -0
  206. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/paths.py +0 -0
  207. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/print_mode.py +0 -0
  208. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/__init__.py +0 -0
  209. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/auth.py +0 -0
  210. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/capability_manager.py +0 -0
  211. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/model_resolution.py +0 -0
  212. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/prompt.py +0 -0
  213. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/prompt_registry.py +0 -0
  214. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/runtime_events.py +0 -0
  215. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/session_hydrator.py +0 -0
  216. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/session_persistence.py +0 -0
  217. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/turn_coordinator.py +0 -0
  218. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/utils.py +0 -0
  219. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/websocket.py +0 -0
  220. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/server/worker_manager.py +0 -0
  221. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/__init__.py +0 -0
  222. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/auth_flow.py +0 -0
  223. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/capabilities_manager.py +0 -0
  224. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/connection.py +0 -0
  225. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/error_handler.py +0 -0
  226. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/model_manager.py +0 -0
  227. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/model_variants.py +0 -0
  228. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/profile_manager.py +0 -0
  229. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/runtime_cache.py +0 -0
  230. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screen_router.py +0 -0
  231. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/__init__.py +0 -0
  232. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/auth.py +0 -0
  233. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/base.py +0 -0
  234. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  235. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/connection_error.py +0 -0
  236. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/environments.py +0 -0
  237. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/evaluations.py +0 -0
  238. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/model_picker.py +0 -0
  239. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/models.py +0 -0
  240. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  241. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/runtimes.py +0 -0
  242. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  243. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/secrets.py +0 -0
  244. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/services.py +0 -0
  245. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sessions.py +0 -0
  246. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  247. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/traces.py +0 -0
  248. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/screens/workspaces.py +0 -0
  249. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/spans_reader.py +0 -0
  250. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/status_messages.py +0 -0
  251. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/theme.py +0 -0
  252. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  253. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_reducer.py +0 -0
  254. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/turn_state_phase.py +0 -0
  255. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/update_check.py +0 -0
  256. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/__init__.py +0 -0
  257. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  258. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  259. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  260. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  261. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/flash.py +0 -0
  262. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  263. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  264. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  265. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  266. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  267. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  268. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  269. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  270. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  271. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  272. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  273. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  274. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  275. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  276. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/throbber.py +0 -0
  277. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  278. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  279. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/welcome.py +0 -0
  280. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/whoami.py +0 -0
  281. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/app/tui/wire_events.py +0 -0
  282. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/__init__.py +0 -0
  283. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  284. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  285. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  286. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  287. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  288. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  289. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  290. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  291. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  292. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  293. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  294. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  295. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
  296. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  297. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  298. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  299. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  300. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  301. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  302. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  303. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  304. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
  305. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  306. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  307. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  308. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  309. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  310. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  311. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  312. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  313. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  314. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  315. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  316. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  317. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  318. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  319. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  320. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  321. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  322. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  323. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  324. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  325. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  326. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  327. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  328. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  329. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  330. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  331. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  332. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  333. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  334. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  335. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  336. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  337. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  338. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  339. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
  340. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  341. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  342. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  343. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  344. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  345. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  346. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  347. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  348. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  349. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  350. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  351. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  352. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  353. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  354. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  355. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  356. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  357. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  358. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  359. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  360. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  361. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  362. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  363. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  364. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/__init__.py +0 -0
  365. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/capability.py +0 -0
  366. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/flags.py +0 -0
  367. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/install.py +0 -0
  368. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/sync.py +0 -0
  369. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/tool_rules.py +0 -0
  370. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/types.py +0 -0
  371. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/worker.py +0 -0
  372. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/capabilities/worker_runner.py +0 -0
  373. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/__init__.py +0 -0
  374. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/conditions.py +0 -0
  375. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/discovery.py +0 -0
  376. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/environment.py +0 -0
  377. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/exceptions.py +0 -0
  378. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/execution.py +0 -0
  379. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/hook.py +0 -0
  380. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/judge.py +0 -0
  381. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/load.py +0 -0
  382. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/log.py +0 -0
  383. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/__init__.py +0 -0
  384. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/config.py +0 -0
  385. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/context.py +0 -0
  386. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/hydrate.py +0 -0
  387. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/meta/introspect.py +0 -0
  388. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/metric.py +0 -0
  389. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/object.py +0 -0
  390. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/scorer.py +0 -0
  391. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/serialization.py +0 -0
  392. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/stopping.py +0 -0
  393. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/task.py +0 -0
  394. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/templating.py +0 -0
  395. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/transforms.py +0 -0
  396. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/__init__.py +0 -0
  397. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/audio.py +0 -0
  398. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/base.py +0 -0
  399. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/common.py +0 -0
  400. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/image.py +0 -0
  401. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/object_3d.py +0 -0
  402. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/table.py +0 -0
  403. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/text.py +0 -0
  404. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/types/video.py +0 -0
  405. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/core/util.py +0 -0
  406. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/__init__.py +0 -0
  407. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/dataset.py +0 -0
  408. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/hf.py +0 -0
  409. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/datasets/local.py +0 -0
  410. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/__init__.py +0 -0
  411. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/console.py +0 -0
  412. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/evaluation.py +0 -0
  413. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/events.py +0 -0
  414. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/format.py +0 -0
  415. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/result.py +0 -0
  416. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/evaluations/sample.py +0 -0
  417. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/__init__.py +0 -0
  418. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/caching.py +0 -0
  419. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/chat.py +0 -0
  420. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/data.py +0 -0
  421. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/exceptions.py +0 -0
  422. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/__init__.py +0 -0
  423. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/http.py +0 -0
  424. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/transformers_.py +0 -0
  425. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/generator/vllm_.py +0 -0
  426. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/message.py +0 -0
  427. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/models.py +0 -0
  428. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/parsing.py +0 -0
  429. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/__init__.py +0 -0
  430. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/base.py +0 -0
  431. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  432. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/generators/utils.py +0 -0
  433. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/__init__.py +0 -0
  434. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/hf.py +0 -0
  435. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/local.py +0 -0
  436. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/models/model.py +0 -0
  437. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/__init__.py +0 -0
  438. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/__init__.py +0 -0
  439. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  440. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/agent.py +0 -0
  441. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/env.py +0 -0
  442. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/runtime.py +0 -0
  443. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/adapters/stack.py +0 -0
  444. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/api.py +0 -0
  445. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/__init__.py +0 -0
  446. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/base.py +0 -0
  447. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/backends/gepa.py +0 -0
  448. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/collectors.py +0 -0
  449. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/config.py +0 -0
  450. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/console.py +0 -0
  451. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/events.py +0 -0
  452. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/format.py +0 -0
  453. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/jobs.py +0 -0
  454. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/result.py +0 -0
  455. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/sampler.py +0 -0
  456. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/sampling.py +0 -0
  457. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/search.py +0 -0
  458. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/stopping.py +0 -0
  459. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/study.py +0 -0
  460. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/optimization/trial.py +0 -0
  461. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/__init__.py +0 -0
  462. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/loader.py +0 -0
  463. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/manifest.py +0 -0
  464. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/oci.py +0 -0
  465. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/package.py +0 -0
  466. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/packaging/task_validation.py +0 -0
  467. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/__init__.py +0 -0
  468. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/guard.py +0 -0
  469. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  470. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/py.typed +0 -0
  471. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/__init__.py +0 -0
  472. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/boundary.py +0 -0
  473. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/fuzzing.py +0 -0
  474. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/graph.py +0 -0
  475. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/grid.py +0 -0
  476. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/image.py +0 -0
  477. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/mapelites.py +0 -0
  478. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/optuna.py +0 -0
  479. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/random.py +0 -0
  480. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/registry.py +0 -0
  481. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/samplers/strategy.py +0 -0
  482. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/__init__.py +0 -0
  483. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  484. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agent_security.py +0 -0
  485. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agentic.py +0 -0
  486. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/agentic_workflow.py +0 -0
  487. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/attack_outcome.py +0 -0
  488. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/classification.py +0 -0
  489. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/consistency.py +0 -0
  490. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/contains.py +0 -0
  491. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/cosine_sim.py +0 -0
  492. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/credentials.py +0 -0
  493. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/crucible.py +0 -0
  494. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/documentation_security.py +0 -0
  495. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/exfiltration_detection.py +0 -0
  496. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/format.py +0 -0
  497. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/harm.py +0 -0
  498. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/ide_security.py +0 -0
  499. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/image.py +0 -0
  500. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/json.py +0 -0
  501. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/judge.py +0 -0
  502. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/judge_ensemble.py +0 -0
  503. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/length.py +0 -0
  504. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/lexical.py +0 -0
  505. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/mcp_security.py +0 -0
  506. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/memorization.py +0 -0
  507. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/multi_agent_security.py +0 -0
  508. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/pii.py +0 -0
  509. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/prompt_leak.py +0 -0
  510. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/readability.py +0 -0
  511. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/reasoning_security.py +0 -0
  512. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/sentiment.py +0 -0
  513. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/similarity.py +0 -0
  514. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/structural_detection.py +0 -0
  515. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/scorers/supply_chain_detection.py +0 -0
  516. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/__init__.py +0 -0
  517. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/providers.py +0 -0
  518. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/session_store.py +0 -0
  519. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/storage/storage.py +0 -0
  520. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/__init__.py +0 -0
  521. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/task.py +0 -0
  522. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tools/think.py +0 -0
  523. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/__init__.py +0 -0
  524. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/constants.py +0 -0
  525. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/convert.py +0 -0
  526. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/exporter.py +0 -0
  527. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/exporters.py +0 -0
  528. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/span.py +0 -0
  529. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/spans.py +0 -0
  530. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/tracing/trace_converter.py +0 -0
  531. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/__init__.py +0 -0
  532. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/_progress.py +0 -0
  533. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/base.py +0 -0
  534. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/dpo.py +0 -0
  535. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/env_rollouts.py +0 -0
  536. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/__init__.py +0 -0
  537. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/_common.py +0 -0
  538. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/rl.py +0 -0
  539. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/sft.py +0 -0
  540. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/etl/worlds.py +0 -0
  541. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/events.py +0 -0
  542. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/grpo.py +0 -0
  543. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/models.py +0 -0
  544. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ppo.py +0 -0
  545. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/prime.py +0 -0
  546. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/__init__.py +0 -0
  547. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/async_trainer.py +0 -0
  548. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/config.py +0 -0
  549. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/coordinator.py +0 -0
  550. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/distributed.py +0 -0
  551. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/dpo.py +0 -0
  552. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/experience.py +0 -0
  553. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  554. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/inference.py +0 -0
  555. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/learner.py +0 -0
  556. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/multi_turn.py +0 -0
  557. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/ppo.py +0 -0
  558. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/reward_model.py +0 -0
  559. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_env.py +0 -0
  560. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_worker.py +0 -0
  561. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/sft.py +0 -0
  562. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/ray/trainer.py +0 -0
  563. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/recipes.py +0 -0
  564. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/__init__.py +0 -0
  565. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/aggregator.py +0 -0
  566. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/functions.py +0 -0
  567. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  568. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/shaping.py +0 -0
  569. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rewards/types.py +0 -0
  570. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/__init__.py +0 -0
  571. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/adapters.py +0 -0
  572. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  573. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/orchestrator.py +0 -0
  574. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/types.py +0 -0
  575. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/rollouts/worlds.py +0 -0
  576. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/serving/__init__.py +0 -0
  577. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/serving/vllm_client.py +0 -0
  578. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/sft.py +0 -0
  579. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/__init__.py +0 -0
  580. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/config.py +0 -0
  581. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/data.py +0 -0
  582. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/renderer.py +0 -0
  583. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/rl.py +0 -0
  584. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker/trainer.py +0 -0
  585. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/tinker_sft.py +0 -0
  586. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/training/utils.py +0 -0
  587. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/__init__.py +0 -0
  588. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  589. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/adversarial_suffix.py +0 -0
  590. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/agent_skill.py +0 -0
  591. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/agentic_workflow.py +0 -0
  592. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/audio.py +0 -0
  593. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/backdoor_finetune.py +0 -0
  594. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  595. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/cipher.py +0 -0
  596. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/competitive_parity.py +0 -0
  597. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/constitutional.py +0 -0
  598. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/document.py +0 -0
  599. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/documentation_poison.py +0 -0
  600. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/encoding.py +0 -0
  601. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/exfiltration.py +0 -0
  602. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/flip_attack.py +0 -0
  603. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/guardrail_bypass.py +0 -0
  604. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/ide_injection.py +0 -0
  605. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/image.py +0 -0
  606. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/injection.py +0 -0
  607. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/json_tools.py +0 -0
  608. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/language.py +0 -0
  609. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/logic_bomb.py +0 -0
  610. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/mcp_attacks.py +0 -0
  611. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  612. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/multimodal_attacks.py +0 -0
  613. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/persuasion.py +0 -0
  614. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/perturbation.py +0 -0
  615. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/pii_extraction.py +0 -0
  616. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/pythonic_tools.py +0 -0
  617. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/rag_poisoning.py +0 -0
  618. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/reasoning_attacks.py +0 -0
  619. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/refine.py +0 -0
  620. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/response_steering.py +0 -0
  621. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/structural_exploits.py +0 -0
  622. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/stylistic.py +0 -0
  623. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/substitution.py +0 -0
  624. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/supply_chain.py +0 -0
  625. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/swap.py +0 -0
  626. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  627. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/text.py +0 -0
  628. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/video.py +0 -0
  629. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/transforms/xml_tools.py +0 -0
  630. {dreadnode-2.0.24 → dreadnode-2.0.25}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.24
3
+ Version: 2.0.25
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -118,7 +118,16 @@ def _is_transient_api_error(error: BaseException) -> bool:
118
118
  if (cls := getattr(_litellm_exc, name, None)) is not None
119
119
  )
120
120
  if classes and isinstance(error, classes):
121
- return True
121
+ # OpenAI returns 429 with code "insufficient_quota" when the
122
+ # account is out of credits — a permanent billing condition,
123
+ # not a rate limit. litellm packs the provider body into the
124
+ # message verbatim, so substring-match to exclude.
125
+ rate_limit_cls = getattr(_litellm_exc, "RateLimitError", None)
126
+ return not (
127
+ rate_limit_cls is not None
128
+ and isinstance(error, rate_limit_cls)
129
+ and "insufficient_quota" in str(error)
130
+ )
122
131
  return False
123
132
 
124
133
 
@@ -348,9 +348,9 @@ def discover_skills(directory: Path | None = None) -> list[Skill]:
348
348
  try:
349
349
  skill = load_skill(skill_file)
350
350
  skills.append(skill)
351
- logger.debug(f"Discovered skill: {skill.name} at {skill_file}")
351
+ logger.debug("Discovered skill: {} at {}", skill.name, skill_file)
352
352
  except Exception as e:
353
- logger.warning(f"Failed to load skill from {skill_file}: {e}")
353
+ logger.error("Failed to load skill from {}: {}", skill_file, e)
354
354
 
355
355
  return skills
356
356
 
@@ -515,7 +515,7 @@ def create_skill_tool(skills: list[Skill]) -> t.Any:
515
515
  examples = ", ".join(f"'{s.qualified_id}'" for s in skills[:3])
516
516
  hint = f" (e.g., {examples}, ...)" if examples else ""
517
517
 
518
- @tool(catch=True, description=description)
518
+ @tool(description=description)
519
519
  async def skill(
520
520
  name: t.Annotated[str, f"The name of the skill from available_skills{hint}"],
521
521
  ) -> str:
@@ -95,7 +95,7 @@ class SubAgentToolset(Toolset):
95
95
  run_in_background: bool = Config(default=False)
96
96
  """Whether to run sub-agents in background (not yet implemented)."""
97
97
 
98
- @tool_method(catch=True)
98
+ @tool_method
99
99
  async def spawn_agent(
100
100
  self,
101
101
  task: t.Annotated[str, "The task for the sub-agent to complete"],
@@ -288,15 +288,13 @@ class Tool(BaseModel, t.Generic[P, R]):
288
288
  exclude=True,
289
289
  )
290
290
  """The function to call."""
291
- catch: bool | t.Iterable[type[Exception]] = set(DEFAULT_CATCH_EXCEPTIONS)
291
+ catch: bool | t.Iterable[type[Exception]] = True
292
292
  """
293
293
  Whether to catch exceptions and return them as messages.
294
294
 
295
295
  - `False`: Do not catch exceptions.
296
- - `True`: Catch all exceptions.
296
+ - `True`: Catch all exceptions (default).
297
297
  - `set[type[Exception]]`: Catch only the specified exceptions.
298
-
299
- By default, catches `json.JSONDecodeError` and `ValidationError`.
300
298
  """
301
299
  truncate: int | None = None
302
300
  """If set, the maximum number of characters to truncate any tool output to."""
@@ -386,7 +384,7 @@ class Tool(BaseModel, t.Generic[P, R]):
386
384
  description=description,
387
385
  parameters_schema=schema,
388
386
  fn=fn,
389
- catch=catch or DEFAULT_CATCH_EXCEPTIONS,
387
+ catch=True if catch is None else catch,
390
388
  truncate=truncate,
391
389
  offload=offload if offload is not None else True,
392
390
  )
@@ -471,8 +469,15 @@ class Tool(BaseModel, t.Generic[P, R]):
471
469
  kwargs = self._type_adapter.validate_python(kwargs)
472
470
  kwargs = kwargs or {}
473
471
 
474
- # Call the function
475
- result = self.fn(**kwargs) # ty: ignore[missing-argument] # ParamSpec limitation
472
+ # Call the function. Sync tools are offloaded to a worker thread
473
+ # so blocking work (subprocess.run, network, large file I/O) does
474
+ # not stall the event loop — the TUI shares that loop with input
475
+ # parsing, and a multi-second block desyncs Textual's escape-
476
+ # sequence parser, leaking raw mouse/key bytes into the composer.
477
+ if inspect.iscoroutinefunction(self.fn):
478
+ result = self.fn(**kwargs) # ty: ignore[missing-argument] # ParamSpec limitation
479
+ else:
480
+ result = await asyncio.to_thread(self.fn, **kwargs) # ParamSpec limitation
476
481
  if inspect.isawaitable(result):
477
482
  result = await result
478
483
 
@@ -596,9 +601,9 @@ class Tool(BaseModel, t.Generic[P, R]):
596
601
  description: The description of the tool.
597
602
  catch: Whether to catch exceptions and return them as messages.
598
603
  - `False`: Do not catch exceptions.
599
- - `True`: Catch all exceptions.
604
+ - `True`: Catch all exceptions (default).
600
605
  - `list[type[Exception]]`: Catch only the specified exceptions.
601
- - `None`: By default, catches `json.JSONDecodeError` and `ValidationError
606
+ - `None`: Use the default (`True`)
602
607
  truncate: If set, the maximum number of characters to truncate any tool output to.
603
608
  offload: Whether large tool outputs should be offloaded to disk.
604
609
 
@@ -667,7 +672,7 @@ class ToolMethod(property, t.Generic[P, R]):
667
672
  name=self.tool_name,
668
673
  description=self.tool_description,
669
674
  parameters_schema=self.tool_parameters_schema,
670
- catch=self.tool_catch or DEFAULT_CATCH_EXCEPTIONS,
675
+ catch=True if self.tool_catch is None else self.tool_catch,
671
676
  truncate=self.tool_truncate,
672
677
  )
673
678
  tool._signature = self._tool_signature
@@ -681,7 +686,7 @@ class ToolMethod(property, t.Generic[P, R]):
681
686
  name=self.tool_name,
682
687
  description=self.tool_description,
683
688
  parameters_schema=self.tool_parameters_schema,
684
- catch=self.tool_catch or DEFAULT_CATCH_EXCEPTIONS,
689
+ catch=True if self.tool_catch is None else self.tool_catch,
685
690
  truncate=self.tool_truncate,
686
691
  )
687
692
  bound_tool._signature = self._tool_signature
@@ -835,9 +840,9 @@ def tool(
835
840
  description: The description of the tool.
836
841
  catch: Whether to catch exceptions and return them as messages.
837
842
  - `False`: Do not catch exceptions.
838
- - `True`: Catch all exceptions.
843
+ - `True`: Catch all exceptions (default).
839
844
  - `list[type[Exception]]`: Catch only the specified exceptions.
840
- - `None`: By default, catches `json.JSONDecodeError` and `ValidationError`.
845
+ - `None`: Use the default (`True`).
841
846
  truncate: If set, the maximum number of characters to truncate any tool output to.
842
847
 
843
848
  Returns:
@@ -908,9 +913,9 @@ def tool_method(
908
913
  description: Override the tool's description. Defaults to the docstring.
909
914
  catch: Whether to catch exceptions and return them as messages.
910
915
  - `False`: Do not catch exceptions.
911
- - `True`: Catch all exceptions.
916
+ - `True`: Catch all exceptions (default).
912
917
  - `list[type[Exception]]`: Catch only the specified exceptions.
913
- - `None`: By default, catches `json.JSONDecodeError` and `ValidationError`.
918
+ - `None`: Use the default (`True`).
914
919
  truncate: The maximum number of characters for the tool's output.
915
920
  """
916
921
 
@@ -128,9 +128,12 @@ class Assessment:
128
128
  self.judge_model = judge_model or model
129
129
 
130
130
  if target_config is None and model is not None:
131
- target_config = {"model": model}
131
+ target_config = {"model": self.target_model or model}
132
132
  if attacker_config is None and model is not None:
133
- attacker_config = {"model": model, "evaluator_model": model}
133
+ attacker_config = {
134
+ "model": self.attacker_model or model,
135
+ "evaluator_model": self.judge_model or model,
136
+ }
134
137
 
135
138
  self.target_config = target_config
136
139
  self.attacker_config = attacker_config
@@ -1243,6 +1243,9 @@ def run(
1243
1243
  description=f"CLI attack: {goal}",
1244
1244
  target=target_fn,
1245
1245
  model=atk_model,
1246
+ target_model=target_model,
1247
+ attacker_model=atk_model,
1248
+ judge_model=eval_model,
1246
1249
  goal=goal,
1247
1250
  goal_category=goal_category,
1248
1251
  project_id=final_project_id,
@@ -1440,6 +1443,9 @@ def run_suite(
1440
1443
  description=f"Suite run: {goal_text}",
1441
1444
  target=target_fn,
1442
1445
  model=atk_model,
1446
+ target_model=model,
1447
+ attacker_model=atk_model,
1448
+ judge_model=atk_model,
1443
1449
  goal=goal_text,
1444
1450
  goal_category=goal_cat,
1445
1451
  project_id=final_project_id,
@@ -1398,15 +1398,22 @@ def validate(
1398
1398
  cap = Capability(cap_dir)
1399
1399
  agents = cap.agents
1400
1400
  tools = cap.tools
1401
- skills = cap.skills_paths or []
1402
1401
  mcp = cap.mcp_server_defs
1403
1402
  workers = cap.worker_defs
1404
1403
 
1405
1404
  health_errors = [h for h in cap.component_health if h.get("status") == "error"]
1405
+ # Count loadable skills (one SKILL.md per skill), not manifest path
1406
+ # entries — `skills_paths` is a list of search roots and overstates
1407
+ # the count, especially when entries fail to parse.
1408
+ skill_count = sum(
1409
+ 1
1410
+ for h in cap.component_health
1411
+ if h.get("kind") == "skill" and h.get("status") == "ok"
1412
+ )
1406
1413
 
1407
1414
  summary = (
1408
1415
  f"agents={len(agents)}, tools={len(tools)}, "
1409
- f"skills={len(skills)}, mcp={len(mcp)}, workers={len(workers)}"
1416
+ f"skills={skill_count}, mcp={len(mcp)}, workers={len(workers)}"
1410
1417
  )
1411
1418
 
1412
1419
  if health_errors:
@@ -513,13 +513,6 @@ class RuntimeClient:
513
513
  response.raise_for_status()
514
514
  return models.SessionInfo.from_dict(response.json())
515
515
 
516
- async def reset_session(self, session_id: str) -> None:
517
- """Reset a server session."""
518
- logger.info("Resetting session | session_id={}", session_id[:8])
519
- await self.start()
520
- response = await self._http_client.post(f"/api/sessions/{session_id}/reset")
521
- response.raise_for_status()
522
-
523
516
  async def set_session_title(self, session_id: str, title: str) -> None:
524
517
  """Persist a session title on the server."""
525
518
  logger.info("Setting session title | session_id={}", session_id[:8])
@@ -2201,16 +2201,6 @@ class SessionRuntime:
2201
2201
  """Async wrapper around ``_persist_state`` with per-session locking."""
2202
2202
  await self.persistence.persist_state_locked(update_messages=update_messages)
2203
2203
 
2204
- def reset(self, *, persist: bool = True) -> None:
2205
- """Reset the conversation history."""
2206
- from dreadnode.agents.trajectory import Trajectory as TrajectoryModel
2207
-
2208
- self._trajectory = TrajectoryModel()
2209
- self._message_count = 0
2210
- self._agent = None
2211
- if persist:
2212
- self._persist_state()
2213
-
2214
2204
  def restore_messages(
2215
2205
  self,
2216
2206
  messages: list[SessionMessage],
@@ -3216,16 +3206,6 @@ async def set_session_policy(session_id: str, body: dict[str, t.Any]) -> JSONRes
3216
3206
  )
3217
3207
 
3218
3208
 
3219
- @app.post("/api/sessions/{session_id}/reset")
3220
- async def reset_session(session_id: str) -> JSONResponse:
3221
- """Reset the agent conversation."""
3222
- session = get_state().get_session(session_id)
3223
- if session is None:
3224
- raise HTTPException(status_code=404, detail=f"Session not found: {session_id}")
3225
- session.reset()
3226
- return JSONResponse(content={"status": "reset", "session_id": session_id})
3227
-
3228
-
3229
3209
  @app.post("/api/sessions/{session_id}/cancel")
3230
3210
  async def cancel_session(session_id: str) -> JSONResponse:
3231
3211
  """Cancel the active turn and drain queued requests for a session."""
@@ -3897,7 +3877,10 @@ def _populate_registry(instance: t.Any) -> None:
3897
3877
  """Discover capabilities and install them into app state."""
3898
3878
  from dreadnode.builtin_capabilities import load_builtin_capabilities
3899
3879
  from dreadnode.capabilities import Capability
3900
- from dreadnode.capabilities.capability import read_local_capability_records
3880
+ from dreadnode.capabilities.capability import (
3881
+ read_local_capability_records,
3882
+ read_local_capability_state,
3883
+ )
3901
3884
 
3902
3885
  state = get_state()
3903
3886
  registry = capability_manager.CapabilityRegistry()
@@ -3975,6 +3958,18 @@ def _populate_registry(instance: t.Any) -> None:
3975
3958
  except Exception:
3976
3959
  logger.exception("Failed to discover capabilities")
3977
3960
 
3961
+ # Bundled caps don't flow through Capability.discover(), so the
3962
+ # disabled-state filter that runs inside discover() never touches
3963
+ # them — they'd always load as active regardless of
3964
+ # local-capability-state.json. Apply the same filter here so the
3965
+ # toggle is honored. The default capability is pinned active.
3966
+ bundled_state = read_local_capability_state(instance.storage.local_capability_state_path)
3967
+ for name in list(registry.capabilities):
3968
+ if name == _BUNDLED_DEFAULT_CAPABILITY:
3969
+ continue
3970
+ if bundled_state.get(name, True) is False:
3971
+ registry.disabled_local[name] = registry.capabilities.pop(name)
3972
+
3978
3973
  if instance.can_sync:
3979
3974
  try:
3980
3975
  registry.update_info = _check_capability_updates(
@@ -1008,9 +1008,6 @@ class _AppCommandActions:
1008
1008
  agent = self._app._selected_agent_for_new_session()
1009
1009
  self._app._create_new_session(agent)
1010
1010
 
1011
- def reset_active_session(self) -> None:
1012
- self._app._reset_active_session()
1013
-
1014
1011
  def rename_session(self, title: str) -> None:
1015
1012
  self._app._rename_session(title)
1016
1013
 
@@ -1611,16 +1608,18 @@ class DreadnodeTextualApp(App[None]):
1611
1608
  surface=BG,
1612
1609
  panel=BG,
1613
1610
  variables={
1614
- # Calm markdown headers — avoid primary orange bleeding in
1611
+ # Calm markdown headers — avoid primary orange bleeding in.
1612
+ # H1-H4 share $fg so headings read against $fg-subtle body
1613
+ # copy; H5/H6 step down to $fg-muted.
1615
1614
  "markdown-h1-color": FG,
1616
1615
  "markdown-h1-text-style": "bold",
1617
1616
  "markdown-h2-color": FG,
1618
1617
  "markdown-h2-text-style": "bold",
1619
- "markdown-h3-color": FG_SUBTLE,
1618
+ "markdown-h3-color": FG,
1620
1619
  "markdown-h3-text-style": "bold",
1621
- "markdown-h4-color": FG_SUBTLE,
1620
+ "markdown-h4-color": FG,
1622
1621
  "markdown-h4-text-style": "bold",
1623
- "markdown-h5-color": FG_MUTED,
1622
+ "markdown-h5-color": FG_SUBTLE,
1624
1623
  "markdown-h5-text-style": "bold",
1625
1624
  "markdown-h6-color": FG_MUTED,
1626
1625
  "markdown-h6-text-style": "bold",
@@ -1981,15 +1980,19 @@ class DreadnodeTextualApp(App[None]):
1981
1980
 
1982
1981
  def on_key(self, event: "Key") -> None:
1983
1982
  """Global key routing for history and vim-style navigation."""
1984
- # Only handle keys on the main screen where composer/conversation exist
1985
- composer_results = self.screen.query(ComposerInput)
1986
- conversation_results = self.screen.query(ConversationView)
1987
- if not len(composer_results) or not len(conversation_results):
1983
+ # Only handle keys on the main screen where composer/conversation exist.
1984
+ # ID-based lookup goes through Textual's _nodes_by_id index (O(1));
1985
+ # the old class-based screen.query(ComposerInput) walked the entire
1986
+ # screen DOM and cost ~40ms per keystroke at ~120 conversation entries.
1987
+ screen = self.screen
1988
+ try:
1989
+ composer = screen.query_one("#composer", ComposerInput)
1990
+ conversation = screen.query_one("#conversation", ConversationView)
1991
+ except NoMatches:
1988
1992
  return
1989
- composer = composer_results.first()
1990
1993
 
1991
- # Overlay routing fallback — when the composer is disabled (e.g. during
1992
- # profile recovery), route keys to the active overlay directly.
1994
+ # Overlay routing fallback — when the composer is disabled (e.g.
1995
+ # during profile recovery), route keys to the active overlay directly.
1993
1996
  if composer.disabled and self._has_active_overlay():
1994
1997
  overlay = composer._get_active_overlay()
1995
1998
  if overlay is not None:
@@ -2015,7 +2018,6 @@ class DreadnodeTextualApp(App[None]):
2015
2018
  # Forward unhandled keys to the overlay for custom handling
2016
2019
  if overlay.on_key(event):
2017
2020
  return
2018
- conversation = conversation_results.first()
2019
2021
 
2020
2022
  # ? shows help when conversation is focused (composer handled via HelpRequested)
2021
2023
  if event.key == "question_mark" and conversation.has_focus:
@@ -2962,31 +2964,6 @@ class DreadnodeTextualApp(App[None]):
2962
2964
  else:
2963
2965
  self._flash("Interactive mode restored", severity="info")
2964
2966
 
2965
- @work(exclusive=True, group="session-switch")
2966
- async def _reset_active_session(self) -> None:
2967
- session = self._active_session()
2968
- if session is None:
2969
- self._flash("No active session to reset", severity="warning")
2970
- return
2971
- logger.info("Session reset | session={}", session.info.session_id[:8])
2972
- await self.managed_client.reset_session(session.info.session_id)
2973
- session.transcript.clear()
2974
- session.info.message_count = 0
2975
- session.turn_count = 0
2976
- session.queued_messages.clear()
2977
- session.allowlisted_tools.clear()
2978
- session.turn_state = TurnState.empty(session.info.session_id)
2979
- session.unread_events = 0
2980
- session.inline_activity = None
2981
- await self._sync_runtime_session_subscriptions()
2982
-
2983
- self._sync_conversation()
2984
- self._sync_active_session_projection()
2985
- self._sync_sessions()
2986
- self._sessions_manager.sync_queue()
2987
- display = session.info.session_id[:8]
2988
- self._flash(f"Reset session {display}", severity="info")
2989
-
2990
2967
  async def _update_command(self) -> None:
2991
2968
  """Handle /update — check for updates and run upgrade."""
2992
2969
  import asyncio
@@ -3284,7 +3261,7 @@ class DreadnodeTextualApp(App[None]):
3284
3261
  # ``phase`` to GENERATING/RUNNING_TOOLS. Without this reset,
3285
3262
  # ``sync_progress_indicator`` sees ``phase=IDLE`` with non-empty
3286
3263
  # ``tool_runs`` and keeps the spinner up as "thinking between
3287
- # tool_end and next generation". Mirrors ``/reset``.
3264
+ # tool_end and next generation".
3288
3265
  session.turn_state = TurnState.empty(session_id)
3289
3266
  self._sync_active_session_projection()
3290
3267
 
@@ -166,8 +166,6 @@ class CommandActions(t.Protocol):
166
166
 
167
167
  def create_new_session(self, agent: str | None = None) -> None: ...
168
168
 
169
- def reset_active_session(self) -> None: ...
170
-
171
169
  def rename_session(self, title: str) -> None: ...
172
170
 
173
171
  def export_session(self, filename: str | None) -> None: ...
@@ -299,8 +297,8 @@ class CommandDispatcher:
299
297
  "q": self._actions.exit_app,
300
298
  "help": self._actions.show_help,
301
299
  "new": lambda: self._actions.create_new_session(),
302
- "reset": lambda: self._actions.reset_active_session(),
303
- "clear": lambda: self._actions.reset_active_session(),
300
+ "clear": lambda: self._actions.create_new_session(),
301
+ "reset": lambda: self._actions.create_new_session(),
304
302
  "sessions": self._actions.screen_router_open_sessions,
305
303
  "agents": self._actions.write_agent_listing,
306
304
  "reload": lambda: self._actions.run_command(self.reload_capabilities_command),
@@ -32,8 +32,7 @@ class SlashCommand:
32
32
  SLASH_COMMANDS: list[SlashCommand] = [
33
33
  SlashCommand("/help", "Show available commands"),
34
34
  SlashCommand("/new", "Create a new session"),
35
- SlashCommand("/reset", "Reset current session"),
36
- SlashCommand("/clear", "Alias for /reset"),
35
+ SlashCommand("/clear", "Alias for /new"),
37
36
  SlashCommand("/sessions", "List all sessions"),
38
37
  SlashCommand("/agents", "List loaded agents"),
39
38
  SlashCommand("/agent", "Start agent session", "<name>"),
@@ -748,23 +748,16 @@ ToolCall {
748
748
  color: $fg-subtle;
749
749
  }
750
750
 
751
- /* Headers — theme variables control color/text-style; we only set margins here
752
- * to keep a clear hierarchy without overriding the theme-driven palette. */
753
- MarkdownH1 {
754
- margin: 1 0 1 0;
755
- }
756
-
757
- MarkdownH2 {
758
- margin: 1 0 0 0;
759
- border-bottom: solid $border;
760
- padding-bottom: 1;
761
- }
762
-
751
+ /* Headers — colors come from theme variables; here we only set margins.
752
+ * Headings own the gap *below* them so adjacent blocks don't double-up
753
+ * (a list with bottom-margin + a heading with top-margin = 2 rows). */
754
+ MarkdownH1,
755
+ MarkdownH2,
763
756
  MarkdownH3,
764
757
  MarkdownH4,
765
758
  MarkdownH5,
766
759
  MarkdownH6 {
767
- margin: 1 0 0 0;
760
+ margin: 0 0 1 0;
768
761
  }
769
762
 
770
763
  /* Paragraphs */
@@ -775,7 +768,7 @@ Markdown > MarkdownParagraph {
775
768
  /* Code — fenced blocks and inline */
776
769
  MarkdownFence {
777
770
  background: $bg-lighter;
778
- margin: 1 0;
771
+ margin: 0 0 1 0;
779
772
  }
780
773
 
781
774
  MarkdownBlock > .code_inline {
@@ -787,7 +780,7 @@ MarkdownBlock > .code_inline {
787
780
  MarkdownBlockQuote {
788
781
  background: $bg-light;
789
782
  border-left: outer $border-light;
790
- margin: 1 0;
783
+ margin: 0 0 1 0;
791
784
  padding: 0 1;
792
785
  }
793
786
 
@@ -296,10 +296,13 @@ def _build_actions(
296
296
  elif update_ver and is_sandbox and item.get("binding_id"):
297
297
  actions.append(("update", f"Update to v{update_ver}"))
298
298
 
299
- if state == "enabled":
300
- actions.append(("toggle", "Disable capability"))
301
- else:
302
- actions.append(("toggle", "Enable capability"))
299
+ # The default bundled capability provides the active agent and
300
+ # tool surface — disabling it from the UI would brick the runtime.
301
+ if item.get("name") != "dreadnode":
302
+ if state == "enabled":
303
+ actions.append(("toggle", "Disable capability"))
304
+ else:
305
+ actions.append(("toggle", "Enable capability"))
303
306
 
304
307
  if item.get("local_path"):
305
308
  actions.append(("browse_files", "Browse files"))
@@ -1383,7 +1386,11 @@ class CapabilitiesScreen(DreadnodeScreen):
1383
1386
  ],
1384
1387
  "components": {
1385
1388
  "agents": len(agents),
1386
- "skills": len(cap.skills_paths or []),
1389
+ "skills": sum(
1390
+ 1
1391
+ for h in cap.component_health
1392
+ if h.get("kind") == "skill" and h.get("status") == "ok"
1393
+ ),
1387
1394
  "mcp_servers": len(cap.mcp_server_defs),
1388
1395
  },
1389
1396
  "update_available": None,
@@ -40,6 +40,9 @@ _LEVEL_COLORS: dict[str, str] = {
40
40
  }
41
41
 
42
42
  _LEVELS = ["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"]
43
+ # Cap per-entry rendered length so cycling to TRACE doesn't freeze the UI on
44
+ # full LLM request/response payloads. Buffer + saved log still keep the full text.
45
+ _MAX_DISPLAY_CHARS = 2000
43
46
  # Exports share the central dreadnode logs directory alongside worker logs
44
47
  # (and, eventually, MCP + TUI/SDK self-logs).
45
48
  _LOG_EXPORT_DIR = LOGS_DIR
@@ -124,7 +127,13 @@ class ConsoleScreen(DreadnodeScreen):
124
127
  t.append(" ")
125
128
  t.append(f"{entry.level:<8}", style=color)
126
129
  t.append(f" {entry.source}", style=FG_MUTED)
127
- t.append(f" {entry.message}")
130
+ msg = entry.message
131
+ if len(msg) > _MAX_DISPLAY_CHARS:
132
+ extra = len(msg) - _MAX_DISPLAY_CHARS
133
+ t.append(f" {msg[:_MAX_DISPLAY_CHARS]}")
134
+ t.append(f" …[+{extra:,} chars]", style=FG_FAINTEST)
135
+ else:
136
+ t.append(f" {msg}")
128
137
  return t
129
138
 
130
139
  def _title_markup(self) -> str:
@@ -141,7 +150,10 @@ class ConsoleScreen(DreadnodeScreen):
141
150
  self.dismiss()
142
151
 
143
152
  def action_cycle_level(self) -> None:
144
- self._level_index = (self._level_index + 1) % len(_LEVELS)
153
+ # Cycle toward more-verbose first (INFO DEBUG → TRACE …) so the
154
+ # common "I want a bit more detail" step doesn't have to wrap through
155
+ # WARNING/ERROR/CRITICAL.
156
+ self._level_index = (self._level_index - 1) % len(_LEVELS)
145
157
  level = _LEVELS[self._level_index]
146
158
  self._min_level_no = self._resolve_level_no(level)
147
159
  self._refresh_log()
@@ -165,7 +177,7 @@ class ConsoleScreen(DreadnodeScreen):
165
177
  ]
166
178
  _LOG_EXPORT_DIR.mkdir(parents=True, exist_ok=True)
167
179
  output_path = _LOG_EXPORT_DIR / filename
168
- output_path.write_text("\n".join(lines), encoding="utf-8")
180
+ output_path.write_text("\n".join(lines), encoding="utf-8", errors="replace")
169
181
  self.notify(f"Saved to {output_path}")
170
182
 
171
183
  def action_clear_logs(self) -> None:
@@ -1699,6 +1699,28 @@ class SessionsManager:
1699
1699
  envelope_status or "ok",
1700
1700
  error_text or "none",
1701
1701
  )
1702
+ if is_active_session:
1703
+ # Perf telemetry — log one summary line per turn so we can
1704
+ # see how rendering cost correlates with session length.
1705
+ # See widgets/conversation.py:perf_snapshot_and_reset.
1706
+ try:
1707
+ conv = self._ui.query_conversation()
1708
+ draft = self._ui.query_draft()
1709
+ entries, vsize_changes = conv.perf_snapshot_and_reset()
1710
+ tok_n, tok_p50, tok_p95, tok_max = draft.perf_snapshot_and_reset()
1711
+ logger.info(
1712
+ "TUI perf | session={} | entries={} | vsize_events={} "
1713
+ "| tokens={} | tok_us_p50={:.0f} | tok_us_p95={:.0f} | tok_us_max={:.0f}",
1714
+ session_id[:8],
1715
+ entries,
1716
+ vsize_changes,
1717
+ tok_n,
1718
+ tok_p50,
1719
+ tok_p95,
1720
+ tok_max,
1721
+ )
1722
+ except Exception:
1723
+ logger.opt(exception=True).debug("TUI perf snapshot failed")
1702
1724
  if error_text:
1703
1725
  logger.error(
1704
1726
  "Agent ended with error: {} (type={})",