dreadnode 2.0.46__tar.gz → 2.0.47__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 (764) hide show
  1. {dreadnode-2.0.46 → dreadnode-2.0.47}/PKG-INFO +2 -2
  2. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/assessment.py +6 -17
  3. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/api/models.py +3 -0
  4. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/airt.py +3 -1
  5. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/args.py +1 -1
  6. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/main.py +17 -3
  7. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/runtime.py +89 -15
  8. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/workflow.py +10 -0
  9. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/config.py +4 -0
  10. dreadnode-2.0.47/dreadnode/app/diagnostics.py +53 -0
  11. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/print_mode.py +4 -2
  12. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/app.py +51 -14
  13. dreadnode-2.0.47/dreadnode/app/server/runtime_inspection.py +89 -0
  14. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/app.py +12 -4
  15. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/bug_report.py +1 -44
  16. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +5 -1
  17. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workflows.md +18 -9
  18. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2 -0
  19. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +1 -1
  20. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/workflow.md +1 -0
  21. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
  22. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +1 -1
  23. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +15 -1
  24. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +9 -1
  25. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +3 -1
  26. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +1 -1
  27. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +10 -0
  28. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +11 -3
  29. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/runtime.py +9 -3
  30. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/egress.py +24 -0
  31. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/policies/__init__.py +14 -8
  32. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/policies/guard.py +15 -6
  33. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/host.py +24 -1
  34. {dreadnode-2.0.46 → dreadnode-2.0.47}/pyproject.toml +16 -3
  35. {dreadnode-2.0.46 → dreadnode-2.0.47}/.gitignore +0 -0
  36. {dreadnode-2.0.46 → dreadnode-2.0.47}/LICENSE +0 -0
  37. {dreadnode-2.0.46 → dreadnode-2.0.47}/README.md +0 -0
  38. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/__init__.py +0 -0
  39. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/__main__.py +0 -0
  40. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/__init__.py +0 -0
  41. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/agent.py +0 -0
  42. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/engines/AGENTS.md +0 -0
  43. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/engines/__init__.py +0 -0
  44. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/engines/base.py +0 -0
  45. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/engines/claude_code.py +0 -0
  46. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/engines/native.py +0 -0
  47. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/events.py +0 -0
  48. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/exceptions.py +0 -0
  49. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/format.py +0 -0
  50. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/hooks.py +0 -0
  51. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/judge.py +0 -0
  52. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/mcp/__init__.py +0 -0
  53. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/mcp/auth.py +0 -0
  54. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/mcp/client.py +0 -0
  55. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/mcp/config.py +0 -0
  56. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/mcp/server.py +0 -0
  57. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/process_judge.py +0 -0
  58. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/reactions.py +0 -0
  59. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/sanitize.py +0 -0
  60. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/skills.py +0 -0
  61. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/stopping.py +0 -0
  62. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/subagent.py +0 -0
  63. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/tool_resolution.py +0 -0
  64. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/tools.py +0 -0
  65. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/agents/trajectory.py +0 -0
  66. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/__init__.py +0 -0
  67. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/_base.py +0 -0
  68. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/adversarial_reasoning.py +0 -0
  69. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/advpromptier.py +0 -0
  70. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/agent_suite.py +0 -0
  71. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/agentic_suite.py +0 -0
  72. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/alignment_faking.py +0 -0
  73. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analogy_escalation.py +0 -0
  74. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/__init__.py +0 -0
  75. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/aggregator.py +0 -0
  76. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/classifier.py +0 -0
  77. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/compliance.py +0 -0
  78. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/engine.py +0 -0
  79. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/recommendations.py +0 -0
  80. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/analytics/types.py +0 -0
  81. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/approval_bypass.py +0 -0
  82. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/aprt_progressive.py +0 -0
  83. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/art_engine.py +0 -0
  84. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/__init__.py +0 -0
  85. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/defense.py +0 -0
  86. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/failure.py +0 -0
  87. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/gate.py +0 -0
  88. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/memory.py +0 -0
  89. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/modes.py +0 -0
  90. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/probes.py +0 -0
  91. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/recon.py +0 -0
  92. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/router.py +0 -0
  93. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/atlas/strategy.py +0 -0
  94. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/attention_shifting.py +0 -0
  95. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/authz.py +0 -0
  96. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/autodan_turbo.py +0 -0
  97. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/autoredteamer.py +0 -0
  98. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/beast.py +0 -0
  99. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/browser_probes.py +0 -0
  100. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/__init__.py +0 -0
  101. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/atlas.py +0 -0
  102. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/nist.py +0 -0
  103. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/owasp.py +0 -0
  104. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  105. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/compliance/saif.py +0 -0
  106. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/constants.py +0 -0
  107. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/cot_jailbreak.py +0 -0
  108. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/crescendo.py +0 -0
  109. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/__init__.py +0 -0
  110. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  111. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  112. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/assets/image/meth.png +0 -0
  113. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  114. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  115. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  116. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  117. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  118. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  119. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  120. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  121. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  122. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  123. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  124. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  125. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  126. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  127. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  128. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  129. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  130. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  131. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/deep_inception.py +0 -0
  132. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/detect.py +0 -0
  133. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/drattack.py +0 -0
  134. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/echo_chamber.py +0 -0
  135. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/__init__.py +0 -0
  136. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/_base.py +0 -0
  137. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/_text_common.py +0 -0
  138. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/bae.py +0 -0
  139. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/boundary.py +0 -0
  140. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  141. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  142. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/pwws.py +0 -0
  143. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/simba.py +0 -0
  144. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/square.py +0 -0
  145. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/text.py +0 -0
  146. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/textbugger.py +0 -0
  147. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/textfooler.py +0 -0
  148. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/evasion/zoo.py +0 -0
  149. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/events.py +0 -0
  150. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/__init__.py +0 -0
  151. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/_base.py +0 -0
  152. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/activethief.py +0 -0
  153. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/copycat.py +0 -0
  154. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/distillation.py +0 -0
  155. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/equation_solving.py +0 -0
  156. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/jacobian.py +0 -0
  157. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/extraction/knockoff.py +0 -0
  158. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/genetic_persona.py +0 -0
  159. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/goat.py +0 -0
  160. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/goat_v2.py +0 -0
  161. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/gptfuzzer.py +0 -0
  162. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/honeytoken.py +0 -0
  163. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/humor_bypass.py +0 -0
  164. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/image.py +0 -0
  165. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/injection_channels.py +0 -0
  166. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/inversion/__init__.py +0 -0
  167. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/inversion/_base.py +0 -0
  168. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/inversion/confidence.py +0 -0
  169. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  170. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/j2_meta.py +0 -0
  171. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/jbdistill.py +0 -0
  172. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/jbfuzz.py +0 -0
  173. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/lrm_autonomous.py +0 -0
  174. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/mapf.py +0 -0
  175. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/mcp_probes.py +0 -0
  176. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/__init__.py +0 -0
  177. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/_base.py +0 -0
  178. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/entropy.py +0 -0
  179. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/label_only.py +0 -0
  180. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/lira.py +0 -0
  181. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/loss.py +0 -0
  182. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/shadow_model.py +0 -0
  183. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/membership/threshold.py +0 -0
  184. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/message_parts.py +0 -0
  185. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/model_export.py +0 -0
  186. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/multimodal.py +0 -0
  187. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/nexus.py +0 -0
  188. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/oast.py +0 -0
  189. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/pair.py +0 -0
  190. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/persona_hijack.py +0 -0
  191. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/policies.py +0 -0
  192. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/probe_planner.py +0 -0
  193. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/prompt.py +0 -0
  194. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/propagation.py +0 -0
  195. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/quantization_safety.py +0 -0
  196. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/rainbow.py +0 -0
  197. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/refusal_aware.py +0 -0
  198. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/renellm.py +0 -0
  199. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/reporting/__init__.py +0 -0
  200. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/reporting/json_report.py +0 -0
  201. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/reporting/llm_summary.py +0 -0
  202. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/reporting/markdown.py +0 -0
  203. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/resource_abuse.py +0 -0
  204. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/reward_hacking.py +0 -0
  205. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/salami_slicing.py +0 -0
  206. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/self_persuasion.py +0 -0
  207. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/siren.py +0 -0
  208. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/tap.py +0 -0
  209. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/target.py +0 -0
  210. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/__init__.py +0 -0
  211. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/auth.py +0 -0
  212. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/factory.py +0 -0
  213. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/http.py +0 -0
  214. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/message.py +0 -0
  215. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/prediction.py +0 -0
  216. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/spec.py +0 -0
  217. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  218. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  219. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/templatefuzz.py +0 -0
  220. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/tmap_trajectory.py +0 -0
  221. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/tool_attack.py +0 -0
  222. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/trojail.py +0 -0
  223. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/airt/watermark_removal.py +0 -0
  224. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/__init__.py +0 -0
  225. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/api/__init__.py +0 -0
  226. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/api/client.py +0 -0
  227. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/__init__.py +0 -0
  228. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/capability.py +0 -0
  229. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/dataset.py +0 -0
  230. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/environment.py +0 -0
  231. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/evaluation.py +0 -0
  232. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/inference_model.py +0 -0
  233. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/judge.py +0 -0
  234. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/model.py +0 -0
  235. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/optimize.py +0 -0
  236. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/sandbox.py +0 -0
  237. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/secret.py +0 -0
  238. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/session.py +0 -0
  239. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/shared.py +0 -0
  240. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/task.py +0 -0
  241. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/task_set.py +0 -0
  242. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/__init__.py +0 -0
  243. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  244. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  245. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  246. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  247. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  248. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  249. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  250. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  251. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  252. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/train.py +0 -0
  253. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/cli/worlds.py +0 -0
  254. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/__init__.py +0 -0
  255. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/interactive.py +0 -0
  256. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/managed_client.py +0 -0
  257. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/models.py +0 -0
  258. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/runtime_client.py +0 -0
  259. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/client/transports.py +0 -0
  260. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/env.py +0 -0
  261. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/main.py +0 -0
  262. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/model_catalog.py +0 -0
  263. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/paths.py +0 -0
  264. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/__init__.py +0 -0
  265. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/auth.py +0 -0
  266. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/capability_manager.py +0 -0
  267. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/model_resolution.py +0 -0
  268. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/prompt.py +0 -0
  269. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/prompt_registry.py +0 -0
  270. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/runtime_credentials.py +0 -0
  271. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/runtime_events.py +0 -0
  272. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/session_hydrator.py +0 -0
  273. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/session_persistence.py +0 -0
  274. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/turn_coordinator.py +0 -0
  275. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/utils.py +0 -0
  276. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/websocket.py +0 -0
  277. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/worker_manager.py +0 -0
  278. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/workflow_manager.py +0 -0
  279. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/server/ws_auth.py +0 -0
  280. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/__init__.py +0 -0
  281. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/auth_flow.py +0 -0
  282. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/capabilities_manager.py +0 -0
  283. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/command_dispatcher.py +0 -0
  284. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/commands.py +0 -0
  285. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/connection.py +0 -0
  286. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/dreadnode.tcss +0 -0
  287. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/error_handler.py +0 -0
  288. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/model_manager.py +0 -0
  289. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/model_variants.py +0 -0
  290. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/profile_manager.py +0 -0
  291. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screen_router.py +0 -0
  292. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/__init__.py +0 -0
  293. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/auth.py +0 -0
  294. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/base.py +0 -0
  295. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/capabilities.py +0 -0
  296. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  297. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/connection_error.py +0 -0
  298. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/console.py +0 -0
  299. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/environments.py +0 -0
  300. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/evaluations.py +0 -0
  301. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/models.py +0 -0
  302. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  303. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/readme.py +0 -0
  304. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/report_bug.py +0 -0
  305. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/runtimes.py +0 -0
  306. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  307. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/secrets.py +0 -0
  308. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/services.py +0 -0
  309. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/sessions.py +0 -0
  310. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  311. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/traces.py +0 -0
  312. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/screens/workspaces.py +0 -0
  313. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/sessions_manager.py +0 -0
  314. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/spans_reader.py +0 -0
  315. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/status_messages.py +0 -0
  316. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/theme.py +0 -0
  317. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/tool_format.py +0 -0
  318. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/turn_coordinator.py +0 -0
  319. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  320. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/turn_reducer.py +0 -0
  321. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/turn_state_phase.py +0 -0
  322. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/update_check.py +0 -0
  323. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/__init__.py +0 -0
  324. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  325. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  326. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/composer.py +0 -0
  327. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  328. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  329. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/conversation.py +0 -0
  330. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/flash.py +0 -0
  331. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  332. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  333. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  334. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  335. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  336. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  337. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  338. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  339. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
  340. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/selection.py +0 -0
  341. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  342. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  343. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  344. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tool.py +0 -0
  345. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  346. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  347. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/welcome.py +0 -0
  348. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/whoami.py +0 -0
  349. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/app/tui/wire_events.py +0 -0
  350. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/__init__.py +0 -0
  351. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  352. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  353. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  354. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  355. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/agent_review.py +0 -0
  356. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/branch.py +0 -0
  357. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fanout.py +0 -0
  358. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fork.py +0 -0
  359. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/linear.py +0 -0
  360. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  361. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  362. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  363. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  364. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  365. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  366. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -0
  367. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  368. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  369. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  370. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  371. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  372. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  373. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  374. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  375. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  376. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
  377. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  378. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  379. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  380. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  381. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  382. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  383. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  384. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  385. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  386. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
  387. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  388. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  389. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  390. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  391. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/workflows-authoring.md +0 -0
  392. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  393. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  394. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  395. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  396. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  397. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  398. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  399. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +0 -0
  400. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  401. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  402. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  403. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  404. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  405. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  406. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  407. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
  408. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  409. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  410. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  411. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  412. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  413. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  414. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  415. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  416. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  417. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  418. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  419. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  420. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  421. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  422. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  423. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  424. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  425. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  426. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  427. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  428. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  429. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  430. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  431. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +0 -0
  432. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
  433. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  434. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  435. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  436. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  437. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  438. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  439. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  440. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  441. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  442. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  443. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  444. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  445. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  446. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  447. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  448. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/__init__.py +0 -0
  449. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/capability.py +0 -0
  450. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/command_tools.py +0 -0
  451. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/flags.py +0 -0
  452. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/install.py +0 -0
  453. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/loader.py +0 -0
  454. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/sync.py +0 -0
  455. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/tool_rules.py +0 -0
  456. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/types.py +0 -0
  457. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/worker.py +0 -0
  458. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/capabilities/worker_runner.py +0 -0
  459. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/__init__.py +0 -0
  460. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/conditions.py +0 -0
  461. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/discovery.py +0 -0
  462. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/environment.py +0 -0
  463. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/exceptions.py +0 -0
  464. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/execution.py +0 -0
  465. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/hook.py +0 -0
  466. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/judge.py +0 -0
  467. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/load.py +0 -0
  468. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/log.py +0 -0
  469. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/meta/__init__.py +0 -0
  470. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/meta/config.py +0 -0
  471. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/meta/context.py +0 -0
  472. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/meta/hydrate.py +0 -0
  473. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/meta/introspect.py +0 -0
  474. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/metric.py +0 -0
  475. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/object.py +0 -0
  476. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/scorer.py +0 -0
  477. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/serialization.py +0 -0
  478. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/startup_clock.py +0 -0
  479. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/stopping.py +0 -0
  480. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/task.py +0 -0
  481. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/templating.py +0 -0
  482. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/tls.py +0 -0
  483. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/transforms.py +0 -0
  484. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/__init__.py +0 -0
  485. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/audio.py +0 -0
  486. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/base.py +0 -0
  487. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/common.py +0 -0
  488. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/image.py +0 -0
  489. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/object_3d.py +0 -0
  490. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/table.py +0 -0
  491. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/text.py +0 -0
  492. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/types/video.py +0 -0
  493. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/core/util.py +0 -0
  494. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/datasets/__init__.py +0 -0
  495. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/datasets/dataset.py +0 -0
  496. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/datasets/hf.py +0 -0
  497. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/datasets/local.py +0 -0
  498. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/__init__.py +0 -0
  499. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/console.py +0 -0
  500. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/evaluation.py +0 -0
  501. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/events.py +0 -0
  502. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/format.py +0 -0
  503. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/result.py +0 -0
  504. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/evaluations/sample.py +0 -0
  505. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/__init__.py +0 -0
  506. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/caching.py +0 -0
  507. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/chat.py +0 -0
  508. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/data.py +0 -0
  509. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/exceptions.py +0 -0
  510. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/__init__.py +0 -0
  511. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/base.py +0 -0
  512. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/http.py +0 -0
  513. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/litellm_.py +0 -0
  514. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/transformers_.py +0 -0
  515. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/generator/vllm_.py +0 -0
  516. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/message.py +0 -0
  517. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/models.py +0 -0
  518. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/parsing.py +0 -0
  519. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/proxy.py +0 -0
  520. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/__init__.py +0 -0
  521. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/base.py +0 -0
  522. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  523. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/generators/utils.py +0 -0
  524. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/items/__init__.py +0 -0
  525. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/items/config.py +0 -0
  526. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/items/models.py +0 -0
  527. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/judges/__init__.py +0 -0
  528. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/judges/outcome.py +0 -0
  529. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/judges/trajectory.py +0 -0
  530. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/judges/trajectory_tools.py +0 -0
  531. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/models/__init__.py +0 -0
  532. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/models/hf.py +0 -0
  533. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/models/local.py +0 -0
  534. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/models/model.py +0 -0
  535. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/__init__.py +0 -0
  536. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/__init__.py +0 -0
  537. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  538. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/agent.py +0 -0
  539. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/env.py +0 -0
  540. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/adapters/stack.py +0 -0
  541. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/api.py +0 -0
  542. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/backends/__init__.py +0 -0
  543. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/backends/base.py +0 -0
  544. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/backends/gepa.py +0 -0
  545. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/collectors.py +0 -0
  546. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/config.py +0 -0
  547. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/console.py +0 -0
  548. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/events.py +0 -0
  549. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/format.py +0 -0
  550. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/jobs.py +0 -0
  551. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/result.py +0 -0
  552. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/sampler.py +0 -0
  553. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/sampling.py +0 -0
  554. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/search.py +0 -0
  555. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/stopping.py +0 -0
  556. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/study.py +0 -0
  557. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/optimization/trial.py +0 -0
  558. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/__init__.py +0 -0
  559. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/loader.py +0 -0
  560. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/manifest.py +0 -0
  561. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/oci.py +0 -0
  562. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/package.py +0 -0
  563. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/packaging/task_validation.py +0 -0
  564. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/policies/reconciliation.py +0 -0
  565. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  566. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/policies/scope.py +0 -0
  567. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/py.typed +0 -0
  568. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/__init__.py +0 -0
  569. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/boundary.py +0 -0
  570. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/fuzzing.py +0 -0
  571. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/graph.py +0 -0
  572. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/grid.py +0 -0
  573. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/image.py +0 -0
  574. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/mapelites.py +0 -0
  575. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/optuna.py +0 -0
  576. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/random.py +0 -0
  577. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/registry.py +0 -0
  578. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/samplers/strategy.py +0 -0
  579. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/__init__.py +0 -0
  580. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  581. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/agent_security.py +0 -0
  582. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/agentic.py +0 -0
  583. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/agentic_workflow.py +0 -0
  584. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/attack_outcome.py +0 -0
  585. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/browser_security.py +0 -0
  586. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/classification.py +0 -0
  587. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/consistency.py +0 -0
  588. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/contains.py +0 -0
  589. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/cosine_sim.py +0 -0
  590. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/credentials.py +0 -0
  591. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/crucible.py +0 -0
  592. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/documentation_security.py +0 -0
  593. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/exfiltration_detection.py +0 -0
  594. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/format.py +0 -0
  595. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/harm.py +0 -0
  596. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/ide_security.py +0 -0
  597. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/image.py +0 -0
  598. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/json.py +0 -0
  599. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/judge.py +0 -0
  600. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/judge_ensemble.py +0 -0
  601. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/length.py +0 -0
  602. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/lexical.py +0 -0
  603. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/mcp_security.py +0 -0
  604. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/memorization.py +0 -0
  605. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/multi_agent_security.py +0 -0
  606. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/pii.py +0 -0
  607. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/prompt_leak.py +0 -0
  608. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/readability.py +0 -0
  609. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/reasoning_security.py +0 -0
  610. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/sentiment.py +0 -0
  611. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/similarity.py +0 -0
  612. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/structural_detection.py +0 -0
  613. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/scorers/supply_chain_detection.py +0 -0
  614. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/storage/__init__.py +0 -0
  615. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/storage/providers.py +0 -0
  616. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/storage/session_store.py +0 -0
  617. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/storage/storage.py +0 -0
  618. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/__init__.py +0 -0
  619. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/_ripgrep.py +0 -0
  620. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/apply_patch.py +0 -0
  621. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/dreadnode_cli.py +0 -0
  622. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/editing.py +0 -0
  623. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/execute.py +0 -0
  624. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/fetch.py +0 -0
  625. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/glob.py +0 -0
  626. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/grep.py +0 -0
  627. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/interaction.py +0 -0
  628. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/ls.py +0 -0
  629. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/memory.py +0 -0
  630. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/project_memory.py +0 -0
  631. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/read.py +0 -0
  632. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/report.py +0 -0
  633. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/report_items.py +0 -0
  634. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/submission.py +0 -0
  635. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/task.py +0 -0
  636. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/think.py +0 -0
  637. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/todo.py +0 -0
  638. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/trajectory_search.py +0 -0
  639. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/web_extract.py +0 -0
  640. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/web_search.py +0 -0
  641. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tools/write.py +0 -0
  642. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/__init__.py +0 -0
  643. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/constants.py +0 -0
  644. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/convert.py +0 -0
  645. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/exporter.py +0 -0
  646. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/exporters.py +0 -0
  647. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/span.py +0 -0
  648. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/spans.py +0 -0
  649. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/tracing/trace_converter.py +0 -0
  650. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/__init__.py +0 -0
  651. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/_progress.py +0 -0
  652. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/base.py +0 -0
  653. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/dpo.py +0 -0
  654. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/env_rollouts.py +0 -0
  655. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/etl/__init__.py +0 -0
  656. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/etl/_common.py +0 -0
  657. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/etl/rl.py +0 -0
  658. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/etl/sft.py +0 -0
  659. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/etl/worlds.py +0 -0
  660. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/events.py +0 -0
  661. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/grpo.py +0 -0
  662. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/jobs.py +0 -0
  663. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/models.py +0 -0
  664. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ppo.py +0 -0
  665. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/prime.py +0 -0
  666. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/__init__.py +0 -0
  667. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/async_trainer.py +0 -0
  668. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/config.py +0 -0
  669. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/coordinator.py +0 -0
  670. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/distributed.py +0 -0
  671. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/dpo.py +0 -0
  672. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/experience.py +0 -0
  673. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  674. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/inference.py +0 -0
  675. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/learner.py +0 -0
  676. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/multi_turn.py +0 -0
  677. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/ppo.py +0 -0
  678. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/reward_model.py +0 -0
  679. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/rollout_env.py +0 -0
  680. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/rollout_worker.py +0 -0
  681. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/sft.py +0 -0
  682. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/ray/trainer.py +0 -0
  683. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/recipes.py +0 -0
  684. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/__init__.py +0 -0
  685. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/aggregator.py +0 -0
  686. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/functions.py +0 -0
  687. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  688. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/shaping.py +0 -0
  689. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rewards/types.py +0 -0
  690. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/__init__.py +0 -0
  691. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/adapters.py +0 -0
  692. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  693. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/orchestrator.py +0 -0
  694. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/types.py +0 -0
  695. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/rollouts/worlds.py +0 -0
  696. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/serving/__init__.py +0 -0
  697. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/serving/vllm_client.py +0 -0
  698. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/sft.py +0 -0
  699. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/__init__.py +0 -0
  700. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/config.py +0 -0
  701. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/data.py +0 -0
  702. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/renderer.py +0 -0
  703. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/rl.py +0 -0
  704. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker/trainer.py +0 -0
  705. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/tinker_sft.py +0 -0
  706. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/training/utils.py +0 -0
  707. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/__init__.py +0 -0
  708. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  709. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/adversarial_suffix.py +0 -0
  710. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/agent_skill.py +0 -0
  711. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/agentic_workflow.py +0 -0
  712. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/art_prompt.py +0 -0
  713. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/audio.py +0 -0
  714. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/backdoor_finetune.py +0 -0
  715. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  716. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/cipher.py +0 -0
  717. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/competitive_parity.py +0 -0
  718. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/constitutional.py +0 -0
  719. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/document.py +0 -0
  720. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/documentation_poison.py +0 -0
  721. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/encoding.py +0 -0
  722. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/exfiltration.py +0 -0
  723. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/flip_attack.py +0 -0
  724. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/guardrail_bypass.py +0 -0
  725. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/ide_injection.py +0 -0
  726. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/image.py +0 -0
  727. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/injection.py +0 -0
  728. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/json_tools.py +0 -0
  729. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/language.py +0 -0
  730. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/logic_bomb.py +0 -0
  731. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/mcp_attacks.py +0 -0
  732. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  733. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/multimodal_attacks.py +0 -0
  734. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/past_tense.py +0 -0
  735. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/persuasion.py +0 -0
  736. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/perturbation.py +0 -0
  737. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/pii_extraction.py +0 -0
  738. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/pythonic_tools.py +0 -0
  739. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/rag_poisoning.py +0 -0
  740. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/reasoning_attacks.py +0 -0
  741. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/refine.py +0 -0
  742. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/response_steering.py +0 -0
  743. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/structural_exploits.py +0 -0
  744. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/stylistic.py +0 -0
  745. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/substitution.py +0 -0
  746. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/supply_chain.py +0 -0
  747. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/swap.py +0 -0
  748. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  749. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/text.py +0 -0
  750. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/video.py +0 -0
  751. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/transforms/xml_tools.py +0 -0
  752. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/version.py +0 -0
  753. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/__init__.py +0 -0
  754. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/compile.py +0 -0
  755. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/context.py +0 -0
  756. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/errors.py +0 -0
  757. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/loader.py +0 -0
  758. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode/workflows/workflow.py +0 -0
  759. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/__init__.py +0 -0
  760. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/events.py +0 -0
  761. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/facts.py +0 -0
  762. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/scheduler.py +0 -0
  763. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/state.py +0 -0
  764. {dreadnode-2.0.46 → dreadnode-2.0.47}/dreadnode_workflow_core/topology.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.46
3
+ Version: 2.0.47
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -52,7 +52,7 @@ Requires-Dist: textual>=8.0.2
52
52
  Requires-Dist: transformers>=4.57.1
53
53
  Requires-Dist: truststore<1.0.0,>=0.10.4
54
54
  Requires-Dist: uvicorn>=0.34.0
55
- Requires-Dist: websockets>=14.0
55
+ Requires-Dist: websockets>=15.0.1
56
56
  Requires-Dist: xmltodict>=1.0.2
57
57
  Provides-Extra: airt-ml
58
58
  Requires-Dist: scikit-learn<2.0.0,>=1.7.1; extra == 'airt-ml'
@@ -246,28 +246,17 @@ class Assessment:
246
246
  return None
247
247
 
248
248
  try:
249
- # Get runtime_id - try to use a default runtime for the project
250
- runtime_id = getattr(self, "_runtime_id", None)
251
- if runtime_id is None:
252
- # Auto-discover a runtime for this project (CLI users shouldn't need to specify this)
253
- try:
254
- runtimes_resp = api.list_runtimes(profile.org_key, profile.workspace_key)
255
- runtime_items = runtimes_resp.get("items", [])
256
- matching_runtimes = [r for r in runtime_items if r["project_id"] == project_id]
257
- if matching_runtimes:
258
- runtime_id = matching_runtimes[0]["id"]
259
- logger.debug(f"Auto-selected runtime {runtime_id} for project {project_id}")
260
- else:
261
- logger.warning(f"No runtimes found for project {project_id}")
262
- except Exception as e:
263
- logger.debug(f"Failed to auto-discover runtime for project: {e}")
264
-
249
+ # A null runtime id asks the server to pick the caller's own runtime
250
+ # for the project. Members each hold their own runtimes there, so a
251
+ # client has no way to know which one is meant; anything inferred
252
+ # here would be a guess sent as though the caller had chosen it.
253
+ # Pass through what the caller supplied, nothing more.
265
254
  result = api.create_airt_assessment(
266
255
  profile.org_key,
267
256
  profile.workspace_key,
268
257
  name=self.name,
269
258
  project_id=project_id,
270
- runtime_id=runtime_id,
259
+ runtime_id=self._runtime_id,
271
260
  description=self.description,
272
261
  session_id=self._session_id,
273
262
  target_model=self.target_model,
@@ -103,6 +103,9 @@ class PlatformConfig(BaseModel):
103
103
  credits_enabled: bool = True
104
104
  feedback_enabled: bool = False
105
105
  integrations_enabled: bool = True
106
+ # Whether the operator has switched on the Agent Policies pages. Absent
107
+ # (False) on older platforms.
108
+ agent_policies_enabled: bool = False
106
109
  # Whether the operator has enabled the Slack integration for this
107
110
  # deployment. Absent (False) on older platforms, which have no Slack routes
108
111
  # at all, so a client that does not receive it shows nothing (SLK-GATE-003).
@@ -405,7 +405,9 @@ def create(
405
405
  ] = None,
406
406
  runtime_id: t.Annotated[
407
407
  str | None,
408
- cyclopts.Parameter(help="Runtime ID. Required when the project has multiple runtimes."),
408
+ cyclopts.Parameter(
409
+ help="Runtime ID. Defaults to your own runtime in the project; a runtime you don't own is ignored."
410
+ ),
409
411
  ] = None,
410
412
  description: t.Annotated[str | None, cyclopts.Parameter(help="Assessment description")] = None,
411
413
  session_id: t.Annotated[str | None, cyclopts.Parameter(help="Session ID to associate")] = None,
@@ -244,7 +244,7 @@ class TuiArgs(PlatformScopeArgs):
244
244
  int | None,
245
245
  cyclopts.Parameter(
246
246
  group=TUI_GROUP,
247
- help="Step budget for autonomous mode (defaults to 30)",
247
+ help="Step budget for autonomous mode (defaults to 100)",
248
248
  ),
249
249
  ] = None
250
250
  policy: t.Annotated[
@@ -18,6 +18,7 @@ from rich.panel import Panel
18
18
 
19
19
  from dreadnode.app.cli.args import RESUME_PICK_SENTINEL, PlatformArgs, TuiArgs
20
20
  from dreadnode.app.cli.shared import console, print_error, print_success
21
+ from dreadnode.app.config import DEFAULT_AUTONOMOUS_MAX_STEPS
21
22
  from dreadnode.app.model_catalog import resolve_model
22
23
  from dreadnode.core.tls import format_tls_error
23
24
 
@@ -255,6 +256,17 @@ def _default(*, tui_args: TuiArgs = TuiArgs()) -> None:
255
256
  # ---------------------------------------------------------------------------
256
257
 
257
258
 
259
+ def _autonomous_step_budget(tui_args: TuiArgs) -> int:
260
+ """Step budget for unattended runs (``--auto``, ``--print``).
261
+
262
+ ``--max-steps`` wins when supplied; otherwise these surfaces run under the
263
+ product default rather than the budget-neutral ``headless`` policy default.
264
+ """
265
+ if tui_args.max_steps is not None:
266
+ return tui_args.max_steps
267
+ return DEFAULT_AUTONOMOUS_MAX_STEPS
268
+
269
+
258
270
  def create_app(tui_args: TuiArgs) -> "DreadnodeTextualApp":
259
271
  """Build a :class:`DreadnodeTextualApp` from resolved CLI/TUI args.
260
272
 
@@ -297,9 +309,10 @@ def create_app(tui_args: TuiArgs) -> "DreadnodeTextualApp":
297
309
  if tui_args.max_steps is not None and "max_steps" not in initial_policy:
298
310
  initial_policy["max_steps"] = tui_args.max_steps
299
311
  elif tui_args.auto:
300
- initial_policy = {"name": "headless"}
301
- if tui_args.max_steps is not None:
302
- initial_policy["max_steps"] = tui_args.max_steps
312
+ initial_policy = {
313
+ "name": "headless",
314
+ "max_steps": _autonomous_step_budget(tui_args),
315
+ }
303
316
 
304
317
  return DreadnodeTextualApp(
305
318
  profile=profile,
@@ -359,6 +372,7 @@ def _run_print(tui_args: TuiArgs) -> None:
359
372
  capabilities=tui_args.capabilities,
360
373
  capability_flags=tui_args.capability_flags,
361
374
  system_prompt=tui_args.system_prompt,
375
+ max_steps=_autonomous_step_budget(tui_args),
362
376
  server_url=tui_args.runtime_server,
363
377
  platform_url=tui_args.server,
364
378
  project_memory_preload_limit=tui_args.project_memory_preload_limit,
@@ -104,6 +104,51 @@ def _field_value(item: t.Any, key: str) -> t.Any:
104
104
  return getattr(item, key, None)
105
105
 
106
106
 
107
+ def _select_own_project_runtime(
108
+ items: t.Sequence[dict[str, t.Any]],
109
+ project_key: t.Any,
110
+ ) -> dict[str, t.Any] | None:
111
+ """Pick the runtime in a project that this caller may start, if any.
112
+
113
+ Each member holds their own runtimes in a project, so "the project's runtime" is not
114
+ something a client can look up; only "mine here" is. Returns ``None`` when
115
+ the caller holds none, which the caller reads as "ensure one".
116
+
117
+ Ownership is judged from the flag the server computes, not from having
118
+ asked for an owner-filtered listing: the filter travels as a query
119
+ parameter, and a server that does not recognise it answers with everything
120
+ rather than an error. A row that does not say it is mine is not selected.
121
+
122
+ That check is what makes the owner filter more than a request, but it is
123
+ not a guarantee on its own. A server old enough to omit the flag also
124
+ predates owner-scoped runtime keys, so the ensure path this returns ``None``
125
+ into can still hand back whichever runtime holds the project's key. Against
126
+ such a server there is no answer to "which of these is mine" to be had, in
127
+ this function or anywhere else.
128
+
129
+ Among the caller's own, a running runtime wins, then a paused one, then the
130
+ one keyed to the project, then the newest. That is the runtime selection
131
+ rule in specs/runtimes.md, which the platform resolver and the web chat
132
+ apply too, so starting a project here lands on the runtime an evaluation or
133
+ a chat session on it would use. Selection never depends on the order rows
134
+ arrive in. A caller who wants a different runtime passes ``--runtime-id``.
135
+ """
136
+ owned = [item for item in items if item.get("owned_by_me") is True]
137
+ if not owned:
138
+ return None
139
+ status_rank = {"running": 2, "paused": 1}
140
+ keyed = isinstance(project_key, str) and bool(project_key)
141
+ return max(
142
+ owned,
143
+ key=lambda item: (
144
+ status_rank.get(str(item.get("status")), 0),
145
+ keyed and item.get("key") == project_key,
146
+ str(item.get("created_at") or ""),
147
+ str(item.get("id") or ""),
148
+ ),
149
+ )
150
+
151
+
107
152
  def _resolve_secret_ids(api: t.Any, selectors: list[str]) -> list[str] | None:
108
153
  if not selectors:
109
154
  return None
@@ -599,18 +644,32 @@ def start(
599
644
  "description",
600
645
  )
601
646
  runtime_target = runtime_id
647
+ unowned_runtime_probe = False
602
648
  if runtime_target is None and target:
603
- # The platform resolves a runtime key or UUID on this path, so probe it
604
- # as a runtime first and fall back to treating <target> as a project.
605
- # Previously this was gated on the target looking like a UUID, which
606
- # meant a runtime key only ever started by accident — via the project
607
- # branch below, and only when the project happened to share its name.
649
+ # <target> is ambiguous by design: a runtime key, a runtime UUID, or a
650
+ # project. The platform resolves runtime keys and UUIDs on this path, so
651
+ # probe it as a runtime first and read it as a project otherwise.
652
+ #
653
+ # A runtime the caller is known not to own does not settle the
654
+ # ambiguity. Runtime keys resolve across the workspace, and the first
655
+ # member to get a runtime in a project takes the project's own key for
656
+ # it — so the plain `dn runtime start <project>` that works for that
657
+ # member probes straight onto their runtime for everyone else. Reading
658
+ # the name as a project instead finds the caller's own runtime there.
659
+ #
660
+ # Only an explicit denial redirects. A server that says nothing about
661
+ # ownership has not said no, and the caller did name this runtime, so it
662
+ # is started as asked — unlike picking one for them out of a listing,
663
+ # where silence is a reason not to choose.
608
664
  try:
609
- api.get_runtime(profile.org_key, profile.workspace_key, target)
665
+ probed = api.get_runtime(profile.org_key, profile.workspace_key, target)
610
666
  except NotFoundError:
611
667
  runtime_target = None
612
668
  else:
613
- runtime_target = target
669
+ if _field_value(probed, "owned_by_me") is False:
670
+ unowned_runtime_probe = True
671
+ else:
672
+ runtime_target = target
614
673
 
615
674
  if runtime_target is not None:
616
675
  payload = api.start_runtime(
@@ -656,7 +715,18 @@ def start(
656
715
  raise ValueError(
657
716
  "Pass a runtime id or project, or set --project in your platform scope."
658
717
  )
659
- project = api.get_project(profile.org_key, profile.workspace_key, resolved_project)
718
+ try:
719
+ project = api.get_project(profile.org_key, profile.workspace_key, resolved_project)
720
+ except NotFoundError:
721
+ if unowned_runtime_probe:
722
+ # The name matched a runtime, just not one this caller can
723
+ # operate, and it names no project either. Reporting a missing
724
+ # project would send them looking for the wrong thing.
725
+ raise ValueError(
726
+ f"'{resolved_project}' is a runtime owned by someone else, and is not a "
727
+ f"project. Run `dn runtime list --mine` to see the runtimes you can start."
728
+ ) from None
729
+ raise
660
730
  project_id = _field_value(project, "id")
661
731
  if not isinstance(project_id, str) or not project_id:
662
732
  raise ValueError(f"Project '{resolved_project}' did not include an id")
@@ -664,22 +734,26 @@ def start(
664
734
  profile.org_key,
665
735
  profile.workspace_key,
666
736
  project_id=project_id,
737
+ owner="me",
667
738
  limit=100,
668
739
  )
669
- items = runtimes_payload.get("items", [])
670
- if len(items) == 0:
740
+ selected = _select_own_project_runtime(
741
+ runtimes_payload.get("items", []),
742
+ _field_value(project, "key"),
743
+ )
744
+ if selected is None:
671
745
  created = api.create_runtime(
672
746
  profile.org_key,
673
747
  profile.workspace_key,
674
748
  resolved_project,
675
749
  )
676
750
  runtime_to_start = t.cast("str", created["id"])
677
- elif len(items) == 1:
678
- runtime_to_start = t.cast("str", items[0]["id"])
679
751
  else:
680
- raise ValueError(
681
- "Project has multiple runtimes. Pass --runtime-id or ensure a specific runtime with --key/--name."
682
- )
752
+ runtime_to_start = t.cast("str", selected["id"])
753
+ if selected.get("status") == "paused":
754
+ # Start hands back a paused sandbox as it is. Waking it is its
755
+ # own call; start then issues the credential for it.
756
+ api.resume_runtime(profile.org_key, profile.workspace_key, runtime_to_start)
683
757
 
684
758
  payload = api.start_runtime(
685
759
  profile.org_key,
@@ -191,6 +191,7 @@ def run(
191
191
  project_id: str,
192
192
  input: t.Annotated[list[str] | None, cyclopts.Parameter(name="--input", negative=())] = None,
193
193
  local: t.Annotated[bool, cyclopts.Parameter(name="--local", negative=())] = False,
194
+ model: str | None = None,
194
195
  runtime_id: str | None = None,
195
196
  runtime_url: str | None = None,
196
197
  as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
@@ -205,10 +206,16 @@ def run(
205
206
  when possible, so `max_steps=200` is an int.
206
207
  local: Execute here, in this process, shipping facts to the platform as
207
208
  it goes. Without it the selected runtime executes the workflow.
209
+ model: Default model for agents using inherit. Requires --local;
210
+ pinned agent models and explicit step models take precedence.
208
211
  runtime_id: Runtime that owns remote execution. Required unless `--local`.
209
212
  runtime_url: Runtime to run agents against when using `--local`.
210
213
  as_json: Output as JSON.
211
214
  """
215
+ if model is not None and not local:
216
+ raise ValueError("--model currently requires --local")
217
+ if model is not None and (not model.strip() or model.strip() == "inherit"):
218
+ raise ValueError("--model must be a concrete model ID")
212
219
  api, profile = platform.connect()
213
220
  try:
214
221
  input_data = parse_inputs(input)
@@ -261,6 +268,7 @@ def run(
261
268
  definition=definition,
262
269
  input_data=input_data,
263
270
  runtime_url=runtime_url,
271
+ model=model,
264
272
  session_group_id=created.get("session_group_id"),
265
273
  execution_id=execution_id,
266
274
  )
@@ -285,6 +293,7 @@ def _execute_locally(
285
293
  runtime_url: str | None,
286
294
  execution_id: str,
287
295
  session_group_id: str | None = None,
296
+ model: str | None = None,
288
297
  ) -> t.Any:
289
298
  """Run the workflow in this process, streaming progress and shipping facts.
290
299
 
@@ -310,6 +319,7 @@ def _execute_locally(
310
319
  capability=definition.get("capability_name"),
311
320
  run_id=str(run_id),
312
321
  session_group_id=str(session_group_id) if session_group_id else None,
322
+ default_model=model,
313
323
  )
314
324
 
315
325
  console.print(
@@ -19,6 +19,10 @@ DEFAULT_CONFIG_PATH = Path.home() / ".dreadnode" / "config.yaml"
19
19
  # Default platform URL when no profile or override is set
20
20
  DEFAULT_PLATFORM_URL = "https://app.dreadnode.io"
21
21
 
22
+ # Product safety budget for unattended CLI and TUI workflows. Session policies
23
+ # remain budget-neutral unless a caller supplies this value explicitly.
24
+ DEFAULT_AUTONOMOUS_MAX_STEPS = 100
25
+
22
26
  # Hostnames that are equivalent for URL comparison
23
27
  _LOCALHOST_ALIASES = frozenset({"localhost", "127.0.0.1", "::1"})
24
28
 
@@ -0,0 +1,53 @@
1
+ """Credential redaction shared by runtime diagnostics and bug reports."""
2
+
3
+ import re
4
+
5
+ _REDACTED = "[REDACTED]"
6
+ _SECRET_ASSIGNMENT_RE = re.compile(
7
+ r"""(?ix)
8
+ (?P<prefix>
9
+ (?:
10
+ ["']?\b
11
+ (?:[a-z0-9]+[_-])*
12
+ (?:authorization|proxy-authorization|x-api-key|api[_-]?key|
13
+ access[_-]?token|refresh[_-]?token|id[_-]?token|password|
14
+ passwd|client[_-]?secret|secret|[a-z0-9]+[_-](?:token|key))
15
+ \b["']?\s*[=:]\s*
16
+ |
17
+ # Bare key/token labels also occur in prose. Require assignment or quoting.
18
+ (?:["']\b(?:token|key)["']\s*[=:]\s*|
19
+ \b(?:token|key)\s*(?:=\s*|:\s*(?=["'])))
20
+ )
21
+ )
22
+ (?:
23
+ (?P<double_quote>") (?:\\.|[^"\\\r\n])* "
24
+ |
25
+ (?P<single_quote>') (?:\\.|[^'\\\r\n])* '
26
+ |
27
+ (?:Bearer\s+)?[^\s,;}\]"']+
28
+ )
29
+ """
30
+ )
31
+ _BEARER_RE = re.compile(r"(?i)\bBearer\s+[A-Za-z0-9._~+/=-]+")
32
+ _KNOWN_TOKEN_RE = re.compile(
33
+ r"\b(?:sk-[A-Za-z0-9_-]{12,}|dn_[A-Za-z0-9_-]{12,}|"
34
+ r"ghp_[A-Za-z0-9]{12,}|github_pat_[A-Za-z0-9_]{12,}|"
35
+ r"xox[baprs]-[A-Za-z0-9-]{12,})\b"
36
+ )
37
+ # Match through the last @ in the authority, without consuming the path/query/fragment.
38
+ _URL_CREDENTIAL_RE = re.compile(r"""(?i)(\b[a-z][a-z0-9+.-]*://[^\s/:@'"<>]*:)([^\s/?#'"<>]+)(@)""")
39
+
40
+
41
+ def redact_sensitive_text(value: str) -> str:
42
+ """Redact common credentials without dumping or inspecting environment state."""
43
+
44
+ def redact_assignment(match: re.Match[str]) -> str:
45
+ quote = match.group("double_quote") or match.group("single_quote") or ""
46
+ return f"{match.group('prefix')}{quote}{_REDACTED}{quote}"
47
+
48
+ value = _SECRET_ASSIGNMENT_RE.sub(redact_assignment, value)
49
+ value = _BEARER_RE.sub(f"Bearer {_REDACTED}", value)
50
+ value = _KNOWN_TOKEN_RE.sub(_REDACTED, value)
51
+ return _URL_CREDENTIAL_RE.sub(
52
+ lambda match: f"{match.group(1)}{_REDACTED}{match.group(3)}", value
53
+ )
@@ -9,6 +9,7 @@ from loguru import logger
9
9
 
10
10
  from dreadnode.app.client.managed_client import ManagedRuntimeClient
11
11
  from dreadnode.app.client.runtime_client import DEFAULT_MODEL
12
+ from dreadnode.app.config import DEFAULT_AUTONOMOUS_MAX_STEPS
12
13
  from dreadnode.app.tui import wire_events as we
13
14
  from dreadnode.app.tui.wire_events import parse_wire_event
14
15
 
@@ -26,11 +27,12 @@ async def run_print_mode(
26
27
  capabilities: list[str] | None = None,
27
28
  capability_flags: list[str] | None = None,
28
29
  system_prompt: str | None = None,
30
+ max_steps: int = DEFAULT_AUTONOMOUS_MAX_STEPS,
29
31
  server_url: str | None = None,
30
32
  platform_url: str | None = None,
31
33
  project_memory_preload_limit: int = 20,
32
34
  ) -> None:
33
- """Run a single prompt headlessly: stream response text to stdout, progress to stderr.
35
+ """Run one prompt headlessly with an explicit autonomous step budget.
34
36
 
35
37
  ``profile`` is the caller's already-resolved profile — the CLI passes the
36
38
  one built from ``--profile`` plus the scope flags and ``DREADNODE_*`` env
@@ -84,7 +86,7 @@ async def run_print_mode(
84
86
  session = await client.create_session(
85
87
  agent=agent,
86
88
  model=model,
87
- policy="headless",
89
+ policy={"name": "headless", "max_steps": max_steps},
88
90
  project_memory_preload_limit=project_memory_preload_limit,
89
91
  )
90
92
  session_id = session.session_id
@@ -209,6 +209,7 @@ def _make_agent_link_tool(
209
209
  extra_tools: list[t.Any] | None,
210
210
  extra_hooks: list[t.Any] | None,
211
211
  kind: str,
212
+ runtime_registry: t.Callable[[], capability_manager.CapabilityRegistry | None] | None = None,
212
213
  ) -> t.Any:
213
214
  """Create a synthetic tool that delegates work to another capability agent."""
214
215
  from dreadnode.agents.tools import Tool
@@ -221,6 +222,7 @@ def _make_agent_link_tool(
221
222
  extra_tools=extra_tools,
222
223
  extra_hooks=extra_hooks,
223
224
  system_prompt_append=get_state().system_prompt_append,
225
+ runtime_registry=runtime_registry,
224
226
  )
225
227
  return await delegated_agent.chat(task)
226
228
 
@@ -419,6 +421,7 @@ def create_agent(
419
421
  system_prompt_append: str | None = None,
420
422
  engine: str | None = None,
421
423
  background_context: str | None = None,
424
+ runtime_registry: t.Callable[[], capability_manager.CapabilityRegistry | None] | None = None,
422
425
  ) -> Agent:
423
426
  """Create an agent from a loaded capability.
424
427
 
@@ -433,6 +436,8 @@ def create_agent(
433
436
  rules since hooks aren't agent-scoped.
434
437
  """
435
438
  from dreadnode.agents import Agent
439
+ from dreadnode.agents.tools import Tool
440
+ from dreadnode.app.server.runtime_inspection import RuntimeInspection
436
441
  from dreadnode.capabilities.tool_rules import filter_tools
437
442
  from dreadnode.tools import default_tools
438
443
 
@@ -472,13 +477,6 @@ def create_agent(
472
477
  if tooling_health:
473
478
  instructions = instructions + "\n" + tooling_health
474
479
 
475
- # Append CLI --system-prompt content as the final layer
476
- if system_prompt_append:
477
- instructions = instructions + "\n\n" + system_prompt_append
478
-
479
- if background_context:
480
- instructions = instructions + "\n\n" + background_context
481
-
482
480
  # 1. Inherent tools — always present. Item mutation tools are capability
483
481
  # opt-in and added below only when the manifest selects output types.
484
482
  base = default_tools(additional_toolsets=inherent_toolsets, include_items=False)
@@ -486,6 +484,15 @@ def create_agent(
486
484
  pool: list[t.Any] = list(base.values())
487
485
  pool_names = set(base.keys())
488
486
 
487
+ inspection = RuntimeInspection(
488
+ registry=runtime_registry or (lambda: get_state().capability_registry),
489
+ agent=lambda: agent,
490
+ capability=(capability.name, capability.version or "") if capability else None,
491
+ )
492
+ inspection_tool = Tool.from_callable(inspection.runtime_info)
493
+ pool.append(inspection_tool)
494
+ pool_names.add(inspection_tool.name)
495
+
489
496
  # Bundled @dreadnode gets the CLI helper, but it is not a global inherent tool.
490
497
  if (
491
498
  capability is not None
@@ -532,6 +539,7 @@ def create_agent(
532
539
  extra_tools=extra_tools,
533
540
  extra_hooks=extra_hooks,
534
541
  kind=link.kind,
542
+ runtime_registry=runtime_registry,
535
543
  )
536
544
  name = _tool_name(tool)
537
545
  if name and name not in pool_names:
@@ -586,6 +594,15 @@ def create_agent(
586
594
  # 3. Apply agent's tool rules (empty dict = all tools pass)
587
595
  rules = agent_def.tools if agent_def else {}
588
596
  tools = filter_tools(pool, rules, name_fn=_tool_name)
597
+ if inspection_tool in tools:
598
+ instructions += "\n\n" + inspection.to_prompt()
599
+
600
+ # Keep caller-provided content after all host guidance.
601
+ if system_prompt_append:
602
+ instructions = instructions + "\n\n" + system_prompt_append
603
+
604
+ if background_context:
605
+ instructions = instructions + "\n\n" + background_context
589
606
 
590
607
  # Engine (loop owner): explicit override > agent_def declaration > native.
591
608
  # ``inherit``/empty falls through to the native engine (``None``).
@@ -2602,6 +2619,7 @@ class SessionRuntime:
2602
2619
  # ``None`` falls through to agent_def.engine then native.
2603
2620
  engine=self._engine,
2604
2621
  background_context=self._project_memory_background_context,
2622
+ runtime_registry=lambda: self._registry,
2605
2623
  )
2606
2624
 
2607
2625
  self._wire_server_tools(agent)
@@ -3383,6 +3401,11 @@ class SessionRuntime:
3383
3401
  # this helper is constructed and consumed within a single turn.
3384
3402
  await request.stream.publish(event) # noqa: B023
3385
3403
 
3404
+ # Set when the failure below was reported by the agent itself on
3405
+ # its terminal ``AgentEnd`` (already delivered to raw-event
3406
+ # consumers) rather than raised by the runtime.
3407
+ agent_reported_error = False
3408
+
3386
3409
  try:
3387
3410
  if request.model and request.model != self.model:
3388
3411
  self.model = request.model
@@ -3527,7 +3550,7 @@ class SessionRuntime:
3527
3550
  self.persistence.begin_turn()
3528
3551
  # Local import to match the existing lazy-import style in
3529
3552
  # this module and avoid eager event-module import at startup.
3530
- from dreadnode.agents.events import GenerationStep
3553
+ from dreadnode.agents.events import AgentEnd, GenerationStep
3531
3554
 
3532
3555
  try:
3533
3556
  # Workflow attribution rides on the agent's own spans rather
@@ -3603,6 +3626,15 @@ class SessionRuntime:
3603
3626
  if isinstance(event, GenerationStep):
3604
3627
  flush_task = asyncio.create_task(self._persist_state_locked())
3605
3628
  self.persistence.track_flush_task(flush_task)
3629
+ # Engines report terminal errors on AgentEnd rather
3630
+ # than raising. Route them through the failed-turn
3631
+ # handler so terminal-envelope consumers see
3632
+ # turn.failed instead of an empty turn.completed.
3633
+ if isinstance(event, AgentEnd) and event.error is not None:
3634
+ agent_reported_error = True
3635
+ if isinstance(event.error, Exception):
3636
+ raise event.error
3637
+ raise RuntimeError(str(event.error))
3606
3638
  finally:
3607
3639
  reset_human_prompt_handler(token)
3608
3640
 
@@ -3723,12 +3755,17 @@ class SessionRuntime:
3723
3755
  except Exception:
3724
3756
  logger.opt(exception=True).debug("error-path persist raised")
3725
3757
 
3726
- error_event: EventPayload = {"type": "error", "error": str(exc)}
3727
- await _emit_turn_event(error_event)
3728
- await self._publish_broker_raw_event(
3729
- turn_id=request.turn_id,
3730
- raw_event=error_event,
3731
- )
3758
+ # Raw-event consumers (TUI, eval worker, SSE chat) render the
3759
+ # ``error`` event as a failure line. When the agent reported
3760
+ # the error on its own AgentEnd they already have that line;
3761
+ # emitting another would show the same error twice.
3762
+ if not agent_reported_error:
3763
+ error_event: EventPayload = {"type": "error", "error": str(exc)}
3764
+ await _emit_turn_event(error_event)
3765
+ await self._publish_broker_raw_event(
3766
+ turn_id=request.turn_id,
3767
+ raw_event=error_event,
3768
+ )
3732
3769
  turn_events = _turn_slice()
3733
3770
  await self._publish_broker_event(
3734
3771
  kind=runtime_events.EVENT_TURN_FAILED,