dreadnode 2.0.23__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.23 → dreadnode-2.0.25}/PKG-INFO +1 -1
  2. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/agent.py +10 -1
  3. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/skills.py +3 -3
  4. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/subagent.py +1 -1
  5. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/tools.py +20 -15
  6. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/assessment.py +50 -7
  7. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/airt.py +92 -22
  8. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/capability.py +9 -2
  9. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/runtime_client.py +0 -7
  10. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/app.py +16 -21
  11. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/app.py +18 -41
  12. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/command_dispatcher.py +2 -4
  13. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/commands.py +1 -2
  14. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/dreadnode.tcss +8 -15
  15. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capabilities.py +12 -5
  16. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/console.py +15 -3
  17. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/sessions_manager.py +22 -0
  18. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/tool_format.py +68 -8
  19. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_coordinator.py +22 -6
  20. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/composer.py +23 -16
  21. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/conversation.py +47 -0
  22. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/help_panel.py +1 -1
  23. {dreadnode-2.0.23 → 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.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +2 -0
  29. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +35 -20
  30. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -1
  31. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +8 -12
  32. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -8
  33. {dreadnode-2.0.23 → 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.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +12 -1
  36. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/loader.py +36 -10
  37. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/base.py +7 -0
  38. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/litellm_.py +20 -0
  39. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/_ripgrep.py +7 -6
  40. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/apply_patch.py +1 -1
  41. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/dreadnode_cli.py +1 -1
  42. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/editing.py +4 -4
  43. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/execute.py +3 -3
  44. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/fetch.py +1 -1
  45. {dreadnode-2.0.23 → 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.23 → dreadnode-2.0.25}/dreadnode/tools/interaction.py +8 -8
  48. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/ls.py +1 -1
  49. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/memory.py +2 -2
  50. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/read.py +7 -3
  51. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/report.py +1 -1
  52. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/todo.py +1 -1
  53. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/trajectory_search.py +1 -1
  54. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/web_extract.py +1 -1
  55. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/web_search.py +1 -1
  56. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/write.py +1 -1
  57. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/jobs.py +3 -3
  58. {dreadnode-2.0.23 → dreadnode-2.0.25}/pyproject.toml +1 -1
  59. dreadnode-2.0.23/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -175
  60. dreadnode-2.0.23/dreadnode/tools/grep.py +0 -285
  61. {dreadnode-2.0.23 → dreadnode-2.0.25}/.gitignore +0 -0
  62. {dreadnode-2.0.23 → dreadnode-2.0.25}/LICENSE +0 -0
  63. {dreadnode-2.0.23 → dreadnode-2.0.25}/README.md +0 -0
  64. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/__init__.py +0 -0
  65. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/__main__.py +0 -0
  66. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/__init__.py +0 -0
  67. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/events.py +0 -0
  68. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/exceptions.py +0 -0
  69. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/format.py +0 -0
  70. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/hooks.py +0 -0
  71. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/judge.py +0 -0
  72. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/__init__.py +0 -0
  73. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/auth.py +0 -0
  74. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/client.py +0 -0
  75. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/config.py +0 -0
  76. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/mcp/server.py +0 -0
  77. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/process_judge.py +0 -0
  78. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/reactions.py +0 -0
  79. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/stopping.py +0 -0
  80. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/tool_resolution.py +0 -0
  81. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/agents/trajectory.py +0 -0
  82. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/__init__.py +0 -0
  83. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/adversarial_reasoning.py +0 -0
  84. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/advpromptier.py +0 -0
  85. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/alignment_faking.py +0 -0
  86. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analogy_escalation.py +0 -0
  87. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/__init__.py +0 -0
  88. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/aggregator.py +0 -0
  89. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/classifier.py +0 -0
  90. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/compliance.py +0 -0
  91. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/engine.py +0 -0
  92. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/recommendations.py +0 -0
  93. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/analytics/types.py +0 -0
  94. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/aprt_progressive.py +0 -0
  95. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/attention_shifting.py +0 -0
  96. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/autodan_turbo.py +0 -0
  97. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/autoredteamer.py +0 -0
  98. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/beast.py +0 -0
  99. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/__init__.py +0 -0
  100. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/atlas.py +0 -0
  101. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/nist.py +0 -0
  102. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp.py +0 -0
  103. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  104. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/compliance/saif.py +0 -0
  105. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/constants.py +0 -0
  106. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/cot_jailbreak.py +0 -0
  107. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/crescendo.py +0 -0
  108. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/__init__.py +0 -0
  109. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  110. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  111. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/assets/image/meth.png +0 -0
  112. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  113. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  114. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  115. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  116. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  117. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  118. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  119. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  120. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  121. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  122. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  123. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  124. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  125. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  126. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  127. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  128. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  129. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/deep_inception.py +0 -0
  130. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/drattack.py +0 -0
  131. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/echo_chamber.py +0 -0
  132. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/events.py +0 -0
  133. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/genetic_persona.py +0 -0
  134. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/goat.py +0 -0
  135. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/goat_v2.py +0 -0
  136. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/gptfuzzer.py +0 -0
  137. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/humor_bypass.py +0 -0
  138. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/image.py +0 -0
  139. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/j2_meta.py +0 -0
  140. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/jbdistill.py +0 -0
  141. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/jbfuzz.py +0 -0
  142. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/lrm_autonomous.py +0 -0
  143. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/mapf.py +0 -0
  144. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/multimodal.py +0 -0
  145. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/nexus.py +0 -0
  146. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/pair.py +0 -0
  147. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/persona_hijack.py +0 -0
  148. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/prompt.py +0 -0
  149. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/quantization_safety.py +0 -0
  150. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/rainbow.py +0 -0
  151. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/refusal_aware.py +0 -0
  152. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/renellm.py +0 -0
  153. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/__init__.py +0 -0
  154. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/json_report.py +0 -0
  155. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/llm_summary.py +0 -0
  156. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reporting/markdown.py +0 -0
  157. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/reward_hacking.py +0 -0
  158. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/salami_slicing.py +0 -0
  159. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/self_persuasion.py +0 -0
  160. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/siren.py +0 -0
  161. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/tap.py +0 -0
  162. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/templatefuzz.py +0 -0
  163. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/tmap_trajectory.py +0 -0
  164. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/trojail.py +0 -0
  165. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/airt/watermark_removal.py +0 -0
  166. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/__init__.py +0 -0
  167. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/__init__.py +0 -0
  168. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/client.py +0 -0
  169. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/api/models.py +0 -0
  170. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/__init__.py +0 -0
  171. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/args.py +0 -0
  172. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/dataset.py +0 -0
  173. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/environment.py +0 -0
  174. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/evaluation.py +0 -0
  175. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/inference_model.py +0 -0
  176. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/main.py +0 -0
  177. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/model.py +0 -0
  178. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/optimize.py +0 -0
  179. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/runtime.py +0 -0
  180. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/sandbox.py +0 -0
  181. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/secret.py +0 -0
  182. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/session.py +0 -0
  183. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/shared.py +0 -0
  184. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/task.py +0 -0
  185. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/__init__.py +0 -0
  186. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  187. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  188. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  189. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  190. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  191. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  192. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  193. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  194. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  195. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/train.py +0 -0
  196. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/cli/worlds.py +0 -0
  197. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/__init__.py +0 -0
  198. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/interactive.py +0 -0
  199. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/managed_client.py +0 -0
  200. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/models.py +0 -0
  201. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/client/transports.py +0 -0
  202. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/config.py +0 -0
  203. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/env.py +0 -0
  204. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/main.py +0 -0
  205. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/model_catalog.py +0 -0
  206. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/paths.py +0 -0
  207. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/print_mode.py +0 -0
  208. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/__init__.py +0 -0
  209. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/auth.py +0 -0
  210. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/capability_manager.py +0 -0
  211. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/model_resolution.py +0 -0
  212. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/prompt.py +0 -0
  213. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/prompt_registry.py +0 -0
  214. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/runtime_events.py +0 -0
  215. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/session_hydrator.py +0 -0
  216. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/session_persistence.py +0 -0
  217. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/turn_coordinator.py +0 -0
  218. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/utils.py +0 -0
  219. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/websocket.py +0 -0
  220. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/server/worker_manager.py +0 -0
  221. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/__init__.py +0 -0
  222. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/auth_flow.py +0 -0
  223. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/capabilities_manager.py +0 -0
  224. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/connection.py +0 -0
  225. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/error_handler.py +0 -0
  226. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/model_manager.py +0 -0
  227. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/model_variants.py +0 -0
  228. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/profile_manager.py +0 -0
  229. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/runtime_cache.py +0 -0
  230. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screen_router.py +0 -0
  231. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/__init__.py +0 -0
  232. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/auth.py +0 -0
  233. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/base.py +0 -0
  234. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  235. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/connection_error.py +0 -0
  236. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/environments.py +0 -0
  237. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/evaluations.py +0 -0
  238. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/model_picker.py +0 -0
  239. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/models.py +0 -0
  240. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  241. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/runtimes.py +0 -0
  242. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  243. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/secrets.py +0 -0
  244. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/services.py +0 -0
  245. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/sessions.py +0 -0
  246. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  247. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/traces.py +0 -0
  248. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/screens/workspaces.py +0 -0
  249. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/spans_reader.py +0 -0
  250. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/status_messages.py +0 -0
  251. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/theme.py +0 -0
  252. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  253. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_reducer.py +0 -0
  254. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/turn_state_phase.py +0 -0
  255. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/update_check.py +0 -0
  256. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/__init__.py +0 -0
  257. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  258. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  259. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  260. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  261. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/flash.py +0 -0
  262. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  263. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  264. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  265. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  266. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  267. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  268. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  269. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  270. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  271. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  272. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  273. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  274. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  275. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  276. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/throbber.py +0 -0
  277. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  278. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  279. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/welcome.py +0 -0
  280. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/widgets/whoami.py +0 -0
  281. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/app/tui/wire_events.py +0 -0
  282. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/__init__.py +0 -0
  283. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  284. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  285. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  286. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  287. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  288. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  289. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  290. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  291. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  292. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  293. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  294. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  295. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
  296. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  297. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  298. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  299. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  300. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  301. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  302. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  303. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  304. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +0 -0
  305. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  306. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  307. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  308. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  309. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  310. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  311. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  312. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  313. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  314. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  315. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  316. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  317. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  318. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  319. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  320. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  321. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  322. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  323. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  324. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  325. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  326. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  327. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  328. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  329. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  330. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  331. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  332. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  333. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  334. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +0 -0
  335. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  336. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  337. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  338. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  339. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
  340. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  341. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  342. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  343. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  344. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  345. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  346. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  347. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  348. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  349. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  350. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  351. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  352. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  353. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  354. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  355. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  356. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  357. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  358. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  359. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  360. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  361. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  362. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  363. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  364. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/__init__.py +0 -0
  365. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/capability.py +0 -0
  366. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/flags.py +0 -0
  367. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/install.py +0 -0
  368. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/sync.py +0 -0
  369. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/tool_rules.py +0 -0
  370. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/types.py +0 -0
  371. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/worker.py +0 -0
  372. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/capabilities/worker_runner.py +0 -0
  373. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/__init__.py +0 -0
  374. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/conditions.py +0 -0
  375. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/discovery.py +0 -0
  376. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/environment.py +0 -0
  377. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/exceptions.py +0 -0
  378. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/execution.py +0 -0
  379. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/hook.py +0 -0
  380. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/judge.py +0 -0
  381. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/load.py +0 -0
  382. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/log.py +0 -0
  383. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/__init__.py +0 -0
  384. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/config.py +0 -0
  385. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/context.py +0 -0
  386. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/hydrate.py +0 -0
  387. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/meta/introspect.py +0 -0
  388. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/metric.py +0 -0
  389. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/object.py +0 -0
  390. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/scorer.py +0 -0
  391. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/serialization.py +0 -0
  392. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/stopping.py +0 -0
  393. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/task.py +0 -0
  394. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/templating.py +0 -0
  395. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/transforms.py +0 -0
  396. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/__init__.py +0 -0
  397. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/audio.py +0 -0
  398. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/base.py +0 -0
  399. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/common.py +0 -0
  400. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/image.py +0 -0
  401. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/object_3d.py +0 -0
  402. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/table.py +0 -0
  403. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/text.py +0 -0
  404. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/types/video.py +0 -0
  405. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/core/util.py +0 -0
  406. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/__init__.py +0 -0
  407. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/dataset.py +0 -0
  408. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/hf.py +0 -0
  409. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/datasets/local.py +0 -0
  410. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/__init__.py +0 -0
  411. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/console.py +0 -0
  412. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/evaluation.py +0 -0
  413. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/events.py +0 -0
  414. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/format.py +0 -0
  415. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/result.py +0 -0
  416. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/evaluations/sample.py +0 -0
  417. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/__init__.py +0 -0
  418. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/caching.py +0 -0
  419. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/chat.py +0 -0
  420. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/data.py +0 -0
  421. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/exceptions.py +0 -0
  422. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/__init__.py +0 -0
  423. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/http.py +0 -0
  424. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/transformers_.py +0 -0
  425. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/generator/vllm_.py +0 -0
  426. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/message.py +0 -0
  427. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/models.py +0 -0
  428. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/parsing.py +0 -0
  429. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/__init__.py +0 -0
  430. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/base.py +0 -0
  431. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  432. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/generators/utils.py +0 -0
  433. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/__init__.py +0 -0
  434. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/hf.py +0 -0
  435. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/local.py +0 -0
  436. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/models/model.py +0 -0
  437. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/__init__.py +0 -0
  438. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/__init__.py +0 -0
  439. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  440. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/agent.py +0 -0
  441. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/env.py +0 -0
  442. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/runtime.py +0 -0
  443. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/adapters/stack.py +0 -0
  444. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/api.py +0 -0
  445. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/__init__.py +0 -0
  446. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/base.py +0 -0
  447. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/backends/gepa.py +0 -0
  448. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/collectors.py +0 -0
  449. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/config.py +0 -0
  450. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/console.py +0 -0
  451. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/events.py +0 -0
  452. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/format.py +0 -0
  453. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/jobs.py +0 -0
  454. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/result.py +0 -0
  455. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/sampler.py +0 -0
  456. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/sampling.py +0 -0
  457. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/search.py +0 -0
  458. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/stopping.py +0 -0
  459. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/study.py +0 -0
  460. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/optimization/trial.py +0 -0
  461. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/__init__.py +0 -0
  462. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/loader.py +0 -0
  463. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/manifest.py +0 -0
  464. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/oci.py +0 -0
  465. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/package.py +0 -0
  466. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/packaging/task_validation.py +0 -0
  467. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/__init__.py +0 -0
  468. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/guard.py +0 -0
  469. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  470. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/py.typed +0 -0
  471. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/__init__.py +0 -0
  472. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/boundary.py +0 -0
  473. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/fuzzing.py +0 -0
  474. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/graph.py +0 -0
  475. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/grid.py +0 -0
  476. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/image.py +0 -0
  477. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/mapelites.py +0 -0
  478. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/optuna.py +0 -0
  479. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/random.py +0 -0
  480. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/registry.py +0 -0
  481. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/samplers/strategy.py +0 -0
  482. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/__init__.py +0 -0
  483. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  484. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agent_security.py +0 -0
  485. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agentic.py +0 -0
  486. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/agentic_workflow.py +0 -0
  487. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/attack_outcome.py +0 -0
  488. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/classification.py +0 -0
  489. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/consistency.py +0 -0
  490. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/contains.py +0 -0
  491. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/cosine_sim.py +0 -0
  492. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/credentials.py +0 -0
  493. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/crucible.py +0 -0
  494. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/documentation_security.py +0 -0
  495. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/exfiltration_detection.py +0 -0
  496. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/format.py +0 -0
  497. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/harm.py +0 -0
  498. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/ide_security.py +0 -0
  499. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/image.py +0 -0
  500. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/json.py +0 -0
  501. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/judge.py +0 -0
  502. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/judge_ensemble.py +0 -0
  503. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/length.py +0 -0
  504. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/lexical.py +0 -0
  505. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/mcp_security.py +0 -0
  506. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/memorization.py +0 -0
  507. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/multi_agent_security.py +0 -0
  508. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/pii.py +0 -0
  509. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/prompt_leak.py +0 -0
  510. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/readability.py +0 -0
  511. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/reasoning_security.py +0 -0
  512. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/sentiment.py +0 -0
  513. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/similarity.py +0 -0
  514. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/structural_detection.py +0 -0
  515. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/scorers/supply_chain_detection.py +0 -0
  516. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/__init__.py +0 -0
  517. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/providers.py +0 -0
  518. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/session_store.py +0 -0
  519. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/storage/storage.py +0 -0
  520. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/__init__.py +0 -0
  521. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/task.py +0 -0
  522. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tools/think.py +0 -0
  523. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/__init__.py +0 -0
  524. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/constants.py +0 -0
  525. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/convert.py +0 -0
  526. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/exporter.py +0 -0
  527. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/exporters.py +0 -0
  528. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/span.py +0 -0
  529. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/spans.py +0 -0
  530. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/tracing/trace_converter.py +0 -0
  531. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/__init__.py +0 -0
  532. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/_progress.py +0 -0
  533. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/base.py +0 -0
  534. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/dpo.py +0 -0
  535. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/env_rollouts.py +0 -0
  536. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/__init__.py +0 -0
  537. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/_common.py +0 -0
  538. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/rl.py +0 -0
  539. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/sft.py +0 -0
  540. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/etl/worlds.py +0 -0
  541. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/events.py +0 -0
  542. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/grpo.py +0 -0
  543. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/models.py +0 -0
  544. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ppo.py +0 -0
  545. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/prime.py +0 -0
  546. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/__init__.py +0 -0
  547. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/async_trainer.py +0 -0
  548. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/config.py +0 -0
  549. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/coordinator.py +0 -0
  550. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/distributed.py +0 -0
  551. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/dpo.py +0 -0
  552. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/experience.py +0 -0
  553. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  554. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/inference.py +0 -0
  555. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/learner.py +0 -0
  556. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/multi_turn.py +0 -0
  557. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/ppo.py +0 -0
  558. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/reward_model.py +0 -0
  559. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_env.py +0 -0
  560. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/rollout_worker.py +0 -0
  561. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/sft.py +0 -0
  562. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/ray/trainer.py +0 -0
  563. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/recipes.py +0 -0
  564. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/__init__.py +0 -0
  565. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/aggregator.py +0 -0
  566. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/functions.py +0 -0
  567. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  568. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/shaping.py +0 -0
  569. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rewards/types.py +0 -0
  570. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/__init__.py +0 -0
  571. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/adapters.py +0 -0
  572. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  573. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/orchestrator.py +0 -0
  574. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/types.py +0 -0
  575. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/rollouts/worlds.py +0 -0
  576. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/serving/__init__.py +0 -0
  577. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/serving/vllm_client.py +0 -0
  578. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/sft.py +0 -0
  579. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/__init__.py +0 -0
  580. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/config.py +0 -0
  581. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/data.py +0 -0
  582. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/renderer.py +0 -0
  583. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/rl.py +0 -0
  584. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker/trainer.py +0 -0
  585. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/tinker_sft.py +0 -0
  586. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/training/utils.py +0 -0
  587. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/__init__.py +0 -0
  588. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  589. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/adversarial_suffix.py +0 -0
  590. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/agent_skill.py +0 -0
  591. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/agentic_workflow.py +0 -0
  592. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/audio.py +0 -0
  593. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/backdoor_finetune.py +0 -0
  594. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  595. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/cipher.py +0 -0
  596. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/competitive_parity.py +0 -0
  597. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/constitutional.py +0 -0
  598. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/document.py +0 -0
  599. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/documentation_poison.py +0 -0
  600. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/encoding.py +0 -0
  601. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/exfiltration.py +0 -0
  602. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/flip_attack.py +0 -0
  603. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/guardrail_bypass.py +0 -0
  604. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/ide_injection.py +0 -0
  605. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/image.py +0 -0
  606. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/injection.py +0 -0
  607. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/json_tools.py +0 -0
  608. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/language.py +0 -0
  609. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/logic_bomb.py +0 -0
  610. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/mcp_attacks.py +0 -0
  611. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  612. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/multimodal_attacks.py +0 -0
  613. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/persuasion.py +0 -0
  614. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/perturbation.py +0 -0
  615. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/pii_extraction.py +0 -0
  616. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/pythonic_tools.py +0 -0
  617. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/rag_poisoning.py +0 -0
  618. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/reasoning_attacks.py +0 -0
  619. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/refine.py +0 -0
  620. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/response_steering.py +0 -0
  621. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/structural_exploits.py +0 -0
  622. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/stylistic.py +0 -0
  623. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/substitution.py +0 -0
  624. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/supply_chain.py +0 -0
  625. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/swap.py +0 -0
  626. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  627. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/text.py +0 -0
  628. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/video.py +0 -0
  629. {dreadnode-2.0.23 → dreadnode-2.0.25}/dreadnode/transforms/xml_tools.py +0 -0
  630. {dreadnode-2.0.23 → 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.23
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
 
@@ -23,6 +23,7 @@ import contextlib
23
23
  import contextvars
24
24
  import os
25
25
  import signal
26
+ import threading
26
27
  import typing as t
27
28
  from pathlib import Path
28
29
 
@@ -57,6 +58,26 @@ def _get_platform_context() -> tuple[ApiClient, Profile] | None:
57
58
  return None
58
59
 
59
60
 
61
+ # Thread-local storage for injected platform context
62
+ _thread_local = threading.local()
63
+
64
+
65
+ def _set_platform_context(api: ApiClient, profile: Profile) -> None:
66
+ """Set platform context for the current thread (used by AIRT CLI)."""
67
+ _thread_local.api = api
68
+ _thread_local.profile = profile
69
+
70
+
71
+ def _get_platform_context_with_fallback() -> tuple[ApiClient, Profile] | None:
72
+ """Get platform context with CLI injection fallback."""
73
+ # First try thread-local injected context (from AIRT CLI)
74
+ if hasattr(_thread_local, "api") and hasattr(_thread_local, "profile"):
75
+ return _thread_local.api, _thread_local.profile
76
+
77
+ # Fallback to global DEFAULT_INSTANCE
78
+ return _get_platform_context()
79
+
80
+
60
81
  class Assessment:
61
82
  """Orchestrates multi-attack assessments.
62
83
 
@@ -91,6 +112,7 @@ class Assessment:
91
112
  workflow_run_id: str | None = None,
92
113
  workflow_script: str | None = None,
93
114
  project_id: str | None = None,
115
+ runtime_id: str | None = None,
94
116
  ) -> None:
95
117
  self.name = name
96
118
  self.description = description
@@ -106,9 +128,12 @@ class Assessment:
106
128
  self.judge_model = judge_model or model
107
129
 
108
130
  if target_config is None and model is not None:
109
- target_config = {"model": model}
131
+ target_config = {"model": self.target_model or model}
110
132
  if attacker_config is None and model is not None:
111
- 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
+ }
112
137
 
113
138
  self.target_config = target_config
114
139
  self.attacker_config = attacker_config
@@ -116,6 +141,7 @@ class Assessment:
116
141
  self._workflow_run_id = workflow_run_id
117
142
  self._workflow_script = workflow_script
118
143
  self._project_id = project_id
144
+ self._runtime_id = runtime_id
119
145
 
120
146
  self._session_id = session_id or os.environ.get("DREADNODE_SESSION_ID")
121
147
  if self._session_id is None:
@@ -177,7 +203,7 @@ class Assessment:
177
203
  if self._assessment_id is not None:
178
204
  return self._assessment_id
179
205
 
180
- ctx = _get_platform_context()
206
+ ctx = _get_platform_context_with_fallback()
181
207
  if ctx is None:
182
208
  logger.debug("SDK offline -- assessment not registered with platform")
183
209
  return None
@@ -192,11 +218,28 @@ class Assessment:
192
218
  return None
193
219
 
194
220
  try:
221
+ # Get runtime_id - try to use a default runtime for the project
222
+ runtime_id = getattr(self, "_runtime_id", None)
223
+ if runtime_id is None:
224
+ # Auto-discover a runtime for this project (CLI users shouldn't need to specify this)
225
+ try:
226
+ runtimes_resp = api.list_runtimes(profile.org_key, profile.workspace_key)
227
+ runtime_items = runtimes_resp.get("items", [])
228
+ matching_runtimes = [r for r in runtime_items if r["project_id"] == project_id]
229
+ if matching_runtimes:
230
+ runtime_id = matching_runtimes[0]["id"]
231
+ logger.debug(f"Auto-selected runtime {runtime_id} for project {project_id}")
232
+ else:
233
+ logger.warning(f"No runtimes found for project {project_id}")
234
+ except Exception as e:
235
+ logger.debug(f"Failed to auto-discover runtime for project: {e}")
236
+
195
237
  result = api.create_airt_assessment(
196
238
  profile.org_key,
197
239
  profile.workspace_key,
198
240
  name=self.name,
199
241
  project_id=project_id,
242
+ runtime_id=runtime_id,
200
243
  description=self.description,
201
244
  session_id=self._session_id,
202
245
  target_model=self.target_model,
@@ -402,7 +445,7 @@ class Assessment:
402
445
  await self.register()
403
446
  # Notify the platform that execution has started (sets started_at server-side)
404
447
  if self._assessment_id is not None:
405
- ctx = _get_platform_context()
448
+ ctx = _get_platform_context_with_fallback()
406
449
  if ctx is not None:
407
450
  api, session = ctx
408
451
  try:
@@ -459,7 +502,7 @@ class Assessment:
459
502
  provider.force_flush(timeout_millis=10_000)
460
503
 
461
504
  # Use the sync API client directly — no async gymnastics
462
- ctx = _get_platform_context()
505
+ ctx = _get_platform_context_with_fallback()
463
506
  if ctx is None or self._assessment_id is None:
464
507
  return
465
508
 
@@ -499,7 +542,7 @@ class Assessment:
499
542
  Returns:
500
543
  True if successfully marked, False otherwise.
501
544
  """
502
- ctx = _get_platform_context()
545
+ ctx = _get_platform_context_with_fallback()
503
546
  if ctx is None or self._assessment_id is None:
504
547
  return False
505
548
 
@@ -527,7 +570,7 @@ class Assessment:
527
570
  Returns:
528
571
  True if successfully marked, False otherwise.
529
572
  """
530
- ctx = _get_platform_context()
573
+ ctx = _get_platform_context_with_fallback()
531
574
  if ctx is None or self._assessment_id is None:
532
575
  return False
533
576
 
@@ -65,7 +65,7 @@ def _parse_json_object_option(value: str | None, *, field_name: str) -> dict[str
65
65
 
66
66
 
67
67
  def _resolve_project_id(api, profile, project):
68
- """Resolve project name to UUID."""
68
+ """Resolve project name to UUID, creating the project if it doesn't exist."""
69
69
  from uuid import UUID
70
70
 
71
71
  candidate = project or getattr(profile, "project_key", None)
@@ -83,9 +83,25 @@ def _resolve_project_id(api, profile, project):
83
83
  try:
84
84
  resolved = api.get_project(profile.org_key, profile.workspace_key, str(candidate))
85
85
  return str(resolved.id)
86
- except Exception as e:
87
- print(f"[PROJECT DEBUG] Failed to resolve project '{candidate}': {e}")
88
- return None
86
+ except Exception as get_error:
87
+ # Project doesn't exist, try to create it
88
+ try:
89
+ print(f"[PROJECT DEBUG] Project '{candidate}' not found, creating it...")
90
+ created = api.create_project(
91
+ profile.org_key,
92
+ profile.workspace_key,
93
+ name=str(candidate),
94
+ key=str(candidate),
95
+ description="Auto-created project for AIRT CLI run",
96
+ )
97
+ print(
98
+ f"[PROJECT DEBUG] Successfully created project '{candidate}' with ID {created.id}"
99
+ )
100
+ return str(created.id)
101
+ except Exception as create_error:
102
+ print(f"[PROJECT DEBUG] Failed to resolve project '{candidate}': {get_error}")
103
+ print(f"[PROJECT DEBUG] Failed to create project '{candidate}': {create_error}")
104
+ return None
89
105
 
90
106
 
91
107
  _SEVERITY_COLORS = {
@@ -1150,6 +1166,9 @@ def run(
1150
1166
  print_error(str(e))
1151
1167
  return
1152
1168
 
1169
+ # Capture original project argument before connect() clears it
1170
+ original_project = platform.project
1171
+
1153
1172
  # Configure SDK and validate scope to populate project_id
1154
1173
  _api, profile = platform.connect()
1155
1174
 
@@ -1175,25 +1194,46 @@ def run(
1175
1194
  console.print()
1176
1195
 
1177
1196
  async def _run() -> None:
1197
+ # Determine project for SDK configuration
1198
+ # Use original CLI argument, fallback to profile, environment, then 'default'
1199
+ import os
1200
+
1178
1201
  from dreadnode.airt import Assessment
1202
+ from dreadnode.airt.assessment import _set_platform_context
1179
1203
 
1180
1204
  # Configure the SDK using the validated profile
1181
1205
  from dreadnode.app.main import DEFAULT_INSTANCE
1182
1206
 
1183
- DEFAULT_INSTANCE.configure(
1184
- server=profile.url,
1185
- api_key=profile.api_key,
1186
- organization=profile.organization,
1187
- workspace=profile.workspace,
1188
- project=profile.project,
1189
- )
1207
+ env_project = os.getenv("DREADNODE_PROJECT")
1208
+ sdk_project = original_project or profile.project or env_project or "default"
1209
+
1210
+ # Try global SDK configuration first
1211
+ try:
1212
+ DEFAULT_INSTANCE.configure(
1213
+ server=profile.url,
1214
+ api_key=profile.api_key,
1215
+ organization=profile.organization,
1216
+ workspace=profile.workspace,
1217
+ project=sdk_project,
1218
+ )
1219
+ from loguru import logger
1220
+
1221
+ logger.debug("SDK instance configured successfully for assessment registration")
1222
+ except Exception as e:
1223
+ from loguru import logger
1224
+
1225
+ logger.warning(f"Failed to configure SDK instance for assessment registration: {e}")
1226
+ logger.info("Using fallback context injection for assessment registration")
1227
+
1228
+ # Always inject platform context as fallback for assessment registration
1229
+ _set_platform_context(_api, profile)
1190
1230
 
1191
1231
  # Resolve project name to UUID
1192
- # Get project from environment if profile.project is None
1232
+ # Use original CLI argument, fallback to profile, environment, then 'default'
1193
1233
  import os
1194
1234
 
1195
1235
  env_project = os.getenv("DREADNODE_PROJECT")
1196
- actual_project = profile.project or env_project
1236
+ actual_project = original_project or profile.project or env_project or "default"
1197
1237
 
1198
1238
  resolved_project_id = _resolve_project_id(_api, profile, actual_project)
1199
1239
  final_project_id = resolved_project_id or profile.project_id or actual_project
@@ -1203,6 +1243,9 @@ def run(
1203
1243
  description=f"CLI attack: {goal}",
1204
1244
  target=target_fn,
1205
1245
  model=atk_model,
1246
+ target_model=target_model,
1247
+ attacker_model=atk_model,
1248
+ judge_model=eval_model,
1206
1249
  goal=goal,
1207
1250
  goal_category=goal_category,
1208
1251
  project_id=final_project_id,
@@ -1332,24 +1375,48 @@ def run_suite(
1332
1375
  console.print(f" Config: [dim]{file}[/dim]")
1333
1376
  console.print()
1334
1377
 
1378
+ # Capture original project argument before connect() clears it
1379
+ original_project = platform.project
1380
+
1335
1381
  # Configure SDK
1336
1382
  _api, profile = platform.connect()
1337
1383
 
1338
1384
  target_fn = _build_target(model, max_tokens)
1339
1385
 
1340
1386
  async def _run_suite() -> list[dict[str, t.Any]]:
1387
+ # Determine project for SDK configuration
1388
+ # Use original CLI argument, fallback to profile, environment, then 'default'
1389
+ import os
1390
+
1341
1391
  from dreadnode.airt import Assessment
1392
+ from dreadnode.airt.assessment import _set_platform_context
1342
1393
 
1343
1394
  # Configure the SDK using the validated profile
1344
1395
  from dreadnode.app.main import DEFAULT_INSTANCE
1345
1396
 
1346
- DEFAULT_INSTANCE.configure(
1347
- server=profile.url,
1348
- api_key=profile.api_key,
1349
- organization=profile.organization,
1350
- workspace=profile.workspace,
1351
- project=profile.project,
1352
- )
1397
+ env_project = os.getenv("DREADNODE_PROJECT")
1398
+ sdk_project = original_project or profile.project or env_project or "default"
1399
+
1400
+ # Try global SDK configuration first
1401
+ try:
1402
+ DEFAULT_INSTANCE.configure(
1403
+ server=profile.url,
1404
+ api_key=profile.api_key,
1405
+ organization=profile.organization,
1406
+ workspace=profile.workspace,
1407
+ project=sdk_project,
1408
+ )
1409
+ from loguru import logger
1410
+
1411
+ logger.debug("SDK instance configured successfully for assessment registration")
1412
+ except Exception as e:
1413
+ from loguru import logger
1414
+
1415
+ logger.warning(f"Failed to configure SDK instance for assessment registration: {e}")
1416
+ logger.info("Using fallback context injection for assessment registration")
1417
+
1418
+ # Always inject platform context as fallback for assessment registration
1419
+ _set_platform_context(_api, profile)
1353
1420
 
1354
1421
  suite_results = []
1355
1422
  for i, goal_cfg in enumerate(goals, 1):
@@ -1362,11 +1429,11 @@ def run_suite(
1362
1429
  console.print(f"\n--- Goal {i}/{len(goals)}: {goal_text[:60]}...")
1363
1430
 
1364
1431
  # Resolve project name to UUID
1365
- # Get project from environment if profile.project is None
1432
+ # Use original CLI argument, then environment variable as fallback
1366
1433
  import os
1367
1434
 
1368
1435
  env_project = os.getenv("DREADNODE_PROJECT")
1369
- actual_project = profile.project or env_project
1436
+ actual_project = original_project or profile.project or env_project
1370
1437
 
1371
1438
  resolved_project_id = _resolve_project_id(_api, profile, actual_project)
1372
1439
  final_project_id = resolved_project_id or profile.project_id or actual_project
@@ -1376,6 +1443,9 @@ def run_suite(
1376
1443
  description=f"Suite run: {goal_text}",
1377
1444
  target=target_fn,
1378
1445
  model=atk_model,
1446
+ target_model=model,
1447
+ attacker_model=atk_model,
1448
+ judge_model=atk_model,
1379
1449
  goal=goal_text,
1380
1450
  goal_category=goal_cat,
1381
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(