dreadnode 2.0.38__tar.gz → 2.0.41__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 (731) hide show
  1. {dreadnode-2.0.38 → dreadnode-2.0.41}/PKG-INFO +18 -6
  2. {dreadnode-2.0.38 → dreadnode-2.0.41}/README.md +12 -3
  3. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/agent.py +158 -64
  4. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/events.py +14 -1
  5. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/hooks.py +169 -9
  6. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/process_judge.py +32 -8
  7. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/reactions.py +2 -0
  8. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/tools.py +3 -2
  9. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/trajectory.py +53 -2
  10. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/client.py +363 -8
  11. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/models.py +40 -1
  12. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/airt.py +36 -41
  13. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/args.py +1 -1
  14. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/capability.py +146 -25
  15. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/evaluation.py +24 -16
  16. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/main.py +2 -1
  17. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/runtime.py +265 -46
  18. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/shared.py +248 -4
  19. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/task.py +149 -18
  20. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/task_set.py +192 -7
  21. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/interactive.py +13 -0
  22. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/managed_client.py +16 -20
  23. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/runtime_client.py +115 -58
  24. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/main.py +2 -0
  25. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/app.py +202 -47
  26. dreadnode-2.0.41/dreadnode/app/server/auth.py +119 -0
  27. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/capability_manager.py +1 -1
  28. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/model_resolution.py +9 -1
  29. dreadnode-2.0.41/dreadnode/app/server/runtime_credentials.py +314 -0
  30. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/session_hydrator.py +25 -0
  31. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/websocket.py +65 -96
  32. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/worker_manager.py +27 -5
  33. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/ws_auth.py +4 -11
  34. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/app.py +123 -7
  35. dreadnode-2.0.41/dreadnode/app/tui/bug_report.py +489 -0
  36. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/command_dispatcher.py +3 -0
  37. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/commands.py +1 -0
  38. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/dreadnode.tcss +42 -0
  39. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/error_handler.py +4 -0
  40. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/profile_manager.py +15 -3
  41. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screen_router.py +68 -0
  42. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/__init__.py +2 -0
  43. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/auth.py +81 -17
  44. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/capabilities.py +14 -9
  45. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/capability_docs.py +10 -0
  46. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/connection_error.py +3 -1
  47. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/console.py +10 -0
  48. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/environments.py +2 -0
  49. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/evaluations.py +2 -0
  50. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/readme.py +10 -0
  51. dreadnode-2.0.41/dreadnode/app/tui/screens/report_bug.py +429 -0
  52. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/runtimes.py +54 -104
  53. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/sandboxes.py +2 -0
  54. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/secrets.py +7 -0
  55. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/services.py +20 -1
  56. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/sessions.py +10 -4
  57. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/traces.py +7 -0
  58. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/sessions_manager.py +155 -4
  59. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_reducer.py +50 -5
  60. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/context_bar.py +4 -2
  61. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/conversation.py +3 -1
  62. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/header_bar.py +2 -1
  63. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/help_panel.py +14 -2
  64. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/prompt_info.py +2 -1
  65. dreadnode-2.0.41/dreadnode/app/tui/widgets/scope_modal.py +401 -0
  66. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tool.py +13 -0
  67. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/wire_events.py +49 -1
  68. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -1
  69. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +2 -2
  70. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +1 -1
  71. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +1 -1
  72. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  73. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +230 -0
  74. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +15 -3
  75. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +11 -1
  76. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +1 -1
  77. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +13 -3
  78. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +3 -3
  79. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +6 -6
  80. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +128 -0
  81. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +10 -5
  82. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +2 -2
  83. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +13 -1
  84. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +24 -8
  85. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +2 -0
  86. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +12 -6
  87. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +38 -0
  88. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +2 -12
  89. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +170 -0
  90. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +177 -0
  91. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +9 -3
  92. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +17 -9
  93. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +5 -9
  94. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +16 -7
  95. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +3 -0
  96. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +16 -4
  97. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +12 -12
  98. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +4 -8
  99. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
  100. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +2 -2
  101. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +6 -4
  102. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +78 -0
  103. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +2 -0
  104. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +113 -0
  105. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -1
  106. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +126 -0
  107. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +18 -18
  108. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +10 -2
  109. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +4 -4
  110. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +5 -1
  111. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +94 -0
  112. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +4 -0
  113. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +76 -0
  114. dreadnode-2.0.41/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +43 -0
  115. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/loader.py +20 -2
  116. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/sync.py +6 -0
  117. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/log.py +61 -19
  118. dreadnode-2.0.41/dreadnode/core/tls.py +124 -0
  119. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/audio.py +6 -5
  120. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/litellm_.py +167 -16
  121. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/config.py +66 -25
  122. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/jobs.py +18 -6
  123. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/manifest.py +4 -3
  124. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/oci.py +36 -4
  125. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/__init__.py +16 -5
  126. dreadnode-2.0.41/dreadnode/policies/guard.py +240 -0
  127. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/rubrics/process/default.yaml +11 -6
  128. dreadnode-2.0.41/dreadnode/policies/scope.py +633 -0
  129. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/__init__.py +6 -1
  130. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/dreadnode_cli.py +14 -3
  131. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/report_items.py +574 -60
  132. dreadnode-2.0.41/dreadnode/tools/submission.py +225 -0
  133. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/exporter.py +4 -2
  134. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/span.py +5 -3
  135. {dreadnode-2.0.38 → dreadnode-2.0.41}/pyproject.toml +21 -3
  136. dreadnode-2.0.38/dreadnode/app/server/auth.py +0 -120
  137. dreadnode-2.0.38/dreadnode/app/server/runtime_token.py +0 -395
  138. dreadnode-2.0.38/dreadnode/app/tui/runtime_cache.py +0 -97
  139. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -144
  140. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -94
  141. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -136
  142. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -96
  143. dreadnode-2.0.38/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -83
  144. dreadnode-2.0.38/dreadnode/policies/guard.py +0 -193
  145. {dreadnode-2.0.38 → dreadnode-2.0.41}/.gitignore +0 -0
  146. {dreadnode-2.0.38 → dreadnode-2.0.41}/LICENSE +0 -0
  147. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/__init__.py +0 -0
  148. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/__main__.py +0 -0
  149. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/__init__.py +0 -0
  150. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/AGENTS.md +0 -0
  151. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/__init__.py +0 -0
  152. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/base.py +0 -0
  153. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/claude_code.py +0 -0
  154. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/engines/native.py +0 -0
  155. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/exceptions.py +0 -0
  156. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/format.py +0 -0
  157. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/judge.py +0 -0
  158. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/__init__.py +0 -0
  159. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/auth.py +0 -0
  160. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/client.py +0 -0
  161. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/config.py +0 -0
  162. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/mcp/server.py +0 -0
  163. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/sanitize.py +0 -0
  164. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/skills.py +0 -0
  165. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/stopping.py +0 -0
  166. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/subagent.py +0 -0
  167. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/agents/tool_resolution.py +0 -0
  168. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/__init__.py +0 -0
  169. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/_base.py +0 -0
  170. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/adversarial_reasoning.py +0 -0
  171. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/advpromptier.py +0 -0
  172. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/alignment_faking.py +0 -0
  173. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analogy_escalation.py +0 -0
  174. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/__init__.py +0 -0
  175. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/aggregator.py +0 -0
  176. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/classifier.py +0 -0
  177. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/compliance.py +0 -0
  178. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/engine.py +0 -0
  179. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/recommendations.py +0 -0
  180. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/analytics/types.py +0 -0
  181. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/aprt_progressive.py +0 -0
  182. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/art_engine.py +0 -0
  183. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/assessment.py +0 -0
  184. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/__init__.py +0 -0
  185. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/defense.py +0 -0
  186. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/failure.py +0 -0
  187. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/gate.py +0 -0
  188. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/memory.py +0 -0
  189. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/modes.py +0 -0
  190. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/probes.py +0 -0
  191. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/recon.py +0 -0
  192. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/router.py +0 -0
  193. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/atlas/strategy.py +0 -0
  194. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/attention_shifting.py +0 -0
  195. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/autodan_turbo.py +0 -0
  196. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/autoredteamer.py +0 -0
  197. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/beast.py +0 -0
  198. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/__init__.py +0 -0
  199. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/atlas.py +0 -0
  200. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/nist.py +0 -0
  201. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/owasp.py +0 -0
  202. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  203. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/compliance/saif.py +0 -0
  204. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/constants.py +0 -0
  205. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/cot_jailbreak.py +0 -0
  206. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/crescendo.py +0 -0
  207. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/__init__.py +0 -0
  208. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  209. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  210. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/assets/image/meth.png +0 -0
  211. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  212. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  213. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  214. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  215. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  216. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  217. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  218. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  219. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  220. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  221. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  222. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  223. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  224. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  225. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  226. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  227. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  228. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  229. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/deep_inception.py +0 -0
  230. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/drattack.py +0 -0
  231. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/echo_chamber.py +0 -0
  232. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/__init__.py +0 -0
  233. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/_base.py +0 -0
  234. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/_text_common.py +0 -0
  235. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/bae.py +0 -0
  236. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/boundary.py +0 -0
  237. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  238. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  239. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/pwws.py +0 -0
  240. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/simba.py +0 -0
  241. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/square.py +0 -0
  242. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/text.py +0 -0
  243. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/textbugger.py +0 -0
  244. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/textfooler.py +0 -0
  245. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/evasion/zoo.py +0 -0
  246. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/events.py +0 -0
  247. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/__init__.py +0 -0
  248. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/_base.py +0 -0
  249. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/activethief.py +0 -0
  250. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/copycat.py +0 -0
  251. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/distillation.py +0 -0
  252. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/equation_solving.py +0 -0
  253. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/jacobian.py +0 -0
  254. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/extraction/knockoff.py +0 -0
  255. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/genetic_persona.py +0 -0
  256. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/goat.py +0 -0
  257. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/goat_v2.py +0 -0
  258. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/gptfuzzer.py +0 -0
  259. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/humor_bypass.py +0 -0
  260. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/image.py +0 -0
  261. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/__init__.py +0 -0
  262. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/_base.py +0 -0
  263. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/confidence.py +0 -0
  264. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  265. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/j2_meta.py +0 -0
  266. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/jbdistill.py +0 -0
  267. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/jbfuzz.py +0 -0
  268. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/lrm_autonomous.py +0 -0
  269. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/mapf.py +0 -0
  270. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/__init__.py +0 -0
  271. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/_base.py +0 -0
  272. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/entropy.py +0 -0
  273. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/label_only.py +0 -0
  274. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/lira.py +0 -0
  275. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/loss.py +0 -0
  276. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/shadow_model.py +0 -0
  277. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/membership/threshold.py +0 -0
  278. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/message_parts.py +0 -0
  279. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/model_export.py +0 -0
  280. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/multimodal.py +0 -0
  281. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/nexus.py +0 -0
  282. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/pair.py +0 -0
  283. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/persona_hijack.py +0 -0
  284. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/prompt.py +0 -0
  285. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/quantization_safety.py +0 -0
  286. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/rainbow.py +0 -0
  287. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/refusal_aware.py +0 -0
  288. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/renellm.py +0 -0
  289. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/__init__.py +0 -0
  290. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/json_report.py +0 -0
  291. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/llm_summary.py +0 -0
  292. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reporting/markdown.py +0 -0
  293. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/reward_hacking.py +0 -0
  294. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/salami_slicing.py +0 -0
  295. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/self_persuasion.py +0 -0
  296. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/siren.py +0 -0
  297. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/tap.py +0 -0
  298. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/target.py +0 -0
  299. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/__init__.py +0 -0
  300. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/auth.py +0 -0
  301. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/factory.py +0 -0
  302. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/http.py +0 -0
  303. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/message.py +0 -0
  304. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/prediction.py +0 -0
  305. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/spec.py +0 -0
  306. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  307. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  308. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/templatefuzz.py +0 -0
  309. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/tmap_trajectory.py +0 -0
  310. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/trojail.py +0 -0
  311. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/airt/watermark_removal.py +0 -0
  312. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/__init__.py +0 -0
  313. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/api/__init__.py +0 -0
  314. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/__init__.py +0 -0
  315. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/dataset.py +0 -0
  316. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/environment.py +0 -0
  317. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/inference_model.py +0 -0
  318. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/judge.py +0 -0
  319. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/model.py +0 -0
  320. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/optimize.py +0 -0
  321. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/sandbox.py +0 -0
  322. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/secret.py +0 -0
  323. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/session.py +0 -0
  324. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/__init__.py +0 -0
  325. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  326. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  327. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  328. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  329. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  330. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  331. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  332. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  333. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  334. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/train.py +0 -0
  335. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/cli/worlds.py +0 -0
  336. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/__init__.py +0 -0
  337. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/models.py +0 -0
  338. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/client/transports.py +0 -0
  339. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/config.py +0 -0
  340. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/env.py +0 -0
  341. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/model_catalog.py +0 -0
  342. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/paths.py +0 -0
  343. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/print_mode.py +0 -0
  344. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/__init__.py +0 -0
  345. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/prompt.py +0 -0
  346. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/prompt_registry.py +0 -0
  347. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/runtime_events.py +0 -0
  348. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/session_persistence.py +0 -0
  349. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/turn_coordinator.py +0 -0
  350. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/server/utils.py +0 -0
  351. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/__init__.py +0 -0
  352. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/auth_flow.py +0 -0
  353. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/capabilities_manager.py +0 -0
  354. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/connection.py +0 -0
  355. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/model_manager.py +0 -0
  356. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/model_variants.py +0 -0
  357. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/base.py +0 -0
  358. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/models.py +0 -0
  359. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  360. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  361. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/screens/workspaces.py +0 -0
  362. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/spans_reader.py +0 -0
  363. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/status_messages.py +0 -0
  364. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/theme.py +0 -0
  365. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/tool_format.py +0 -0
  366. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_coordinator.py +0 -0
  367. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  368. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/turn_state_phase.py +0 -0
  369. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/update_check.py +0 -0
  370. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/__init__.py +0 -0
  371. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  372. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  373. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/composer.py +0 -0
  374. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  375. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/flash.py +0 -0
  376. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  377. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  378. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  379. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  380. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  381. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  382. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  383. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  384. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  385. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  386. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  387. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  388. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/throbber.py +0 -0
  389. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  390. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  391. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/welcome.py +0 -0
  392. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/app/tui/widgets/whoami.py +0 -0
  393. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/__init__.py +0 -0
  394. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  395. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  396. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  397. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  398. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  399. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  400. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  401. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  402. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  403. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  404. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  405. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  406. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  407. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  408. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  409. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  410. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  411. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  412. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  413. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  414. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  415. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  416. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  417. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  418. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  419. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  420. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  421. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  422. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  423. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  424. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  425. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +0 -0
  426. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  427. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  428. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  429. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +0 -0
  430. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  431. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  432. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  433. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  434. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  435. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  436. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  437. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  438. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  439. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  440. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  441. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  442. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  443. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  444. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  445. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  446. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  447. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  448. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  449. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/__init__.py +0 -0
  450. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/capability.py +0 -0
  451. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/flags.py +0 -0
  452. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/install.py +0 -0
  453. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/tool_rules.py +0 -0
  454. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/types.py +0 -0
  455. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/worker.py +0 -0
  456. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/capabilities/worker_runner.py +0 -0
  457. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/__init__.py +0 -0
  458. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/conditions.py +0 -0
  459. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/discovery.py +0 -0
  460. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/environment.py +0 -0
  461. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/exceptions.py +0 -0
  462. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/execution.py +0 -0
  463. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/hook.py +0 -0
  464. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/judge.py +0 -0
  465. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/load.py +0 -0
  466. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/__init__.py +0 -0
  467. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/config.py +0 -0
  468. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/context.py +0 -0
  469. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/hydrate.py +0 -0
  470. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/meta/introspect.py +0 -0
  471. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/metric.py +0 -0
  472. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/object.py +0 -0
  473. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/scorer.py +0 -0
  474. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/serialization.py +0 -0
  475. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/stopping.py +0 -0
  476. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/task.py +0 -0
  477. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/templating.py +0 -0
  478. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/transforms.py +0 -0
  479. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/__init__.py +0 -0
  480. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/base.py +0 -0
  481. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/common.py +0 -0
  482. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/image.py +0 -0
  483. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/object_3d.py +0 -0
  484. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/table.py +0 -0
  485. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/text.py +0 -0
  486. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/types/video.py +0 -0
  487. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/core/util.py +0 -0
  488. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/__init__.py +0 -0
  489. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/dataset.py +0 -0
  490. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/hf.py +0 -0
  491. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/datasets/local.py +0 -0
  492. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/__init__.py +0 -0
  493. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/console.py +0 -0
  494. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/evaluation.py +0 -0
  495. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/events.py +0 -0
  496. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/format.py +0 -0
  497. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/result.py +0 -0
  498. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/evaluations/sample.py +0 -0
  499. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/__init__.py +0 -0
  500. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/caching.py +0 -0
  501. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/chat.py +0 -0
  502. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/data.py +0 -0
  503. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/exceptions.py +0 -0
  504. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/__init__.py +0 -0
  505. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/base.py +0 -0
  506. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/http.py +0 -0
  507. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/transformers_.py +0 -0
  508. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/generator/vllm_.py +0 -0
  509. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/message.py +0 -0
  510. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/models.py +0 -0
  511. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/parsing.py +0 -0
  512. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/proxy.py +0 -0
  513. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/__init__.py +0 -0
  514. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/base.py +0 -0
  515. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  516. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/generators/utils.py +0 -0
  517. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/__init__.py +0 -0
  518. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/items/models.py +0 -0
  519. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/__init__.py +0 -0
  520. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/outcome.py +0 -0
  521. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/trajectory.py +0 -0
  522. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/judges/trajectory_tools.py +0 -0
  523. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/__init__.py +0 -0
  524. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/hf.py +0 -0
  525. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/local.py +0 -0
  526. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/models/model.py +0 -0
  527. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/__init__.py +0 -0
  528. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/__init__.py +0 -0
  529. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  530. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/agent.py +0 -0
  531. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/env.py +0 -0
  532. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/runtime.py +0 -0
  533. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/adapters/stack.py +0 -0
  534. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/api.py +0 -0
  535. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/__init__.py +0 -0
  536. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/base.py +0 -0
  537. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/backends/gepa.py +0 -0
  538. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/collectors.py +0 -0
  539. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/config.py +0 -0
  540. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/console.py +0 -0
  541. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/events.py +0 -0
  542. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/format.py +0 -0
  543. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/result.py +0 -0
  544. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/sampler.py +0 -0
  545. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/sampling.py +0 -0
  546. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/search.py +0 -0
  547. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/stopping.py +0 -0
  548. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/study.py +0 -0
  549. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/optimization/trial.py +0 -0
  550. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/__init__.py +0 -0
  551. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/loader.py +0 -0
  552. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/package.py +0 -0
  553. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/packaging/task_validation.py +0 -0
  554. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/policies/reconciliation.py +0 -0
  555. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/py.typed +0 -0
  556. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/__init__.py +0 -0
  557. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/boundary.py +0 -0
  558. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/fuzzing.py +0 -0
  559. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/graph.py +0 -0
  560. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/grid.py +0 -0
  561. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/image.py +0 -0
  562. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/mapelites.py +0 -0
  563. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/optuna.py +0 -0
  564. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/random.py +0 -0
  565. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/registry.py +0 -0
  566. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/samplers/strategy.py +0 -0
  567. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/__init__.py +0 -0
  568. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  569. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agent_security.py +0 -0
  570. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agentic.py +0 -0
  571. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/agentic_workflow.py +0 -0
  572. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/attack_outcome.py +0 -0
  573. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/classification.py +0 -0
  574. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/consistency.py +0 -0
  575. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/contains.py +0 -0
  576. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/cosine_sim.py +0 -0
  577. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/credentials.py +0 -0
  578. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/crucible.py +0 -0
  579. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/documentation_security.py +0 -0
  580. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/exfiltration_detection.py +0 -0
  581. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/format.py +0 -0
  582. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/harm.py +0 -0
  583. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/ide_security.py +0 -0
  584. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/image.py +0 -0
  585. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/json.py +0 -0
  586. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/judge.py +0 -0
  587. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/judge_ensemble.py +0 -0
  588. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/length.py +0 -0
  589. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/lexical.py +0 -0
  590. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/mcp_security.py +0 -0
  591. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/memorization.py +0 -0
  592. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/multi_agent_security.py +0 -0
  593. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/pii.py +0 -0
  594. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/prompt_leak.py +0 -0
  595. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/readability.py +0 -0
  596. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/reasoning_security.py +0 -0
  597. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/sentiment.py +0 -0
  598. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/similarity.py +0 -0
  599. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/structural_detection.py +0 -0
  600. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/scorers/supply_chain_detection.py +0 -0
  601. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/__init__.py +0 -0
  602. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/providers.py +0 -0
  603. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/session_store.py +0 -0
  604. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/storage/storage.py +0 -0
  605. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/_ripgrep.py +0 -0
  606. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/apply_patch.py +0 -0
  607. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/editing.py +0 -0
  608. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/execute.py +0 -0
  609. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/fetch.py +0 -0
  610. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/glob.py +0 -0
  611. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/grep.py +0 -0
  612. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/interaction.py +0 -0
  613. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/ls.py +0 -0
  614. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/memory.py +0 -0
  615. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/project_memory.py +0 -0
  616. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/read.py +0 -0
  617. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/report.py +0 -0
  618. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/task.py +0 -0
  619. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/think.py +0 -0
  620. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/todo.py +0 -0
  621. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/trajectory_search.py +0 -0
  622. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/web_extract.py +0 -0
  623. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/web_search.py +0 -0
  624. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tools/write.py +0 -0
  625. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/__init__.py +0 -0
  626. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/constants.py +0 -0
  627. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/convert.py +0 -0
  628. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/exporters.py +0 -0
  629. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/spans.py +0 -0
  630. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/tracing/trace_converter.py +0 -0
  631. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/__init__.py +0 -0
  632. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/_progress.py +0 -0
  633. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/base.py +0 -0
  634. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/dpo.py +0 -0
  635. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/env_rollouts.py +0 -0
  636. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/__init__.py +0 -0
  637. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/_common.py +0 -0
  638. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/rl.py +0 -0
  639. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/sft.py +0 -0
  640. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/etl/worlds.py +0 -0
  641. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/events.py +0 -0
  642. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/grpo.py +0 -0
  643. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/jobs.py +0 -0
  644. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/models.py +0 -0
  645. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ppo.py +0 -0
  646. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/prime.py +0 -0
  647. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/__init__.py +0 -0
  648. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/async_trainer.py +0 -0
  649. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/config.py +0 -0
  650. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/coordinator.py +0 -0
  651. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/distributed.py +0 -0
  652. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/dpo.py +0 -0
  653. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/experience.py +0 -0
  654. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  655. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/inference.py +0 -0
  656. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/learner.py +0 -0
  657. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/multi_turn.py +0 -0
  658. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/ppo.py +0 -0
  659. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/reward_model.py +0 -0
  660. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/rollout_env.py +0 -0
  661. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/rollout_worker.py +0 -0
  662. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/sft.py +0 -0
  663. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/ray/trainer.py +0 -0
  664. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/recipes.py +0 -0
  665. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/__init__.py +0 -0
  666. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/aggregator.py +0 -0
  667. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/functions.py +0 -0
  668. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  669. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/shaping.py +0 -0
  670. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rewards/types.py +0 -0
  671. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/__init__.py +0 -0
  672. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/adapters.py +0 -0
  673. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  674. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/orchestrator.py +0 -0
  675. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/types.py +0 -0
  676. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/rollouts/worlds.py +0 -0
  677. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/serving/__init__.py +0 -0
  678. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/serving/vllm_client.py +0 -0
  679. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/sft.py +0 -0
  680. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/__init__.py +0 -0
  681. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/config.py +0 -0
  682. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/data.py +0 -0
  683. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/renderer.py +0 -0
  684. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/rl.py +0 -0
  685. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker/trainer.py +0 -0
  686. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/tinker_sft.py +0 -0
  687. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/training/utils.py +0 -0
  688. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/__init__.py +0 -0
  689. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  690. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/adversarial_suffix.py +0 -0
  691. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/agent_skill.py +0 -0
  692. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/agentic_workflow.py +0 -0
  693. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/audio.py +0 -0
  694. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/backdoor_finetune.py +0 -0
  695. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  696. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/cipher.py +0 -0
  697. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/competitive_parity.py +0 -0
  698. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/constitutional.py +0 -0
  699. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/document.py +0 -0
  700. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/documentation_poison.py +0 -0
  701. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/encoding.py +0 -0
  702. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/exfiltration.py +0 -0
  703. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/flip_attack.py +0 -0
  704. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/guardrail_bypass.py +0 -0
  705. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/ide_injection.py +0 -0
  706. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/image.py +0 -0
  707. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/injection.py +0 -0
  708. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/json_tools.py +0 -0
  709. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/language.py +0 -0
  710. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/logic_bomb.py +0 -0
  711. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/mcp_attacks.py +0 -0
  712. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  713. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/multimodal_attacks.py +0 -0
  714. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/persuasion.py +0 -0
  715. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/perturbation.py +0 -0
  716. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/pii_extraction.py +0 -0
  717. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/pythonic_tools.py +0 -0
  718. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/rag_poisoning.py +0 -0
  719. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/reasoning_attacks.py +0 -0
  720. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/refine.py +0 -0
  721. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/response_steering.py +0 -0
  722. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/structural_exploits.py +0 -0
  723. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/stylistic.py +0 -0
  724. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/substitution.py +0 -0
  725. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/supply_chain.py +0 -0
  726. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/swap.py +0 -0
  727. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  728. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/text.py +0 -0
  729. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/video.py +0 -0
  730. {dreadnode-2.0.38 → dreadnode-2.0.41}/dreadnode/transforms/xml_tools.py +0 -0
  731. {dreadnode-2.0.38 → dreadnode-2.0.41}/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.41
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
  ```
@@ -85,54 +85,53 @@ def _raise_exception(error: BaseException) -> t.NoReturn:
85
85
  raise error
86
86
 
87
87
 
88
- _TRANSIENT_LITELLM_EXCEPTION_NAMES: tuple[str, ...] = (
89
- "RateLimitError",
90
- "Timeout",
91
- "APIConnectionError",
92
- "APIConnectionTimeoutError",
93
- "ServiceUnavailableError",
94
- "InternalServerError",
95
- "BadGatewayError",
96
- "APIError",
97
- )
98
-
99
-
100
- def _is_transient_api_error(error: BaseException) -> bool:
101
- """Classify an error as a transient LLM API failure worth retrying.
88
+ def _is_retry_safe_api_error(error: BaseException) -> bool:
89
+ """Return whether an LLM API failure is safe to send again.
102
90
 
103
- Matches an explicit allow-list of ``litellm.exceptions`` classes that
104
- represent recoverable conditions: rate limits, timeouts, connection
105
- failures, and 5xx responses. Notably **does not** match
106
- ``BadRequestError``, ``AuthenticationError``,
107
- ``ContextWindowExceededError`` (handled by overflow recovery), or other
108
- deterministic client errors.
109
-
110
- The allow-list is walked dynamically because ``litellm.exceptions`` does
111
- not expose a single common ancestor for its transient exceptions.
112
- Returns ``False`` if ``litellm`` is not importable.
91
+ Only explicit 429 admission failures are retryable. Timeouts, connection
92
+ failures, interrupted streams, and 5xx responses are ambiguous because the
93
+ provider may still be working on the original request.
113
94
  """
114
95
  with contextlib.suppress(ImportError):
115
96
  import litellm.exceptions as _litellm_exc
116
97
 
117
- classes = tuple(
118
- cls
119
- for name in _TRANSIENT_LITELLM_EXCEPTION_NAMES
120
- if (cls := getattr(_litellm_exc, name, None)) is not None
121
- )
122
- if classes and isinstance(error, classes):
98
+ rate_limit_cls = getattr(_litellm_exc, "RateLimitError", None)
99
+ if (
100
+ rate_limit_cls is not None
101
+ and isinstance(error, rate_limit_cls)
102
+ and getattr(error, "status_code", None) == 429
103
+ ):
123
104
  # OpenAI returns 429 with code "insufficient_quota" when the
124
105
  # account is out of credits — a permanent billing condition,
125
106
  # not a rate limit. litellm packs the provider body into the
126
107
  # message verbatim, so substring-match to exclude.
127
- rate_limit_cls = getattr(_litellm_exc, "RateLimitError", None)
128
- return not (
129
- rate_limit_cls is not None
130
- and isinstance(error, rate_limit_cls)
131
- and "insufficient_quota" in str(error)
132
- )
108
+ return "insufficient_quota" not in str(error)
133
109
  return False
134
110
 
135
111
 
112
+ def _is_tool_array_overflow(error: BaseException | None) -> bool:
113
+ """Whether ``error`` is an OpenAI/Azure rejection of too many tools.
114
+
115
+ OpenAI-family endpoints cap the ``tools`` array at 128 and 400 with
116
+ ``code: array_above_max_length`` when it is longer. Anthropic has no
117
+ such cap and never raises this, so matching the provider's own error
118
+ string keeps the prompt-serialized fallback scoped to models that
119
+ actually need it — Claude keeps native tool calling untouched.
120
+ """
121
+ if error is None:
122
+ return False
123
+ text = str(error)
124
+ cause = getattr(error, "__cause__", None) or getattr(error, "__context__", None)
125
+ if cause is not None:
126
+ text += " " + str(cause)
127
+ lowered = text.lower()
128
+ return (
129
+ "array_above_max_length" in lowered
130
+ or ("tools" in lowered and "array too long" in lowered)
131
+ or "maximum length 128" in lowered
132
+ )
133
+
134
+
136
135
  def _replayable(messages: list[Message]) -> list[Message]:
137
136
  """Drop assistant messages that carry nothing worth sending back.
138
137
 
@@ -205,9 +204,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
205
204
  generate_params_extra: dict[str, t.Any] = Config(default_factory=dict)
206
205
  """Extra parameters merged into GenerateParams for every generation (e.g. thinking config)."""
207
206
  backoff_max_tries: int = Config(default=8, ge=0)
208
- """Maximum retries on transient LLM API errors per step. ``0`` disables retry."""
207
+ """Maximum retries on retry-safe LLM admission failures per step. ``0`` disables retry."""
209
208
  backoff_max_time: float = Config(default=300.0, ge=0)
210
- """Maximum total seconds to spend retrying transient LLM API errors per step."""
209
+ """Maximum total seconds to spend on retry-safe LLM attempts per step."""
211
210
  backoff_base_factor: float = Config(default=1.0, ge=0)
212
211
  """Base factor for exponential backoff: wait = base_factor * 2 ** (attempt - 1)."""
213
212
  backoff_jitter: bool = Config(default=True)
@@ -219,6 +218,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
219
218
 
220
219
  # Private state
221
220
  _generator: Generator | None = PrivateAttr(None, init=False)
221
+ _tool_cap_exceeded: bool = PrivateAttr(False, init=False)
222
+ """Set once the provider has rejected the tool count (>128 for OpenAI/Azure)
223
+ so later turns serialize tools up front instead of retrying a doomed api
224
+ attempt. Write-once True - safe under concurrent run() calls."""
222
225
  _current_input: str = PrivateAttr("", init=False)
223
226
  _capability: tuple[str, str] | None = PrivateAttr(None, init=False)
224
227
  """The (name, version) capability this agent runs under, if any. Bound to
@@ -313,11 +316,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
313
316
  """Get conversation history."""
314
317
  return self.trajectory.messages
315
318
 
316
- def _get_transforms(self) -> list[Transform]:
317
- """Resolve message transforms for the current configuration."""
319
+ def _get_transforms(self, tool_mode: ToolMode | None = None) -> list[Transform]:
320
+ """Resolve message transforms for the current configuration.
321
+
322
+ ``tool_mode`` overrides ``self.tool_mode`` for a single generation
323
+ without mutating shared state - used by the tool-overflow fallback so
324
+ concurrent ``run()`` calls on one Agent don't clobber each other.
325
+ """
326
+ tool_mode = tool_mode if tool_mode is not None else self.tool_mode
318
327
  transforms = []
319
328
  if self.tools:
320
- match self.tool_mode:
329
+ match tool_mode:
321
330
  case "xml":
322
331
  transforms.append(
323
332
  make_tools_to_xml_transform(self.all_tools, add_tool_stop_token=True)
@@ -334,6 +343,49 @@ class Agent(Executor[AgentEvent, Trajectory]):
334
343
 
335
344
  async def _generate(self, messages: list[Message]) -> Chat:
336
345
  """Execute a single LLM generation step."""
346
+ if self.tool_mode == "auto" and self.tools:
347
+ self.tool_mode = (
348
+ "api" if await self.generator.supports_function_calling() else "json-in-xml"
349
+ )
350
+
351
+ # Effective mode is local to this call - never mutate self.tool_mode for
352
+ # the fallback, or concurrent run() calls on one shared Agent (e.g.
353
+ # Evaluation(concurrency > 1)) would clobber each other's mode.
354
+ effective_mode = self.tool_mode
355
+ # Once any turn has hit the provider tool cap, serialize up front on
356
+ # later turns to skip a doomed api attempt. The flag is only ever set
357
+ # True, so concurrent writers are harmless.
358
+ if effective_mode == "api" and self.tools and self._tool_cap_exceeded:
359
+ effective_mode = "json-in-xml"
360
+
361
+ chat = await self._generate_once(messages, effective_mode)
362
+
363
+ # Non-degrading fallback for the OpenAI/Azure 128-tool ceiling.
364
+ # GPT-family endpoints 400 with `array_above_max_length` when the
365
+ # tools array exceeds 128; Claude has no such cap and never hits this.
366
+ # Retry once with prompt-serialized tools so the full tool surface
367
+ # stays available instead of failing the turn. Native api mode is
368
+ # preserved for every model that accepts the tool count. The retry is
369
+ # gated on the call-local ``effective_mode`` so a sibling call that
370
+ # flipped the flag can't make this one skip its own recovery.
371
+ if (
372
+ chat.failed
373
+ and effective_mode == "api"
374
+ and self.tools
375
+ and _is_tool_array_overflow(chat.error)
376
+ ):
377
+ logger.warning(
378
+ "Model '{}' rejected {} tool definitions (over provider cap); "
379
+ "retrying with prompt-serialized tools (json-in-xml)",
380
+ self.generator.model,
381
+ len(self.all_tools),
382
+ )
383
+ self._tool_cap_exceeded = True
384
+ chat = await self._generate_once(messages, "json-in-xml")
385
+
386
+ return chat
387
+
388
+ async def _generate_once(self, messages: list[Message], tool_mode: ToolMode) -> Chat:
337
389
  messages = list(messages)
338
390
  extra = dict(self.generate_params_extra) if self.generate_params_extra else {}
339
391
  params_kwargs: dict[str, t.Any] = {
@@ -344,12 +396,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
344
396
  params_kwargs["extra"] = extra
345
397
  params = GenerateParams(**params_kwargs)
346
398
 
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()
399
+ transforms = self._get_transforms(tool_mode)
353
400
  post_transforms: list[PostTransform | None] = []
354
401
  for transform_callback in transforms:
355
402
  messages, params, post_transform = await transform_callback(messages, params)
@@ -468,11 +515,32 @@ class Agent(Executor[AgentEvent, Trajectory]):
468
515
  (name for name, r in hook_reactions.items() if r is winning_reaction), "unknown"
469
516
  )
470
517
 
518
+ reaction_messages: list[Message] = []
519
+ if isinstance(winning_reaction, RetryWithFeedback):
520
+ if winning_reaction.tool_call_id:
521
+ reaction_messages.append(
522
+ Message(
523
+ "tool",
524
+ f"[POLICY DENIED] {winning_reaction.feedback}",
525
+ tool_call_id=winning_reaction.tool_call_id,
526
+ metadata=winning_reaction.metadata,
527
+ )
528
+ )
529
+ else:
530
+ reaction_messages.append(
531
+ Message(
532
+ "user",
533
+ winning_reaction.feedback,
534
+ metadata=winning_reaction.metadata,
535
+ )
536
+ )
537
+
471
538
  async for _event in self._dispatch(
472
539
  ReactStep(
473
540
  agent_id=self.agent_id,
474
541
  hook_name=winning_hook_name,
475
542
  reaction=winning_reaction,
543
+ messages=reaction_messages,
476
544
  )
477
545
  ):
478
546
  yield _event
@@ -483,8 +551,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
483
551
  messages.append(Message("user", winning_reaction.feedback))
484
552
  raise Continue(messages=messages)
485
553
  if isinstance(winning_reaction, RetryWithFeedback):
486
- messages = [Message("user", winning_reaction.feedback)]
487
- raise Retry(messages=messages)
554
+ raise Continue(messages=reaction_messages)
488
555
 
489
556
  raise winning_reaction
490
557
 
@@ -495,10 +562,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
495
562
  tries: int,
496
563
  start_time: float,
497
564
  ) -> float | None:
498
- """Compute a retry sleep for a transient LLM API error.
565
+ """Compute a retry sleep for a retry-safe LLM admission failure.
499
566
 
500
567
  Returns the sleep duration in seconds if the caller should retry, or
501
- ``None`` if the error is not transient, tries are exhausted, or the
568
+ ``None`` if the error is not retry-safe, tries are exhausted, or the
502
569
  per-step time budget has been spent. Caller owns sleeping and emitting
503
570
  the ``GenerationRetry`` event. Backoff is agent-owned at the error
504
571
  site, mirroring ``_try_overflow_recovery`` — no step is consumed and
@@ -507,7 +574,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
507
574
  if self.backoff_max_tries <= 0:
508
575
  return None
509
576
 
510
- if not _is_transient_api_error(error):
577
+ if not _is_retry_safe_api_error(error):
511
578
  return None
512
579
 
513
580
  if tries >= self.backoff_max_tries:
@@ -670,6 +737,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
670
737
  agent_name=self.name,
671
738
  tool_call=tool_call,
672
739
  error=NameError(error_msg),
740
+ policy_decision=start_event.policy_decision,
673
741
  )
674
742
  error_event.emit(t_span)
675
743
  async for event in self._dispatch(error_event):
@@ -678,6 +746,8 @@ class Agent(Executor[AgentEvent, Trajectory]):
678
746
  message = Message.from_model(
679
747
  SystemErrorModel(content=f"Tool '{tool_call.name}' not found.")
680
748
  )
749
+ if start_event.policy_decision is not None:
750
+ message.metadata["policy_decision"] = start_event.policy_decision
681
751
 
682
752
  step_event = ToolStep(
683
753
  agent_id=self.agent_id,
@@ -698,6 +768,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
698
768
  try:
699
769
  message, stop = await tool.handle_tool_call(tool_call)
700
770
 
771
+ if start_event.policy_decision is not None:
772
+ message.metadata["policy_decision"] = start_event.policy_decision
773
+
701
774
  # Tools that catch their own exceptions (bash non-zero,
702
775
  # @tool(catch=True), MCP isError) lift the failure into
703
776
  # message.metadata. Surface it on ToolEnd so renderers can
@@ -717,6 +790,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
717
790
  error=tool_error,
718
791
  error_type=tool_error_type,
719
792
  cost_usd=tool_cost_usd,
793
+ policy_decision=start_event.policy_decision,
720
794
  )
721
795
  async for event in self._dispatch(end_event):
722
796
  yield event
@@ -754,6 +828,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
754
828
  status="errored",
755
829
  tool_call=tool_call,
756
830
  error=e,
831
+ policy_decision=start_event.policy_decision,
757
832
  )
758
833
  error_event.emit(t_span)
759
834
  async for event in self._dispatch(error_event):
@@ -862,15 +937,13 @@ class Agent(Executor[AgentEvent, Trajectory]):
862
937
  async for event in self._dispatch(gen_start):
863
938
  yield event
864
939
 
940
+ backoff_started = time.monotonic()
865
941
  step_chat = await self._generate(messages)
866
942
 
867
- # In-place transient-error backoff — rate limits and
868
- # other litellm.APIError failures get retried at the
869
- # error site with exponential backoff. No step budget
870
- # consumed; clients observe GenerationRetry events
871
- # rather than a spurious terminal GenerationError.
943
+ # In-place retry-safe backoff — only explicit 429 admission
944
+ # failures are sent again. Ambiguous transport and provider
945
+ # failures may still have active work, so they terminate.
872
946
  backoff_tries = 0
873
- backoff_started = time.monotonic()
874
947
  while step_chat.failed and step_chat.error:
875
948
  wait = self._try_backoff(
876
949
  step_chat.error,
@@ -1090,11 +1163,17 @@ class Agent(Executor[AgentEvent, Trajectory]):
1090
1163
  """Run all tools and signal completion."""
1091
1164
  nonlocal tool_execution_error
1092
1165
  try:
1166
+ tool_calls = _messages[-1].tool_calls or []
1167
+ item_calls = [tc for tc in tool_calls if tc.name == "report_item"]
1168
+ other_calls = [tc for tc in tool_calls if tc.name != "report_item"]
1169
+
1170
+ async def run_item_tools() -> None:
1171
+ for tool_call in item_calls:
1172
+ await run_tool_with_queue(tool_call)
1173
+
1093
1174
  await asyncio.gather(
1094
- *[
1095
- run_tool_with_queue(tc)
1096
- for tc in (_messages[-1].tool_calls or [])
1097
- ]
1175
+ *(run_tool_with_queue(tc) for tc in other_calls),
1176
+ run_item_tools(),
1098
1177
  )
1099
1178
  except Exception as exc:
1100
1179
  tool_execution_error = exc
@@ -1116,9 +1195,21 @@ class Agent(Executor[AgentEvent, Trajectory]):
1116
1195
  stopped_by_tool_call = event.tool_call
1117
1196
 
1118
1197
  await tools_task # Ensure task completes
1119
- if tool_execution_error is not None:
1120
- _raise_exception(tool_execution_error)
1198
+ # Always preserve completed tool results — even when
1199
+ # one tool was denied, other tools may have finished
1200
+ # and their results must stay in the conversation.
1121
1201
  messages.extend(tool_messages)
1202
+ # A hook retry or continuation (including a ScopeGuard
1203
+ # denial) still completes this generation boundary. Defer
1204
+ # that reaction until after GenerationStep so the assistant
1205
+ # tool call is persisted and can be paired with feedback.
1206
+ deferred_reaction = (
1207
+ tool_execution_error
1208
+ if isinstance(tool_execution_error, (Continue, Retry))
1209
+ else None
1210
+ )
1211
+ if tool_execution_error is not None and deferred_reaction is None:
1212
+ _raise_exception(tool_execution_error)
1122
1213
 
1123
1214
  # Emit GenerationEnd AFTER tools (closes generation span)
1124
1215
  gen_end = GenerationEnd(
@@ -1158,6 +1249,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
1158
1249
  yield event
1159
1250
  gen_event.emit(gen_span) # Emit after dispatch - metrics attached
1160
1251
 
1252
+ if deferred_reaction is not None:
1253
+ _raise_exception(deferred_reaction)
1254
+
1161
1255
  if stopped_by_tool_call:
1162
1256
  _raise_exception(
1163
1257
  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,