dreadnode 2.0.38__tar.gz → 2.0.40__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 (727) hide show
  1. {dreadnode-2.0.38 → dreadnode-2.0.40}/PKG-INFO +18 -6
  2. {dreadnode-2.0.38 → dreadnode-2.0.40}/README.md +12 -3
  3. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/agent.py +137 -17
  4. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/events.py +14 -1
  5. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/hooks.py +169 -9
  6. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/process_judge.py +32 -8
  7. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/reactions.py +2 -0
  8. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/tools.py +3 -2
  9. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/trajectory.py +13 -0
  10. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/client.py +356 -2
  11. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/models.py +40 -1
  12. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/airt.py +36 -41
  13. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/args.py +1 -1
  14. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/capability.py +146 -25
  15. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/evaluation.py +24 -16
  16. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/main.py +2 -1
  17. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/shared.py +209 -4
  18. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/task.py +149 -18
  19. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/task_set.py +192 -7
  20. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/runtime_client.py +2 -2
  21. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/main.py +2 -0
  22. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/app.py +169 -20
  23. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/model_resolution.py +9 -1
  24. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/runtime_token.py +11 -41
  25. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/app.py +123 -7
  26. dreadnode-2.0.40/dreadnode/app/tui/bug_report.py +489 -0
  27. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/command_dispatcher.py +3 -0
  28. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/commands.py +1 -0
  29. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/dreadnode.tcss +42 -0
  30. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/error_handler.py +4 -0
  31. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/profile_manager.py +15 -3
  32. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screen_router.py +68 -0
  33. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/__init__.py +2 -0
  34. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/auth.py +81 -17
  35. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/capabilities.py +14 -9
  36. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/capability_docs.py +10 -0
  37. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/connection_error.py +3 -1
  38. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/console.py +10 -0
  39. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/environments.py +2 -0
  40. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/evaluations.py +2 -0
  41. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/readme.py +10 -0
  42. dreadnode-2.0.40/dreadnode/app/tui/screens/report_bug.py +429 -0
  43. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/runtimes.py +135 -43
  44. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/sandboxes.py +2 -0
  45. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/secrets.py +7 -0
  46. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/services.py +20 -1
  47. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/sessions.py +10 -4
  48. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/traces.py +7 -0
  49. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/sessions_manager.py +155 -4
  50. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_reducer.py +50 -5
  51. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/context_bar.py +4 -2
  52. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/conversation.py +3 -1
  53. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/header_bar.py +2 -1
  54. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/help_panel.py +14 -2
  55. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/prompt_info.py +2 -1
  56. dreadnode-2.0.40/dreadnode/app/tui/widgets/scope_modal.py +401 -0
  57. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tool.py +13 -0
  58. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/wire_events.py +49 -1
  59. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -1
  60. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +2 -2
  61. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +1 -1
  62. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +1 -1
  63. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  64. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +230 -0
  65. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +15 -3
  66. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +11 -1
  67. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +1 -1
  68. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +13 -3
  69. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +3 -3
  70. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +6 -6
  71. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +128 -0
  72. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +2 -2
  73. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +13 -1
  74. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +24 -8
  75. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +2 -0
  76. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +12 -6
  77. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +38 -0
  78. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +2 -12
  79. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +177 -0
  80. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +9 -3
  81. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +17 -9
  82. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +5 -9
  83. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +16 -7
  84. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +3 -0
  85. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +16 -4
  86. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +12 -12
  87. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +4 -8
  88. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
  89. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +1 -1
  90. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +6 -4
  91. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +78 -0
  92. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +2 -0
  93. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +113 -0
  94. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
  95. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +20 -8
  96. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +18 -18
  97. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +1 -1
  98. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +4 -4
  99. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +1 -1
  100. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +94 -0
  101. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +2 -0
  102. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +79 -0
  103. dreadnode-2.0.40/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +43 -0
  104. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/loader.py +20 -2
  105. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/sync.py +6 -0
  106. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/log.py +61 -19
  107. dreadnode-2.0.40/dreadnode/core/tls.py +113 -0
  108. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/audio.py +6 -5
  109. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/litellm_.py +41 -15
  110. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/config.py +66 -25
  111. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/jobs.py +18 -6
  112. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/manifest.py +4 -3
  113. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/oci.py +36 -4
  114. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/__init__.py +16 -5
  115. dreadnode-2.0.40/dreadnode/policies/guard.py +240 -0
  116. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/rubrics/process/default.yaml +11 -6
  117. dreadnode-2.0.40/dreadnode/policies/scope.py +633 -0
  118. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/__init__.py +6 -1
  119. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/dreadnode_cli.py +14 -3
  120. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/report_items.py +574 -60
  121. dreadnode-2.0.40/dreadnode/tools/submission.py +225 -0
  122. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/exporter.py +4 -2
  123. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/span.py +5 -3
  124. {dreadnode-2.0.38 → dreadnode-2.0.40}/pyproject.toml +13 -3
  125. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -144
  126. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -136
  127. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -96
  128. dreadnode-2.0.38/dreadnode/policies/guard.py +0 -193
  129. {dreadnode-2.0.38 → dreadnode-2.0.40}/.gitignore +0 -0
  130. {dreadnode-2.0.38 → dreadnode-2.0.40}/LICENSE +0 -0
  131. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/__init__.py +0 -0
  132. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/__main__.py +0 -0
  133. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/__init__.py +0 -0
  134. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/AGENTS.md +0 -0
  135. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/__init__.py +0 -0
  136. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/base.py +0 -0
  137. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/claude_code.py +0 -0
  138. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/engines/native.py +0 -0
  139. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/exceptions.py +0 -0
  140. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/format.py +0 -0
  141. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/judge.py +0 -0
  142. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/__init__.py +0 -0
  143. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/auth.py +0 -0
  144. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/client.py +0 -0
  145. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/config.py +0 -0
  146. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/mcp/server.py +0 -0
  147. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/sanitize.py +0 -0
  148. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/skills.py +0 -0
  149. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/stopping.py +0 -0
  150. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/subagent.py +0 -0
  151. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/agents/tool_resolution.py +0 -0
  152. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/__init__.py +0 -0
  153. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/_base.py +0 -0
  154. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/adversarial_reasoning.py +0 -0
  155. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/advpromptier.py +0 -0
  156. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/alignment_faking.py +0 -0
  157. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analogy_escalation.py +0 -0
  158. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/__init__.py +0 -0
  159. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/aggregator.py +0 -0
  160. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/classifier.py +0 -0
  161. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/compliance.py +0 -0
  162. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/engine.py +0 -0
  163. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/recommendations.py +0 -0
  164. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/analytics/types.py +0 -0
  165. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/aprt_progressive.py +0 -0
  166. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/art_engine.py +0 -0
  167. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/assessment.py +0 -0
  168. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/__init__.py +0 -0
  169. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/defense.py +0 -0
  170. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/failure.py +0 -0
  171. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/gate.py +0 -0
  172. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/memory.py +0 -0
  173. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/modes.py +0 -0
  174. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/probes.py +0 -0
  175. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/recon.py +0 -0
  176. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/router.py +0 -0
  177. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/atlas/strategy.py +0 -0
  178. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/attention_shifting.py +0 -0
  179. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/autodan_turbo.py +0 -0
  180. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/autoredteamer.py +0 -0
  181. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/beast.py +0 -0
  182. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/__init__.py +0 -0
  183. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/atlas.py +0 -0
  184. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/nist.py +0 -0
  185. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/owasp.py +0 -0
  186. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  187. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/compliance/saif.py +0 -0
  188. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/constants.py +0 -0
  189. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/cot_jailbreak.py +0 -0
  190. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/crescendo.py +0 -0
  191. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/__init__.py +0 -0
  192. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  193. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  194. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/assets/image/meth.png +0 -0
  195. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  196. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  197. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  198. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  199. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  200. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  201. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  202. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  203. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  204. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  205. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  206. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  207. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  208. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  209. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  210. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  211. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  212. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  213. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/deep_inception.py +0 -0
  214. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/drattack.py +0 -0
  215. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/echo_chamber.py +0 -0
  216. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/__init__.py +0 -0
  217. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/_base.py +0 -0
  218. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/_text_common.py +0 -0
  219. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/bae.py +0 -0
  220. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/boundary.py +0 -0
  221. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  222. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  223. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/pwws.py +0 -0
  224. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/simba.py +0 -0
  225. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/square.py +0 -0
  226. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/text.py +0 -0
  227. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/textbugger.py +0 -0
  228. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/textfooler.py +0 -0
  229. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/evasion/zoo.py +0 -0
  230. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/events.py +0 -0
  231. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/__init__.py +0 -0
  232. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/_base.py +0 -0
  233. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/activethief.py +0 -0
  234. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/copycat.py +0 -0
  235. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/distillation.py +0 -0
  236. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/equation_solving.py +0 -0
  237. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/jacobian.py +0 -0
  238. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/extraction/knockoff.py +0 -0
  239. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/genetic_persona.py +0 -0
  240. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/goat.py +0 -0
  241. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/goat_v2.py +0 -0
  242. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/gptfuzzer.py +0 -0
  243. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/humor_bypass.py +0 -0
  244. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/image.py +0 -0
  245. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/__init__.py +0 -0
  246. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/_base.py +0 -0
  247. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/confidence.py +0 -0
  248. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  249. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/j2_meta.py +0 -0
  250. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/jbdistill.py +0 -0
  251. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/jbfuzz.py +0 -0
  252. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/lrm_autonomous.py +0 -0
  253. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/mapf.py +0 -0
  254. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/__init__.py +0 -0
  255. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/_base.py +0 -0
  256. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/entropy.py +0 -0
  257. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/label_only.py +0 -0
  258. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/lira.py +0 -0
  259. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/loss.py +0 -0
  260. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/shadow_model.py +0 -0
  261. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/membership/threshold.py +0 -0
  262. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/message_parts.py +0 -0
  263. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/model_export.py +0 -0
  264. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/multimodal.py +0 -0
  265. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/nexus.py +0 -0
  266. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/pair.py +0 -0
  267. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/persona_hijack.py +0 -0
  268. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/prompt.py +0 -0
  269. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/quantization_safety.py +0 -0
  270. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/rainbow.py +0 -0
  271. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/refusal_aware.py +0 -0
  272. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/renellm.py +0 -0
  273. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/__init__.py +0 -0
  274. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/json_report.py +0 -0
  275. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/llm_summary.py +0 -0
  276. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reporting/markdown.py +0 -0
  277. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/reward_hacking.py +0 -0
  278. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/salami_slicing.py +0 -0
  279. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/self_persuasion.py +0 -0
  280. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/siren.py +0 -0
  281. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/tap.py +0 -0
  282. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/target.py +0 -0
  283. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/__init__.py +0 -0
  284. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/auth.py +0 -0
  285. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/factory.py +0 -0
  286. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/http.py +0 -0
  287. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/message.py +0 -0
  288. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/prediction.py +0 -0
  289. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/spec.py +0 -0
  290. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  291. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  292. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/templatefuzz.py +0 -0
  293. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/tmap_trajectory.py +0 -0
  294. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/trojail.py +0 -0
  295. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/airt/watermark_removal.py +0 -0
  296. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/__init__.py +0 -0
  297. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/api/__init__.py +0 -0
  298. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/__init__.py +0 -0
  299. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/dataset.py +0 -0
  300. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/environment.py +0 -0
  301. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/inference_model.py +0 -0
  302. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/judge.py +0 -0
  303. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/model.py +0 -0
  304. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/optimize.py +0 -0
  305. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/runtime.py +0 -0
  306. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/sandbox.py +0 -0
  307. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/secret.py +0 -0
  308. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/session.py +0 -0
  309. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/__init__.py +0 -0
  310. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  311. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  312. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  313. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  314. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  315. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  316. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  317. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  318. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  319. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/train.py +0 -0
  320. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/cli/worlds.py +0 -0
  321. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/__init__.py +0 -0
  322. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/interactive.py +0 -0
  323. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/managed_client.py +0 -0
  324. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/models.py +0 -0
  325. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/client/transports.py +0 -0
  326. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/config.py +0 -0
  327. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/env.py +0 -0
  328. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/model_catalog.py +0 -0
  329. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/paths.py +0 -0
  330. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/print_mode.py +0 -0
  331. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/__init__.py +0 -0
  332. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/auth.py +0 -0
  333. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/capability_manager.py +0 -0
  334. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/prompt.py +0 -0
  335. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/prompt_registry.py +0 -0
  336. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/runtime_events.py +0 -0
  337. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/session_hydrator.py +0 -0
  338. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/session_persistence.py +0 -0
  339. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/turn_coordinator.py +0 -0
  340. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/utils.py +0 -0
  341. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/websocket.py +0 -0
  342. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/worker_manager.py +0 -0
  343. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/server/ws_auth.py +0 -0
  344. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/__init__.py +0 -0
  345. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/auth_flow.py +0 -0
  346. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/capabilities_manager.py +0 -0
  347. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/connection.py +0 -0
  348. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/model_manager.py +0 -0
  349. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/model_variants.py +0 -0
  350. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/runtime_cache.py +0 -0
  351. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/base.py +0 -0
  352. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/models.py +0 -0
  353. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  354. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  355. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/screens/workspaces.py +0 -0
  356. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/spans_reader.py +0 -0
  357. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/status_messages.py +0 -0
  358. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/theme.py +0 -0
  359. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/tool_format.py +0 -0
  360. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_coordinator.py +0 -0
  361. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  362. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/turn_state_phase.py +0 -0
  363. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/update_check.py +0 -0
  364. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/__init__.py +0 -0
  365. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  366. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  367. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/composer.py +0 -0
  368. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  369. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/flash.py +0 -0
  370. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  371. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  372. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  373. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  374. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  375. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  376. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  377. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  378. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  379. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  380. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  381. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  382. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/throbber.py +0 -0
  383. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  384. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  385. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/welcome.py +0 -0
  386. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/app/tui/widgets/whoami.py +0 -0
  387. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/__init__.py +0 -0
  388. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  389. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  390. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  391. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  392. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  393. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  394. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  395. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  396. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  397. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  398. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  399. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  400. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  401. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  402. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  403. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  404. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  405. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  406. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  407. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  408. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  409. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  410. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  411. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  412. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  413. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  414. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  415. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  416. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  417. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  418. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  419. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  420. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  421. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  422. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  423. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  424. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  425. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  426. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  427. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  428. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  429. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  430. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  431. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  432. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  433. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  434. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  435. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  436. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  437. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  438. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  439. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  440. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  441. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  442. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  443. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  444. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  445. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/__init__.py +0 -0
  446. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/capability.py +0 -0
  447. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/flags.py +0 -0
  448. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/install.py +0 -0
  449. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/tool_rules.py +0 -0
  450. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/types.py +0 -0
  451. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/worker.py +0 -0
  452. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/capabilities/worker_runner.py +0 -0
  453. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/__init__.py +0 -0
  454. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/conditions.py +0 -0
  455. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/discovery.py +0 -0
  456. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/environment.py +0 -0
  457. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/exceptions.py +0 -0
  458. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/execution.py +0 -0
  459. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/hook.py +0 -0
  460. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/judge.py +0 -0
  461. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/load.py +0 -0
  462. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/__init__.py +0 -0
  463. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/config.py +0 -0
  464. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/context.py +0 -0
  465. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/hydrate.py +0 -0
  466. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/meta/introspect.py +0 -0
  467. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/metric.py +0 -0
  468. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/object.py +0 -0
  469. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/scorer.py +0 -0
  470. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/serialization.py +0 -0
  471. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/stopping.py +0 -0
  472. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/task.py +0 -0
  473. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/templating.py +0 -0
  474. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/transforms.py +0 -0
  475. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/__init__.py +0 -0
  476. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/base.py +0 -0
  477. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/common.py +0 -0
  478. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/image.py +0 -0
  479. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/object_3d.py +0 -0
  480. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/table.py +0 -0
  481. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/text.py +0 -0
  482. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/types/video.py +0 -0
  483. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/core/util.py +0 -0
  484. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/__init__.py +0 -0
  485. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/dataset.py +0 -0
  486. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/hf.py +0 -0
  487. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/datasets/local.py +0 -0
  488. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/__init__.py +0 -0
  489. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/console.py +0 -0
  490. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/evaluation.py +0 -0
  491. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/events.py +0 -0
  492. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/format.py +0 -0
  493. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/result.py +0 -0
  494. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/evaluations/sample.py +0 -0
  495. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/__init__.py +0 -0
  496. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/caching.py +0 -0
  497. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/chat.py +0 -0
  498. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/data.py +0 -0
  499. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/exceptions.py +0 -0
  500. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/__init__.py +0 -0
  501. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/base.py +0 -0
  502. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/http.py +0 -0
  503. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/transformers_.py +0 -0
  504. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/generator/vllm_.py +0 -0
  505. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/message.py +0 -0
  506. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/models.py +0 -0
  507. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/parsing.py +0 -0
  508. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/proxy.py +0 -0
  509. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/__init__.py +0 -0
  510. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/base.py +0 -0
  511. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  512. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/generators/utils.py +0 -0
  513. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/__init__.py +0 -0
  514. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/items/models.py +0 -0
  515. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/__init__.py +0 -0
  516. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/outcome.py +0 -0
  517. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/trajectory.py +0 -0
  518. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/judges/trajectory_tools.py +0 -0
  519. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/__init__.py +0 -0
  520. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/hf.py +0 -0
  521. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/local.py +0 -0
  522. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/models/model.py +0 -0
  523. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/__init__.py +0 -0
  524. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/__init__.py +0 -0
  525. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  526. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/agent.py +0 -0
  527. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/env.py +0 -0
  528. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/runtime.py +0 -0
  529. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/adapters/stack.py +0 -0
  530. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/api.py +0 -0
  531. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/__init__.py +0 -0
  532. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/base.py +0 -0
  533. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/backends/gepa.py +0 -0
  534. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/collectors.py +0 -0
  535. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/config.py +0 -0
  536. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/console.py +0 -0
  537. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/events.py +0 -0
  538. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/format.py +0 -0
  539. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/result.py +0 -0
  540. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/sampler.py +0 -0
  541. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/sampling.py +0 -0
  542. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/search.py +0 -0
  543. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/stopping.py +0 -0
  544. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/study.py +0 -0
  545. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/optimization/trial.py +0 -0
  546. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/__init__.py +0 -0
  547. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/loader.py +0 -0
  548. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/package.py +0 -0
  549. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/packaging/task_validation.py +0 -0
  550. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/policies/reconciliation.py +0 -0
  551. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/py.typed +0 -0
  552. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/__init__.py +0 -0
  553. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/boundary.py +0 -0
  554. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/fuzzing.py +0 -0
  555. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/graph.py +0 -0
  556. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/grid.py +0 -0
  557. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/image.py +0 -0
  558. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/mapelites.py +0 -0
  559. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/optuna.py +0 -0
  560. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/random.py +0 -0
  561. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/registry.py +0 -0
  562. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/samplers/strategy.py +0 -0
  563. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/__init__.py +0 -0
  564. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  565. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agent_security.py +0 -0
  566. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agentic.py +0 -0
  567. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/agentic_workflow.py +0 -0
  568. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/attack_outcome.py +0 -0
  569. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/classification.py +0 -0
  570. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/consistency.py +0 -0
  571. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/contains.py +0 -0
  572. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/cosine_sim.py +0 -0
  573. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/credentials.py +0 -0
  574. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/crucible.py +0 -0
  575. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/documentation_security.py +0 -0
  576. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/exfiltration_detection.py +0 -0
  577. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/format.py +0 -0
  578. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/harm.py +0 -0
  579. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/ide_security.py +0 -0
  580. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/image.py +0 -0
  581. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/json.py +0 -0
  582. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/judge.py +0 -0
  583. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/judge_ensemble.py +0 -0
  584. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/length.py +0 -0
  585. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/lexical.py +0 -0
  586. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/mcp_security.py +0 -0
  587. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/memorization.py +0 -0
  588. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/multi_agent_security.py +0 -0
  589. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/pii.py +0 -0
  590. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/prompt_leak.py +0 -0
  591. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/readability.py +0 -0
  592. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/reasoning_security.py +0 -0
  593. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/sentiment.py +0 -0
  594. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/similarity.py +0 -0
  595. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/structural_detection.py +0 -0
  596. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/scorers/supply_chain_detection.py +0 -0
  597. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/__init__.py +0 -0
  598. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/providers.py +0 -0
  599. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/session_store.py +0 -0
  600. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/storage/storage.py +0 -0
  601. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/_ripgrep.py +0 -0
  602. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/apply_patch.py +0 -0
  603. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/editing.py +0 -0
  604. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/execute.py +0 -0
  605. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/fetch.py +0 -0
  606. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/glob.py +0 -0
  607. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/grep.py +0 -0
  608. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/interaction.py +0 -0
  609. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/ls.py +0 -0
  610. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/memory.py +0 -0
  611. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/project_memory.py +0 -0
  612. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/read.py +0 -0
  613. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/report.py +0 -0
  614. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/task.py +0 -0
  615. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/think.py +0 -0
  616. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/todo.py +0 -0
  617. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/trajectory_search.py +0 -0
  618. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/web_extract.py +0 -0
  619. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/web_search.py +0 -0
  620. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tools/write.py +0 -0
  621. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/__init__.py +0 -0
  622. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/constants.py +0 -0
  623. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/convert.py +0 -0
  624. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/exporters.py +0 -0
  625. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/spans.py +0 -0
  626. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/tracing/trace_converter.py +0 -0
  627. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/__init__.py +0 -0
  628. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/_progress.py +0 -0
  629. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/base.py +0 -0
  630. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/dpo.py +0 -0
  631. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/env_rollouts.py +0 -0
  632. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/__init__.py +0 -0
  633. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/_common.py +0 -0
  634. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/rl.py +0 -0
  635. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/sft.py +0 -0
  636. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/etl/worlds.py +0 -0
  637. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/events.py +0 -0
  638. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/grpo.py +0 -0
  639. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/jobs.py +0 -0
  640. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/models.py +0 -0
  641. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ppo.py +0 -0
  642. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/prime.py +0 -0
  643. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/__init__.py +0 -0
  644. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/async_trainer.py +0 -0
  645. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/config.py +0 -0
  646. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/coordinator.py +0 -0
  647. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/distributed.py +0 -0
  648. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/dpo.py +0 -0
  649. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/experience.py +0 -0
  650. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  651. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/inference.py +0 -0
  652. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/learner.py +0 -0
  653. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/multi_turn.py +0 -0
  654. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/ppo.py +0 -0
  655. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/reward_model.py +0 -0
  656. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/rollout_env.py +0 -0
  657. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/rollout_worker.py +0 -0
  658. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/sft.py +0 -0
  659. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/ray/trainer.py +0 -0
  660. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/recipes.py +0 -0
  661. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/__init__.py +0 -0
  662. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/aggregator.py +0 -0
  663. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/functions.py +0 -0
  664. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  665. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/shaping.py +0 -0
  666. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rewards/types.py +0 -0
  667. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/__init__.py +0 -0
  668. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/adapters.py +0 -0
  669. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  670. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/orchestrator.py +0 -0
  671. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/types.py +0 -0
  672. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/rollouts/worlds.py +0 -0
  673. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/serving/__init__.py +0 -0
  674. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/serving/vllm_client.py +0 -0
  675. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/sft.py +0 -0
  676. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/__init__.py +0 -0
  677. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/config.py +0 -0
  678. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/data.py +0 -0
  679. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/renderer.py +0 -0
  680. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/rl.py +0 -0
  681. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker/trainer.py +0 -0
  682. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/tinker_sft.py +0 -0
  683. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/training/utils.py +0 -0
  684. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/__init__.py +0 -0
  685. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  686. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/adversarial_suffix.py +0 -0
  687. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/agent_skill.py +0 -0
  688. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/agentic_workflow.py +0 -0
  689. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/audio.py +0 -0
  690. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/backdoor_finetune.py +0 -0
  691. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  692. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/cipher.py +0 -0
  693. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/competitive_parity.py +0 -0
  694. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/constitutional.py +0 -0
  695. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/document.py +0 -0
  696. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/documentation_poison.py +0 -0
  697. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/encoding.py +0 -0
  698. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/exfiltration.py +0 -0
  699. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/flip_attack.py +0 -0
  700. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/guardrail_bypass.py +0 -0
  701. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/ide_injection.py +0 -0
  702. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/image.py +0 -0
  703. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/injection.py +0 -0
  704. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/json_tools.py +0 -0
  705. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/language.py +0 -0
  706. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/logic_bomb.py +0 -0
  707. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/mcp_attacks.py +0 -0
  708. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  709. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/multimodal_attacks.py +0 -0
  710. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/persuasion.py +0 -0
  711. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/perturbation.py +0 -0
  712. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/pii_extraction.py +0 -0
  713. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/pythonic_tools.py +0 -0
  714. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/rag_poisoning.py +0 -0
  715. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/reasoning_attacks.py +0 -0
  716. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/refine.py +0 -0
  717. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/response_steering.py +0 -0
  718. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/structural_exploits.py +0 -0
  719. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/stylistic.py +0 -0
  720. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/substitution.py +0 -0
  721. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/supply_chain.py +0 -0
  722. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/swap.py +0 -0
  723. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  724. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/text.py +0 -0
  725. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/video.py +0 -0
  726. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/transforms/xml_tools.py +0 -0
  727. {dreadnode-2.0.38 → dreadnode-2.0.40}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.38
3
+ Version: 2.0.40
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -11,7 +11,7 @@ Requires-Dist: aiofiles<25.0.0,>=24.1.0
11
11
  Requires-Dist: art<7.0.0,>=6.5
12
12
  Requires-Dist: aws-sdk-bedrock-runtime>=0.7.0; python_version >= '3.12'
13
13
  Requires-Dist: awscrt>=0.27.0; python_version >= '3.12'
14
- Requires-Dist: boto3>=1.40.0
14
+ Requires-Dist: boto3<=1.41.5,>=1.40.0
15
15
  Requires-Dist: coolname<3.0.0,>=2.2.0
16
16
  Requires-Dist: croniter<7.0.0,>=6.0.0
17
17
  Requires-Dist: cyclopts>=4.2.0
@@ -24,6 +24,7 @@ Requires-Dist: gepa>=0.1.1
24
24
  Requires-Dist: httpx<1.0.0,>=0.28.0
25
25
  Requires-Dist: jsonpath-ng>=1.7.0
26
26
  Requires-Dist: jsonref>=1.1.0
27
+ Requires-Dist: jsonschema>=4.26.0
27
28
  Requires-Dist: litellm<=1.84.0,>=1.84.0
28
29
  Requires-Dist: logfire<=3.20.0,>=3.5.3
29
30
  Requires-Dist: loguru>=0.7.3
@@ -42,12 +43,14 @@ Requires-Dist: pyarrow>=4.0.0
42
43
  Requires-Dist: pydantic-xml>=2.14.0
43
44
  Requires-Dist: pydantic<3.0.0,>=2.9.2
44
45
  Requires-Dist: pyyaml>=6.0.2
46
+ Requires-Dist: s3fs<=2025.10.0,>=2025.10.0
45
47
  Requires-Dist: scipy<2.0.0,>=1.11.0
46
48
  Requires-Dist: smithy-aws-core>=0.7.0; python_version >= '3.12'
47
49
  Requires-Dist: soundfile<1.0.0,>=0.13.1
48
50
  Requires-Dist: starlette<1.4.0,>=1.3.1
49
51
  Requires-Dist: textual>=8.0.2
50
52
  Requires-Dist: transformers>=4.57.1
53
+ Requires-Dist: truststore<1.0.0,>=0.10.4
51
54
  Requires-Dist: uvicorn>=0.34.0
52
55
  Requires-Dist: websockets>=14.0
53
56
  Requires-Dist: xmltodict>=1.0.2
@@ -131,24 +134,27 @@ import dreadnode as dn
131
134
 
132
135
  dn.configure()
133
136
 
137
+
134
138
  # Define a tool
135
139
  @dn.tool
136
140
  def search_database(query: str) -> list[str]:
137
141
  """Search the vulnerability database."""
138
142
  return ["CVE-2024-1234", "CVE-2024-5678"]
139
143
 
144
+
140
145
  # Create an agent with tools
141
146
  @dn.agent(model="openai/gpt-4o", tools=[search_database])
142
147
  def security_analyst():
143
148
  """You are a security analyst. Find and analyze vulnerabilities."""
144
149
 
150
+
145
151
  # Run the agent - tracing is automatic
146
152
  async def main():
147
- trajectory = await security_analyst.run(
148
- "Analyze recent vulnerabilities in the database"
149
- )
153
+ trajectory = await security_analyst.run("Analyze recent vulnerabilities in the database")
150
154
 
151
155
  print(f"Completed in {len(trajectory.steps)} steps")
156
+
157
+
152
158
  print(f"Token usage: {trajectory.usage.total_tokens}")
153
159
  ```
154
160
 
@@ -190,12 +196,14 @@ import dreadnode as dn
190
196
  from dreadnode import tool
191
197
  from dreadnode.core.agents.reactions import Finish, Continue
192
198
 
199
+
193
200
  # Tools with type hints
194
201
  @tool
195
202
  def scan_ports(host: str) -> list[int]:
196
203
  """Scan for open ports on a host."""
197
204
  return [22, 80, 443] # Simplified example
198
205
 
206
+
199
207
  # Agent with configuration
200
208
  @dn.agent(
201
209
  model="anthropic/claude-3-5-sonnet",
@@ -205,6 +213,7 @@ def scan_ports(host: str) -> list[int]:
205
213
  def pentester():
206
214
  """You are a penetration tester. Find security issues."""
207
215
 
216
+
208
217
  # Hooks for control flow
209
218
  @pentester.hook
210
219
  async def check_progress(event):
@@ -212,6 +221,7 @@ async def check_progress(event):
212
221
  return Finish("Vulnerability discovered")
213
222
  return Continue()
214
223
 
224
+
215
225
  # Run the agent
216
226
  trajectory = await pentester.run("Test the web application at localhost:8080")
217
227
  print(f"Completed in {len(trajectory.steps)} steps")
@@ -354,6 +364,7 @@ import dreadnode as dn
354
364
  trajectory = await security_analyst.run("Analyze the target")
355
365
  # All steps, tool calls, and generations are traced
356
366
 
367
+
357
368
  # For custom task workflows, use explicit runs
358
369
  @dn.task
359
370
  async def analyze(target: str) -> dict:
@@ -363,6 +374,7 @@ async def analyze(target: str) -> dict:
363
374
  dn.log_metric("quality", 0.95)
364
375
  return result
365
376
 
377
+
366
378
  with dn.run(name="custom-analysis"):
367
379
  await analyze("webapp")
368
380
  ```
@@ -42,24 +42,27 @@ import dreadnode as dn
42
42
 
43
43
  dn.configure()
44
44
 
45
+
45
46
  # Define a tool
46
47
  @dn.tool
47
48
  def search_database(query: str) -> list[str]:
48
49
  """Search the vulnerability database."""
49
50
  return ["CVE-2024-1234", "CVE-2024-5678"]
50
51
 
52
+
51
53
  # Create an agent with tools
52
54
  @dn.agent(model="openai/gpt-4o", tools=[search_database])
53
55
  def security_analyst():
54
56
  """You are a security analyst. Find and analyze vulnerabilities."""
55
57
 
58
+
56
59
  # Run the agent - tracing is automatic
57
60
  async def main():
58
- trajectory = await security_analyst.run(
59
- "Analyze recent vulnerabilities in the database"
60
- )
61
+ trajectory = await security_analyst.run("Analyze recent vulnerabilities in the database")
61
62
 
62
63
  print(f"Completed in {len(trajectory.steps)} steps")
64
+
65
+
63
66
  print(f"Token usage: {trajectory.usage.total_tokens}")
64
67
  ```
65
68
 
@@ -101,12 +104,14 @@ import dreadnode as dn
101
104
  from dreadnode import tool
102
105
  from dreadnode.core.agents.reactions import Finish, Continue
103
106
 
107
+
104
108
  # Tools with type hints
105
109
  @tool
106
110
  def scan_ports(host: str) -> list[int]:
107
111
  """Scan for open ports on a host."""
108
112
  return [22, 80, 443] # Simplified example
109
113
 
114
+
110
115
  # Agent with configuration
111
116
  @dn.agent(
112
117
  model="anthropic/claude-3-5-sonnet",
@@ -116,6 +121,7 @@ def scan_ports(host: str) -> list[int]:
116
121
  def pentester():
117
122
  """You are a penetration tester. Find security issues."""
118
123
 
124
+
119
125
  # Hooks for control flow
120
126
  @pentester.hook
121
127
  async def check_progress(event):
@@ -123,6 +129,7 @@ async def check_progress(event):
123
129
  return Finish("Vulnerability discovered")
124
130
  return Continue()
125
131
 
132
+
126
133
  # Run the agent
127
134
  trajectory = await pentester.run("Test the web application at localhost:8080")
128
135
  print(f"Completed in {len(trajectory.steps)} steps")
@@ -265,6 +272,7 @@ import dreadnode as dn
265
272
  trajectory = await security_analyst.run("Analyze the target")
266
273
  # All steps, tool calls, and generations are traced
267
274
 
275
+
268
276
  # For custom task workflows, use explicit runs
269
277
  @dn.task
270
278
  async def analyze(target: str) -> dict:
@@ -274,6 +282,7 @@ async def analyze(target: str) -> dict:
274
282
  dn.log_metric("quality", 0.95)
275
283
  return result
276
284
 
285
+
277
286
  with dn.run(name="custom-analysis"):
278
287
  await analyze("webapp")
279
288
  ```
@@ -133,6 +133,29 @@ def _is_transient_api_error(error: BaseException) -> bool:
133
133
  return False
134
134
 
135
135
 
136
+ def _is_tool_array_overflow(error: BaseException | None) -> bool:
137
+ """Whether ``error`` is an OpenAI/Azure rejection of too many tools.
138
+
139
+ OpenAI-family endpoints cap the ``tools`` array at 128 and 400 with
140
+ ``code: array_above_max_length`` when it is longer. Anthropic has no
141
+ such cap and never raises this, so matching the provider's own error
142
+ string keeps the prompt-serialized fallback scoped to models that
143
+ actually need it — Claude keeps native tool calling untouched.
144
+ """
145
+ if error is None:
146
+ return False
147
+ text = str(error)
148
+ cause = getattr(error, "__cause__", None) or getattr(error, "__context__", None)
149
+ if cause is not None:
150
+ text += " " + str(cause)
151
+ lowered = text.lower()
152
+ return (
153
+ "array_above_max_length" in lowered
154
+ or ("tools" in lowered and "array too long" in lowered)
155
+ or "maximum length 128" in lowered
156
+ )
157
+
158
+
136
159
  def _replayable(messages: list[Message]) -> list[Message]:
137
160
  """Drop assistant messages that carry nothing worth sending back.
138
161
 
@@ -219,6 +242,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
219
242
 
220
243
  # Private state
221
244
  _generator: Generator | None = PrivateAttr(None, init=False)
245
+ _tool_cap_exceeded: bool = PrivateAttr(False, init=False)
246
+ """Set once the provider has rejected the tool count (>128 for OpenAI/Azure)
247
+ so later turns serialize tools up front instead of retrying a doomed api
248
+ attempt. Write-once True - safe under concurrent run() calls."""
222
249
  _current_input: str = PrivateAttr("", init=False)
223
250
  _capability: tuple[str, str] | None = PrivateAttr(None, init=False)
224
251
  """The (name, version) capability this agent runs under, if any. Bound to
@@ -313,11 +340,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
313
340
  """Get conversation history."""
314
341
  return self.trajectory.messages
315
342
 
316
- def _get_transforms(self) -> list[Transform]:
317
- """Resolve message transforms for the current configuration."""
343
+ def _get_transforms(self, tool_mode: ToolMode | None = None) -> list[Transform]:
344
+ """Resolve message transforms for the current configuration.
345
+
346
+ ``tool_mode`` overrides ``self.tool_mode`` for a single generation
347
+ without mutating shared state - used by the tool-overflow fallback so
348
+ concurrent ``run()`` calls on one Agent don't clobber each other.
349
+ """
350
+ tool_mode = tool_mode if tool_mode is not None else self.tool_mode
318
351
  transforms = []
319
352
  if self.tools:
320
- match self.tool_mode:
353
+ match tool_mode:
321
354
  case "xml":
322
355
  transforms.append(
323
356
  make_tools_to_xml_transform(self.all_tools, add_tool_stop_token=True)
@@ -334,6 +367,49 @@ class Agent(Executor[AgentEvent, Trajectory]):
334
367
 
335
368
  async def _generate(self, messages: list[Message]) -> Chat:
336
369
  """Execute a single LLM generation step."""
370
+ if self.tool_mode == "auto" and self.tools:
371
+ self.tool_mode = (
372
+ "api" if await self.generator.supports_function_calling() else "json-in-xml"
373
+ )
374
+
375
+ # Effective mode is local to this call - never mutate self.tool_mode for
376
+ # the fallback, or concurrent run() calls on one shared Agent (e.g.
377
+ # Evaluation(concurrency > 1)) would clobber each other's mode.
378
+ effective_mode = self.tool_mode
379
+ # Once any turn has hit the provider tool cap, serialize up front on
380
+ # later turns to skip a doomed api attempt. The flag is only ever set
381
+ # True, so concurrent writers are harmless.
382
+ if effective_mode == "api" and self.tools and self._tool_cap_exceeded:
383
+ effective_mode = "json-in-xml"
384
+
385
+ chat = await self._generate_once(messages, effective_mode)
386
+
387
+ # Non-degrading fallback for the OpenAI/Azure 128-tool ceiling.
388
+ # GPT-family endpoints 400 with `array_above_max_length` when the
389
+ # tools array exceeds 128; Claude has no such cap and never hits this.
390
+ # Retry once with prompt-serialized tools so the full tool surface
391
+ # stays available instead of failing the turn. Native api mode is
392
+ # preserved for every model that accepts the tool count. The retry is
393
+ # gated on the call-local ``effective_mode`` so a sibling call that
394
+ # flipped the flag can't make this one skip its own recovery.
395
+ if (
396
+ chat.failed
397
+ and effective_mode == "api"
398
+ and self.tools
399
+ and _is_tool_array_overflow(chat.error)
400
+ ):
401
+ logger.warning(
402
+ "Model '{}' rejected {} tool definitions (over provider cap); "
403
+ "retrying with prompt-serialized tools (json-in-xml)",
404
+ self.generator.model,
405
+ len(self.all_tools),
406
+ )
407
+ self._tool_cap_exceeded = True
408
+ chat = await self._generate_once(messages, "json-in-xml")
409
+
410
+ return chat
411
+
412
+ async def _generate_once(self, messages: list[Message], tool_mode: ToolMode) -> Chat:
337
413
  messages = list(messages)
338
414
  extra = dict(self.generate_params_extra) if self.generate_params_extra else {}
339
415
  params_kwargs: dict[str, t.Any] = {
@@ -344,12 +420,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
344
420
  params_kwargs["extra"] = extra
345
421
  params = GenerateParams(**params_kwargs)
346
422
 
347
- if self.tool_mode == "auto" and self.tools:
348
- self.tool_mode = (
349
- "api" if await self.generator.supports_function_calling() else "json-in-xml"
350
- )
351
-
352
- transforms = self._get_transforms()
423
+ transforms = self._get_transforms(tool_mode)
353
424
  post_transforms: list[PostTransform | None] = []
354
425
  for transform_callback in transforms:
355
426
  messages, params, post_transform = await transform_callback(messages, params)
@@ -468,11 +539,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
468
539
  (name for name, r in hook_reactions.items() if r is winning_reaction), "unknown"
469
540
  )
470
541
 
542
+ reaction_messages: list[Message] = []
543
+ if isinstance(winning_reaction, RetryWithFeedback):
544
+ if winning_reaction.tool_call_id:
545
+ reaction_messages.append(
546
+ Message(
547
+ "tool",
548
+ f"[POLICY DENIED] {winning_reaction.feedback}",
549
+ tool_call_id=winning_reaction.tool_call_id,
550
+ metadata=winning_reaction.metadata,
551
+ )
552
+ )
553
+ else:
554
+ reaction_messages.append(
555
+ Message(
556
+ "user",
557
+ winning_reaction.feedback,
558
+ metadata=winning_reaction.metadata,
559
+ )
560
+ )
561
+
471
562
  async for _event in self._dispatch(
472
563
  ReactStep(
473
564
  agent_id=self.agent_id,
474
565
  hook_name=winning_hook_name,
475
566
  reaction=winning_reaction,
567
+ messages=reaction_messages,
476
568
  )
477
569
  ):
478
570
  yield _event
@@ -483,8 +575,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
483
575
  messages.append(Message("user", winning_reaction.feedback))
484
576
  raise Continue(messages=messages)
485
577
  if isinstance(winning_reaction, RetryWithFeedback):
486
- messages = [Message("user", winning_reaction.feedback)]
487
- raise Retry(messages=messages)
578
+ raise Continue(messages=reaction_messages)
488
579
 
489
580
  raise winning_reaction
490
581
 
@@ -670,6 +761,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
670
761
  agent_name=self.name,
671
762
  tool_call=tool_call,
672
763
  error=NameError(error_msg),
764
+ policy_decision=start_event.policy_decision,
673
765
  )
674
766
  error_event.emit(t_span)
675
767
  async for event in self._dispatch(error_event):
@@ -678,6 +770,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
678
770
  message = Message.from_model(
679
771
  SystemErrorModel(content=f"Tool '{tool_call.name}' not found.")
680
772
  )
773
+ if start_event.policy_decision is not None:
774
+ message.metadata["policy_decision"] = start_event.policy_decision
681
775
 
682
776
  step_event = ToolStep(
683
777
  agent_id=self.agent_id,
@@ -698,6 +792,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
698
792
  try:
699
793
  message, stop = await tool.handle_tool_call(tool_call)
700
794
 
795
+ if start_event.policy_decision is not None:
796
+ message.metadata["policy_decision"] = start_event.policy_decision
797
+
701
798
  # Tools that catch their own exceptions (bash non-zero,
702
799
  # @tool(catch=True), MCP isError) lift the failure into
703
800
  # message.metadata. Surface it on ToolEnd so renderers can
@@ -717,6 +814,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
717
814
  error=tool_error,
718
815
  error_type=tool_error_type,
719
816
  cost_usd=tool_cost_usd,
817
+ policy_decision=start_event.policy_decision,
720
818
  )
721
819
  async for event in self._dispatch(end_event):
722
820
  yield event
@@ -754,6 +852,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
754
852
  status="errored",
755
853
  tool_call=tool_call,
756
854
  error=e,
855
+ policy_decision=start_event.policy_decision,
757
856
  )
758
857
  error_event.emit(t_span)
759
858
  async for event in self._dispatch(error_event):
@@ -1090,11 +1189,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
1090
1189
  """Run all tools and signal completion."""
1091
1190
  nonlocal tool_execution_error
1092
1191
  try:
1192
+ tool_calls = _messages[-1].tool_calls or []
1193
+ item_calls = [tc for tc in tool_calls if tc.name == "report_item"]
1194
+ other_calls = [tc for tc in tool_calls if tc.name != "report_item"]
1195
+
1196
+ async def run_item_tools() -> None:
1197
+ for tool_call in item_calls:
1198
+ await run_tool_with_queue(tool_call)
1199
+
1093
1200
  await asyncio.gather(
1094
- *[
1095
- run_tool_with_queue(tc)
1096
- for tc in (_messages[-1].tool_calls or [])
1097
- ]
1201
+ *(run_tool_with_queue(tc) for tc in other_calls),
1202
+ run_item_tools(),
1098
1203
  )
1099
1204
  except Exception as exc:
1100
1205
  tool_execution_error = exc
@@ -1116,9 +1221,21 @@ class Agent(Executor[AgentEvent, Trajectory]):
1116
1221
  stopped_by_tool_call = event.tool_call
1117
1222
 
1118
1223
  await tools_task # Ensure task completes
1119
- if tool_execution_error is not None:
1120
- _raise_exception(tool_execution_error)
1224
+ # Always preserve completed tool results — even when
1225
+ # one tool was denied, other tools may have finished
1226
+ # and their results must stay in the conversation.
1121
1227
  messages.extend(tool_messages)
1228
+ # A hook retry or continuation (including a ScopeGuard
1229
+ # denial) still completes this generation boundary. Defer
1230
+ # that reaction until after GenerationStep so the assistant
1231
+ # tool call is persisted and can be paired with feedback.
1232
+ deferred_reaction = (
1233
+ tool_execution_error
1234
+ if isinstance(tool_execution_error, (Continue, Retry))
1235
+ else None
1236
+ )
1237
+ if tool_execution_error is not None and deferred_reaction is None:
1238
+ _raise_exception(tool_execution_error)
1122
1239
 
1123
1240
  # Emit GenerationEnd AFTER tools (closes generation span)
1124
1241
  gen_end = GenerationEnd(
@@ -1158,6 +1275,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
1158
1275
  yield event
1159
1276
  gen_event.emit(gen_span) # Emit after dispatch - metrics attached
1160
1277
 
1278
+ if deferred_reaction is not None:
1279
+ _raise_exception(deferred_reaction)
1280
+
1161
1281
  if stopped_by_tool_call:
1162
1282
  _raise_exception(
1163
1283
  Finish(
@@ -456,6 +456,7 @@ class ToolStart(AgentEvent):
456
456
  """
457
457
 
458
458
  tool_call: ToolCall
459
+ policy_decision: dict[str, t.Any] | None = None
459
460
 
460
461
  def _get_data(self) -> dict[str, t.Any]:
461
462
  try:
@@ -468,6 +469,7 @@ class ToolStart(AgentEvent):
468
469
  "name": self.tool_call.name,
469
470
  "arguments": args,
470
471
  },
472
+ "policy_decision": self.policy_decision,
471
473
  }
472
474
 
473
475
  def __repr__(self) -> str:
@@ -542,6 +544,7 @@ class ToolEnd(AgentEvent):
542
544
  error: str | None = None
543
545
  error_type: str | None = None
544
546
  cost_usd: float | None = None
547
+ policy_decision: dict[str, t.Any] | None = None
545
548
  """Estimated USD cost contributed by this tool call, when the tool
546
549
  ran an internal LLM (e.g. ``spawn_agent``). ``None`` for ordinary
547
550
  tools — the TUI only accumulates this into the sub-agent cost
@@ -559,6 +562,7 @@ class ToolEnd(AgentEvent):
559
562
  "error": self.error,
560
563
  "error_type": self.error_type,
561
564
  "cost_usd": self.cost_usd,
565
+ "policy_decision": self.policy_decision,
562
566
  }
563
567
 
564
568
  def __repr__(self) -> str:
@@ -605,6 +609,7 @@ class ToolError(AgentEvent):
605
609
 
606
610
  tool_call: ToolCall
607
611
  error: SerializableError
612
+ policy_decision: dict[str, t.Any] | None = None
608
613
 
609
614
  def _get_data(self) -> dict[str, t.Any]:
610
615
  return {
@@ -614,6 +619,7 @@ class ToolError(AgentEvent):
614
619
  },
615
620
  "error": str(self.error),
616
621
  "error_type": type(self.error).__name__,
622
+ "policy_decision": self.policy_decision,
617
623
  }
618
624
 
619
625
  def emit(self, span: "TaskSpan") -> None:
@@ -1005,10 +1011,17 @@ class ReactStep(AgentStep):
1005
1011
  reaction_data["type"] = type(self.reaction).__name__
1006
1012
  if hasattr(self.reaction, "feedback"):
1007
1013
  reaction_data["feedback"] = self.reaction.feedback
1014
+ if hasattr(self.reaction, "tool_call_id"):
1015
+ reaction_data["tool_call_id"] = self.reaction.tool_call_id
1016
+ if hasattr(self.reaction, "metadata"):
1017
+ reaction_data["metadata"] = self.reaction.metadata
1008
1018
  if hasattr(self.reaction, "reason"):
1009
1019
  reaction_data["reason"] = self.reaction.reason
1010
1020
  if hasattr(self.reaction, "error"):
1011
- reaction_data["error"] = str(self.reaction.error)
1021
+ error = self.reaction.error
1022
+ reaction_data["error"] = str(error)
1023
+ if isinstance(error, BaseException):
1024
+ reaction_data["error_type"] = type(error).__name__
1012
1025
  return {
1013
1026
  "hook_name": self.hook_name,
1014
1027
  "reaction": reaction_data,