dreadnode 2.0.45__tar.gz → 2.0.47__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (769) hide show
  1. {dreadnode-2.0.45 → dreadnode-2.0.47}/PKG-INFO +2 -2
  2. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/agent.py +15 -4
  3. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/engines/base.py +4 -2
  4. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/engines/claude_code.py +5 -1
  5. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/engines/native.py +3 -1
  6. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/assessment.py +6 -17
  7. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/api/client.py +211 -4
  8. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/api/models.py +18 -0
  9. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/airt.py +3 -1
  10. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/args.py +1 -1
  11. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/capability.py +17 -1
  12. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/environment.py +39 -7
  13. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/main.py +31 -3
  14. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/runtime.py +89 -15
  15. dreadnode-2.0.47/dreadnode/app/cli/workflow.py +603 -0
  16. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/managed_client.py +34 -6
  17. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/runtime_client.py +45 -2
  18. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/config.py +35 -0
  19. dreadnode-2.0.47/dreadnode/app/diagnostics.py +53 -0
  20. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/print_mode.py +27 -5
  21. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/app.py +228 -44
  22. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/capability_manager.py +57 -16
  23. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/runtime_events.py +3 -0
  24. dreadnode-2.0.47/dreadnode/app/server/runtime_inspection.py +89 -0
  25. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/session_hydrator.py +1 -1
  26. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/turn_coordinator.py +26 -0
  27. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/websocket.py +20 -2
  28. dreadnode-2.0.47/dreadnode/app/server/workflow_manager.py +207 -0
  29. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/app.py +61 -48
  30. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/bug_report.py +1 -44
  31. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/command_dispatcher.py +24 -6
  32. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/commands.py +5 -0
  33. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/dreadnode.tcss +5 -0
  34. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/__init__.py +0 -13
  35. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/composer.py +108 -27
  36. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/context_bar.py +2 -1
  37. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/conversation.py +142 -3
  38. dreadnode-2.0.47/dreadnode/app/tui/widgets/selection.py +207 -0
  39. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tool.py +31 -16
  40. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +3 -1
  41. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +29 -12
  42. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/agent_review.py +35 -0
  43. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/branch.py +41 -0
  44. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fanout.py +40 -0
  45. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/fork.py +52 -0
  46. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/assets/workflows/linear.py +28 -0
  47. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +17 -0
  48. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +1 -0
  49. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agent-output.md +0 -4
  50. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +42 -10
  51. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +13 -11
  52. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +3 -1
  53. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +5 -1
  54. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workflows.md +302 -0
  55. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2 -0
  56. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +56 -5
  57. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/workflows-authoring.md +242 -0
  58. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +4 -0
  59. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +1 -0
  60. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +4 -4
  61. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +1 -1
  62. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +9 -5
  63. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/judge.md +1 -1
  64. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +1 -1
  65. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +2 -2
  66. dreadnode-2.0.47/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/workflow.md +187 -0
  67. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +1 -1
  68. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +13 -11
  69. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +1 -1
  70. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +1 -1
  71. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +22 -0
  72. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +10 -1
  73. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +6 -6
  74. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +3 -1
  75. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +1 -1
  76. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +10 -0
  77. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/isolation.md +11 -3
  78. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/loader.py +22 -1
  79. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/types.py +18 -0
  80. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/worker_runner.py +4 -4
  81. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/runtime.py +9 -3
  82. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/egress.py +24 -0
  83. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/manifest.py +17 -0
  84. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/oci.py +60 -0
  85. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/policies/__init__.py +14 -8
  86. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/policies/guard.py +15 -6
  87. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/constants.py +7 -0
  88. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/span.py +34 -0
  89. dreadnode-2.0.47/dreadnode/workflows/__init__.py +118 -0
  90. dreadnode-2.0.47/dreadnode/workflows/compile.py +1330 -0
  91. dreadnode-2.0.47/dreadnode/workflows/context.py +115 -0
  92. dreadnode-2.0.47/dreadnode/workflows/errors.py +87 -0
  93. dreadnode-2.0.47/dreadnode/workflows/host.py +879 -0
  94. dreadnode-2.0.47/dreadnode/workflows/loader.py +163 -0
  95. dreadnode-2.0.47/dreadnode/workflows/workflow.py +198 -0
  96. dreadnode-2.0.47/dreadnode_workflow_core/__init__.py +122 -0
  97. dreadnode-2.0.47/dreadnode_workflow_core/events.py +148 -0
  98. dreadnode-2.0.47/dreadnode_workflow_core/facts.py +124 -0
  99. dreadnode-2.0.47/dreadnode_workflow_core/scheduler.py +486 -0
  100. dreadnode-2.0.47/dreadnode_workflow_core/state.py +269 -0
  101. dreadnode-2.0.47/dreadnode_workflow_core/topology.py +252 -0
  102. {dreadnode-2.0.45 → dreadnode-2.0.47}/pyproject.toml +28 -5
  103. dreadnode-2.0.45/dreadnode/app/tui/widgets/header_bar.py +0 -59
  104. dreadnode-2.0.45/dreadnode/app/tui/widgets/permission_prompt.py +0 -112
  105. dreadnode-2.0.45/dreadnode/app/tui/widgets/prompt_info.py +0 -64
  106. dreadnode-2.0.45/dreadnode/app/tui/widgets/session_sidebar.py +0 -111
  107. dreadnode-2.0.45/dreadnode/app/tui/widgets/throbber.py +0 -87
  108. {dreadnode-2.0.45 → dreadnode-2.0.47}/.gitignore +0 -0
  109. {dreadnode-2.0.45 → dreadnode-2.0.47}/LICENSE +0 -0
  110. {dreadnode-2.0.45 → dreadnode-2.0.47}/README.md +0 -0
  111. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/__init__.py +0 -0
  112. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/__main__.py +0 -0
  113. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/__init__.py +0 -0
  114. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/engines/AGENTS.md +0 -0
  115. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/engines/__init__.py +0 -0
  116. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/events.py +0 -0
  117. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/exceptions.py +0 -0
  118. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/format.py +0 -0
  119. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/hooks.py +0 -0
  120. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/judge.py +0 -0
  121. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/mcp/__init__.py +0 -0
  122. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/mcp/auth.py +0 -0
  123. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/mcp/client.py +0 -0
  124. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/mcp/config.py +0 -0
  125. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/mcp/server.py +0 -0
  126. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/process_judge.py +0 -0
  127. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/reactions.py +0 -0
  128. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/sanitize.py +0 -0
  129. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/skills.py +0 -0
  130. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/stopping.py +0 -0
  131. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/subagent.py +0 -0
  132. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/tool_resolution.py +0 -0
  133. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/tools.py +0 -0
  134. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/agents/trajectory.py +0 -0
  135. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/__init__.py +0 -0
  136. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/_base.py +0 -0
  137. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/adversarial_reasoning.py +0 -0
  138. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/advpromptier.py +0 -0
  139. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/agent_suite.py +0 -0
  140. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/agentic_suite.py +0 -0
  141. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/alignment_faking.py +0 -0
  142. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analogy_escalation.py +0 -0
  143. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/__init__.py +0 -0
  144. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/aggregator.py +0 -0
  145. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/classifier.py +0 -0
  146. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/compliance.py +0 -0
  147. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/engine.py +0 -0
  148. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/recommendations.py +0 -0
  149. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/analytics/types.py +0 -0
  150. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/approval_bypass.py +0 -0
  151. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/aprt_progressive.py +0 -0
  152. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/art_engine.py +0 -0
  153. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/__init__.py +0 -0
  154. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/defense.py +0 -0
  155. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/failure.py +0 -0
  156. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/gate.py +0 -0
  157. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/memory.py +0 -0
  158. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/modes.py +0 -0
  159. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/probes.py +0 -0
  160. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/recon.py +0 -0
  161. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/router.py +0 -0
  162. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/atlas/strategy.py +0 -0
  163. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/attention_shifting.py +0 -0
  164. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/authz.py +0 -0
  165. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/autodan_turbo.py +0 -0
  166. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/autoredteamer.py +0 -0
  167. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/beast.py +0 -0
  168. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/browser_probes.py +0 -0
  169. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/__init__.py +0 -0
  170. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/atlas.py +0 -0
  171. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/nist.py +0 -0
  172. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/owasp.py +0 -0
  173. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  174. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/compliance/saif.py +0 -0
  175. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/constants.py +0 -0
  176. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/cot_jailbreak.py +0 -0
  177. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/crescendo.py +0 -0
  178. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/__init__.py +0 -0
  179. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  180. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  181. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/assets/image/meth.png +0 -0
  182. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  183. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  184. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  185. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  186. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  187. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  188. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  189. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  190. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  191. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  192. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  193. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  194. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  195. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  196. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  197. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  198. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  199. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  200. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/deep_inception.py +0 -0
  201. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/detect.py +0 -0
  202. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/drattack.py +0 -0
  203. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/echo_chamber.py +0 -0
  204. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/__init__.py +0 -0
  205. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/_base.py +0 -0
  206. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/_text_common.py +0 -0
  207. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/bae.py +0 -0
  208. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/boundary.py +0 -0
  209. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/deepwordbug.py +0 -0
  210. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/hopskipjump.py +0 -0
  211. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/pwws.py +0 -0
  212. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/simba.py +0 -0
  213. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/square.py +0 -0
  214. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/text.py +0 -0
  215. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/textbugger.py +0 -0
  216. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/textfooler.py +0 -0
  217. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/evasion/zoo.py +0 -0
  218. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/events.py +0 -0
  219. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/__init__.py +0 -0
  220. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/_base.py +0 -0
  221. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/activethief.py +0 -0
  222. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/copycat.py +0 -0
  223. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/distillation.py +0 -0
  224. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/equation_solving.py +0 -0
  225. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/jacobian.py +0 -0
  226. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/extraction/knockoff.py +0 -0
  227. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/genetic_persona.py +0 -0
  228. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/goat.py +0 -0
  229. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/goat_v2.py +0 -0
  230. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/gptfuzzer.py +0 -0
  231. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/honeytoken.py +0 -0
  232. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/humor_bypass.py +0 -0
  233. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/image.py +0 -0
  234. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/injection_channels.py +0 -0
  235. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/inversion/__init__.py +0 -0
  236. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/inversion/_base.py +0 -0
  237. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/inversion/confidence.py +0 -0
  238. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/inversion/nes_inversion.py +0 -0
  239. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/j2_meta.py +0 -0
  240. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/jbdistill.py +0 -0
  241. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/jbfuzz.py +0 -0
  242. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/lrm_autonomous.py +0 -0
  243. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/mapf.py +0 -0
  244. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/mcp_probes.py +0 -0
  245. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/__init__.py +0 -0
  246. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/_base.py +0 -0
  247. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/entropy.py +0 -0
  248. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/label_only.py +0 -0
  249. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/lira.py +0 -0
  250. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/loss.py +0 -0
  251. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/shadow_model.py +0 -0
  252. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/membership/threshold.py +0 -0
  253. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/message_parts.py +0 -0
  254. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/model_export.py +0 -0
  255. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/multimodal.py +0 -0
  256. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/nexus.py +0 -0
  257. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/oast.py +0 -0
  258. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/pair.py +0 -0
  259. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/persona_hijack.py +0 -0
  260. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/policies.py +0 -0
  261. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/probe_planner.py +0 -0
  262. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/prompt.py +0 -0
  263. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/propagation.py +0 -0
  264. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/quantization_safety.py +0 -0
  265. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/rainbow.py +0 -0
  266. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/refusal_aware.py +0 -0
  267. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/renellm.py +0 -0
  268. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/reporting/__init__.py +0 -0
  269. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/reporting/json_report.py +0 -0
  270. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/reporting/llm_summary.py +0 -0
  271. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/reporting/markdown.py +0 -0
  272. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/resource_abuse.py +0 -0
  273. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/reward_hacking.py +0 -0
  274. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/salami_slicing.py +0 -0
  275. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/self_persuasion.py +0 -0
  276. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/siren.py +0 -0
  277. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/tap.py +0 -0
  278. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/target.py +0 -0
  279. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/__init__.py +0 -0
  280. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/auth.py +0 -0
  281. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/factory.py +0 -0
  282. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/http.py +0 -0
  283. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/message.py +0 -0
  284. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/prediction.py +0 -0
  285. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/spec.py +0 -0
  286. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/streaming/__init__.py +0 -0
  287. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/targets/streaming/nova_sonic.py +0 -0
  288. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/templatefuzz.py +0 -0
  289. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/tmap_trajectory.py +0 -0
  290. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/tool_attack.py +0 -0
  291. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/trojail.py +0 -0
  292. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/airt/watermark_removal.py +0 -0
  293. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/__init__.py +0 -0
  294. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/api/__init__.py +0 -0
  295. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/__init__.py +0 -0
  296. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/dataset.py +0 -0
  297. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/evaluation.py +0 -0
  298. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/inference_model.py +0 -0
  299. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/judge.py +0 -0
  300. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/model.py +0 -0
  301. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/optimize.py +0 -0
  302. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/sandbox.py +0 -0
  303. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/secret.py +0 -0
  304. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/session.py +0 -0
  305. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/shared.py +0 -0
  306. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/task.py +0 -0
  307. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/task_set.py +0 -0
  308. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/__init__.py +0 -0
  309. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  310. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  311. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  312. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  313. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  314. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  315. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  316. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  317. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  318. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/train.py +0 -0
  319. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/cli/worlds.py +0 -0
  320. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/__init__.py +0 -0
  321. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/interactive.py +0 -0
  322. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/models.py +0 -0
  323. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/client/transports.py +0 -0
  324. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/env.py +0 -0
  325. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/main.py +0 -0
  326. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/model_catalog.py +0 -0
  327. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/paths.py +0 -0
  328. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/__init__.py +0 -0
  329. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/auth.py +0 -0
  330. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/model_resolution.py +0 -0
  331. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/prompt.py +0 -0
  332. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/prompt_registry.py +0 -0
  333. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/runtime_credentials.py +0 -0
  334. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/session_persistence.py +0 -0
  335. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/utils.py +0 -0
  336. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/worker_manager.py +0 -0
  337. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/server/ws_auth.py +0 -0
  338. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/__init__.py +0 -0
  339. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/auth_flow.py +0 -0
  340. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/capabilities_manager.py +0 -0
  341. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/connection.py +0 -0
  342. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/error_handler.py +0 -0
  343. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/model_manager.py +0 -0
  344. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/model_variants.py +0 -0
  345. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/profile_manager.py +0 -0
  346. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screen_router.py +0 -0
  347. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/__init__.py +0 -0
  348. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/auth.py +0 -0
  349. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/base.py +0 -0
  350. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/capabilities.py +0 -0
  351. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  352. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/connection_error.py +0 -0
  353. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/console.py +0 -0
  354. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/environments.py +0 -0
  355. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/evaluations.py +0 -0
  356. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/models.py +0 -0
  357. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  358. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/readme.py +0 -0
  359. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/report_bug.py +0 -0
  360. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/runtimes.py +0 -0
  361. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  362. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/secrets.py +0 -0
  363. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/services.py +0 -0
  364. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/sessions.py +0 -0
  365. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  366. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/traces.py +0 -0
  367. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/screens/workspaces.py +0 -0
  368. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/sessions_manager.py +0 -0
  369. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/spans_reader.py +0 -0
  370. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/status_messages.py +0 -0
  371. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/theme.py +0 -0
  372. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/tool_format.py +0 -0
  373. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/turn_coordinator.py +0 -0
  374. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  375. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/turn_reducer.py +0 -0
  376. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/turn_state_phase.py +0 -0
  377. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/update_check.py +0 -0
  378. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  379. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  380. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  381. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/flash.py +0 -0
  382. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  383. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  384. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  385. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  386. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  387. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  388. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  389. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/rewind_picker.py +0 -0
  390. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/scope_modal.py +0 -0
  391. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  392. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  393. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  394. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  395. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  396. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/welcome.py +0 -0
  397. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/widgets/whoami.py +0 -0
  398. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/app/tui/wire_events.py +0 -0
  399. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/__init__.py +0 -0
  400. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  401. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  402. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  403. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  404. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  405. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  406. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  407. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/custom-engines.md +0 -0
  408. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  409. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/engines.md +0 -0
  410. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  411. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  412. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  413. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  414. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  415. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  416. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  417. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  418. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  419. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  420. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  421. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  422. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/optimization/capability-improvement.md +0 -0
  423. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  424. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  425. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  426. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  427. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +0 -0
  428. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  429. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  430. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  431. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  432. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  433. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  434. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  435. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/session.md +0 -0
  436. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task-set.md +0 -0
  437. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +0 -0
  438. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  439. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  440. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +0 -0
  441. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  442. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  443. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +0 -0
  444. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  445. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  446. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +0 -0
  447. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  448. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  449. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  450. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  451. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  452. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +0 -0
  453. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  454. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +0 -0
  455. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/local-storage.md +0 -0
  456. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/tui/overview.md +0 -0
  457. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  458. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  459. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  460. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  461. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  462. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  463. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  464. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  465. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  466. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  467. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  468. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  469. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  470. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  471. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  472. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/__init__.py +0 -0
  473. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/capability.py +0 -0
  474. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/command_tools.py +0 -0
  475. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/flags.py +0 -0
  476. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/install.py +0 -0
  477. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/sync.py +0 -0
  478. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/tool_rules.py +0 -0
  479. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/capabilities/worker.py +0 -0
  480. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/__init__.py +0 -0
  481. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/conditions.py +0 -0
  482. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/discovery.py +0 -0
  483. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/environment.py +0 -0
  484. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/exceptions.py +0 -0
  485. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/execution.py +0 -0
  486. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/hook.py +0 -0
  487. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/judge.py +0 -0
  488. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/load.py +0 -0
  489. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/log.py +0 -0
  490. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/meta/__init__.py +0 -0
  491. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/meta/config.py +0 -0
  492. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/meta/context.py +0 -0
  493. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/meta/hydrate.py +0 -0
  494. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/meta/introspect.py +0 -0
  495. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/metric.py +0 -0
  496. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/object.py +0 -0
  497. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/scorer.py +0 -0
  498. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/serialization.py +0 -0
  499. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/startup_clock.py +0 -0
  500. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/stopping.py +0 -0
  501. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/task.py +0 -0
  502. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/templating.py +0 -0
  503. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/tls.py +0 -0
  504. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/transforms.py +0 -0
  505. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/__init__.py +0 -0
  506. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/audio.py +0 -0
  507. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/base.py +0 -0
  508. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/common.py +0 -0
  509. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/image.py +0 -0
  510. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/object_3d.py +0 -0
  511. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/table.py +0 -0
  512. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/text.py +0 -0
  513. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/types/video.py +0 -0
  514. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/core/util.py +0 -0
  515. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/datasets/__init__.py +0 -0
  516. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/datasets/dataset.py +0 -0
  517. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/datasets/hf.py +0 -0
  518. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/datasets/local.py +0 -0
  519. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/__init__.py +0 -0
  520. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/console.py +0 -0
  521. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/evaluation.py +0 -0
  522. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/events.py +0 -0
  523. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/format.py +0 -0
  524. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/result.py +0 -0
  525. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/evaluations/sample.py +0 -0
  526. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/__init__.py +0 -0
  527. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/caching.py +0 -0
  528. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/chat.py +0 -0
  529. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/data.py +0 -0
  530. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/exceptions.py +0 -0
  531. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/__init__.py +0 -0
  532. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/base.py +0 -0
  533. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/http.py +0 -0
  534. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/litellm_.py +0 -0
  535. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/transformers_.py +0 -0
  536. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/generator/vllm_.py +0 -0
  537. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/message.py +0 -0
  538. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/models.py +0 -0
  539. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/parsing.py +0 -0
  540. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/proxy.py +0 -0
  541. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/__init__.py +0 -0
  542. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/base.py +0 -0
  543. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  544. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/generators/utils.py +0 -0
  545. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/items/__init__.py +0 -0
  546. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/items/config.py +0 -0
  547. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/items/models.py +0 -0
  548. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/judges/__init__.py +0 -0
  549. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/judges/outcome.py +0 -0
  550. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/judges/trajectory.py +0 -0
  551. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/judges/trajectory_tools.py +0 -0
  552. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/models/__init__.py +0 -0
  553. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/models/hf.py +0 -0
  554. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/models/local.py +0 -0
  555. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/models/model.py +0 -0
  556. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/__init__.py +0 -0
  557. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/__init__.py +0 -0
  558. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  559. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/agent.py +0 -0
  560. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/env.py +0 -0
  561. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/adapters/stack.py +0 -0
  562. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/api.py +0 -0
  563. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/backends/__init__.py +0 -0
  564. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/backends/base.py +0 -0
  565. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/backends/gepa.py +0 -0
  566. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/collectors.py +0 -0
  567. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/config.py +0 -0
  568. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/console.py +0 -0
  569. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/events.py +0 -0
  570. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/format.py +0 -0
  571. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/jobs.py +0 -0
  572. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/result.py +0 -0
  573. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/sampler.py +0 -0
  574. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/sampling.py +0 -0
  575. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/search.py +0 -0
  576. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/stopping.py +0 -0
  577. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/study.py +0 -0
  578. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/optimization/trial.py +0 -0
  579. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/__init__.py +0 -0
  580. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/loader.py +0 -0
  581. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/package.py +0 -0
  582. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/packaging/task_validation.py +0 -0
  583. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/policies/reconciliation.py +0 -0
  584. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  585. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/policies/scope.py +0 -0
  586. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/py.typed +0 -0
  587. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/__init__.py +0 -0
  588. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/boundary.py +0 -0
  589. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/fuzzing.py +0 -0
  590. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/graph.py +0 -0
  591. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/grid.py +0 -0
  592. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/image.py +0 -0
  593. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/mapelites.py +0 -0
  594. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/optuna.py +0 -0
  595. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/random.py +0 -0
  596. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/registry.py +0 -0
  597. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/samplers/strategy.py +0 -0
  598. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/__init__.py +0 -0
  599. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  600. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/agent_security.py +0 -0
  601. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/agentic.py +0 -0
  602. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/agentic_workflow.py +0 -0
  603. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/attack_outcome.py +0 -0
  604. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/browser_security.py +0 -0
  605. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/classification.py +0 -0
  606. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/consistency.py +0 -0
  607. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/contains.py +0 -0
  608. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/cosine_sim.py +0 -0
  609. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/credentials.py +0 -0
  610. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/crucible.py +0 -0
  611. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/documentation_security.py +0 -0
  612. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/exfiltration_detection.py +0 -0
  613. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/format.py +0 -0
  614. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/harm.py +0 -0
  615. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/ide_security.py +0 -0
  616. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/image.py +0 -0
  617. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/json.py +0 -0
  618. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/judge.py +0 -0
  619. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/judge_ensemble.py +0 -0
  620. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/length.py +0 -0
  621. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/lexical.py +0 -0
  622. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/mcp_security.py +0 -0
  623. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/memorization.py +0 -0
  624. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/multi_agent_security.py +0 -0
  625. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/pii.py +0 -0
  626. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/prompt_leak.py +0 -0
  627. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/readability.py +0 -0
  628. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/reasoning_security.py +0 -0
  629. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/sentiment.py +0 -0
  630. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/similarity.py +0 -0
  631. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/structural_detection.py +0 -0
  632. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/scorers/supply_chain_detection.py +0 -0
  633. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/storage/__init__.py +0 -0
  634. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/storage/providers.py +0 -0
  635. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/storage/session_store.py +0 -0
  636. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/storage/storage.py +0 -0
  637. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/__init__.py +0 -0
  638. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/_ripgrep.py +0 -0
  639. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/apply_patch.py +0 -0
  640. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/dreadnode_cli.py +0 -0
  641. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/editing.py +0 -0
  642. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/execute.py +0 -0
  643. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/fetch.py +0 -0
  644. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/glob.py +0 -0
  645. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/grep.py +0 -0
  646. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/interaction.py +0 -0
  647. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/ls.py +0 -0
  648. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/memory.py +0 -0
  649. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/project_memory.py +0 -0
  650. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/read.py +0 -0
  651. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/report.py +0 -0
  652. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/report_items.py +0 -0
  653. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/submission.py +0 -0
  654. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/task.py +0 -0
  655. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/think.py +0 -0
  656. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/todo.py +0 -0
  657. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/trajectory_search.py +0 -0
  658. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/web_extract.py +0 -0
  659. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/web_search.py +0 -0
  660. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tools/write.py +0 -0
  661. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/__init__.py +0 -0
  662. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/convert.py +0 -0
  663. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/exporter.py +0 -0
  664. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/exporters.py +0 -0
  665. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/spans.py +0 -0
  666. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/tracing/trace_converter.py +0 -0
  667. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/__init__.py +0 -0
  668. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/_progress.py +0 -0
  669. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/base.py +0 -0
  670. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/dpo.py +0 -0
  671. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/env_rollouts.py +0 -0
  672. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/etl/__init__.py +0 -0
  673. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/etl/_common.py +0 -0
  674. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/etl/rl.py +0 -0
  675. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/etl/sft.py +0 -0
  676. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/etl/worlds.py +0 -0
  677. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/events.py +0 -0
  678. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/grpo.py +0 -0
  679. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/jobs.py +0 -0
  680. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/models.py +0 -0
  681. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ppo.py +0 -0
  682. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/prime.py +0 -0
  683. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/__init__.py +0 -0
  684. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/async_trainer.py +0 -0
  685. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/config.py +0 -0
  686. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/coordinator.py +0 -0
  687. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/distributed.py +0 -0
  688. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/dpo.py +0 -0
  689. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/experience.py +0 -0
  690. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  691. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/inference.py +0 -0
  692. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/learner.py +0 -0
  693. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/multi_turn.py +0 -0
  694. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/ppo.py +0 -0
  695. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/reward_model.py +0 -0
  696. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/rollout_env.py +0 -0
  697. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/rollout_worker.py +0 -0
  698. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/sft.py +0 -0
  699. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/ray/trainer.py +0 -0
  700. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/recipes.py +0 -0
  701. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/__init__.py +0 -0
  702. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/aggregator.py +0 -0
  703. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/functions.py +0 -0
  704. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  705. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/shaping.py +0 -0
  706. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rewards/types.py +0 -0
  707. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/__init__.py +0 -0
  708. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/adapters.py +0 -0
  709. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  710. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/orchestrator.py +0 -0
  711. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/types.py +0 -0
  712. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/rollouts/worlds.py +0 -0
  713. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/serving/__init__.py +0 -0
  714. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/serving/vllm_client.py +0 -0
  715. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/sft.py +0 -0
  716. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/__init__.py +0 -0
  717. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/config.py +0 -0
  718. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/data.py +0 -0
  719. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/renderer.py +0 -0
  720. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/rl.py +0 -0
  721. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker/trainer.py +0 -0
  722. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/tinker_sft.py +0 -0
  723. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/training/utils.py +0 -0
  724. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/__init__.py +0 -0
  725. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  726. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/adversarial_suffix.py +0 -0
  727. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/agent_skill.py +0 -0
  728. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/agentic_workflow.py +0 -0
  729. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/art_prompt.py +0 -0
  730. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/audio.py +0 -0
  731. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/backdoor_finetune.py +0 -0
  732. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  733. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/cipher.py +0 -0
  734. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/competitive_parity.py +0 -0
  735. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/constitutional.py +0 -0
  736. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/document.py +0 -0
  737. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/documentation_poison.py +0 -0
  738. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/encoding.py +0 -0
  739. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/exfiltration.py +0 -0
  740. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/flip_attack.py +0 -0
  741. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/guardrail_bypass.py +0 -0
  742. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/ide_injection.py +0 -0
  743. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/image.py +0 -0
  744. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/injection.py +0 -0
  745. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/json_tools.py +0 -0
  746. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/language.py +0 -0
  747. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/logic_bomb.py +0 -0
  748. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/mcp_attacks.py +0 -0
  749. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  750. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/multimodal_attacks.py +0 -0
  751. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/past_tense.py +0 -0
  752. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/persuasion.py +0 -0
  753. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/perturbation.py +0 -0
  754. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/pii_extraction.py +0 -0
  755. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/pythonic_tools.py +0 -0
  756. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/rag_poisoning.py +0 -0
  757. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/reasoning_attacks.py +0 -0
  758. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/refine.py +0 -0
  759. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/response_steering.py +0 -0
  760. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/structural_exploits.py +0 -0
  761. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/stylistic.py +0 -0
  762. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/substitution.py +0 -0
  763. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/supply_chain.py +0 -0
  764. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/swap.py +0 -0
  765. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  766. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/text.py +0 -0
  767. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/video.py +0 -0
  768. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/transforms/xml_tools.py +0 -0
  769. {dreadnode-2.0.45 → dreadnode-2.0.47}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dreadnode
3
- Version: 2.0.45
3
+ Version: 2.0.47
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -52,7 +52,7 @@ Requires-Dist: textual>=8.0.2
52
52
  Requires-Dist: transformers>=4.57.1
53
53
  Requires-Dist: truststore<1.0.0,>=0.10.4
54
54
  Requires-Dist: uvicorn>=0.34.0
55
- Requires-Dist: websockets>=14.0
55
+ Requires-Dist: websockets>=15.0.1
56
56
  Requires-Dist: xmltodict>=1.0.2
57
57
  Provides-Extra: airt-ml
58
58
  Requires-Dist: scikit-learn<2.0.0,>=1.7.1; extra == 'airt-ml'
@@ -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
@@ -246,28 +246,17 @@ class Assessment:
246
246
  return None
247
247
 
248
248
  try:
249
- # Get runtime_id - try to use a default runtime for the project
250
- runtime_id = getattr(self, "_runtime_id", None)
251
- if runtime_id is None:
252
- # Auto-discover a runtime for this project (CLI users shouldn't need to specify this)
253
- try:
254
- runtimes_resp = api.list_runtimes(profile.org_key, profile.workspace_key)
255
- runtime_items = runtimes_resp.get("items", [])
256
- matching_runtimes = [r for r in runtime_items if r["project_id"] == project_id]
257
- if matching_runtimes:
258
- runtime_id = matching_runtimes[0]["id"]
259
- logger.debug(f"Auto-selected runtime {runtime_id} for project {project_id}")
260
- else:
261
- logger.warning(f"No runtimes found for project {project_id}")
262
- except Exception as e:
263
- logger.debug(f"Failed to auto-discover runtime for project: {e}")
264
-
249
+ # A null runtime id asks the server to pick the caller's own runtime
250
+ # for the project. Members each hold their own runtimes there, so a
251
+ # client has no way to know which one is meant; anything inferred
252
+ # here would be a guess sent as though the caller had chosen it.
253
+ # Pass through what the caller supplied, nothing more.
265
254
  result = api.create_airt_assessment(
266
255
  profile.org_key,
267
256
  profile.workspace_key,
268
257
  name=self.name,
269
258
  project_id=project_id,
270
- runtime_id=runtime_id,
259
+ runtime_id=self._runtime_id,
271
260
  description=self.description,
272
261
  session_id=self._session_id,
273
262
  target_model=self.target_model,
@@ -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,21 @@ 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 switched on the Agent Policies pages. Absent
107
+ # (False) on older platforms.
108
+ agent_policies_enabled: bool = False
109
+ # Whether the operator has enabled the Slack integration for this
110
+ # deployment. Absent (False) on older platforms, which have no Slack routes
111
+ # at all, so a client that does not receive it shows nothing (SLK-GATE-003).
112
+ slack_enabled: bool = False
103
113
  # False on older platforms whose /feedback rejects diagnostic-report fields.
104
114
  feedback_diagnostics: bool = False
105
115
  website_url: str
@@ -299,6 +309,14 @@ class Organization(BaseModel):
299
309
  """URL-friendly identifier for the organization."""
300
310
  description: str | None = None
301
311
  """Description of the organization."""
312
+ avatar_preset: t.Literal["slate", "blue", "violet", "green", "amber"] | None = None
313
+ """Selected avatar color preset."""
314
+ avatar_source: t.Literal["image", "preset"] | None = None
315
+ """Which avatar is active; None renders the organization name initial."""
316
+ avatar_image_available: bool = False
317
+ """Whether the organization has an uploaded avatar image."""
318
+ avatar_image_revision: str | None = None
319
+ """Revision of the uploaded avatar image."""
302
320
  is_active: bool = True
303
321
  """Is the organization active?"""
304
322
  allow_external_invites: bool = False
@@ -405,7 +405,9 @@ def create(
405
405
  ] = None,
406
406
  runtime_id: t.Annotated[
407
407
  str | None,
408
- cyclopts.Parameter(help="Runtime ID. Required when the project has multiple runtimes."),
408
+ cyclopts.Parameter(
409
+ help="Runtime ID. Defaults to your own runtime in the project; a runtime you don't own is ignored."
410
+ ),
409
411
  ] = None,
410
412
  description: t.Annotated[str | None, cyclopts.Parameter(help="Assessment description")] = None,
411
413
  session_id: t.Annotated[str | None, cyclopts.Parameter(help="Session ID to associate")] = None,
@@ -244,7 +244,7 @@ class TuiArgs(PlatformScopeArgs):
244
244
  int | None,
245
245
  cyclopts.Parameter(
246
246
  group=TUI_GROUP,
247
- help="Step budget for autonomous mode (defaults to 30)",
247
+ help="Step budget for autonomous mode (defaults to 100)",
248
248
  ),
249
249
  ] = None
250
250
  policy: t.Annotated[
@@ -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:
@@ -18,6 +18,7 @@ from rich.panel import Panel
18
18
 
19
19
  from dreadnode.app.cli.args import RESUME_PICK_SENTINEL, PlatformArgs, TuiArgs
20
20
  from dreadnode.app.cli.shared import console, print_error, print_success
21
+ from dreadnode.app.config import DEFAULT_AUTONOMOUS_MAX_STEPS
21
22
  from dreadnode.app.model_catalog import resolve_model
22
23
  from dreadnode.core.tls import format_tls_error
23
24
 
@@ -149,6 +150,7 @@ _LAZY_COMMANDS: dict[str, tuple[str, str | None]] = {
149
150
  "task": ("dreadnode.app.cli.task", None),
150
151
  "task-set": ("dreadnode.app.cli.task_set", None),
151
152
  "train": ("dreadnode.app.cli.train", None),
153
+ "workflow": ("dreadnode.app.cli.workflow", None),
152
154
  "worlds": ("dreadnode.app.cli.worlds", None),
153
155
  }
154
156
 
@@ -254,6 +256,17 @@ def _default(*, tui_args: TuiArgs = TuiArgs()) -> None:
254
256
  # ---------------------------------------------------------------------------
255
257
 
256
258
 
259
+ def _autonomous_step_budget(tui_args: TuiArgs) -> int:
260
+ """Step budget for unattended runs (``--auto``, ``--print``).
261
+
262
+ ``--max-steps`` wins when supplied; otherwise these surfaces run under the
263
+ product default rather than the budget-neutral ``headless`` policy default.
264
+ """
265
+ if tui_args.max_steps is not None:
266
+ return tui_args.max_steps
267
+ return DEFAULT_AUTONOMOUS_MAX_STEPS
268
+
269
+
257
270
  def create_app(tui_args: TuiArgs) -> "DreadnodeTextualApp":
258
271
  """Build a :class:`DreadnodeTextualApp` from resolved CLI/TUI args.
259
272
 
@@ -296,9 +309,10 @@ def create_app(tui_args: TuiArgs) -> "DreadnodeTextualApp":
296
309
  if tui_args.max_steps is not None and "max_steps" not in initial_policy:
297
310
  initial_policy["max_steps"] = tui_args.max_steps
298
311
  elif tui_args.auto:
299
- initial_policy = {"name": "headless"}
300
- if tui_args.max_steps is not None:
301
- initial_policy["max_steps"] = tui_args.max_steps
312
+ initial_policy = {
313
+ "name": "headless",
314
+ "max_steps": _autonomous_step_budget(tui_args),
315
+ }
302
316
 
303
317
  return DreadnodeTextualApp(
304
318
  profile=profile,
@@ -336,15 +350,29 @@ def _run_print(tui_args: TuiArgs) -> None:
336
350
  if not tui_args.prompt:
337
351
  raise ValueError("--print requires --prompt")
338
352
 
353
+ # Resolve the same way the TUI does, so ``--profile`` and the scope
354
+ # flags reach the headless runtime instead of being re-derived from
355
+ # whichever profile happens to be active on disk.
356
+ from dreadnode.app.config import ProfileError
357
+
358
+ try:
359
+ profile = tui_args.resolve()
360
+ except ProfileError as exc:
361
+ raise ValueError(str(exc)) from exc
362
+ except Exception:
363
+ profile = None
364
+
339
365
  asyncio.run(
340
366
  run_print_mode(
341
367
  prompt=tui_args.prompt,
368
+ profile=profile,
342
369
  model=resolve_model(tui_args.model) if tui_args.model else None,
343
370
  agent=tui_args.agent,
344
371
  capabilities_dirs=tui_args.capabilities_dirs,
345
372
  capabilities=tui_args.capabilities,
346
373
  capability_flags=tui_args.capability_flags,
347
374
  system_prompt=tui_args.system_prompt,
375
+ max_steps=_autonomous_step_budget(tui_args),
348
376
  server_url=tui_args.runtime_server,
349
377
  platform_url=tui_args.server,
350
378
  project_memory_preload_limit=tui_args.project_memory_preload_limit,