dreadnode 2.0.44__tar.gz → 2.0.46__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 (767) hide show
  1. {dreadnode-2.0.44 → dreadnode-2.0.46}/PKG-INFO +1 -1
  2. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/agent.py +15 -4
  3. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/engines/base.py +4 -2
  4. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/engines/claude_code.py +5 -1
  5. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/engines/native.py +3 -1
  6. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/_base.py +74 -13
  7. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/api/client.py +211 -4
  8. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/api/models.py +15 -0
  9. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/capability.py +17 -1
  10. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/environment.py +39 -7
  11. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/evaluation.py +3 -1
  12. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/main.py +164 -35
  13. dreadnode-2.0.46/dreadnode/app/cli/workflow.py +593 -0
  14. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/managed_client.py +34 -6
  15. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/runtime_client.py +45 -2
  16. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/config.py +31 -0
  17. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/print_mode.py +24 -4
  18. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/app.py +215 -45
  19. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/capability_manager.py +57 -16
  20. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/prompt.py +7 -1
  21. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/runtime_events.py +3 -0
  22. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/session_hydrator.py +1 -1
  23. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/turn_coordinator.py +26 -0
  24. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/websocket.py +20 -2
  25. dreadnode-2.0.46/dreadnode/app/server/workflow_manager.py +207 -0
  26. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/app.py +85 -46
  27. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/command_dispatcher.py +24 -6
  28. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/commands.py +5 -0
  29. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/dreadnode.tcss +36 -28
  30. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/raw_spans.py +2 -2
  31. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/theme.py +54 -31
  32. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/__init__.py +0 -13
  33. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/composer.py +108 -27
  34. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/context_bar.py +2 -1
  35. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/conversation.py +142 -3
  36. dreadnode-2.0.46/dreadnode/app/tui/widgets/selection.py +207 -0
  37. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/tool.py +33 -17
  38. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +3 -1
  39. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +29 -12
  40. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/agent_review.py +35 -0
  41. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/branch.py +41 -0
  42. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fanout.py +40 -0
  43. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fork.py +52 -0
  44. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/linear.py +28 -0
  45. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +17 -0
  46. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  47. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -4
  48. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +42 -10
  49. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +13 -11
  50. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +3 -1
  51. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workflows.md +293 -0
  52. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +56 -5
  53. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/workflows-authoring.md +242 -0
  54. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +4 -0
  55. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +1 -0
  56. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +3 -3
  57. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +1 -1
  58. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +9 -5
  59. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +3 -3
  60. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +1 -1
  61. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +1 -1
  62. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +2 -2
  63. dreadnode-2.0.46/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/workflow.md +186 -0
  64. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +1 -1
  65. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +13 -11
  66. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +8 -0
  67. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +1 -0
  68. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +6 -6
  69. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +1 -3
  70. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +1 -2
  71. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +59 -26
  72. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +4 -4
  73. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/loader.py +22 -1
  74. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/types.py +18 -0
  75. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/worker_runner.py +4 -4
  76. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/tls.py +1 -1
  77. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/manifest.py +17 -0
  78. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/oci.py +60 -0
  79. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/storage/storage.py +4 -3
  80. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/constants.py +7 -0
  81. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/span.py +34 -0
  82. dreadnode-2.0.46/dreadnode/workflows/__init__.py +118 -0
  83. dreadnode-2.0.46/dreadnode/workflows/compile.py +1330 -0
  84. dreadnode-2.0.46/dreadnode/workflows/context.py +115 -0
  85. dreadnode-2.0.46/dreadnode/workflows/errors.py +87 -0
  86. dreadnode-2.0.46/dreadnode/workflows/host.py +856 -0
  87. dreadnode-2.0.46/dreadnode/workflows/loader.py +163 -0
  88. dreadnode-2.0.46/dreadnode/workflows/workflow.py +198 -0
  89. dreadnode-2.0.46/dreadnode_workflow_core/__init__.py +122 -0
  90. dreadnode-2.0.46/dreadnode_workflow_core/events.py +148 -0
  91. dreadnode-2.0.46/dreadnode_workflow_core/facts.py +124 -0
  92. dreadnode-2.0.46/dreadnode_workflow_core/scheduler.py +486 -0
  93. dreadnode-2.0.46/dreadnode_workflow_core/state.py +269 -0
  94. dreadnode-2.0.46/dreadnode_workflow_core/topology.py +252 -0
  95. {dreadnode-2.0.44 → dreadnode-2.0.46}/pyproject.toml +13 -3
  96. dreadnode-2.0.44/dreadnode/app/tui/widgets/header_bar.py +0 -59
  97. dreadnode-2.0.44/dreadnode/app/tui/widgets/permission_prompt.py +0 -112
  98. dreadnode-2.0.44/dreadnode/app/tui/widgets/prompt_info.py +0 -64
  99. dreadnode-2.0.44/dreadnode/app/tui/widgets/session_sidebar.py +0 -111
  100. dreadnode-2.0.44/dreadnode/app/tui/widgets/throbber.py +0 -87
  101. {dreadnode-2.0.44 → dreadnode-2.0.46}/.gitignore +0 -0
  102. {dreadnode-2.0.44 → dreadnode-2.0.46}/LICENSE +0 -0
  103. {dreadnode-2.0.44 → dreadnode-2.0.46}/README.md +0 -0
  104. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/__init__.py +0 -0
  105. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/__main__.py +0 -0
  106. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/__init__.py +0 -0
  107. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/engines/AGENTS.md +0 -0
  108. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/engines/__init__.py +0 -0
  109. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/events.py +0 -0
  110. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/exceptions.py +0 -0
  111. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/format.py +0 -0
  112. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/hooks.py +0 -0
  113. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/judge.py +0 -0
  114. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/mcp/__init__.py +0 -0
  115. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/mcp/auth.py +0 -0
  116. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/mcp/client.py +0 -0
  117. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/mcp/config.py +0 -0
  118. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/mcp/server.py +0 -0
  119. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/process_judge.py +0 -0
  120. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/reactions.py +0 -0
  121. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/sanitize.py +0 -0
  122. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/skills.py +0 -0
  123. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/stopping.py +0 -0
  124. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/subagent.py +0 -0
  125. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/tool_resolution.py +0 -0
  126. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/tools.py +0 -0
  127. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/agents/trajectory.py +0 -0
  128. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/__init__.py +0 -0
  129. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/adversarial_reasoning.py +0 -0
  130. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/advpromptier.py +0 -0
  131. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/agent_suite.py +0 -0
  132. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/agentic_suite.py +0 -0
  133. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/alignment_faking.py +0 -0
  134. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analogy_escalation.py +0 -0
  135. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/__init__.py +0 -0
  136. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/aggregator.py +0 -0
  137. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/classifier.py +0 -0
  138. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/compliance.py +0 -0
  139. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/engine.py +0 -0
  140. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/recommendations.py +0 -0
  141. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/analytics/types.py +0 -0
  142. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/approval_bypass.py +0 -0
  143. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/aprt_progressive.py +0 -0
  144. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/art_engine.py +0 -0
  145. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/assessment.py +0 -0
  146. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/__init__.py +0 -0
  147. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/defense.py +0 -0
  148. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/failure.py +0 -0
  149. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/gate.py +0 -0
  150. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/memory.py +0 -0
  151. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/modes.py +0 -0
  152. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/probes.py +0 -0
  153. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/recon.py +0 -0
  154. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/router.py +0 -0
  155. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/atlas/strategy.py +0 -0
  156. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/attention_shifting.py +0 -0
  157. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/authz.py +0 -0
  158. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/autodan_turbo.py +0 -0
  159. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/autoredteamer.py +0 -0
  160. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/beast.py +0 -0
  161. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/browser_probes.py +0 -0
  162. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/__init__.py +0 -0
  163. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/atlas.py +0 -0
  164. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/nist.py +0 -0
  165. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/owasp.py +0 -0
  166. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  167. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/compliance/saif.py +0 -0
  168. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/constants.py +0 -0
  169. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/cot_jailbreak.py +0 -0
  170. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/crescendo.py +0 -0
  171. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/__init__.py +0 -0
  172. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  173. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  174. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/assets/image/meth.png +0 -0
  175. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  176. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  177. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  178. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  179. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  180. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  181. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  182. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  183. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  184. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  185. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  186. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  187. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  188. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  189. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  190. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  191. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  192. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  193. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/deep_inception.py +0 -0
  194. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/detect.py +0 -0
  195. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/drattack.py +0 -0
  196. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/echo_chamber.py +0 -0
  197. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/__init__.py +0 -0
  198. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/_base.py +0 -0
  199. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/_text_common.py +0 -0
  200. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/bae.py +0 -0
  201. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/boundary.py +0 -0
  202. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  203. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  204. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/pwws.py +0 -0
  205. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/simba.py +0 -0
  206. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/square.py +0 -0
  207. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/text.py +0 -0
  208. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/textbugger.py +0 -0
  209. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/textfooler.py +0 -0
  210. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/evasion/zoo.py +0 -0
  211. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/events.py +0 -0
  212. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/__init__.py +0 -0
  213. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/_base.py +0 -0
  214. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/activethief.py +0 -0
  215. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/copycat.py +0 -0
  216. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/distillation.py +0 -0
  217. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/equation_solving.py +0 -0
  218. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/jacobian.py +0 -0
  219. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/extraction/knockoff.py +0 -0
  220. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/genetic_persona.py +0 -0
  221. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/goat.py +0 -0
  222. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/goat_v2.py +0 -0
  223. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/gptfuzzer.py +0 -0
  224. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/honeytoken.py +0 -0
  225. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/humor_bypass.py +0 -0
  226. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/image.py +0 -0
  227. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/injection_channels.py +0 -0
  228. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/inversion/__init__.py +0 -0
  229. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/inversion/_base.py +0 -0
  230. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/inversion/confidence.py +0 -0
  231. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  232. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/j2_meta.py +0 -0
  233. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/jbdistill.py +0 -0
  234. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/jbfuzz.py +0 -0
  235. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/lrm_autonomous.py +0 -0
  236. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/mapf.py +0 -0
  237. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/mcp_probes.py +0 -0
  238. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/__init__.py +0 -0
  239. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/_base.py +0 -0
  240. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/entropy.py +0 -0
  241. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/label_only.py +0 -0
  242. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/lira.py +0 -0
  243. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/loss.py +0 -0
  244. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/shadow_model.py +0 -0
  245. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/membership/threshold.py +0 -0
  246. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/message_parts.py +0 -0
  247. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/model_export.py +0 -0
  248. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/multimodal.py +0 -0
  249. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/nexus.py +0 -0
  250. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/oast.py +0 -0
  251. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/pair.py +0 -0
  252. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/persona_hijack.py +0 -0
  253. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/policies.py +0 -0
  254. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/probe_planner.py +0 -0
  255. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/prompt.py +0 -0
  256. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/propagation.py +0 -0
  257. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/quantization_safety.py +0 -0
  258. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/rainbow.py +0 -0
  259. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/refusal_aware.py +0 -0
  260. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/renellm.py +0 -0
  261. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/reporting/__init__.py +0 -0
  262. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/reporting/json_report.py +0 -0
  263. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/reporting/llm_summary.py +0 -0
  264. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/reporting/markdown.py +0 -0
  265. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/resource_abuse.py +0 -0
  266. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/reward_hacking.py +0 -0
  267. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/salami_slicing.py +0 -0
  268. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/self_persuasion.py +0 -0
  269. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/siren.py +0 -0
  270. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/tap.py +0 -0
  271. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/target.py +0 -0
  272. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/__init__.py +0 -0
  273. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/auth.py +0 -0
  274. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/factory.py +0 -0
  275. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/http.py +0 -0
  276. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/message.py +0 -0
  277. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/prediction.py +0 -0
  278. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/spec.py +0 -0
  279. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  280. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  281. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/templatefuzz.py +0 -0
  282. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/tmap_trajectory.py +0 -0
  283. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/tool_attack.py +0 -0
  284. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/trojail.py +0 -0
  285. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/airt/watermark_removal.py +0 -0
  286. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/__init__.py +0 -0
  287. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/api/__init__.py +0 -0
  288. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/__init__.py +0 -0
  289. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/airt.py +0 -0
  290. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/args.py +0 -0
  291. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/dataset.py +0 -0
  292. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/inference_model.py +0 -0
  293. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/judge.py +0 -0
  294. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/model.py +0 -0
  295. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/optimize.py +0 -0
  296. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/runtime.py +0 -0
  297. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/sandbox.py +0 -0
  298. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/secret.py +0 -0
  299. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/session.py +0 -0
  300. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/shared.py +0 -0
  301. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/task.py +0 -0
  302. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/task_set.py +0 -0
  303. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/__init__.py +0 -0
  304. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  305. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  306. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  307. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  308. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  309. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  310. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  311. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  312. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  313. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/train.py +0 -0
  314. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/cli/worlds.py +0 -0
  315. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/__init__.py +0 -0
  316. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/interactive.py +0 -0
  317. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/models.py +0 -0
  318. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/client/transports.py +0 -0
  319. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/env.py +0 -0
  320. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/main.py +0 -0
  321. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/model_catalog.py +0 -0
  322. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/paths.py +0 -0
  323. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/__init__.py +0 -0
  324. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/auth.py +0 -0
  325. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/model_resolution.py +0 -0
  326. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/prompt_registry.py +0 -0
  327. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/runtime_credentials.py +0 -0
  328. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/session_persistence.py +0 -0
  329. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/utils.py +0 -0
  330. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/worker_manager.py +0 -0
  331. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/server/ws_auth.py +0 -0
  332. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/__init__.py +0 -0
  333. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/auth_flow.py +0 -0
  334. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/bug_report.py +0 -0
  335. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/capabilities_manager.py +0 -0
  336. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/connection.py +0 -0
  337. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/error_handler.py +0 -0
  338. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/model_manager.py +0 -0
  339. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/model_variants.py +0 -0
  340. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/profile_manager.py +0 -0
  341. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screen_router.py +0 -0
  342. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/__init__.py +0 -0
  343. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/auth.py +0 -0
  344. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/base.py +0 -0
  345. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/capabilities.py +0 -0
  346. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  347. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/connection_error.py +0 -0
  348. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/console.py +0 -0
  349. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/environments.py +0 -0
  350. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/evaluations.py +0 -0
  351. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/models.py +0 -0
  352. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/readme.py +0 -0
  353. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/report_bug.py +0 -0
  354. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/runtimes.py +0 -0
  355. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  356. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/secrets.py +0 -0
  357. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/services.py +0 -0
  358. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/sessions.py +0 -0
  359. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  360. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/traces.py +0 -0
  361. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/screens/workspaces.py +0 -0
  362. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/sessions_manager.py +0 -0
  363. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/spans_reader.py +0 -0
  364. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/status_messages.py +0 -0
  365. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/tool_format.py +0 -0
  366. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/turn_coordinator.py +0 -0
  367. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  368. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/turn_reducer.py +0 -0
  369. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/turn_state_phase.py +0 -0
  370. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/update_check.py +0 -0
  371. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  372. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  373. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  374. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/flash.py +0 -0
  375. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  376. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  377. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  378. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  379. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  380. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  381. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  382. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  383. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
  384. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  385. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  386. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  387. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  388. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  389. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/welcome.py +0 -0
  390. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/widgets/whoami.py +0 -0
  391. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/app/tui/wire_events.py +0 -0
  392. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/__init__.py +0 -0
  393. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  394. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  395. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  396. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  397. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  398. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  399. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  400. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  401. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  402. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  403. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  404. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  405. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  406. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  407. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  408. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  409. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  410. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  411. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  412. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  413. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  414. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  415. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  416. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
  417. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  418. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  419. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  420. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  421. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  422. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  423. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  424. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  425. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  426. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  427. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  428. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  429. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
  430. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  431. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  432. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  433. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  434. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  435. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  436. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  437. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  438. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  439. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  440. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  441. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  442. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  443. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  444. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  445. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  446. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  447. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  448. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  449. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  450. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  451. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  452. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
  453. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  454. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  455. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  456. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  457. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  458. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  459. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  460. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  461. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  462. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  463. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  464. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  465. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  466. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  467. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  468. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/__init__.py +0 -0
  469. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/capability.py +0 -0
  470. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/command_tools.py +0 -0
  471. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/flags.py +0 -0
  472. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/install.py +0 -0
  473. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/sync.py +0 -0
  474. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/tool_rules.py +0 -0
  475. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/capabilities/worker.py +0 -0
  476. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/__init__.py +0 -0
  477. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/conditions.py +0 -0
  478. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/discovery.py +0 -0
  479. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/environment.py +0 -0
  480. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/exceptions.py +0 -0
  481. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/execution.py +0 -0
  482. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/hook.py +0 -0
  483. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/judge.py +0 -0
  484. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/load.py +0 -0
  485. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/log.py +0 -0
  486. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/meta/__init__.py +0 -0
  487. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/meta/config.py +0 -0
  488. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/meta/context.py +0 -0
  489. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/meta/hydrate.py +0 -0
  490. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/meta/introspect.py +0 -0
  491. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/metric.py +0 -0
  492. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/object.py +0 -0
  493. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/scorer.py +0 -0
  494. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/serialization.py +0 -0
  495. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/startup_clock.py +0 -0
  496. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/stopping.py +0 -0
  497. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/task.py +0 -0
  498. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/templating.py +0 -0
  499. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/transforms.py +0 -0
  500. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/__init__.py +0 -0
  501. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/audio.py +0 -0
  502. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/base.py +0 -0
  503. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/common.py +0 -0
  504. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/image.py +0 -0
  505. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/object_3d.py +0 -0
  506. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/table.py +0 -0
  507. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/text.py +0 -0
  508. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/types/video.py +0 -0
  509. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/core/util.py +0 -0
  510. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/datasets/__init__.py +0 -0
  511. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/datasets/dataset.py +0 -0
  512. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/datasets/hf.py +0 -0
  513. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/datasets/local.py +0 -0
  514. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/__init__.py +0 -0
  515. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/console.py +0 -0
  516. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/evaluation.py +0 -0
  517. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/events.py +0 -0
  518. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/format.py +0 -0
  519. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/result.py +0 -0
  520. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/evaluations/sample.py +0 -0
  521. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/__init__.py +0 -0
  522. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/caching.py +0 -0
  523. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/chat.py +0 -0
  524. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/data.py +0 -0
  525. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/exceptions.py +0 -0
  526. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/__init__.py +0 -0
  527. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/base.py +0 -0
  528. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/http.py +0 -0
  529. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/litellm_.py +0 -0
  530. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/transformers_.py +0 -0
  531. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/generator/vllm_.py +0 -0
  532. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/message.py +0 -0
  533. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/models.py +0 -0
  534. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/parsing.py +0 -0
  535. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/proxy.py +0 -0
  536. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/tokenizer/__init__.py +0 -0
  537. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/tokenizer/base.py +0 -0
  538. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  539. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/generators/utils.py +0 -0
  540. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/items/__init__.py +0 -0
  541. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/items/config.py +0 -0
  542. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/items/models.py +0 -0
  543. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/judges/__init__.py +0 -0
  544. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/judges/outcome.py +0 -0
  545. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/judges/trajectory.py +0 -0
  546. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/judges/trajectory_tools.py +0 -0
  547. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/models/__init__.py +0 -0
  548. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/models/hf.py +0 -0
  549. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/models/local.py +0 -0
  550. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/models/model.py +0 -0
  551. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/__init__.py +0 -0
  552. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/__init__.py +0 -0
  553. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  554. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/agent.py +0 -0
  555. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/env.py +0 -0
  556. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/runtime.py +0 -0
  557. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/adapters/stack.py +0 -0
  558. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/api.py +0 -0
  559. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/backends/__init__.py +0 -0
  560. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/backends/base.py +0 -0
  561. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/backends/gepa.py +0 -0
  562. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/collectors.py +0 -0
  563. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/config.py +0 -0
  564. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/console.py +0 -0
  565. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/events.py +0 -0
  566. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/format.py +0 -0
  567. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/jobs.py +0 -0
  568. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/result.py +0 -0
  569. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/sampler.py +0 -0
  570. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/sampling.py +0 -0
  571. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/search.py +0 -0
  572. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/stopping.py +0 -0
  573. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/study.py +0 -0
  574. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/optimization/trial.py +0 -0
  575. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/__init__.py +0 -0
  576. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/egress.py +0 -0
  577. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/loader.py +0 -0
  578. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/package.py +0 -0
  579. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/packaging/task_validation.py +0 -0
  580. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/policies/__init__.py +0 -0
  581. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/policies/guard.py +0 -0
  582. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/policies/reconciliation.py +0 -0
  583. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  584. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/policies/scope.py +0 -0
  585. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/py.typed +0 -0
  586. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/__init__.py +0 -0
  587. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/boundary.py +0 -0
  588. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/fuzzing.py +0 -0
  589. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/graph.py +0 -0
  590. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/grid.py +0 -0
  591. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/image.py +0 -0
  592. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/mapelites.py +0 -0
  593. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/optuna.py +0 -0
  594. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/random.py +0 -0
  595. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/registry.py +0 -0
  596. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/samplers/strategy.py +0 -0
  597. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/__init__.py +0 -0
  598. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  599. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/agent_security.py +0 -0
  600. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/agentic.py +0 -0
  601. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/agentic_workflow.py +0 -0
  602. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/attack_outcome.py +0 -0
  603. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/browser_security.py +0 -0
  604. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/classification.py +0 -0
  605. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/consistency.py +0 -0
  606. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/contains.py +0 -0
  607. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/cosine_sim.py +0 -0
  608. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/credentials.py +0 -0
  609. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/crucible.py +0 -0
  610. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/documentation_security.py +0 -0
  611. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/exfiltration_detection.py +0 -0
  612. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/format.py +0 -0
  613. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/harm.py +0 -0
  614. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/ide_security.py +0 -0
  615. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/image.py +0 -0
  616. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/json.py +0 -0
  617. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/judge.py +0 -0
  618. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/judge_ensemble.py +0 -0
  619. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/length.py +0 -0
  620. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/lexical.py +0 -0
  621. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/mcp_security.py +0 -0
  622. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/memorization.py +0 -0
  623. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/multi_agent_security.py +0 -0
  624. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/pii.py +0 -0
  625. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/prompt_leak.py +0 -0
  626. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/readability.py +0 -0
  627. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/reasoning_security.py +0 -0
  628. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/sentiment.py +0 -0
  629. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/similarity.py +0 -0
  630. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/structural_detection.py +0 -0
  631. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/scorers/supply_chain_detection.py +0 -0
  632. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/storage/__init__.py +0 -0
  633. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/storage/providers.py +0 -0
  634. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/storage/session_store.py +0 -0
  635. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/__init__.py +0 -0
  636. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/_ripgrep.py +0 -0
  637. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/apply_patch.py +0 -0
  638. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/dreadnode_cli.py +0 -0
  639. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/editing.py +0 -0
  640. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/execute.py +0 -0
  641. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/fetch.py +0 -0
  642. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/glob.py +0 -0
  643. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/grep.py +0 -0
  644. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/interaction.py +0 -0
  645. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/ls.py +0 -0
  646. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/memory.py +0 -0
  647. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/project_memory.py +0 -0
  648. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/read.py +0 -0
  649. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/report.py +0 -0
  650. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/report_items.py +0 -0
  651. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/submission.py +0 -0
  652. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/task.py +0 -0
  653. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/think.py +0 -0
  654. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/todo.py +0 -0
  655. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/trajectory_search.py +0 -0
  656. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/web_extract.py +0 -0
  657. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/web_search.py +0 -0
  658. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tools/write.py +0 -0
  659. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/__init__.py +0 -0
  660. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/convert.py +0 -0
  661. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/exporter.py +0 -0
  662. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/exporters.py +0 -0
  663. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/spans.py +0 -0
  664. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/tracing/trace_converter.py +0 -0
  665. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/__init__.py +0 -0
  666. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/_progress.py +0 -0
  667. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/base.py +0 -0
  668. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/dpo.py +0 -0
  669. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/env_rollouts.py +0 -0
  670. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/etl/__init__.py +0 -0
  671. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/etl/_common.py +0 -0
  672. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/etl/rl.py +0 -0
  673. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/etl/sft.py +0 -0
  674. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/etl/worlds.py +0 -0
  675. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/events.py +0 -0
  676. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/grpo.py +0 -0
  677. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/jobs.py +0 -0
  678. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/models.py +0 -0
  679. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ppo.py +0 -0
  680. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/prime.py +0 -0
  681. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/__init__.py +0 -0
  682. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/async_trainer.py +0 -0
  683. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/config.py +0 -0
  684. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/coordinator.py +0 -0
  685. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/distributed.py +0 -0
  686. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/dpo.py +0 -0
  687. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/experience.py +0 -0
  688. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  689. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/inference.py +0 -0
  690. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/learner.py +0 -0
  691. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/multi_turn.py +0 -0
  692. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/ppo.py +0 -0
  693. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/reward_model.py +0 -0
  694. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/rollout_env.py +0 -0
  695. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/rollout_worker.py +0 -0
  696. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/sft.py +0 -0
  697. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/ray/trainer.py +0 -0
  698. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/recipes.py +0 -0
  699. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/__init__.py +0 -0
  700. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/aggregator.py +0 -0
  701. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/functions.py +0 -0
  702. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  703. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/shaping.py +0 -0
  704. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rewards/types.py +0 -0
  705. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/__init__.py +0 -0
  706. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/adapters.py +0 -0
  707. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  708. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/orchestrator.py +0 -0
  709. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/types.py +0 -0
  710. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/rollouts/worlds.py +0 -0
  711. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/serving/__init__.py +0 -0
  712. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/serving/vllm_client.py +0 -0
  713. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/sft.py +0 -0
  714. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/__init__.py +0 -0
  715. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/config.py +0 -0
  716. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/data.py +0 -0
  717. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/renderer.py +0 -0
  718. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/rl.py +0 -0
  719. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker/trainer.py +0 -0
  720. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/tinker_sft.py +0 -0
  721. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/training/utils.py +0 -0
  722. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/__init__.py +0 -0
  723. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  724. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/adversarial_suffix.py +0 -0
  725. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/agent_skill.py +0 -0
  726. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/agentic_workflow.py +0 -0
  727. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/art_prompt.py +0 -0
  728. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/audio.py +0 -0
  729. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/backdoor_finetune.py +0 -0
  730. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  731. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/cipher.py +0 -0
  732. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/competitive_parity.py +0 -0
  733. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/constitutional.py +0 -0
  734. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/document.py +0 -0
  735. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/documentation_poison.py +0 -0
  736. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/encoding.py +0 -0
  737. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/exfiltration.py +0 -0
  738. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/flip_attack.py +0 -0
  739. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/guardrail_bypass.py +0 -0
  740. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/ide_injection.py +0 -0
  741. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/image.py +0 -0
  742. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/injection.py +0 -0
  743. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/json_tools.py +0 -0
  744. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/language.py +0 -0
  745. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/logic_bomb.py +0 -0
  746. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/mcp_attacks.py +0 -0
  747. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  748. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/multimodal_attacks.py +0 -0
  749. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/past_tense.py +0 -0
  750. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/persuasion.py +0 -0
  751. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/perturbation.py +0 -0
  752. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/pii_extraction.py +0 -0
  753. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/pythonic_tools.py +0 -0
  754. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/rag_poisoning.py +0 -0
  755. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/reasoning_attacks.py +0 -0
  756. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/refine.py +0 -0
  757. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/response_steering.py +0 -0
  758. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/structural_exploits.py +0 -0
  759. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/stylistic.py +0 -0
  760. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/substitution.py +0 -0
  761. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/supply_chain.py +0 -0
  762. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/swap.py +0 -0
  763. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  764. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/text.py +0 -0
  765. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/video.py +0 -0
  766. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/transforms/xml_tools.py +0 -0
  767. {dreadnode-2.0.44 → dreadnode-2.0.46}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.44
3
+ Version: 2.0.46
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -838,7 +838,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
838
838
  raise
839
839
 
840
840
  async def _stream(
841
- self, trajectory: Trajectory | None = None
841
+ self,
842
+ trajectory: Trajectory | None = None,
843
+ *,
844
+ message_metadata: dict[str, t.Any] | None = None,
842
845
  ) -> t.AsyncGenerator[AgentEvent, None]:
843
846
  """Drive the loop through the resolved :class:`AgentEngine`.
844
847
 
@@ -855,6 +858,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
855
858
  goal=self._current_input,
856
859
  dispatch=self._dispatch,
857
860
  permission=self._permission_bridge,
861
+ message_metadata=message_metadata,
858
862
  )
859
863
  async for event in engine.run_loop(ctx):
860
864
  yield event
@@ -864,7 +868,10 @@ class Agent(Executor[AgentEvent, Trajectory]):
864
868
  return resolve_engine(self.engine)
865
869
 
866
870
  async def _native_run_loop(
867
- self, trajectory: Trajectory | None = None
871
+ self,
872
+ trajectory: Trajectory | None = None,
873
+ *,
874
+ message_metadata: dict[str, t.Any] | None = None,
868
875
  ) -> t.AsyncGenerator[AgentEvent, None]:
869
876
  """
870
877
  Core agent execution loop with inline tracing.
@@ -882,7 +889,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
882
889
  Message(
883
890
  "user",
884
891
  str(self._current_input),
885
- metadata={"agent": self.name, "model": self.model_name},
892
+ metadata={**(message_metadata or {}), "agent": self.name, "model": self.model_name},
886
893
  ),
887
894
  ]
888
895
  messages = inject_system_content(messages, self.instructions)
@@ -1316,12 +1323,14 @@ class Agent(Executor[AgentEvent, Trajectory]):
1316
1323
  *,
1317
1324
  reset: bool = True,
1318
1325
  trajectory: Trajectory | None = None,
1326
+ message_metadata: dict[str, t.Any] | None = None,
1319
1327
  ) -> t.AsyncIterator[t.AsyncGenerator[AgentEvent, None]]:
1320
1328
  """
1321
1329
  Stream agent execution.
1322
1330
 
1323
1331
  Args:
1324
1332
  goal: Input message for the agent.
1333
+ message_metadata: Informational metadata attached to this turn's user message.
1325
1334
  reset: If True, start new conversation. If False, continue existing.
1326
1335
  Ignored when *trajectory* is provided.
1327
1336
  trajectory: External trajectory to operate on. When provided the
@@ -1369,7 +1378,9 @@ class Agent(Executor[AgentEvent, Trajectory]):
1369
1378
  with ctx as parent_span:
1370
1379
 
1371
1380
  async def _events() -> t.AsyncGenerator[AgentEvent, None]:
1372
- async for event in self._stream(active_trajectory):
1381
+ async for event in self._stream(
1382
+ active_trajectory, message_metadata=message_metadata
1383
+ ):
1373
1384
  # Emit agent-level events to parent span
1374
1385
  if parent_span and isinstance(
1375
1386
  event, (AgentStart, AgentEnd, AgentStalled, AgentError)
@@ -104,8 +104,8 @@ class PermissionBridge(t.Protocol):
104
104
  class EngineContext:
105
105
  """Everything an engine needs to run one turn.
106
106
 
107
- The native engine uses only ``agent`` + ``trajectory`` (it reaches the rest
108
- through ``agent``). Foreign engines additionally use ``goal``, ``dispatch``
107
+ The native engine uses ``agent``, ``trajectory``, and ``message_metadata``.
108
+ Foreign engines additionally use ``goal``, ``dispatch``
109
109
  (to run observational hooks on translated events), and ``permission``.
110
110
  """
111
111
 
@@ -116,6 +116,8 @@ class EngineContext:
116
116
  """Run an event through the agent's hooks (metrics + reactions). Foreign
117
117
  engines call this per translated event; the native engine dispatches inline."""
118
118
  permission: "PermissionBridge | None" = None
119
+ message_metadata: dict[str, t.Any] | None = None
120
+ """Informational metadata for the initiating user message, never authorization."""
119
121
 
120
122
 
121
123
  class AgentEngine(ABC):
@@ -393,7 +393,11 @@ class ClaudeCodeEngine(AgentEngine):
393
393
  Message(
394
394
  "user",
395
395
  str(ctx.goal or ""),
396
- metadata={"agent": agent.name, "model": agent.model_name},
396
+ metadata={
397
+ **(ctx.message_metadata or {}),
398
+ "agent": agent.name,
399
+ "model": agent.model_name,
400
+ },
397
401
  )
398
402
  )
399
403
  step_messages.append(assistant_msg)
@@ -22,5 +22,7 @@ class NativeEngine(AgentEngine):
22
22
  dispatches_internally = True
23
23
 
24
24
  async def run_loop(self, ctx: EngineContext) -> "t.AsyncIterator[AgentEvent]":
25
- async for event in ctx.agent._native_run_loop(ctx.trajectory):
25
+ async for event in ctx.agent._native_run_loop(
26
+ ctx.trajectory, message_metadata=ctx.message_metadata
27
+ ):
26
28
  yield event
@@ -89,12 +89,27 @@ class BlackBoxAttack:
89
89
  self.rng = np.random.default_rng(seed)
90
90
  self.airt_assessment_id = airt_assessment_id
91
91
  self.airt_target_model = airt_target_model or target.name
92
- self.airt_goal = airt_goal or self.default_goal
92
+ # Make the default goal target-aware so the same objective against
93
+ # different models counts as distinct goals on the dashboard (e.g. evasion
94
+ # of the fraud, digits, and sentiment classifiers = 3 goals, not 1). An
95
+ # explicit airt_goal is respected verbatim; only the default is suffixed.
96
+ self.airt_goal = airt_goal or (
97
+ f"{self.default_goal} on {self.airt_target_model}"
98
+ if self.airt_target_model
99
+ else self.default_goal
100
+ )
93
101
  self.airt_goal_category = airt_goal_category or self.default_goal_category
94
102
  self._query_count = 0
95
103
  #: A sample of real (input -> prediction) pairs so the finding can show
96
104
  #: the actual queries the attacker sent, not just the total count.
97
105
  self._query_samples: list[dict[str, t.Any]] = []
106
+ #: Count of trial spans emitted this run. Each algorithm iteration is one
107
+ #: trial (mirroring how a generative Study counts a trial per step), so the
108
+ #: platform can count trials / incurred budget for traditional-ML attacks.
109
+ self._trials_emitted = 0
110
+ #: Hard safety cap on trial spans so a pathologically long loop cannot
111
+ #: explode the trace tree.
112
+ self._max_trial_spans = 1000
98
113
 
99
114
  # -- target I/O -------------------------------------------------------- #
100
115
  async def _query(self, xs: t.Sequence[QueryInput]) -> list[Prediction]:
@@ -146,28 +161,74 @@ class BlackBoxAttack:
146
161
  metrics: dict[str, float] | None = None,
147
162
  **attrs: t.Any,
148
163
  ) -> None:
149
- """Emit a point-in-time span for one algorithm iteration, recording the
164
+ """Emit a **trial** span for one algorithm iteration, recording the
150
165
  intermediate adversarial state so the full attack trajectory is
151
- inspectable in the Traces tab.
166
+ inspectable in the Traces tab and every iteration is counted as a trial.
167
+
168
+ One iteration == one trial: this mirrors how a generative ``Study`` emits
169
+ a trial span per refinement step, so the platform counts trials (and the
170
+ incurred query budget) for traditional-ML attacks the same way. The span
171
+ carries the AIRT assessment/attack attributes and is a child of the run's
172
+ ``study`` span (opened in :meth:`run`), which is how ClickHouse links a
173
+ trial to its assessment.
152
174
 
153
175
  ``input`` is the current candidate (perturbed text / feature vector /
154
176
  image preview) the attacker sent; ``output`` is the target's response at
155
- this step (predicted label + confidence); ``metrics`` are the scalar
156
- signals (distance, confidence, fidelity) plotted over the run. Capped
157
- (first 20 iterations, then every 10th) so a long run does not explode the
177
+ this step; ``metrics`` are the scalar signals (distance, confidence,
178
+ fidelity) plotted over the run. The lightweight trial span is emitted
179
+ every iteration; the heavier input/output previews are attached only for
180
+ the first 20 iterations then every 10th, so a long run does not bloat the
158
181
  trace tree."""
159
- if iteration >= 20 and iteration % 10 != 0:
182
+ if self._trials_emitted >= self._max_trial_spans:
160
183
  return
161
- with self._phase(f"step {iteration}", iteration=iteration, **attrs) as span:
162
- if span is None or not hasattr(span, "log_input"):
184
+ self._trials_emitted += 1
185
+ heavy = iteration < 20 or iteration % 10 == 0
186
+ with self._trial(iteration, **attrs) as span:
187
+ if span is None or not hasattr(span, "log_metric"):
163
188
  return
164
189
  with suppress(Exception):
165
- if input is not None:
166
- span.log_input("candidate", input)
167
- if output is not None:
168
- span.log_output("prediction", output)
169
190
  for key, value in (metrics or {}).items():
170
191
  span.log_metric(key, float(value), step=iteration)
192
+ if heavy and input is not None and hasattr(span, "log_input"):
193
+ span.log_input("candidate", input)
194
+ if heavy and output is not None and hasattr(span, "log_output"):
195
+ span.log_output("prediction", output)
196
+
197
+ def _trial(self, iteration: int, **attrs: t.Any) -> t.Any:
198
+ """Open a ``trial`` span for one iteration, tagged with the AIRT
199
+ assessment/attack attributes so it is counted against this assessment."""
200
+ try:
201
+ from dreadnode.tracing.spans import trial_span
202
+
203
+ ctx = trial_span(
204
+ trial_id=f"{self._attack_name}-{iteration}-{self._trials_emitted}",
205
+ step=int(iteration),
206
+ airt_assessment_id=self.airt_assessment_id,
207
+ airt_trial_index=int(iteration),
208
+ airt_attack_name=self._attack_name,
209
+ airt_attack_domain=self.attack_domain,
210
+ airt_target_model=self.airt_target_model,
211
+ airt_goal=self.airt_goal,
212
+ airt_goal_category=self.airt_goal_category,
213
+ airt_input_modality=self.modality,
214
+ )
215
+ except Exception:
216
+ return nullcontext()
217
+ if not attrs:
218
+ return ctx
219
+ # Fold any per-iteration attrs (e.g. distance norm) onto the span.
220
+ from contextlib import contextmanager
221
+
222
+ @contextmanager
223
+ def _wrapped() -> t.Iterator[t.Any]:
224
+ with ctx as span:
225
+ if span is not None and hasattr(span, "set_attribute"):
226
+ with suppress(Exception):
227
+ for key, value in attrs.items():
228
+ span.set_attribute(str(key), value)
229
+ yield span
230
+
231
+ return _wrapped()
171
232
 
172
233
  # -- run scaffold ------------------------------------------------------ #
173
234
  @property
@@ -3325,10 +3325,12 @@ class ApiClient:
3325
3325
  """Find a session's workspace and project by searching across all org workspaces.
3326
3326
 
3327
3327
  Returns the full API response payload (normally containing a
3328
- ``session`` dict with ``workspace`` and ``project_name`` keys) from the
3329
- first workspace where the session is found, or ``None`` if not found in
3330
- any workspace. Used by ``--resume`` to locate sessions that belong to a
3331
- different workspace than the current profile default.
3328
+ ``session`` dict with ``workspace``, ``project_key`` and
3329
+ ``project_name`` keys) from the first workspace where the session is
3330
+ found, or ``None`` if not found in any workspace. Used by ``--resume``
3331
+ to locate sessions that belong to a different workspace than the
3332
+ current profile default — which scopes off ``project_key``, the
3333
+ addressable slug, not the ``project_name`` display label.
3332
3334
 
3333
3335
  Raises :class:`AuthenticationError` on 401 so callers can surface
3334
3336
  the auth failure rather than silently returning "not found".
@@ -4274,6 +4276,211 @@ class ApiClient:
4274
4276
  )
4275
4277
  return t.cast("dict[str, t.Any]", response.json())
4276
4278
 
4279
+ # ------------------------------------------------------------------
4280
+ # Workflows - authored graphs, runs, and approvals
4281
+ # ------------------------------------------------------------------
4282
+
4283
+ def list_workflow_definitions(
4284
+ self,
4285
+ org: str,
4286
+ workspace: str,
4287
+ *,
4288
+ capability: str | None = None,
4289
+ name: str | None = None,
4290
+ agent: str | None = None,
4291
+ limit: int = 100,
4292
+ ) -> list[dict[str, t.Any]]:
4293
+ """GET workspace workflow definitions."""
4294
+ params: dict[str, t.Any] = {"limit": limit}
4295
+ params.update(
4296
+ {
4297
+ key: value
4298
+ for key, value in (
4299
+ ("capability", capability),
4300
+ ("name", name),
4301
+ ("agent", agent),
4302
+ )
4303
+ if value is not None
4304
+ }
4305
+ )
4306
+ response = self.request(
4307
+ "GET",
4308
+ f"/org/{org}/ws/{workspace}/workflows/definitions",
4309
+ params=params,
4310
+ )
4311
+ return t.cast("list[dict[str, t.Any]]", response.json())
4312
+
4313
+ def get_workflow_definition(
4314
+ self, org: str, workspace: str, definition_id: str
4315
+ ) -> dict[str, t.Any]:
4316
+ """Get a workspace-visible definition with its full topology."""
4317
+ response = self.request(
4318
+ "GET",
4319
+ f"/org/{org}/ws/{workspace}/workflows/definitions/{definition_id}",
4320
+ )
4321
+ return t.cast("dict[str, t.Any]", response.json())
4322
+
4323
+ def create_workflow_run(
4324
+ self,
4325
+ org: str,
4326
+ workspace: str,
4327
+ *,
4328
+ definition_id: str,
4329
+ project_id: str,
4330
+ input_data: dict[str, t.Any] | None = None,
4331
+ host_kind: str = "runtime",
4332
+ runtime_id: str | None = None,
4333
+ ) -> dict[str, t.Any]:
4334
+ """Start a workflow run in a workspace project."""
4335
+ if host_kind == "runtime" and runtime_id is None:
4336
+ raise ValueError("runtime_id is required for runtime-hosted workflows")
4337
+ if host_kind == "local" and runtime_id is not None:
4338
+ raise ValueError("runtime_id is not allowed for local workflows")
4339
+ payload: dict[str, t.Any] = {
4340
+ "definition_id": definition_id,
4341
+ "project_id": project_id,
4342
+ "input": input_data or {},
4343
+ "host_kind": host_kind,
4344
+ }
4345
+ if runtime_id is not None:
4346
+ payload["runtime_id"] = runtime_id
4347
+ response = self.request(
4348
+ "POST",
4349
+ f"/org/{org}/ws/{workspace}/workflows/runs",
4350
+ json_data=payload,
4351
+ )
4352
+ return t.cast("dict[str, t.Any]", response.json())
4353
+
4354
+ def list_workflow_runs(
4355
+ self,
4356
+ org: str,
4357
+ workspace: str,
4358
+ *,
4359
+ project_id: str | None = None,
4360
+ runtime_id: str | None = None,
4361
+ definition_id: str | None = None,
4362
+ status: str | None = None,
4363
+ limit: int = 100,
4364
+ ) -> list[dict[str, t.Any]]:
4365
+ """List workflow runs in a workspace project."""
4366
+ if project_id is None and runtime_id is None:
4367
+ raise ValueError("project_id is required unless polling by runtime_id")
4368
+ params: dict[str, t.Any] = {"limit": limit}
4369
+ if project_id is not None:
4370
+ params["project_id"] = project_id
4371
+ if runtime_id is not None:
4372
+ params["runtime_id"] = runtime_id
4373
+ if definition_id is not None:
4374
+ params["definition_id"] = definition_id
4375
+ if status is not None:
4376
+ params["status"] = status
4377
+ response = self.request(
4378
+ "GET",
4379
+ f"/org/{org}/ws/{workspace}/workflows/runs",
4380
+ params=params,
4381
+ )
4382
+ return t.cast("list[dict[str, t.Any]]", response.json())
4383
+
4384
+ def claim_workflow_run(
4385
+ self,
4386
+ org: str,
4387
+ workspace: str,
4388
+ run_id: str,
4389
+ *,
4390
+ execution_id: str,
4391
+ runtime_id: str | None = None,
4392
+ ) -> dict[str, t.Any]:
4393
+ """Atomically claim one pending workflow run for this host."""
4394
+ payload: dict[str, t.Any] = {"execution_id": execution_id}
4395
+ if runtime_id is not None:
4396
+ payload["runtime_id"] = runtime_id
4397
+ response = self.request(
4398
+ "POST",
4399
+ f"/org/{org}/ws/{workspace}/workflows/runs/{run_id}/claim",
4400
+ json_data=payload,
4401
+ )
4402
+ return t.cast("dict[str, t.Any]", response.json())
4403
+
4404
+ def get_workflow_run(self, org: str, workspace: str, run_id: str) -> dict[str, t.Any]:
4405
+ """Get a workflow run with nodes and pinned topology."""
4406
+ response = self.request("GET", f"/org/{org}/ws/{workspace}/workflows/runs/{run_id}")
4407
+ return t.cast("dict[str, t.Any]", response.json())
4408
+
4409
+ def append_workflow_facts(
4410
+ self,
4411
+ org: str,
4412
+ workspace: str,
4413
+ run_id: str,
4414
+ facts: list[dict[str, t.Any]],
4415
+ *,
4416
+ execution_id: str,
4417
+ ) -> dict[str, t.Any]:
4418
+ """Append host-sequenced facts to a workspace workflow run."""
4419
+ response = self.request(
4420
+ "POST",
4421
+ f"/org/{org}/ws/{workspace}/workflows/runs/{run_id}/facts",
4422
+ json_data={"execution_id": execution_id, "facts": facts},
4423
+ )
4424
+ return t.cast("dict[str, t.Any]", response.json())
4425
+
4426
+ def heartbeat_workflow_run(
4427
+ self,
4428
+ org: str,
4429
+ workspace: str,
4430
+ run_id: str,
4431
+ *,
4432
+ execution_id: str,
4433
+ ) -> dict[str, t.Any]:
4434
+ """Report workflow-run liveness."""
4435
+ response = self.request(
4436
+ "POST",
4437
+ f"/org/{org}/ws/{workspace}/workflows/runs/{run_id}/heartbeat",
4438
+ json_data={"execution_id": execution_id},
4439
+ )
4440
+ return t.cast("dict[str, t.Any]", response.json())
4441
+
4442
+ def cancel_workflow_run(
4443
+ self, org: str, workspace: str, run_id: str, *, project_id: str
4444
+ ) -> dict[str, t.Any]:
4445
+ """Cancel a workflow run in one project."""
4446
+ response = self.request(
4447
+ "POST",
4448
+ f"/org/{org}/ws/{workspace}/workflows/runs/{run_id}/cancel",
4449
+ params={"project_id": project_id},
4450
+ )
4451
+ return t.cast("dict[str, t.Any]", response.json())
4452
+
4453
+ def list_workflow_approvals(
4454
+ self, org: str, workspace: str, *, project_id: str, limit: int = 100
4455
+ ) -> list[dict[str, t.Any]]:
4456
+ """List pending workflow approvals in a workspace project."""
4457
+ response = self.request(
4458
+ "GET",
4459
+ f"/org/{org}/ws/{workspace}/workflows/approvals",
4460
+ params={"project_id": project_id, "limit": limit},
4461
+ )
4462
+ return t.cast("list[dict[str, t.Any]]", response.json())
4463
+
4464
+ def decide_workflow_approval(
4465
+ self,
4466
+ org: str,
4467
+ workspace: str,
4468
+ approval_id: str,
4469
+ *,
4470
+ outcome: str,
4471
+ note: str | None = None,
4472
+ ) -> dict[str, t.Any]:
4473
+ """Decide a workspace workflow approval."""
4474
+ payload: dict[str, t.Any] = {"outcome": outcome}
4475
+ if note is not None:
4476
+ payload["note"] = note
4477
+ response = self.request(
4478
+ "POST",
4479
+ f"/org/{org}/ws/{workspace}/workflows/approvals/{approval_id}/decision",
4480
+ json_data=payload,
4481
+ )
4482
+ return t.cast("dict[str, t.Any]", response.json())
4483
+
4277
4484
 
4278
4485
  def create_api_client(*, profile: str | None = None) -> ApiClient:
4279
4486
  """Create an authenticated API client using stored API key configuration data."""
@@ -95,11 +95,18 @@ class PlatformConfig(BaseModel):
95
95
  # web UI defaults it the other way and fails closed, but nothing in the SDK
96
96
  # gates on it today — it is mirrored so the drift check stays meaningful.
97
97
  airgapped: bool = False
98
+ email_configured: bool = False
98
99
  recaptcha_enabled: bool = False
99
100
  recaptcha_site_key: str | None = None
101
+ account_defender_enabled: bool = False
102
+ account_defender_site_key: str | None = None
100
103
  credits_enabled: bool = True
101
104
  feedback_enabled: bool = False
102
105
  integrations_enabled: bool = True
106
+ # Whether the operator has enabled the Slack integration for this
107
+ # deployment. Absent (False) on older platforms, which have no Slack routes
108
+ # at all, so a client that does not receive it shows nothing (SLK-GATE-003).
109
+ slack_enabled: bool = False
103
110
  # False on older platforms whose /feedback rejects diagnostic-report fields.
104
111
  feedback_diagnostics: bool = False
105
112
  website_url: str
@@ -299,6 +306,14 @@ class Organization(BaseModel):
299
306
  """URL-friendly identifier for the organization."""
300
307
  description: str | None = None
301
308
  """Description of the organization."""
309
+ avatar_preset: t.Literal["slate", "blue", "violet", "green", "amber"] | None = None
310
+ """Selected avatar color preset."""
311
+ avatar_source: t.Literal["image", "preset"] | None = None
312
+ """Which avatar is active; None renders the organization name initial."""
313
+ avatar_image_available: bool = False
314
+ """Whether the organization has an uploaded avatar image."""
315
+ avatar_image_revision: str | None = None
316
+ """Revision of the uploaded avatar image."""
302
317
  is_active: bool = True
303
318
  """Is the organization active?"""
304
319
  allow_external_invites: bool = False
@@ -350,7 +350,22 @@ def _summarize_capability(p: dict[str, t.Any]) -> str:
350
350
  visibility = "public" if p.get("is_public") else "private"
351
351
  description = p.get("description")
352
352
  suffix = f" [dim]-[/dim] {description}" if description else ""
353
- return f"[cyan]{name}[/cyan]@[dim]{version}[/dim] {_visibility_markup(visibility)}{suffix}"
353
+ secrets = p.get("secrets")
354
+ required_secrets = (
355
+ [
356
+ secret.get("name")
357
+ for secret in secrets
358
+ if isinstance(secret, dict) and secret.get("required", True)
359
+ ]
360
+ if isinstance(secrets, list)
361
+ else []
362
+ )
363
+ credential_notice = (
364
+ f" [yellow]requires credentials: {', '.join(str(secret) for secret in required_secrets)}[/yellow]"
365
+ if required_secrets
366
+ else ""
367
+ )
368
+ return f"[cyan]{name}[/cyan]@[dim]{version}[/dim] {_visibility_markup(visibility)}{suffix}{credential_notice}"
354
369
 
355
370
 
356
371
  _CAPABILITY_LIST_ROW_FIELDS: tuple[str, ...] = (
@@ -360,6 +375,7 @@ _CAPABILITY_LIST_ROW_FIELDS: tuple[str, ...] = (
360
375
  "author_name",
361
376
  "license",
362
377
  "component_counts",
378
+ "secrets",
363
379
  "version_count",
364
380
  "versions",
365
381
  "created_at",
@@ -11,6 +11,7 @@ import typing as t
11
11
 
12
12
  import cyclopts
13
13
 
14
+ from dreadnode.app.api.client import NotFoundError
14
15
  from dreadnode.app.cli.args import PlatformScopeArgs
15
16
  from dreadnode.app.cli.shared import (
16
17
  _FLAG_STATE,
@@ -137,7 +138,33 @@ def _print_environment_detail(payload: dict[str, t.Any]) -> None:
137
138
  # ---------------------------------------------------------------------------
138
139
 
139
140
 
140
- @cli.command()
141
+ def _create_env_with_hint(
142
+ api: t.Any, org: str, workspace: str, body: dict[str, t.Any], task_ref: str
143
+ ) -> dict[str, t.Any]:
144
+ """Create the environment, adding a resolution hint to a task-not-found 404.
145
+
146
+ A bare name resolves to a task in the caller's org or any public task; a task
147
+ owned by another org resolves only when it is public or owned by the caller
148
+ (server-side visibility rule). We do not retry client-side - a public task
149
+ already resolves by bare name, and a private cross-org task 404s the same way
150
+ whether or not it is qualified. Only a task-not-found 404 gets the hint; any
151
+ other 404 (e.g. a bad ``--project-id``) keeps the server's own detail message.
152
+ """
153
+ try:
154
+ return api.create_environment(org, workspace, body)
155
+ except NotFoundError as exc:
156
+ # provision() can 404 on the project lookup (bad --project-id) before it
157
+ # ever resolves the task, so only rewrite genuine task-not-found errors.
158
+ if "task not found" not in str(exc).lower():
159
+ raise
160
+ raise NotFoundError(
161
+ f"Task '{task_ref}' not found. A bare name resolves to a task in your org or "
162
+ f"any public task; a task owned by another org must be public or owned by you. "
163
+ f"Check the name and version, or qualify it as <org>/<name>."
164
+ ) from exc
165
+
166
+
167
+ @cli.command(alias="provision")
141
168
  def create(
142
169
  task_ref: str,
143
170
  *,
@@ -207,14 +234,19 @@ def create(
207
234
  as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
208
235
  platform: PlatformScopeArgs = PlatformScopeArgs(),
209
236
  ) -> None:
210
- """Provision a task environment.
237
+ """Provision a task environment. (Alias: ``dreadnode env provision``.)
211
238
 
212
239
  ``task_ref`` follows the canonical ``[org/]name[@version]`` format:
213
240
 
214
- - ``my-task`` — latest visible version
215
- - ``my-task@1.0.0`` — exact version
216
- - ``acme/my-task`` — cross-org (must be public or owned by you)
217
- - ``acme/my-task@1.0.0`` — cross-org exact version
241
+ - ``my-task`` : latest version visible to you
242
+ - ``my-task@1.0.0`` : exact version
243
+ - ``acme/my-task`` : cross-org (must be public or owned by you)
244
+ - ``acme/my-task@1.0.0`` : cross-org exact version
245
+
246
+ A bare name resolves to a task in your org or any public task, so bundled
247
+ public targets (e.g. ``ml-extraction-fraud-tabular``, ``finops-mesh``) work by
248
+ bare name. A task owned by another org resolves only when it is public or
249
+ owned by you; otherwise qualify it as ``<org>/<name>``.
218
250
 
219
251
  Use ``--input name=value`` repeatedly to bind template variables (values
220
252
  are JSON-decoded when possible, falling back to plain strings).
@@ -245,7 +277,7 @@ def create(
245
277
  if env_models is not None:
246
278
  body["model_overrides"] = env_models
247
279
 
248
- payload = api.create_environment(profile.org_key, profile.workspace_key, body)
280
+ payload = _create_env_with_hint(api, profile.org_key, profile.workspace_key, body, task_ref)
249
281
  env_id = str(payload.get("id", ""))
250
282
 
251
283
  if wait and env_id:
@@ -792,7 +792,9 @@ def create(
792
792
  max_steps: Maximum agent tool/generation steps per sample.
793
793
  Enforced via a headless session policy; the task timeout still
794
794
  applies as a wall-clock bound.
795
- cleanup_policy: Sandbox cleanup policy.
795
+ cleanup_policy: Sandbox cleanup policy. Hosted E2B evaluations support
796
+ only ``always``; ``on_success`` is available on Docker and
797
+ OpenSandbox deployments.
796
798
  judge_model: Override the judge model for all tasks in this evaluation.
797
799
  egress: Additional outbound destination for this run's sandboxes, as an
798
800
  FQDN, a '*.suffix' wildcard, an IP, or a CIDR (repeatable). Unions