dreadnode 2.0.14__tar.gz → 2.0.16__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 (625) hide show
  1. {dreadnode-2.0.14 → dreadnode-2.0.16}/PKG-INFO +4 -2
  2. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/__init__.py +2 -0
  3. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/__init__.py +12 -0
  4. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/agent.py +10 -12
  5. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/events.py +10 -0
  6. dreadnode-2.0.16/dreadnode/agents/judge.py +196 -0
  7. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/skills.py +11 -0
  8. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/tools.py +22 -19
  9. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/assessment.py +1 -67
  10. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/image.py +68 -31
  11. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/client.py +265 -134
  12. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/models.py +339 -76
  13. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/capability.py +2 -2
  14. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/dataset.py +62 -6
  15. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/evaluation.py +2 -1
  16. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/optimize.py +194 -23
  17. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/train.py +129 -2
  18. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/managed_client.py +4 -0
  19. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/models.py +134 -0
  20. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/runtime_client.py +168 -7
  21. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/main.py +144 -15
  22. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/model_catalog.py +4 -4
  23. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/app.py +360 -19
  24. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/prompt.py +15 -13
  25. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_persistence.py +7 -3
  26. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/worker_manager.py +12 -4
  27. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/app.py +69 -11
  28. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/dreadnode.tcss +8 -1
  29. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/profile_manager.py +6 -15
  30. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/auth.py +10 -2
  31. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/capabilities.py +139 -104
  32. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/sandboxes.py +0 -57
  33. dreadnode-2.0.16/dreadnode/app/tui/screens/sessions.py +652 -0
  34. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/workspaces.py +0 -4
  35. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/sessions_manager.py +130 -4
  36. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/tool_format.py +181 -1
  37. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_reducer.py +27 -0
  38. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/context_bar.py +29 -1
  39. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/conversation.py +11 -0
  40. dreadnode-2.0.16/dreadnode/app/tui/widgets/tool.py +341 -0
  41. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/wire_events.py +5 -0
  42. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +71 -0
  43. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +18 -6
  44. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +175 -0
  45. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +60 -0
  46. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +54 -0
  47. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +28 -0
  48. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +124 -0
  49. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +96 -0
  50. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +172 -0
  51. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +87 -0
  52. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +128 -0
  53. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +97 -0
  54. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +240 -0
  55. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +174 -0
  56. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +68 -0
  57. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +117 -0
  58. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +107 -0
  59. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +80 -0
  60. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +189 -0
  61. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +165 -0
  62. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +329 -0
  63. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +139 -0
  64. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +133 -0
  65. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2034 -0
  66. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +1726 -0
  67. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +99 -0
  68. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +66 -0
  69. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +83 -0
  70. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +22 -0
  71. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +356 -0
  72. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +260 -0
  73. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +173 -0
  74. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +239 -0
  75. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +79 -0
  76. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +217 -0
  77. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +182 -0
  78. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +91 -0
  79. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +94 -0
  80. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +100 -0
  81. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +236 -0
  82. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +229 -0
  83. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +363 -0
  84. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +218 -0
  85. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +74 -0
  86. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +31 -0
  87. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +97 -0
  88. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +68 -0
  89. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +218 -0
  90. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +32 -0
  91. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +117 -0
  92. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +86 -0
  93. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +132 -0
  94. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +111 -0
  95. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +68 -0
  96. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +113 -0
  97. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +94 -0
  98. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +160 -0
  99. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +89 -0
  100. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +86 -0
  101. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +200 -0
  102. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +83 -0
  103. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +161 -0
  104. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +58 -0
  105. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +86 -0
  106. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +107 -0
  107. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +64 -0
  108. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +108 -0
  109. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +88 -0
  110. dreadnode-2.0.16/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +44 -0
  111. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/.gitignore +2 -0
  112. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/capability.yaml +29 -0
  113. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +93 -0
  114. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +66 -0
  115. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +36 -0
  116. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +100 -0
  117. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  118. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  119. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +12 -0
  120. dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +12 -0
  121. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/worker.py +9 -1
  122. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/__init__.py +2 -0
  123. dreadnode-2.0.16/dreadnode/core/environment.py +524 -0
  124. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/util.py +2 -0
  125. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/base.py +6 -0
  126. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/litellm_.py +77 -8
  127. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/message.py +18 -1
  128. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/__init__.py +9 -1
  129. dreadnode-2.0.16/dreadnode/optimization/adapters/__init__.py +11 -0
  130. dreadnode-2.0.16/dreadnode/optimization/adapters/_env_eval.py +167 -0
  131. dreadnode-2.0.16/dreadnode/optimization/adapters/env.py +173 -0
  132. dreadnode-2.0.16/dreadnode/optimization/adapters/runtime.py +630 -0
  133. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/adapters/stack.py +53 -3
  134. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/events.py +5 -2
  135. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/jobs.py +387 -77
  136. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/study.py +122 -15
  137. dreadnode-2.0.16/dreadnode/packaging/__init__.py +0 -0
  138. dreadnode-2.0.16/dreadnode/py.typed +0 -0
  139. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/image.py +121 -74
  140. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/storage.py +109 -55
  141. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/__init__.py +7 -8
  142. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/fetch.py +63 -21
  143. dreadnode-2.0.16/dreadnode/tools/report.py +134 -0
  144. dreadnode-2.0.16/dreadnode/tools/web_extract.py +176 -0
  145. dreadnode-2.0.16/dreadnode/tools/web_search.py +685 -0
  146. dreadnode-2.0.16/dreadnode/tracing/__init__.py +0 -0
  147. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/constants.py +11 -0
  148. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/spans.py +50 -3
  149. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/__init__.py +25 -0
  150. dreadnode-2.0.16/dreadnode/training/_progress.py +248 -0
  151. dreadnode-2.0.16/dreadnode/training/env_rollouts.py +347 -0
  152. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/__init__.py +4 -0
  153. dreadnode-2.0.16/dreadnode/training/etl/sft.py +335 -0
  154. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/events.py +2 -2
  155. dreadnode-2.0.16/dreadnode/training/jobs.py +2550 -0
  156. dreadnode-2.0.16/dreadnode/training/models.py +88 -0
  157. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/recipes.py +89 -0
  158. dreadnode-2.0.16/dreadnode/training/rollouts/agent_rollout.py +332 -0
  159. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/orchestrator.py +7 -7
  160. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/worlds.py +3 -3
  161. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/__init__.py +4 -2
  162. dreadnode-2.0.16/dreadnode/training/tinker/renderer.py +918 -0
  163. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/rl.py +135 -6
  164. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker_sft.py +2 -2
  165. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/utils.py +11 -18
  166. {dreadnode-2.0.14 → dreadnode-2.0.16}/pyproject.toml +21 -5
  167. dreadnode-2.0.14/dreadnode/app/tui/screens/sessions.py +0 -384
  168. dreadnode-2.0.14/dreadnode/app/tui/widgets/tool.py +0 -168
  169. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -160
  170. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-components.md +0 -111
  171. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -339
  172. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -262
  173. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -109
  174. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/command-groups.md +0 -224
  175. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/tui-crosswalk.md +0 -27
  176. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-runtime-reference/SKILL.md +0 -76
  177. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/system-prompt.md +0 -7
  178. dreadnode-2.0.14/dreadnode/core/environment.py +0 -254
  179. dreadnode-2.0.14/dreadnode/optimization/adapters/__init__.py +0 -3
  180. dreadnode-2.0.14/dreadnode/tools/report.py +0 -95
  181. dreadnode-2.0.14/dreadnode/tools/web_search.py +0 -170
  182. dreadnode-2.0.14/dreadnode/training/etl/sft.py +0 -102
  183. dreadnode-2.0.14/dreadnode/training/jobs.py +0 -1404
  184. dreadnode-2.0.14/dreadnode/training/tinker/renderer.py +0 -533
  185. {dreadnode-2.0.14 → dreadnode-2.0.16}/.gitignore +0 -0
  186. {dreadnode-2.0.14 → dreadnode-2.0.16}/LICENSE +0 -0
  187. {dreadnode-2.0.14 → dreadnode-2.0.16}/README.md +0 -0
  188. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/__main__.py +0 -0
  189. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/exceptions.py +0 -0
  190. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/format.py +0 -0
  191. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/hooks.py +0 -0
  192. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/__init__.py +0 -0
  193. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/auth.py +0 -0
  194. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/client.py +0 -0
  195. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/config.py +0 -0
  196. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/mcp/server.py +0 -0
  197. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/reactions.py +0 -0
  198. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/stopping.py +0 -0
  199. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/subagent.py +0 -0
  200. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/tool_resolution.py +0 -0
  201. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/agents/trajectory.py +0 -0
  202. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/__init__.py +0 -0
  203. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/adversarial_reasoning.py +0 -0
  204. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/advpromptier.py +0 -0
  205. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/alignment_faking.py +0 -0
  206. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analogy_escalation.py +0 -0
  207. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/__init__.py +0 -0
  208. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/aggregator.py +0 -0
  209. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/classifier.py +0 -0
  210. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/compliance.py +0 -0
  211. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/engine.py +0 -0
  212. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/recommendations.py +0 -0
  213. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/analytics/types.py +0 -0
  214. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/aprt_progressive.py +0 -0
  215. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/attention_shifting.py +0 -0
  216. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/autodan_turbo.py +0 -0
  217. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/autoredteamer.py +0 -0
  218. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/beast.py +0 -0
  219. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/__init__.py +0 -0
  220. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/atlas.py +0 -0
  221. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/nist.py +0 -0
  222. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/owasp.py +0 -0
  223. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  224. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/compliance/saif.py +0 -0
  225. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/constants.py +0 -0
  226. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/cot_jailbreak.py +0 -0
  227. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/crescendo.py +0 -0
  228. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/__init__.py +0 -0
  229. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  230. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  231. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/assets/image/meth.png +0 -0
  232. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  233. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  234. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  235. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  236. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  237. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  238. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  239. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  240. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  241. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  242. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  243. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  244. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  245. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  246. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  247. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  248. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  249. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/deep_inception.py +0 -0
  250. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/drattack.py +0 -0
  251. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/echo_chamber.py +0 -0
  252. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/events.py +0 -0
  253. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/genetic_persona.py +0 -0
  254. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/goat.py +0 -0
  255. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/goat_v2.py +0 -0
  256. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/gptfuzzer.py +0 -0
  257. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/humor_bypass.py +0 -0
  258. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/j2_meta.py +0 -0
  259. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/jbdistill.py +0 -0
  260. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/jbfuzz.py +0 -0
  261. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/lrm_autonomous.py +0 -0
  262. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/mapf.py +0 -0
  263. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/multimodal.py +0 -0
  264. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/nexus.py +0 -0
  265. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/pair.py +0 -0
  266. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/persona_hijack.py +0 -0
  267. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/prompt.py +0 -0
  268. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/quantization_safety.py +0 -0
  269. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/rainbow.py +0 -0
  270. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/refusal_aware.py +0 -0
  271. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/renellm.py +0 -0
  272. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/__init__.py +0 -0
  273. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/json_report.py +0 -0
  274. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/llm_summary.py +0 -0
  275. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reporting/markdown.py +0 -0
  276. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/reward_hacking.py +0 -0
  277. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/salami_slicing.py +0 -0
  278. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/self_persuasion.py +0 -0
  279. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/siren.py +0 -0
  280. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/tap.py +0 -0
  281. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/templatefuzz.py +0 -0
  282. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/tmap_trajectory.py +0 -0
  283. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/trojail.py +0 -0
  284. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/airt/watermark_removal.py +0 -0
  285. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/__init__.py +0 -0
  286. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/api/__init__.py +0 -0
  287. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/__init__.py +0 -0
  288. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/airt.py +0 -0
  289. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/args.py +0 -0
  290. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/environment.py +0 -0
  291. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/main.py +0 -0
  292. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/model.py +0 -0
  293. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/runtime.py +0 -0
  294. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/sandbox.py +0 -0
  295. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/shared.py +0 -0
  296. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/task.py +0 -0
  297. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/__init__.py +0 -0
  298. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  299. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  300. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  301. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  302. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  303. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  304. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  305. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  306. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  307. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/cli/worlds.py +0 -0
  308. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/__init__.py +0 -0
  309. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/interactive.py +0 -0
  310. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/client/transports.py +0 -0
  311. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/config.py +0 -0
  312. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/env.py +0 -0
  313. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/paths.py +0 -0
  314. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/print_mode.py +0 -0
  315. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/__init__.py +0 -0
  316. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/auth.py +0 -0
  317. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/capability_manager.py +0 -0
  318. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/model_resolution.py +0 -0
  319. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/prompt_registry.py +0 -0
  320. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/runtime_events.py +0 -0
  321. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_hydrator.py +0 -0
  322. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/session_policy.py +0 -0
  323. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/turn_coordinator.py +0 -0
  324. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/utils.py +0 -0
  325. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/server/websocket.py +0 -0
  326. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/__init__.py +0 -0
  327. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/auth_flow.py +0 -0
  328. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/capabilities_manager.py +0 -0
  329. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/command_dispatcher.py +0 -0
  330. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/commands.py +0 -0
  331. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/connection.py +0 -0
  332. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/error_handler.py +0 -0
  333. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/model_manager.py +0 -0
  334. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/model_variants.py +0 -0
  335. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/runtime_cache.py +0 -0
  336. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screen_router.py +0 -0
  337. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/__init__.py +0 -0
  338. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/base.py +0 -0
  339. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  340. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/connection_error.py +0 -0
  341. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/console.py +0 -0
  342. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/environments.py +0 -0
  343. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/evaluations.py +0 -0
  344. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/model_picker.py +0 -0
  345. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/models.py +0 -0
  346. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  347. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/runtimes.py +0 -0
  348. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/secrets.py +0 -0
  349. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/services.py +0 -0
  350. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  351. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/screens/traces.py +0 -0
  352. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/spans_reader.py +0 -0
  353. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/theme.py +0 -0
  354. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_coordinator.py +0 -0
  355. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  356. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/turn_state_phase.py +0 -0
  357. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/update_check.py +0 -0
  358. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/__init__.py +0 -0
  359. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  360. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  361. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/composer.py +0 -0
  362. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/flash.py +0 -0
  363. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  364. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  365. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  366. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  367. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  368. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  369. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  370. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  371. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  372. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  373. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  374. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  375. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  376. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/throbber.py +0 -0
  377. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  378. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  379. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/welcome.py +0 -0
  380. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/app/tui/widgets/whoami.py +0 -0
  381. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/__init__.py +0 -0
  382. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  383. {dreadnode-2.0.14/dreadnode/packaging → dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/hooks}/__init__.py +0 -0
  384. {dreadnode-2.0.14/dreadnode/tracing → dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib}/__init__.py +0 -0
  385. /dreadnode-2.0.14/dreadnode/py.typed → /dreadnode-2.0.16/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  386. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/__init__.py +0 -0
  387. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/capability.py +0 -0
  388. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/flags.py +0 -0
  389. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/loader.py +0 -0
  390. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/sync.py +0 -0
  391. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/tool_rules.py +0 -0
  392. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/types.py +0 -0
  393. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/capabilities/worker_runner.py +0 -0
  394. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/conditions.py +0 -0
  395. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/discovery.py +0 -0
  396. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/exceptions.py +0 -0
  397. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/execution.py +0 -0
  398. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/hook.py +0 -0
  399. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/judge.py +0 -0
  400. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/load.py +0 -0
  401. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/log.py +0 -0
  402. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/__init__.py +0 -0
  403. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/config.py +0 -0
  404. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/context.py +0 -0
  405. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/hydrate.py +0 -0
  406. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/meta/introspect.py +0 -0
  407. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/metric.py +0 -0
  408. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/object.py +0 -0
  409. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/scorer.py +0 -0
  410. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/serialization.py +0 -0
  411. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/stopping.py +0 -0
  412. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/task.py +0 -0
  413. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/templating.py +0 -0
  414. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/transforms.py +0 -0
  415. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/__init__.py +0 -0
  416. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/audio.py +0 -0
  417. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/base.py +0 -0
  418. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/common.py +0 -0
  419. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/image.py +0 -0
  420. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/object_3d.py +0 -0
  421. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/table.py +0 -0
  422. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/text.py +0 -0
  423. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/core/types/video.py +0 -0
  424. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/__init__.py +0 -0
  425. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/dataset.py +0 -0
  426. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/hf.py +0 -0
  427. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/datasets/local.py +0 -0
  428. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/__init__.py +0 -0
  429. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/console.py +0 -0
  430. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/evaluation.py +0 -0
  431. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/events.py +0 -0
  432. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/format.py +0 -0
  433. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/result.py +0 -0
  434. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/evaluations/sample.py +0 -0
  435. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/__init__.py +0 -0
  436. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/caching.py +0 -0
  437. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/chat.py +0 -0
  438. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/data.py +0 -0
  439. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/exceptions.py +0 -0
  440. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/__init__.py +0 -0
  441. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/http.py +0 -0
  442. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/transformers_.py +0 -0
  443. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/generator/vllm_.py +0 -0
  444. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/models.py +0 -0
  445. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/parsing.py +0 -0
  446. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/__init__.py +0 -0
  447. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/base.py +0 -0
  448. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  449. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/generators/utils.py +0 -0
  450. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/__init__.py +0 -0
  451. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/hf.py +0 -0
  452. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/local.py +0 -0
  453. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/models/model.py +0 -0
  454. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/adapters/agent.py +0 -0
  455. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/api.py +0 -0
  456. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/__init__.py +0 -0
  457. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/base.py +0 -0
  458. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/backends/gepa.py +0 -0
  459. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/collectors.py +0 -0
  460. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/config.py +0 -0
  461. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/console.py +0 -0
  462. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/format.py +0 -0
  463. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/result.py +0 -0
  464. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/sampler.py +0 -0
  465. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/sampling.py +0 -0
  466. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/search.py +0 -0
  467. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/stopping.py +0 -0
  468. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/optimization/trial.py +0 -0
  469. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/loader.py +0 -0
  470. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/manifest.py +0 -0
  471. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/oci.py +0 -0
  472. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/package.py +0 -0
  473. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/packaging/task_validation.py +0 -0
  474. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/__init__.py +0 -0
  475. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/boundary.py +0 -0
  476. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/fuzzing.py +0 -0
  477. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/graph.py +0 -0
  478. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/grid.py +0 -0
  479. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/mapelites.py +0 -0
  480. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/optuna.py +0 -0
  481. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/random.py +0 -0
  482. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/registry.py +0 -0
  483. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/samplers/strategy.py +0 -0
  484. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/__init__.py +0 -0
  485. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  486. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agent_security.py +0 -0
  487. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agentic.py +0 -0
  488. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/agentic_workflow.py +0 -0
  489. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/attack_outcome.py +0 -0
  490. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/classification.py +0 -0
  491. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/consistency.py +0 -0
  492. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/contains.py +0 -0
  493. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/cosine_sim.py +0 -0
  494. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/credentials.py +0 -0
  495. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/crucible.py +0 -0
  496. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/documentation_security.py +0 -0
  497. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/exfiltration_detection.py +0 -0
  498. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/format.py +0 -0
  499. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/harm.py +0 -0
  500. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/ide_security.py +0 -0
  501. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/image.py +0 -0
  502. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/json.py +0 -0
  503. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/judge.py +0 -0
  504. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/judge_ensemble.py +0 -0
  505. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/length.py +0 -0
  506. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/lexical.py +0 -0
  507. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/mcp_security.py +0 -0
  508. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/memorization.py +0 -0
  509. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/multi_agent_security.py +0 -0
  510. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/pii.py +0 -0
  511. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/prompt_leak.py +0 -0
  512. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/readability.py +0 -0
  513. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/reasoning_security.py +0 -0
  514. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/sentiment.py +0 -0
  515. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/similarity.py +0 -0
  516. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/structural_detection.py +0 -0
  517. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/scorers/supply_chain_detection.py +0 -0
  518. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/__init__.py +0 -0
  519. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/providers.py +0 -0
  520. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/storage/session_store.py +0 -0
  521. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/_ripgrep.py +0 -0
  522. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/apply_patch.py +0 -0
  523. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/dreadnode_cli.py +0 -0
  524. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/editing.py +0 -0
  525. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/execute.py +0 -0
  526. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/glob.py +0 -0
  527. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/grep.py +0 -0
  528. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/interaction.py +0 -0
  529. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/ls.py +0 -0
  530. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/memory.py +0 -0
  531. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/read.py +0 -0
  532. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/task.py +0 -0
  533. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/think.py +0 -0
  534. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/todo.py +0 -0
  535. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/trajectory_search.py +0 -0
  536. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tools/write.py +0 -0
  537. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/convert.py +0 -0
  538. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/exporter.py +0 -0
  539. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/exporters.py +0 -0
  540. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/span.py +0 -0
  541. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/tracing/trace_converter.py +0 -0
  542. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/base.py +0 -0
  543. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/dpo.py +0 -0
  544. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/_common.py +0 -0
  545. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/rl.py +0 -0
  546. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/etl/worlds.py +0 -0
  547. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/grpo.py +0 -0
  548. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ppo.py +0 -0
  549. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/prime.py +0 -0
  550. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/__init__.py +0 -0
  551. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/async_trainer.py +0 -0
  552. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/config.py +0 -0
  553. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/coordinator.py +0 -0
  554. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/distributed.py +0 -0
  555. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/dpo.py +0 -0
  556. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/experience.py +0 -0
  557. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  558. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/inference.py +0 -0
  559. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/learner.py +0 -0
  560. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/multi_turn.py +0 -0
  561. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/ppo.py +0 -0
  562. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/reward_model.py +0 -0
  563. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/rollout_env.py +0 -0
  564. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/rollout_worker.py +0 -0
  565. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/sft.py +0 -0
  566. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/ray/trainer.py +0 -0
  567. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/__init__.py +0 -0
  568. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/aggregator.py +0 -0
  569. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/functions.py +0 -0
  570. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  571. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/shaping.py +0 -0
  572. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rewards/types.py +0 -0
  573. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/__init__.py +0 -0
  574. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/adapters.py +0 -0
  575. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/rollouts/types.py +0 -0
  576. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/serving/__init__.py +0 -0
  577. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/serving/vllm_client.py +0 -0
  578. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/sft.py +0 -0
  579. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/config.py +0 -0
  580. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/data.py +0 -0
  581. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/training/tinker/trainer.py +0 -0
  582. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/__init__.py +0 -0
  583. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  584. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/adversarial_suffix.py +0 -0
  585. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/agent_skill.py +0 -0
  586. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/agentic_workflow.py +0 -0
  587. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/audio.py +0 -0
  588. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/backdoor_finetune.py +0 -0
  589. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  590. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/cipher.py +0 -0
  591. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/competitive_parity.py +0 -0
  592. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/constitutional.py +0 -0
  593. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/document.py +0 -0
  594. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/documentation_poison.py +0 -0
  595. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/encoding.py +0 -0
  596. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/exfiltration.py +0 -0
  597. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/flip_attack.py +0 -0
  598. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/guardrail_bypass.py +0 -0
  599. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/ide_injection.py +0 -0
  600. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/image.py +0 -0
  601. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/injection.py +0 -0
  602. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/json_tools.py +0 -0
  603. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/language.py +0 -0
  604. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/logic_bomb.py +0 -0
  605. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/mcp_attacks.py +0 -0
  606. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  607. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/multimodal_attacks.py +0 -0
  608. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/persuasion.py +0 -0
  609. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/perturbation.py +0 -0
  610. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/pii_extraction.py +0 -0
  611. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/pythonic_tools.py +0 -0
  612. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/rag_poisoning.py +0 -0
  613. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/reasoning_attacks.py +0 -0
  614. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/refine.py +0 -0
  615. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/response_steering.py +0 -0
  616. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/structural_exploits.py +0 -0
  617. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/stylistic.py +0 -0
  618. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/substitution.py +0 -0
  619. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/supply_chain.py +0 -0
  620. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/swap.py +0 -0
  621. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  622. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/text.py +0 -0
  623. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/video.py +0 -0
  624. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/transforms/xml_tools.py +0 -0
  625. {dreadnode-2.0.14 → dreadnode-2.0.16}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.14
3
+ Version: 2.0.16
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -13,6 +13,7 @@ Requires-Dist: coolname<3.0.0,>=2.2.0
13
13
  Requires-Dist: croniter<7.0.0,>=6.0.0
14
14
  Requires-Dist: cyclopts>=4.2.0
15
15
  Requires-Dist: datasets>=4.5.0
16
+ Requires-Dist: ddgs>=9.0.0
16
17
  Requires-Dist: fastapi>=0.115.0
17
18
  Requires-Dist: fastmcp>=2.14.0
18
19
  Requires-Dist: fsspec[s3]<=2025.10.0,>=2025.10.0
@@ -20,9 +21,10 @@ Requires-Dist: gepa>=0.1.1
20
21
  Requires-Dist: httpx<1.0.0,>=0.28.0
21
22
  Requires-Dist: jsonpath-ng>=1.7.0
22
23
  Requires-Dist: jsonref>=1.1.0
23
- Requires-Dist: litellm<=1.83.0,>=1.83.0
24
+ Requires-Dist: litellm<=1.83.7,>=1.83.7
24
25
  Requires-Dist: logfire<=3.20.0,>=3.5.3
25
26
  Requires-Dist: loguru>=0.7.3
27
+ Requires-Dist: markdownify<2.0.0,>=1.1.0
26
28
  Requires-Dist: mcp<2.0.0,>=1.25.0
27
29
  Requires-Dist: moviepy<3.0.0,>=2.1.2
28
30
  Requires-Dist: numpy<=2.3.5,>=2.3.0
@@ -154,6 +154,7 @@ __all__ = [
154
154
  "push_capability",
155
155
  "push_dataset",
156
156
  "push_environment",
157
+ "push_hf_dataset",
157
158
  "push_model",
158
159
  "push_update",
159
160
  "run",
@@ -290,6 +291,7 @@ __instance_methods__: list[str] = [
290
291
  "push_capability",
291
292
  "push_dataset",
292
293
  "push_environment",
294
+ "push_hf_dataset",
293
295
  "push_model",
294
296
  ]
295
297
 
@@ -20,12 +20,14 @@ from dreadnode.core.hook import Hook
20
20
 
21
21
  __all__ = [
22
22
  "Agent",
23
+ "AgentJudge",
23
24
  "Continue",
24
25
  "Fail",
25
26
  "Finish",
26
27
  "FunctionCall",
27
28
  "FunctionDefinition",
28
29
  "Hook",
30
+ "JudgeResult",
29
31
  "Reaction",
30
32
  "Retry",
31
33
  "RetryWithFeedback",
@@ -59,6 +61,8 @@ _LAZY_NAMES = frozenset(
59
61
  "reactions",
60
62
  "stopping",
61
63
  "Agent",
64
+ "AgentJudge",
65
+ "JudgeResult",
62
66
  "Trajectory",
63
67
  "Continue",
64
68
  "Fail",
@@ -77,6 +81,7 @@ def _lazy_init() -> None:
77
81
  _stopping = importlib.import_module("dreadnode.agents.stopping")
78
82
  _agent = importlib.import_module("dreadnode.agents.agent")
79
83
  _trajectory = importlib.import_module("dreadnode.agents.trajectory")
84
+ _judge = importlib.import_module("dreadnode.agents.judge")
80
85
 
81
86
  _Agent = _agent.Agent # noqa: N806
82
87
  _Trajectory = _trajectory.Trajectory # noqa: N806
@@ -84,11 +89,18 @@ def _lazy_init() -> None:
84
89
  _Agent.model_rebuild()
85
90
  _Trajectory.model_rebuild()
86
91
 
92
+ # Expose AgentJudge as ``Agent.Judge`` for discoverability. ``Agent`` is
93
+ # the primary abstraction; ``Agent.Judge(...)`` is the specialized
94
+ # construction mirror for trajectory-scoring use cases.
95
+ _Agent.Judge = _judge.AgentJudge
96
+
87
97
  g = globals()
88
98
  g["events"] = _events
89
99
  g["reactions"] = _reactions
90
100
  g["stopping"] = _stopping
91
101
  g["Agent"] = _Agent
102
+ g["AgentJudge"] = _judge.AgentJudge
103
+ g["JudgeResult"] = _judge.JudgeResult
92
104
  g["Trajectory"] = _Trajectory
93
105
  g["Continue"] = _reactions.Continue
94
106
  g["Fail"] = _reactions.Fail
@@ -6,7 +6,6 @@ import time
6
6
  import typing as t
7
7
  from contextlib import AsyncExitStack, asynccontextmanager, suppress
8
8
  from copy import deepcopy
9
- from pathlib import Path
10
9
  from textwrap import dedent
11
10
  from uuid import UUID, uuid4
12
11
 
@@ -169,8 +168,6 @@ class Agent(Executor[AgentEvent, Trajectory]):
169
168
  """Timeout in seconds for each LLM generation call. None = no timeout."""
170
169
  generate_params_extra: dict[str, t.Any] = Config(default_factory=dict)
171
170
  """Extra parameters merged into GenerateParams for every generation (e.g. thinking config)."""
172
- working_dir: Path | None = Config(default=None)
173
- """Working directory used for tool output offloading and other IO."""
174
171
  backoff_max_tries: int = Config(default=8, ge=0)
175
172
  """Maximum retries on transient LLM API errors per step. ``0`` disables retry."""
176
173
  backoff_max_time: float = Config(default=300.0, ge=0)
@@ -184,6 +181,15 @@ class Agent(Executor[AgentEvent, Trajectory]):
184
181
  _generator: Generator | None = PrivateAttr(None, init=False)
185
182
  _current_input: str = PrivateAttr("", init=False)
186
183
 
184
+ # Discoverability namespace for the AgentJudge specialized construction.
185
+ # Assigned at module-load time by ``dreadnode.agents.__init__._lazy_init``
186
+ # to break the import cycle between Agent and AgentJudge (which in turn
187
+ # imports the llm_judge scorer stack).
188
+ if t.TYPE_CHECKING:
189
+ from dreadnode.agents.judge import AgentJudge
190
+
191
+ Judge: t.ClassVar[type[AgentJudge]]
192
+
187
193
  @field_validator("tools", mode="before")
188
194
  @classmethod
189
195
  def validate_tools(cls, value: t.Any) -> t.Any:
@@ -219,14 +225,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
219
225
  return StopCondition.fit_many(value)
220
226
 
221
227
  @model_validator(mode="after")
222
- def bind_tool_working_dir(self) -> "Agent":
228
+ def ensure_agent_tag(self) -> "Agent":
223
229
  if "agent" not in self.tags:
224
230
  self.tags.insert(0, "agent")
225
-
226
- working_dir = self.working_dir or Path.cwd()
227
- for tool in self.all_tools:
228
- if tool.working_dir is None:
229
- tool.working_dir = working_dir
230
231
  return self
231
232
 
232
233
  @property
@@ -640,9 +641,6 @@ class Agent(Executor[AgentEvent, Trajectory]):
640
641
 
641
642
  return
642
643
 
643
- if tool.working_dir is None:
644
- tool.working_dir = self.working_dir or Path.cwd()
645
-
646
644
  try:
647
645
  message, stop = await tool.handle_tool_call(tool_call)
648
646
 
@@ -152,6 +152,15 @@ class AgentStep(AgentEvent):
152
152
 
153
153
  @property
154
154
  def estimated_cost(self) -> float | None:
155
+ # Prefer the cost litellm attached to the response - it dispatches
156
+ # per-provider (anthropic_cost_per_token, openai_cost_per_token,
157
+ # bedrock_*, vertex_*, gemini_*, ...) and honours cache_read /
158
+ # cache_creation rates, reasoning tokens, tiered pricing, and
159
+ # region/service-tier multipliers. The naive math below ignores
160
+ # all of that and is wrong by 30-80% under prompt caching.
161
+ if self.usage.cost_usd is not None:
162
+ return self.usage.cost_usd
163
+
155
164
  import litellm
156
165
 
157
166
  if self.generator is None:
@@ -701,6 +710,7 @@ class GenerationStep(AgentStep):
701
710
  "input_tokens": self.usage.input_tokens,
702
711
  "output_tokens": self.usage.output_tokens,
703
712
  "total_tokens": self.usage.total_tokens,
713
+ "cost_usd": self.estimated_cost,
704
714
  },
705
715
  "stop_reason": self.stop_reason,
706
716
  "model": self.generator.model if self.generator else None,
@@ -0,0 +1,196 @@
1
+ """Agent.Judge — specialized agent for evaluating trajectories against a rubric.
2
+
3
+ Thin wrapper over ``dreadnode.scorers.judge.llm_judge`` that adapts the scorer
4
+ to consume a full :class:`Trajectory` (multi-turn message log) rather than a
5
+ single output string. Used by the hosted training ``llm_judge`` verification
6
+ method and by anyone grading rollouts in a notebook.
7
+
8
+ Exposed as ``Agent.Judge(...)`` (class attribute) and as ``AgentJudge`` directly
9
+ from ``dreadnode.agents``.
10
+ """
11
+
12
+ import typing as t
13
+ from dataclasses import dataclass, field
14
+ from pathlib import Path
15
+
16
+ from dreadnode.core.metric import Metric
17
+
18
+ if t.TYPE_CHECKING:
19
+ from dreadnode.agents.trajectory import Trajectory
20
+ from dreadnode.core.scorer import Scorer
21
+
22
+
23
+ @dataclass(slots=True)
24
+ class JudgeResult:
25
+ """Structured result of an :class:`AgentJudge` evaluation.
26
+
27
+ Attributes:
28
+ passed: Whether the trajectory cleared the judge's passing threshold.
29
+ score: Scalar in ``[0, 1]`` — the rubric-driven judge score.
30
+ reason: Free-text rationale returned by the judge LLM.
31
+ metrics: Raw metric list from the underlying scorer (score metric
32
+ first, followed by the boolean pass metric).
33
+ """
34
+
35
+ passed: bool
36
+ score: float
37
+ reason: str
38
+ metrics: list[Metric] = field(default_factory=list)
39
+
40
+
41
+ class AgentJudge:
42
+ """Specialized agent that evaluates a :class:`Trajectory` against a rubric.
43
+
44
+ Example::
45
+
46
+ from dreadnode.agents import Agent
47
+
48
+ judge = Agent.Judge(
49
+ model="openai/gpt-4o",
50
+ rubric="rce",
51
+ passing_threshold=0.7,
52
+ )
53
+ result = await judge.evaluate(rollout.trajectory)
54
+ if result.passed:
55
+ print("win!", result.score, result.reason)
56
+
57
+ Reuses the production :func:`dreadnode.scorers.judge.llm_judge` scorer
58
+ (rubric YAML loading, XML response parsing, fallback regex, etc.) — this
59
+ class only adapts the transcript shape and surfaces a :class:`JudgeResult`.
60
+ """
61
+
62
+ def __init__(
63
+ self,
64
+ *,
65
+ model: str,
66
+ rubric: str | Path,
67
+ passing_threshold: float = 0.5,
68
+ system_prompt: str | None = None,
69
+ model_params: dict[str, t.Any] | None = None,
70
+ ) -> None:
71
+ if not 0.0 <= passing_threshold <= 1.0:
72
+ raise ValueError(
73
+ f"passing_threshold must be between 0.0 and 1.0 (got {passing_threshold!r})"
74
+ )
75
+
76
+ # Lazy import keeps agents/__init__ import graph cheap — scorers.judge
77
+ # pulls in yaml + the rubrics dir.
78
+ from dreadnode.scorers.judge import llm_judge
79
+
80
+ self._model = model
81
+ self._rubric = rubric
82
+ self._passing_threshold = passing_threshold
83
+ self._system_prompt = system_prompt
84
+ self._model_params = model_params
85
+ self._scorer: Scorer[t.Any] = llm_judge(
86
+ model=model,
87
+ rubric=rubric,
88
+ passing=lambda score: score >= passing_threshold,
89
+ system_prompt=system_prompt,
90
+ model_params=model_params,
91
+ )
92
+
93
+ @property
94
+ def model(self) -> str:
95
+ return self._model
96
+
97
+ @property
98
+ def rubric(self) -> str | Path:
99
+ return self._rubric
100
+
101
+ @property
102
+ def passing_threshold(self) -> float:
103
+ return self._passing_threshold
104
+
105
+ async def evaluate(
106
+ self,
107
+ trajectory: "Trajectory",
108
+ *,
109
+ context: dict[str, t.Any] | None = None,
110
+ ) -> JudgeResult:
111
+ """Score ``trajectory`` against the configured rubric.
112
+
113
+ Flattens ``trajectory.messages`` to a transcript formatted as
114
+ ``[role] content`` lines, optionally prepended with a
115
+ ``# Task context`` block built from ``context`` (task instruction,
116
+ env service URLs, flag hints, etc.).
117
+
118
+ Args:
119
+ trajectory: The agent run to evaluate. Uses ``trajectory.messages``
120
+ which already chains per-step messages in chat order.
121
+ context: Optional per-call context merged into the judge's input.
122
+ Good use: pass the rendered task instruction and any known
123
+ ground-truth hints so the judge can evaluate faithfulness.
124
+
125
+ Returns:
126
+ A :class:`JudgeResult` with ``passed`` / ``score`` / ``reason``.
127
+
128
+ Raises:
129
+ ValueError: if the scorer returned fewer than two metrics (the
130
+ scorer contract is score metric + pass metric).
131
+ """
132
+
133
+ transcript = self._trajectory_to_transcript(trajectory, context=context)
134
+ metrics = await self._scorer.normalize_and_score(transcript)
135
+ if not metrics:
136
+ raise ValueError(
137
+ "AgentJudge scorer returned no metrics — check the judge model's output format."
138
+ )
139
+
140
+ score_metric = metrics[0]
141
+ score = float(score_metric.value)
142
+ reason = str(score_metric.attributes.get("reason", ""))
143
+
144
+ # Second metric is the boolean pass flag (see scorers/judge.py). If
145
+ # absent, fall back to threshold comparison so callers still get a
146
+ # sensible ``passed`` value.
147
+ if len(metrics) >= 2:
148
+ passed = bool(metrics[1].value)
149
+ else:
150
+ passed = score >= self._passing_threshold
151
+
152
+ return JudgeResult(
153
+ passed=passed,
154
+ score=score,
155
+ reason=reason,
156
+ metrics=list(metrics),
157
+ )
158
+
159
+ @staticmethod
160
+ def _trajectory_to_transcript(
161
+ trajectory: "Trajectory",
162
+ *,
163
+ context: dict[str, t.Any] | None = None,
164
+ ) -> str:
165
+ """Render a transcript the judge LLM can consume.
166
+
167
+ Format:
168
+ # Task context
169
+ - key: value
170
+ - ...
171
+
172
+ # Conversation transcript
173
+ [system] ...
174
+ [user] ...
175
+ [assistant] ...
176
+ ...
177
+
178
+ Context is optional. The conversation section always appears, even
179
+ for empty trajectories (judge then scores on instruction only).
180
+ """
181
+
182
+ lines: list[str] = []
183
+ if context:
184
+ lines.append("# Task context")
185
+ for key, value in context.items():
186
+ lines.append(f"- {key}: {value}")
187
+ lines.append("")
188
+ lines.append("# Conversation transcript")
189
+ for msg in trajectory.messages:
190
+ role = getattr(msg, "role", "unknown")
191
+ content = getattr(msg, "content", "") or ""
192
+ lines.append(f"[{role}] {content}")
193
+ return "\n".join(lines)
194
+
195
+
196
+ __all__ = ["AgentJudge", "JudgeResult"]
@@ -15,6 +15,7 @@ import yaml
15
15
  from loguru import logger
16
16
 
17
17
  from dreadnode.agents.tools import tool
18
+ from dreadnode.capabilities.capability import Capability
18
19
 
19
20
  # CAP-IDENT-010 (skill surface): unsafe characters are replaced with `_` and
20
21
  # the segment is trimmed of leading/trailing `_`. Unlike the tool wire surface,
@@ -522,3 +523,13 @@ def create_skill_tool(skills: list[Skill]) -> t.Any:
522
523
  return resolve_skill(name, skills).render_content()
523
524
 
524
525
  return skill
526
+
527
+
528
+ def attach_capability_skills(*, agent: t.Any, capability: Capability) -> None:
529
+ """Attach capability-local skills to the reconstructed agent, if any."""
530
+
531
+ all_skills: list[Skill] = []
532
+ for skills_path in capability.skills_paths or []:
533
+ all_skills.extend(discover_skills(skills_path))
534
+ if all_skills:
535
+ agent.tools.append(create_skill_tool(all_skills))
@@ -7,7 +7,6 @@ import re
7
7
  import typing as t
8
8
  from pathlib import Path
9
9
 
10
- import aiofiles
11
10
  import typing_extensions as te
12
11
  from pydantic import (
13
12
  BaseModel,
@@ -167,20 +166,19 @@ async def offload_tool_output(
167
166
  content: str,
168
167
  tool_call_id: str,
169
168
  tool_name: str, # noqa: ARG001 - callers pass as keyword arg
170
- working_dir: Path,
171
169
  ) -> tuple[str, Path]:
172
- """Write tool output to disk and return middle-out summary plus file path."""
173
- output_root = working_dir if working_dir.name == ".dreadnode" else working_dir / ".dreadnode"
174
- output_dir = output_root / "tool-output"
175
- await asyncio.to_thread(output_dir.mkdir, parents=True, exist_ok=True)
170
+ """Write tool output to disk and return middle-out summary plus file path.
176
171
 
177
- safe_id = re.sub(r"[^a-zA-Z0-9_-]", "_", tool_call_id)
178
- file_path = output_dir / f"{safe_id}.txt"
179
- async with aiofiles.open(file_path, "w") as f:
180
- await f.write(content)
172
+ Output lands at ``<cache>/tool-output/<YYYYMMDD-HHMMSS>-<tool_call_id>.txt``,
173
+ where ``<cache>`` is the active Dreadnode instance's cache directory
174
+ (``~/.dreadnode`` by default; honors ``configure(cache=...)``).
175
+ """
176
+ from dreadnode import _get_default_instance
177
+ from dreadnode.storage.storage import write_timestamped
181
178
 
182
- relative_base = working_dir.parent if working_dir.name == ".dreadnode" else working_dir
183
- relative_path = file_path.relative_to(relative_base)
179
+ output_dir = _get_default_instance().storage.tool_output_path
180
+ safe_id = re.sub(r"[^a-zA-Z0-9_-]", "_", tool_call_id)
181
+ file_path = await asyncio.to_thread(write_timestamped, output_dir, f"{safe_id}.txt", content)
184
182
 
185
183
  half = OFFLOAD_THRESHOLD // 2
186
184
  start = content[:half]
@@ -189,7 +187,7 @@ async def offload_tool_output(
189
187
 
190
188
  truncated = (
191
189
  f"{start}\n\n"
192
- f"... [{middle_lines} lines truncated — full output saved to {relative_path}] ...\n\n"
190
+ f"... [{middle_lines} lines truncated — full output saved to {file_path}] ...\n\n"
193
191
  f"{end}"
194
192
  )
195
193
  return truncated, file_path
@@ -304,8 +302,6 @@ class Tool(BaseModel, t.Generic[P, R]):
304
302
  """If set, the maximum number of characters to truncate any tool output to."""
305
303
  offload: bool = True
306
304
  """Whether large tool outputs should be offloaded to disk."""
307
- working_dir: Path | None = None
308
- """Working directory used to store offloaded tool outputs."""
309
305
 
310
306
  _signature: inspect.Signature | None = PrivateAttr(default=None, init=False)
311
307
  _type_adapter: TypeAdapter[t.Any] | None = PrivateAttr(default=None, init=False)
@@ -535,16 +531,24 @@ class Tool(BaseModel, t.Generic[P, R]):
535
531
  message = message.shorten(self.truncate)
536
532
 
537
533
  if self.offload and message.content and len(message.content) > OFFLOAD_THRESHOLD:
538
- working_dir = self.working_dir or Path.cwd()
534
+ from dreadnode import _get_default_instance
535
+
539
536
  truncated_content, output_file = await offload_tool_output(
540
537
  message.content,
541
538
  tool_call.id,
542
539
  tool_call.name,
543
- working_dir,
544
540
  )
545
541
  message = message.clone()
546
542
  message.content_parts = [ContentText(text=truncated_content)]
547
- message.metadata["output_file"] = str(output_file.relative_to(working_dir))
543
+ # Strip cache root before persisting on the span — absolute paths
544
+ # leak user home / hostname to the platform without giving the
545
+ # server anything actionable (the file is local-only).
546
+ cache_root = _get_default_instance().cache
547
+ try:
548
+ metadata_path = output_file.relative_to(cache_root)
549
+ except ValueError:
550
+ metadata_path = output_file
551
+ message.metadata["output_file"] = str(metadata_path)
548
552
 
549
553
  return message, stop
550
554
 
@@ -564,7 +568,6 @@ class Tool(BaseModel, t.Generic[P, R]):
564
568
  catch=self.catch,
565
569
  truncate=self.truncate,
566
570
  offload=self.offload,
567
- working_dir=self.working_dir,
568
571
  )
569
572
 
570
573
  new._signature = self._signature
@@ -24,7 +24,6 @@ import contextvars
24
24
  import os
25
25
  import signal
26
26
  import typing as t
27
- import uuid
28
27
  from pathlib import Path
29
28
 
30
29
  from loguru import logger
@@ -127,7 +126,6 @@ class Assessment:
127
126
 
128
127
  self._assessment_id: str | None = None
129
128
  self._attack_results: list[AttackResult] = []
130
- self._attack_run_ids: dict[int, str] = {} # index in _attack_results -> platform run_id
131
129
  self._tracing_enabled: bool = False
132
130
  self._auto_registered: bool = False
133
131
  self._context_token: contextvars.Token[Assessment | None] | None = None
@@ -232,14 +230,10 @@ class Assessment:
232
230
  yield a
233
231
 
234
232
  async def _finalize(self) -> None:
235
- """Upload pending results, flush traces, mark complete."""
233
+ """Flush pending OTEL spans and mark complete."""
236
234
  if not self._attack_results:
237
235
  return
238
236
 
239
- for i, result in enumerate(self._attack_results):
240
- if i not in self._attack_run_ids:
241
- await self.upload_result(result)
242
-
243
237
  # Flush pending OTEL spans BEFORE marking complete so CH has data
244
238
  # when the API materializes findings on status change.
245
239
  # dn.shutdown() would kill the trace provider, breaking any
@@ -327,7 +321,6 @@ class Assessment:
327
321
  execution_time_s=getattr(result, "execution_time_s", 0.0),
328
322
  )
329
323
  self._attack_results.append(ar)
330
- await self.upload_result(ar)
331
324
 
332
325
  return result
333
326
 
@@ -496,65 +489,6 @@ class Assessment:
496
489
  _current_assessment.reset(self._context_token)
497
490
  self._context_token = None
498
491
 
499
- # =========================================================================
500
- # Result Upload
501
- # =========================================================================
502
-
503
- async def upload_result(self, result: AttackResult) -> str | None:
504
- """Register and upload an attack result to the platform.
505
-
506
- Args:
507
- result: The AttackResult to upload.
508
-
509
- Returns:
510
- The platform run ID, or None if offline.
511
- """
512
- ctx = _get_platform_context()
513
- if ctx is None or self._assessment_id is None:
514
- return None
515
-
516
- api, profile = ctx
517
- org = profile.org_key
518
- ws = profile.workspace_key
519
-
520
- try:
521
- trace_id = uuid.uuid4().hex
522
- run_data = api.register_airt_attack_run(
523
- org,
524
- ws,
525
- self._assessment_id,
526
- attack_name=result.attack_name,
527
- goal=result.goal,
528
- goal_category=result.goal_category.value,
529
- transforms_applied=result.transforms_applied,
530
- compliance_tags=result.compliance_tags,
531
- trace_id=trace_id,
532
- )
533
- run_id = run_data["id"]
534
-
535
- api.upload_airt_attack_result(
536
- org,
537
- ws,
538
- self._assessment_id,
539
- run_id,
540
- attack_result_json=result.to_dict(),
541
- best_score=result.best_score,
542
- total_trials=result.total_trials,
543
- finished_trials=len(result.finished_trials),
544
- execution_time_s=result.execution_time_s,
545
- )
546
- except Exception as e:
547
- logger.error(f"Failed to upload attack result: {e}")
548
- return None
549
-
550
- idx = len(self._attack_results) - 1
551
- if result in self._attack_results:
552
- idx = self._attack_results.index(result)
553
- self._attack_run_ids[idx] = run_id
554
-
555
- logger.info(f"Attack result uploaded: {result.attack_name} -> {run_id}")
556
- return run_id
557
-
558
492
  # =========================================================================
559
493
  # Lifecycle
560
494
  # =========================================================================