dreadnode 2.0.14__tar.gz → 2.0.15__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 (613) hide show
  1. {dreadnode-2.0.14 → dreadnode-2.0.15}/PKG-INFO +1 -1
  2. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/api/client.py +128 -6
  3. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/api/models.py +90 -9
  4. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/optimize.py +175 -23
  5. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/managed_client.py +4 -0
  6. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/models.py +122 -0
  7. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/runtime_client.py +154 -7
  8. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/app.py +311 -4
  9. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/prompt.py +12 -12
  10. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/worker_manager.py +12 -4
  11. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/app.py +1 -0
  12. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/dreadnode.tcss +8 -1
  13. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/capabilities.py +139 -104
  14. dreadnode-2.0.15/dreadnode/app/tui/screens/sessions.py +652 -0
  15. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/tool_format.py +76 -0
  16. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +71 -0
  17. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +16 -6
  18. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +175 -0
  19. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +60 -0
  20. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +54 -0
  21. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +28 -0
  22. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +124 -0
  23. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +96 -0
  24. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +172 -0
  25. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +87 -0
  26. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +128 -0
  27. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +97 -0
  28. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +240 -0
  29. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +174 -0
  30. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +68 -0
  31. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +117 -0
  32. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +107 -0
  33. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +80 -0
  34. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +189 -0
  35. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +165 -0
  36. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +329 -0
  37. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +139 -0
  38. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/guides/capability-optimization-loop.md +127 -0
  39. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +2041 -0
  40. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +1658 -0
  41. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +99 -0
  42. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +66 -0
  43. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +83 -0
  44. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +22 -0
  45. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +356 -0
  46. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +260 -0
  47. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +161 -0
  48. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +239 -0
  49. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +79 -0
  50. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +217 -0
  51. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +174 -0
  52. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +91 -0
  53. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +94 -0
  54. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +100 -0
  55. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +236 -0
  56. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +204 -0
  57. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +363 -0
  58. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +218 -0
  59. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +74 -0
  60. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +30 -0
  61. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +97 -0
  62. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +68 -0
  63. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +218 -0
  64. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +32 -0
  65. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +117 -0
  66. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +82 -0
  67. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +129 -0
  68. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +109 -0
  69. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +68 -0
  70. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +113 -0
  71. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +94 -0
  72. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +151 -0
  73. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +89 -0
  74. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +86 -0
  75. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +200 -0
  76. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +83 -0
  77. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +161 -0
  78. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +58 -0
  79. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +86 -0
  80. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +107 -0
  81. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +108 -0
  82. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +86 -0
  83. dreadnode-2.0.15/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +44 -0
  84. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/.gitignore +2 -0
  85. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/capability.yaml +29 -0
  86. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +93 -0
  87. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +66 -0
  88. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +36 -0
  89. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +100 -0
  90. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  91. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  92. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +12 -0
  93. dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +12 -0
  94. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/worker.py +9 -1
  95. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/__init__.py +2 -0
  96. dreadnode-2.0.15/dreadnode/core/environment.py +498 -0
  97. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/util.py +2 -0
  98. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/litellm_.py +32 -0
  99. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/message.py +18 -1
  100. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/__init__.py +2 -1
  101. dreadnode-2.0.15/dreadnode/optimization/adapters/__init__.py +4 -0
  102. dreadnode-2.0.15/dreadnode/optimization/adapters/env.py +276 -0
  103. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/jobs.py +167 -32
  104. dreadnode-2.0.15/dreadnode/packaging/__init__.py +0 -0
  105. dreadnode-2.0.15/dreadnode/py.typed +0 -0
  106. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/__init__.py +4 -0
  107. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/fetch.py +65 -6
  108. dreadnode-2.0.15/dreadnode/tools/web_extract.py +176 -0
  109. dreadnode-2.0.15/dreadnode/tools/web_search.py +541 -0
  110. dreadnode-2.0.15/dreadnode/tracing/__init__.py +0 -0
  111. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/etl/__init__.py +4 -0
  112. dreadnode-2.0.15/dreadnode/training/etl/sft.py +335 -0
  113. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/jobs.py +32 -2
  114. {dreadnode-2.0.14 → dreadnode-2.0.15}/pyproject.toml +2 -2
  115. dreadnode-2.0.14/dreadnode/app/tui/screens/sessions.py +0 -384
  116. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -160
  117. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-components.md +0 -111
  118. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -339
  119. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -262
  120. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -109
  121. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/command-groups.md +0 -224
  122. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/tui-crosswalk.md +0 -27
  123. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-runtime-reference/SKILL.md +0 -76
  124. dreadnode-2.0.14/dreadnode/builtin_capabilities/dreadnode/system-prompt.md +0 -7
  125. dreadnode-2.0.14/dreadnode/core/environment.py +0 -254
  126. dreadnode-2.0.14/dreadnode/optimization/adapters/__init__.py +0 -3
  127. dreadnode-2.0.14/dreadnode/tools/web_search.py +0 -170
  128. dreadnode-2.0.14/dreadnode/training/etl/sft.py +0 -102
  129. {dreadnode-2.0.14 → dreadnode-2.0.15}/.gitignore +0 -0
  130. {dreadnode-2.0.14 → dreadnode-2.0.15}/LICENSE +0 -0
  131. {dreadnode-2.0.14 → dreadnode-2.0.15}/README.md +0 -0
  132. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/__init__.py +0 -0
  133. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/__main__.py +0 -0
  134. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/__init__.py +0 -0
  135. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/agent.py +0 -0
  136. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/events.py +0 -0
  137. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/exceptions.py +0 -0
  138. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/format.py +0 -0
  139. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/hooks.py +0 -0
  140. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/mcp/__init__.py +0 -0
  141. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/mcp/auth.py +0 -0
  142. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/mcp/client.py +0 -0
  143. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/mcp/config.py +0 -0
  144. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/mcp/server.py +0 -0
  145. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/reactions.py +0 -0
  146. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/skills.py +0 -0
  147. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/stopping.py +0 -0
  148. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/subagent.py +0 -0
  149. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/tool_resolution.py +0 -0
  150. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/tools.py +0 -0
  151. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/agents/trajectory.py +0 -0
  152. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/__init__.py +0 -0
  153. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/adversarial_reasoning.py +0 -0
  154. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/advpromptier.py +0 -0
  155. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/alignment_faking.py +0 -0
  156. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analogy_escalation.py +0 -0
  157. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/__init__.py +0 -0
  158. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/aggregator.py +0 -0
  159. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/classifier.py +0 -0
  160. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/compliance.py +0 -0
  161. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/engine.py +0 -0
  162. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/recommendations.py +0 -0
  163. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/analytics/types.py +0 -0
  164. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/aprt_progressive.py +0 -0
  165. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/assessment.py +0 -0
  166. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/attention_shifting.py +0 -0
  167. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/autodan_turbo.py +0 -0
  168. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/autoredteamer.py +0 -0
  169. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/beast.py +0 -0
  170. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/__init__.py +0 -0
  171. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/atlas.py +0 -0
  172. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/nist.py +0 -0
  173. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/owasp.py +0 -0
  174. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  175. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/compliance/saif.py +0 -0
  176. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/constants.py +0 -0
  177. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/cot_jailbreak.py +0 -0
  178. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/crescendo.py +0 -0
  179. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/__init__.py +0 -0
  180. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  181. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  182. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/assets/image/meth.png +0 -0
  183. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  184. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  185. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  186. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  187. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  188. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  189. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  190. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  191. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  192. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  193. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  194. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  195. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  196. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  197. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  198. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  199. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  200. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/deep_inception.py +0 -0
  201. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/drattack.py +0 -0
  202. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/echo_chamber.py +0 -0
  203. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/events.py +0 -0
  204. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/genetic_persona.py +0 -0
  205. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/goat.py +0 -0
  206. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/goat_v2.py +0 -0
  207. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/gptfuzzer.py +0 -0
  208. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/humor_bypass.py +0 -0
  209. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/image.py +0 -0
  210. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/j2_meta.py +0 -0
  211. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/jbdistill.py +0 -0
  212. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/jbfuzz.py +0 -0
  213. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/lrm_autonomous.py +0 -0
  214. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/mapf.py +0 -0
  215. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/multimodal.py +0 -0
  216. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/nexus.py +0 -0
  217. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/pair.py +0 -0
  218. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/persona_hijack.py +0 -0
  219. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/prompt.py +0 -0
  220. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/quantization_safety.py +0 -0
  221. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/rainbow.py +0 -0
  222. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/refusal_aware.py +0 -0
  223. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/renellm.py +0 -0
  224. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/reporting/__init__.py +0 -0
  225. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/reporting/json_report.py +0 -0
  226. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/reporting/llm_summary.py +0 -0
  227. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/reporting/markdown.py +0 -0
  228. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/reward_hacking.py +0 -0
  229. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/salami_slicing.py +0 -0
  230. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/self_persuasion.py +0 -0
  231. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/siren.py +0 -0
  232. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/tap.py +0 -0
  233. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/templatefuzz.py +0 -0
  234. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/tmap_trajectory.py +0 -0
  235. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/trojail.py +0 -0
  236. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/airt/watermark_removal.py +0 -0
  237. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/__init__.py +0 -0
  238. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/api/__init__.py +0 -0
  239. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/__init__.py +0 -0
  240. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/airt.py +0 -0
  241. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/args.py +0 -0
  242. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/capability.py +0 -0
  243. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/dataset.py +0 -0
  244. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/environment.py +0 -0
  245. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/evaluation.py +0 -0
  246. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/main.py +0 -0
  247. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/model.py +0 -0
  248. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/runtime.py +0 -0
  249. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/sandbox.py +0 -0
  250. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/shared.py +0 -0
  251. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/task.py +0 -0
  252. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/__init__.py +0 -0
  253. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  254. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  255. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  256. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  257. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  258. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  259. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  260. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  261. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  262. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/train.py +0 -0
  263. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/cli/worlds.py +0 -0
  264. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/__init__.py +0 -0
  265. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/interactive.py +0 -0
  266. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/client/transports.py +0 -0
  267. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/config.py +0 -0
  268. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/env.py +0 -0
  269. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/main.py +0 -0
  270. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/model_catalog.py +0 -0
  271. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/paths.py +0 -0
  272. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/print_mode.py +0 -0
  273. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/__init__.py +0 -0
  274. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/auth.py +0 -0
  275. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/capability_manager.py +0 -0
  276. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/model_resolution.py +0 -0
  277. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/prompt_registry.py +0 -0
  278. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/runtime_events.py +0 -0
  279. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/session_hydrator.py +0 -0
  280. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/session_persistence.py +0 -0
  281. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/session_policy.py +0 -0
  282. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/turn_coordinator.py +0 -0
  283. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/utils.py +0 -0
  284. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/server/websocket.py +0 -0
  285. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/__init__.py +0 -0
  286. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/auth_flow.py +0 -0
  287. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/capabilities_manager.py +0 -0
  288. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/command_dispatcher.py +0 -0
  289. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/commands.py +0 -0
  290. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/connection.py +0 -0
  291. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/error_handler.py +0 -0
  292. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/model_manager.py +0 -0
  293. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/model_variants.py +0 -0
  294. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/profile_manager.py +0 -0
  295. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/runtime_cache.py +0 -0
  296. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screen_router.py +0 -0
  297. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/__init__.py +0 -0
  298. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/auth.py +0 -0
  299. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/base.py +0 -0
  300. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  301. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/connection_error.py +0 -0
  302. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/console.py +0 -0
  303. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/environments.py +0 -0
  304. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/evaluations.py +0 -0
  305. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/model_picker.py +0 -0
  306. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/models.py +0 -0
  307. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  308. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/runtimes.py +0 -0
  309. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  310. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/secrets.py +0 -0
  311. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/services.py +0 -0
  312. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  313. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/traces.py +0 -0
  314. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/screens/workspaces.py +0 -0
  315. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/sessions_manager.py +0 -0
  316. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/spans_reader.py +0 -0
  317. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/theme.py +0 -0
  318. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/turn_coordinator.py +0 -0
  319. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  320. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/turn_reducer.py +0 -0
  321. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/turn_state_phase.py +0 -0
  322. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/update_check.py +0 -0
  323. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/__init__.py +0 -0
  324. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  325. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  326. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/composer.py +0 -0
  327. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  328. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/conversation.py +0 -0
  329. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/flash.py +0 -0
  330. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  331. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  332. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  333. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  334. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  335. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  336. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  337. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  338. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  339. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  340. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  341. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  342. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  343. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/throbber.py +0 -0
  344. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/tool.py +0 -0
  345. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  346. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  347. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/welcome.py +0 -0
  348. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/widgets/whoami.py +0 -0
  349. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/app/tui/wire_events.py +0 -0
  350. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/builtin_capabilities/__init__.py +0 -0
  351. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  352. {dreadnode-2.0.14/dreadnode/packaging → dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/hooks}/__init__.py +0 -0
  353. {dreadnode-2.0.14/dreadnode/tracing → dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib}/__init__.py +0 -0
  354. /dreadnode-2.0.14/dreadnode/py.typed → /dreadnode-2.0.15/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  355. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/__init__.py +0 -0
  356. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/capability.py +0 -0
  357. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/flags.py +0 -0
  358. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/loader.py +0 -0
  359. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/sync.py +0 -0
  360. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/tool_rules.py +0 -0
  361. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/types.py +0 -0
  362. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/capabilities/worker_runner.py +0 -0
  363. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/conditions.py +0 -0
  364. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/discovery.py +0 -0
  365. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/exceptions.py +0 -0
  366. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/execution.py +0 -0
  367. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/hook.py +0 -0
  368. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/judge.py +0 -0
  369. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/load.py +0 -0
  370. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/log.py +0 -0
  371. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/meta/__init__.py +0 -0
  372. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/meta/config.py +0 -0
  373. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/meta/context.py +0 -0
  374. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/meta/hydrate.py +0 -0
  375. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/meta/introspect.py +0 -0
  376. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/metric.py +0 -0
  377. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/object.py +0 -0
  378. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/scorer.py +0 -0
  379. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/serialization.py +0 -0
  380. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/stopping.py +0 -0
  381. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/task.py +0 -0
  382. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/templating.py +0 -0
  383. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/transforms.py +0 -0
  384. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/__init__.py +0 -0
  385. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/audio.py +0 -0
  386. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/base.py +0 -0
  387. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/common.py +0 -0
  388. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/image.py +0 -0
  389. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/object_3d.py +0 -0
  390. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/table.py +0 -0
  391. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/text.py +0 -0
  392. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/core/types/video.py +0 -0
  393. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/datasets/__init__.py +0 -0
  394. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/datasets/dataset.py +0 -0
  395. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/datasets/hf.py +0 -0
  396. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/datasets/local.py +0 -0
  397. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/__init__.py +0 -0
  398. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/console.py +0 -0
  399. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/evaluation.py +0 -0
  400. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/events.py +0 -0
  401. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/format.py +0 -0
  402. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/result.py +0 -0
  403. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/evaluations/sample.py +0 -0
  404. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/__init__.py +0 -0
  405. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/caching.py +0 -0
  406. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/chat.py +0 -0
  407. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/data.py +0 -0
  408. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/exceptions.py +0 -0
  409. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/__init__.py +0 -0
  410. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/base.py +0 -0
  411. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/http.py +0 -0
  412. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/transformers_.py +0 -0
  413. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/generator/vllm_.py +0 -0
  414. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/models.py +0 -0
  415. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/parsing.py +0 -0
  416. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/tokenizer/__init__.py +0 -0
  417. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/tokenizer/base.py +0 -0
  418. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  419. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/generators/utils.py +0 -0
  420. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/models/__init__.py +0 -0
  421. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/models/hf.py +0 -0
  422. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/models/local.py +0 -0
  423. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/models/model.py +0 -0
  424. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/adapters/agent.py +0 -0
  425. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/adapters/stack.py +0 -0
  426. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/api.py +0 -0
  427. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/backends/__init__.py +0 -0
  428. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/backends/base.py +0 -0
  429. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/backends/gepa.py +0 -0
  430. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/collectors.py +0 -0
  431. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/config.py +0 -0
  432. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/console.py +0 -0
  433. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/events.py +0 -0
  434. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/format.py +0 -0
  435. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/result.py +0 -0
  436. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/sampler.py +0 -0
  437. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/sampling.py +0 -0
  438. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/search.py +0 -0
  439. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/stopping.py +0 -0
  440. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/study.py +0 -0
  441. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/optimization/trial.py +0 -0
  442. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/packaging/loader.py +0 -0
  443. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/packaging/manifest.py +0 -0
  444. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/packaging/oci.py +0 -0
  445. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/packaging/package.py +0 -0
  446. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/packaging/task_validation.py +0 -0
  447. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/__init__.py +0 -0
  448. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/boundary.py +0 -0
  449. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/fuzzing.py +0 -0
  450. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/graph.py +0 -0
  451. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/grid.py +0 -0
  452. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/image.py +0 -0
  453. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/mapelites.py +0 -0
  454. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/optuna.py +0 -0
  455. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/random.py +0 -0
  456. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/registry.py +0 -0
  457. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/samplers/strategy.py +0 -0
  458. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/__init__.py +0 -0
  459. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  460. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/agent_security.py +0 -0
  461. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/agentic.py +0 -0
  462. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/agentic_workflow.py +0 -0
  463. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/attack_outcome.py +0 -0
  464. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/classification.py +0 -0
  465. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/consistency.py +0 -0
  466. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/contains.py +0 -0
  467. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/cosine_sim.py +0 -0
  468. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/credentials.py +0 -0
  469. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/crucible.py +0 -0
  470. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/documentation_security.py +0 -0
  471. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/exfiltration_detection.py +0 -0
  472. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/format.py +0 -0
  473. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/harm.py +0 -0
  474. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/ide_security.py +0 -0
  475. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/image.py +0 -0
  476. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/json.py +0 -0
  477. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/judge.py +0 -0
  478. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/judge_ensemble.py +0 -0
  479. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/length.py +0 -0
  480. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/lexical.py +0 -0
  481. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/mcp_security.py +0 -0
  482. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/memorization.py +0 -0
  483. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/multi_agent_security.py +0 -0
  484. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/pii.py +0 -0
  485. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/prompt_leak.py +0 -0
  486. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/readability.py +0 -0
  487. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/reasoning_security.py +0 -0
  488. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/sentiment.py +0 -0
  489. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/similarity.py +0 -0
  490. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/structural_detection.py +0 -0
  491. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/scorers/supply_chain_detection.py +0 -0
  492. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/storage/__init__.py +0 -0
  493. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/storage/providers.py +0 -0
  494. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/storage/session_store.py +0 -0
  495. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/storage/storage.py +0 -0
  496. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/_ripgrep.py +0 -0
  497. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/apply_patch.py +0 -0
  498. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/dreadnode_cli.py +0 -0
  499. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/editing.py +0 -0
  500. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/execute.py +0 -0
  501. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/glob.py +0 -0
  502. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/grep.py +0 -0
  503. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/interaction.py +0 -0
  504. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/ls.py +0 -0
  505. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/memory.py +0 -0
  506. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/read.py +0 -0
  507. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/report.py +0 -0
  508. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/task.py +0 -0
  509. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/think.py +0 -0
  510. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/todo.py +0 -0
  511. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/trajectory_search.py +0 -0
  512. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tools/write.py +0 -0
  513. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/constants.py +0 -0
  514. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/convert.py +0 -0
  515. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/exporter.py +0 -0
  516. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/exporters.py +0 -0
  517. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/span.py +0 -0
  518. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/spans.py +0 -0
  519. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/tracing/trace_converter.py +0 -0
  520. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/__init__.py +0 -0
  521. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/base.py +0 -0
  522. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/dpo.py +0 -0
  523. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/etl/_common.py +0 -0
  524. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/etl/rl.py +0 -0
  525. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/etl/worlds.py +0 -0
  526. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/events.py +0 -0
  527. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/grpo.py +0 -0
  528. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ppo.py +0 -0
  529. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/prime.py +0 -0
  530. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/__init__.py +0 -0
  531. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/async_trainer.py +0 -0
  532. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/config.py +0 -0
  533. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/coordinator.py +0 -0
  534. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/distributed.py +0 -0
  535. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/dpo.py +0 -0
  536. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/experience.py +0 -0
  537. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  538. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/inference.py +0 -0
  539. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/learner.py +0 -0
  540. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/multi_turn.py +0 -0
  541. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/ppo.py +0 -0
  542. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/reward_model.py +0 -0
  543. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/rollout_env.py +0 -0
  544. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/rollout_worker.py +0 -0
  545. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/sft.py +0 -0
  546. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/ray/trainer.py +0 -0
  547. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/recipes.py +0 -0
  548. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/__init__.py +0 -0
  549. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/aggregator.py +0 -0
  550. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/functions.py +0 -0
  551. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  552. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/shaping.py +0 -0
  553. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rewards/types.py +0 -0
  554. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rollouts/__init__.py +0 -0
  555. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rollouts/adapters.py +0 -0
  556. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rollouts/orchestrator.py +0 -0
  557. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rollouts/types.py +0 -0
  558. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/rollouts/worlds.py +0 -0
  559. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/serving/__init__.py +0 -0
  560. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/serving/vllm_client.py +0 -0
  561. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/sft.py +0 -0
  562. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/__init__.py +0 -0
  563. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/config.py +0 -0
  564. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/data.py +0 -0
  565. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/renderer.py +0 -0
  566. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/rl.py +0 -0
  567. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker/trainer.py +0 -0
  568. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/tinker_sft.py +0 -0
  569. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/training/utils.py +0 -0
  570. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/__init__.py +0 -0
  571. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  572. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/adversarial_suffix.py +0 -0
  573. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/agent_skill.py +0 -0
  574. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/agentic_workflow.py +0 -0
  575. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/audio.py +0 -0
  576. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/backdoor_finetune.py +0 -0
  577. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  578. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/cipher.py +0 -0
  579. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/competitive_parity.py +0 -0
  580. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/constitutional.py +0 -0
  581. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/document.py +0 -0
  582. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/documentation_poison.py +0 -0
  583. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/encoding.py +0 -0
  584. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/exfiltration.py +0 -0
  585. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/flip_attack.py +0 -0
  586. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/guardrail_bypass.py +0 -0
  587. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/ide_injection.py +0 -0
  588. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/image.py +0 -0
  589. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/injection.py +0 -0
  590. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/json_tools.py +0 -0
  591. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/language.py +0 -0
  592. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/logic_bomb.py +0 -0
  593. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/mcp_attacks.py +0 -0
  594. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  595. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/multimodal_attacks.py +0 -0
  596. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/persuasion.py +0 -0
  597. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/perturbation.py +0 -0
  598. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/pii_extraction.py +0 -0
  599. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/pythonic_tools.py +0 -0
  600. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/rag_poisoning.py +0 -0
  601. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/reasoning_attacks.py +0 -0
  602. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/refine.py +0 -0
  603. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/response_steering.py +0 -0
  604. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/structural_exploits.py +0 -0
  605. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/stylistic.py +0 -0
  606. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/substitution.py +0 -0
  607. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/supply_chain.py +0 -0
  608. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/swap.py +0 -0
  609. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  610. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/text.py +0 -0
  611. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/video.py +0 -0
  612. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/transforms/xml_tools.py +0 -0
  613. {dreadnode-2.0.14 → dreadnode-2.0.15}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.14
3
+ Version: 2.0.15
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -2060,13 +2060,21 @@ class ApiClient:
2060
2060
  message_count: int = 0,
2061
2061
  project_id: str | None = None,
2062
2062
  runtime_id: str | None = None,
2063
+ labels: dict[str, list[str]] | None = None,
2064
+ visibility: t.Literal["private", "workspace"] = "private",
2065
+ origin: t.Literal["user", "eval", "worker"] = "user",
2063
2066
  ) -> dict[str, t.Any]:
2064
2067
  """POST /org/{org}/ws/{workspace}/sessions - Create or save a session."""
2065
2068
  payload: dict[str, t.Any] = {
2066
2069
  "id": session_id,
2067
2070
  "model": model,
2068
2071
  "message_count": message_count,
2072
+ "visibility": visibility,
2069
2073
  }
2074
+ # SES-ORG-003: only send ``origin`` on the wire when non-default —
2075
+ # the platform's ``user`` default applies otherwise.
2076
+ if origin != "user":
2077
+ payload["origin"] = origin
2070
2078
  if agent is not None:
2071
2079
  payload["agent"] = agent
2072
2080
  if title is not None:
@@ -2075,6 +2083,8 @@ class ApiClient:
2075
2083
  payload["project_id"] = project_id
2076
2084
  if runtime_id is not None:
2077
2085
  payload["runtime_id"] = runtime_id
2086
+ if labels is not None:
2087
+ payload["labels"] = labels
2078
2088
  response = self.request("POST", f"/org/{org}/ws/{workspace}/sessions", json_data=payload)
2079
2089
  return t.cast("dict[str, t.Any]", response.json())
2080
2090
 
@@ -2088,8 +2098,15 @@ class ApiClient:
2088
2098
  agent: str | None = None,
2089
2099
  title: str | None = None,
2090
2100
  message_count: int | None = None,
2101
+ labels: dict[str, list[str]] | None = None,
2102
+ visibility: t.Literal["private", "workspace"] | None = None,
2091
2103
  ) -> dict[str, t.Any]:
2092
- """PATCH /org/{org}/ws/{workspace}/sessions/{session_id} - Update a session."""
2104
+ """PATCH /org/{org}/ws/{workspace}/sessions/{session_id} - Update a session.
2105
+
2106
+ ``labels`` full-replaces non-reserved labels when provided (SES-LBL-042).
2107
+ ``visibility`` may only promote ``private`` → ``workspace``; downgrade
2108
+ returns 403 (SES-ACL-005). Omit fields to leave them unchanged.
2109
+ """
2093
2110
  payload: dict[str, t.Any] = {}
2094
2111
  if model is not None:
2095
2112
  payload["model"] = model
@@ -2099,6 +2116,10 @@ class ApiClient:
2099
2116
  payload["title"] = title
2100
2117
  if message_count is not None:
2101
2118
  payload["message_count"] = message_count
2119
+ if labels is not None:
2120
+ payload["labels"] = labels
2121
+ if visibility is not None:
2122
+ payload["visibility"] = visibility
2102
2123
  response = self.request(
2103
2124
  "PATCH",
2104
2125
  f"/org/{org}/ws/{workspace}/sessions/{session_id}",
@@ -2106,29 +2127,130 @@ class ApiClient:
2106
2127
  )
2107
2128
  return t.cast("dict[str, t.Any]", response.json())
2108
2129
 
2130
+ def archive_session(
2131
+ self,
2132
+ org: str,
2133
+ workspace: str,
2134
+ session_id: str,
2135
+ ) -> dict[str, t.Any]:
2136
+ """POST /org/{org}/ws/{workspace}/sessions/{id}/archive — idempotent."""
2137
+ response = self.request(
2138
+ "POST",
2139
+ f"/org/{org}/ws/{workspace}/sessions/{session_id}/archive",
2140
+ )
2141
+ return t.cast("dict[str, t.Any]", response.json())
2142
+
2143
+ def unarchive_session(
2144
+ self,
2145
+ org: str,
2146
+ workspace: str,
2147
+ session_id: str,
2148
+ ) -> dict[str, t.Any]:
2149
+ """POST /org/{org}/ws/{workspace}/sessions/{id}/unarchive — idempotent."""
2150
+ response = self.request(
2151
+ "POST",
2152
+ f"/org/{org}/ws/{workspace}/sessions/{session_id}/unarchive",
2153
+ )
2154
+ return t.cast("dict[str, t.Any]", response.json())
2155
+
2156
+ def freeze_session(
2157
+ self,
2158
+ org: str,
2159
+ workspace: str,
2160
+ session_id: str,
2161
+ ) -> dict[str, t.Any]:
2162
+ """POST /org/{org}/ws/{workspace}/sessions/{id}/freeze — terminal, idempotent."""
2163
+ response = self.request(
2164
+ "POST",
2165
+ f"/org/{org}/ws/{workspace}/sessions/{session_id}/freeze",
2166
+ )
2167
+ return t.cast("dict[str, t.Any]", response.json())
2168
+
2109
2169
  def list_sessions(
2110
2170
  self,
2111
2171
  org: str,
2112
2172
  workspace: str,
2113
2173
  *,
2114
2174
  page: int = 1,
2115
- page_size: int = 20,
2116
- project_id: str | None = None,
2175
+ limit: int = 20,
2176
+ project_id: str | list[str] | None = None,
2117
2177
  user_id: str | None = None,
2178
+ archived: t.Literal["active", "archived", "any"] = "active",
2179
+ label: list[str] | None = None,
2180
+ origin: list[str] | None = None,
2181
+ sort_by: t.Literal[
2182
+ "updated_at", "last_message_at", "created_at", "message_count"
2183
+ ] = "updated_at",
2184
+ sort_dir: t.Literal["asc", "desc"] = "desc",
2185
+ search: str | None = None,
2186
+ include_workload_sessions: bool = False,
2118
2187
  ) -> dict[str, t.Any]:
2119
2188
  """GET /org/{org}/ws/{workspace}/sessions - List sessions.
2120
2189
 
2121
- The platform endpoint defaults to workspace-wide. Pass ``user_id``
2122
- to scope to a single creator (e.g. the TUI's "my sessions" view).
2190
+ ``archived`` defaults to ``active`` so archived rows are hidden by
2191
+ default. ``label`` is a repeated ``key:value`` filter (SES-LBL-050).
2192
+ ``project_id`` accepts a single id or a list of ids (repeatable,
2193
+ OR combine — SES-LST-006). ``sort_by`` must be one of
2194
+ ``updated_at`` (default), ``last_message_at``, ``created_at``, or
2195
+ ``message_count``. ``search`` is the full-text filter (SES-LST-007).
2123
2196
  """
2124
- params: dict[str, t.Any] = {"page": page, "page_size": page_size}
2197
+ params: dict[str, t.Any] = {
2198
+ "page": page,
2199
+ "limit": limit,
2200
+ "archived": archived,
2201
+ "sort_by": sort_by,
2202
+ "sort_dir": sort_dir,
2203
+ }
2204
+ if include_workload_sessions:
2205
+ params["include_workload_sessions"] = True
2125
2206
  if project_id is not None:
2126
2207
  params["project_id"] = project_id
2127
2208
  if user_id is not None:
2128
2209
  params["user_id"] = user_id
2210
+ if label:
2211
+ params["label"] = label
2212
+ if origin:
2213
+ params["origin"] = origin
2214
+ if search:
2215
+ params["search"] = search
2129
2216
  response = self.request("GET", f"/org/{org}/ws/{workspace}/sessions", params=params)
2130
2217
  return t.cast("dict[str, t.Any]", response.json())
2131
2218
 
2219
+ def get_session_facets(
2220
+ self,
2221
+ org: str,
2222
+ workspace: str,
2223
+ *,
2224
+ project_id: str | list[str] | None = None,
2225
+ user_id: str | None = None,
2226
+ archived: t.Literal["active", "archived", "any"] = "active",
2227
+ label: list[str] | None = None,
2228
+ origin: list[str] | None = None,
2229
+ search: str | None = None,
2230
+ include_workload_sessions: bool = False,
2231
+ ) -> dict[str, t.Any]:
2232
+ """GET /org/{org}/ws/{workspace}/sessions/facets - Per-key label value counts.
2233
+
2234
+ Takes the same filter set as :meth:`list_sessions` (minus pagination
2235
+ / sort). ``project_id`` accepts a single id or a list. The response
2236
+ shape is ``{"labels": {key: [{"value": ..., "count": ...}, ...]}}``.
2237
+ """
2238
+ params: dict[str, t.Any] = {"archived": archived}
2239
+ if include_workload_sessions:
2240
+ params["include_workload_sessions"] = True
2241
+ if project_id is not None:
2242
+ params["project_id"] = project_id
2243
+ if user_id is not None:
2244
+ params["user_id"] = user_id
2245
+ if label:
2246
+ params["label"] = label
2247
+ if origin:
2248
+ params["origin"] = origin
2249
+ if search:
2250
+ params["search"] = search
2251
+ response = self.request("GET", f"/org/{org}/ws/{workspace}/sessions/facets", params=params)
2252
+ return t.cast("dict[str, t.Any]", response.json())
2253
+
2132
2254
  def get_session(
2133
2255
  self,
2134
2256
  org: str,
@@ -818,6 +818,8 @@ class SessionCreateRequest(BaseModel):
818
818
  validation_alias="generateParamsExtra",
819
819
  )
820
820
  policy: str | dict[str, t.Any] | None = None
821
+ labels: dict[str, list[str]] | None = None
822
+ origin: str | None = None
821
823
 
822
824
  model_config = ConfigDict(populate_by_name=True)
823
825
 
@@ -1369,7 +1371,7 @@ class TrainingJobArtifacts(BaseModel):
1369
1371
  # -----------------------------------------------------------------------------
1370
1372
 
1371
1373
  OptimizationBackend = t.Literal["gepa"]
1372
- OptimizationTargetKind = t.Literal["capability_agent"]
1374
+ OptimizationTargetKind = t.Literal["capability_agent", "capability_env"]
1373
1375
  OptimizationJobStatus = t.Literal[
1374
1376
  "pending",
1375
1377
  "queued",
@@ -1379,7 +1381,17 @@ OptimizationJobStatus = t.Literal[
1379
1381
  "cancelled",
1380
1382
  ]
1381
1383
  OptimizationLogLevel = t.Literal["debug", "info", "warning", "error"]
1382
- OptimizationComponent = t.Literal["instructions"]
1384
+ OptimizationComponent = t.Literal[
1385
+ "instructions",
1386
+ "agent_prompt",
1387
+ "capability_prompt",
1388
+ "skill_descriptions",
1389
+ "skill_bodies",
1390
+ ]
1391
+ _AGENT_COMPONENTS: frozenset[OptimizationComponent] = frozenset({"instructions"})
1392
+ _ENV_COMPONENTS: frozenset[OptimizationComponent] = frozenset(
1393
+ {"agent_prompt", "capability_prompt", "skill_descriptions", "skill_bodies"}
1394
+ )
1383
1395
  OptimizationProgressEventType = t.Literal[
1384
1396
  "optimization_start",
1385
1397
  "iteration_start",
@@ -1398,6 +1410,12 @@ class OptimizationJobConfig(BaseModel):
1398
1410
 
1399
1411
  model_config = ConfigDict(extra="forbid")
1400
1412
 
1413
+ concurrency: int = 1
1414
+ parallel_rows: int = 1
1415
+ task_ref: str | None = None
1416
+ task_refs: list[str] | None = None
1417
+ val_task_refs: list[str] | None = None
1418
+ timeout_sec: int | None = None
1401
1419
  seed: int = 0
1402
1420
  max_metric_calls: int | None = 100
1403
1421
  max_trials: int | None = None
@@ -1438,22 +1456,83 @@ class CreateOptimizationJobBase(BaseModel):
1438
1456
  run_ref: str | None = None
1439
1457
  capability_ref: CapabilityRef
1440
1458
  agent_name: str | None = None
1441
- dataset_ref: DatasetRef
1459
+ dataset_ref: DatasetRef | None = None
1442
1460
  val_dataset_ref: DatasetRef | None = None
1443
1461
  reward_recipe: RewardRecipe
1444
- components: list[OptimizationComponent] = Field(default_factory=lambda: ["instructions"])
1462
+ components: list[OptimizationComponent] | None = None
1463
+ task_ref: str | None = None
1464
+ task_refs: list[str] | None = None
1465
+ val_task_refs: list[str] | None = None
1466
+ timeout_sec: int | None = None
1445
1467
  objective: str | None = None
1446
1468
  config: OptimizationJobConfig = Field(default_factory=OptimizationJobConfig)
1447
1469
  tags: list[str] = Field(default_factory=list)
1448
1470
 
1449
1471
  @model_validator(mode="after")
1450
1472
  def validate_components(self) -> CreateOptimizationJobBase:
1473
+ if self.components is None:
1474
+ self.components = (
1475
+ ["agent_prompt", "capability_prompt", "skill_descriptions", "skill_bodies"]
1476
+ if self.target_kind == "capability_env"
1477
+ else ["instructions"]
1478
+ )
1451
1479
  if not self.components:
1452
1480
  raise ValueError("Hosted optimization jobs require at least one optimizable component")
1453
- if set(self.components) != {"instructions"}:
1454
- raise ValueError(
1455
- "Hosted optimization currently supports only ['instructions'] components"
1456
- )
1481
+ component_set = set(self.components)
1482
+ if self.target_kind == "capability_agent":
1483
+ invalid = component_set - _AGENT_COMPONENTS
1484
+ if invalid:
1485
+ raise ValueError(
1486
+ "capability_agent supports only ['instructions'] components"
1487
+ f" (got {sorted(invalid)})"
1488
+ )
1489
+ else: # capability_env
1490
+ invalid = component_set - _ENV_COMPONENTS
1491
+ if invalid:
1492
+ raise ValueError(
1493
+ "capability_env supports component surfaces"
1494
+ f" {sorted(_ENV_COMPONENTS)} (got {sorted(invalid)})"
1495
+ )
1496
+ return self
1497
+
1498
+ @model_validator(mode="after")
1499
+ def validate_env_requirements(self) -> CreateOptimizationJobBase:
1500
+ if self.target_kind == "capability_env":
1501
+ train_sources = [
1502
+ ("task_refs", bool(self.task_refs)),
1503
+ ("dataset_ref", self.dataset_ref is not None),
1504
+ ("task_ref", self.task_ref is not None),
1505
+ ]
1506
+ active = [name for name, present in train_sources if present]
1507
+ if len(active) == 0:
1508
+ raise ValueError(
1509
+ "capability_env requires a training surface: provide "
1510
+ "task_refs, task_ref, or dataset_ref"
1511
+ )
1512
+ if len(active) > 1:
1513
+ raise ValueError(
1514
+ "capability_env training surface is ambiguous — provide only "
1515
+ f"one of task_refs / task_ref / dataset_ref (got {active})"
1516
+ )
1517
+ if self.val_task_refs is not None and self.val_dataset_ref is not None:
1518
+ raise ValueError(
1519
+ "capability_env val surface is ambiguous — provide only one "
1520
+ "of val_task_refs or val_dataset_ref"
1521
+ )
1522
+ else:
1523
+ if self.task_ref is not None:
1524
+ raise ValueError("task_ref is only valid with target_kind='capability_env'")
1525
+ if self.timeout_sec is not None:
1526
+ raise ValueError("timeout_sec is only valid with target_kind='capability_env'")
1527
+ if self.task_refs is not None:
1528
+ raise ValueError("task_refs is only valid with target_kind='capability_env'")
1529
+ if self.val_task_refs is not None:
1530
+ raise ValueError("val_task_refs is only valid with target_kind='capability_env'")
1531
+ if self.dataset_ref is None:
1532
+ raise ValueError(
1533
+ "capability_agent requires dataset_ref (dataset rows drive the "
1534
+ "agent's user message and scoring)"
1535
+ )
1457
1536
  return self
1458
1537
 
1459
1538
 
@@ -1549,8 +1628,10 @@ class OptimizationJob(BaseModel):
1549
1628
  model: str
1550
1629
  project: str | None = None
1551
1630
  run_ref: str | None = None
1552
- dataset_ref: DatasetRef
1631
+ dataset_ref: DatasetRef | None = None
1553
1632
  val_dataset_ref: DatasetRef | None = None
1633
+ task_refs: list[str] | None = None
1634
+ val_task_refs: list[str] | None = None
1554
1635
  objective: str | None = None
1555
1636
  capability: OptimizationCapabilitySnapshot
1556
1637
  agent_name: str | None = None
@@ -34,7 +34,20 @@ OptimizationStatus = t.Literal[
34
34
 
35
35
  OptimizationBackend = t.Literal["gepa"]
36
36
 
37
- TargetKind = t.Literal["capability_agent"]
37
+ TargetKind = t.Literal["capability_agent", "capability_env"]
38
+
39
+ EnvComponent = t.Literal[
40
+ "agent_prompt",
41
+ "capability_prompt",
42
+ "skill_descriptions",
43
+ "skill_bodies",
44
+ ]
45
+ _DEFAULT_ENV_COMPONENTS: tuple[EnvComponent, ...] = (
46
+ "agent_prompt",
47
+ "capability_prompt",
48
+ "skill_descriptions",
49
+ "skill_bodies",
50
+ )
38
51
 
39
52
  cli = cyclopts.App(name="optimize", help="Optimize agents with jobs.")
40
53
 
@@ -83,20 +96,59 @@ def submit(
83
96
  str,
84
97
  cyclopts.Parameter(help="Capability ref in NAME@VERSION form"),
85
98
  ],
86
- dataset: t.Annotated[
87
- str,
88
- cyclopts.Parameter(help="Training dataset ref in NAME@VERSION form"),
89
- ],
90
99
  reward_recipe: t.Annotated[
91
100
  RewardRecipeChoice,
92
101
  cyclopts.Parameter(
93
102
  help="Hosted reward recipe name",
94
103
  ),
95
104
  ],
105
+ dataset: t.Annotated[
106
+ str | None,
107
+ cyclopts.Parameter(
108
+ help=(
109
+ "Agent-scored dataset ref (NAME@VERSION). Rows drive the agent's "
110
+ "user message and reward-recipe scoring. Mutually exclusive with "
111
+ "--task and --task-dataset."
112
+ ),
113
+ ),
114
+ ] = None,
115
+ task: t.Annotated[
116
+ list[str] | None,
117
+ cyclopts.Parameter(
118
+ negative_iterable=(),
119
+ help=(
120
+ "Env-scored training task (repeatable). One value = single task, "
121
+ "multiple = train-across-tasks. Mutually exclusive with --dataset "
122
+ "and --task-dataset."
123
+ ),
124
+ ),
125
+ ] = None,
126
+ task_dataset: t.Annotated[
127
+ str | None,
128
+ cyclopts.Parameter(
129
+ help=(
130
+ "Env-scored dataset ref (NAME@VERSION) where rows carry task_ref "
131
+ "plus per-row content (inputs, scoring fields). Use when the "
132
+ "corpus warrants versioning — otherwise reach for --task. "
133
+ "Mutually exclusive with --dataset and --task."
134
+ ),
135
+ ),
136
+ ] = None,
96
137
  val_dataset: t.Annotated[
97
138
  str | None,
98
139
  cyclopts.Parameter(
99
- help="Optional validation dataset ref in NAME@VERSION form",
140
+ help="Optional held-out validation dataset (NAME@VERSION).",
141
+ ),
142
+ ] = None,
143
+ val_task: t.Annotated[
144
+ list[str] | None,
145
+ cyclopts.Parameter(
146
+ negative_iterable=(),
147
+ help=(
148
+ "Env-scored held-out validation task (repeatable). Never merged "
149
+ "with training — candidates are mutated against train, scored "
150
+ "for selection against val."
151
+ ),
100
152
  ),
101
153
  ] = None,
102
154
  reward_params: t.Annotated[
@@ -180,6 +232,37 @@ def submit(
180
232
  float | None, cyclopts.Parameter(help="Timeout in seconds for waiting")
181
233
  ] = None,
182
234
  as_json: t.Annotated[bool, cyclopts.Parameter(name="--json", negative=())] = False,
235
+ env_timeout_sec: t.Annotated[
236
+ int | None,
237
+ cyclopts.Parameter(
238
+ help="Per-trial TaskEnvironment timeout in seconds (env-mode only).",
239
+ ),
240
+ ] = None,
241
+ parallel_rows: t.Annotated[
242
+ int | None,
243
+ cyclopts.Parameter(
244
+ validator=cyclopts.validators.Number(gte=1),
245
+ help="Dataset rows scored concurrently within one candidate (env-mode only; default 1).",
246
+ ),
247
+ ] = None,
248
+ concurrency: t.Annotated[
249
+ int | None,
250
+ cyclopts.Parameter(
251
+ validator=cyclopts.validators.Number(gte=1),
252
+ help="Candidates evaluated in parallel across the search (default 1).",
253
+ ),
254
+ ] = None,
255
+ component: t.Annotated[
256
+ list[EnvComponent] | None,
257
+ cyclopts.Parameter(
258
+ negative_iterable=(),
259
+ help=(
260
+ "Capability surface to optimize (env-mode only, repeatable). "
261
+ "Defaults to all four: agent_prompt, capability_prompt, "
262
+ "skill_descriptions, skill_bodies."
263
+ ),
264
+ ),
265
+ ] = None,
183
266
  platform: PlatformScopeArgs = PlatformScopeArgs(),
184
267
  ) -> None:
185
268
  """Submit a hosted optimization job."""
@@ -191,10 +274,56 @@ def submit(
191
274
  RewardRecipe,
192
275
  )
193
276
 
277
+ # Each training-surface flag is self-identifying. Pick exactly one;
278
+ # target_kind is inferred from which one the user chose.
279
+ train_sources = [
280
+ ("--task", bool(task)),
281
+ ("--task-dataset", task_dataset is not None),
282
+ ("--dataset", dataset is not None),
283
+ ]
284
+ active_train = [name for name, present in train_sources if present]
285
+ if len(active_train) == 0:
286
+ raise ValueError(
287
+ "submit requires a training surface: --task (env, inline), "
288
+ "--task-dataset (env, dataset), or --dataset (agent, dataset)"
289
+ )
290
+ if len(active_train) > 1:
291
+ raise ValueError(
292
+ f"training surface is ambiguous — provide only one of {active_train}. "
293
+ "--task is env with inline task list; --task-dataset is env with "
294
+ "curated dataset rows; --dataset is agent-scored."
295
+ )
296
+
297
+ is_env = bool(task) or task_dataset is not None
298
+ target_kind: TargetKind = "capability_env" if is_env else "capability_agent"
299
+
300
+ if val_task and val_dataset:
301
+ raise ValueError(
302
+ "val surface is ambiguous — provide only one of --val-task or --val-dataset"
303
+ )
304
+ if not is_env:
305
+ if val_task:
306
+ raise ValueError("--val-task is only valid in env mode (with --task or --task-dataset)")
307
+ if env_timeout_sec is not None:
308
+ raise ValueError("--env-timeout-sec is only valid in env mode")
309
+ if parallel_rows is not None:
310
+ raise ValueError("--parallel-rows is only meaningful in env mode")
311
+ if component:
312
+ raise ValueError("--component is only valid in env mode")
313
+
194
314
  api, profile = platform.connect()
195
315
 
196
316
  capability_ref = ArtifactRef.parse_versioned(capability, profile.org_key)
197
- dataset_ref = ArtifactRef.parse_versioned(dataset, profile.org_key)
317
+
318
+ # Both --dataset and --task-dataset resolve to the same request field
319
+ # (``dataset_ref``); the distinction is user-facing intent encoded via
320
+ # the flag choice. The server-side target_kind + validator keep the two
321
+ # modes unambiguous.
322
+ dataset_ref_source = dataset or task_dataset
323
+ dataset_ref: DatasetRef | None = None
324
+ if dataset_ref_source:
325
+ dataset_parsed = ArtifactRef.parse_versioned(dataset_ref_source, profile.org_key)
326
+ dataset_ref = DatasetRef(name=dataset_parsed.name, version=dataset_parsed.version)
198
327
 
199
328
  val_dataset_ref: DatasetRef | None = None
200
329
  if val_dataset:
@@ -236,28 +365,51 @@ def submit(
236
365
  config_kwargs["track_best_outputs"] = True
237
366
  if display_progress_bar:
238
367
  config_kwargs["display_progress_bar"] = True
239
-
240
- request = CreateGEPAOptimizationJobRequest(
241
- name=name,
242
- model=resolve_model(model),
243
- project=profile.project_key,
244
- run_ref=run_ref,
245
- capability_ref=CapabilityRef(
368
+ if concurrency is not None:
369
+ config_kwargs["concurrency"] = concurrency
370
+ if parallel_rows is not None:
371
+ config_kwargs["parallel_rows"] = parallel_rows
372
+
373
+ if target_kind == "capability_env":
374
+ components: list[str] = list(component) if component else list(_DEFAULT_ENV_COMPONENTS)
375
+ else:
376
+ components = ["instructions"]
377
+
378
+ request_kwargs: dict[str, t.Any] = {
379
+ "name": name,
380
+ "target_kind": target_kind,
381
+ "model": resolve_model(model),
382
+ # Prefer the resolved UUID over the key string. ``validate_scope``
383
+ # (run by ``platform.connect()``) populates ``project_id`` via a
384
+ # workspace-scoped lookup, so when it's set the server can resolve
385
+ # the project unambiguously. Falls back to the key when no project
386
+ # is configured on the profile.
387
+ "project": profile.project_id or profile.project_key,
388
+ "run_ref": run_ref,
389
+ "capability_ref": CapabilityRef(
246
390
  name=capability_ref.name,
247
391
  version=capability_ref.version,
248
392
  ),
249
- agent_name=agent_name,
250
- dataset_ref=DatasetRef(name=dataset_ref.name, version=dataset_ref.version),
251
- val_dataset_ref=val_dataset_ref,
252
- reward_recipe=RewardRecipe(
393
+ "agent_name": agent_name,
394
+ "dataset_ref": dataset_ref,
395
+ "val_dataset_ref": val_dataset_ref,
396
+ "reward_recipe": RewardRecipe(
253
397
  name=reward_recipe,
254
398
  params=parsed_reward_params,
255
399
  ),
256
- components=["instructions"],
257
- objective=objective,
258
- config=OptimizationJobConfig(**config_kwargs),
259
- tags=list(tag or []),
260
- )
400
+ "components": components,
401
+ "objective": objective,
402
+ "config": OptimizationJobConfig(**config_kwargs),
403
+ "tags": list(tag or []),
404
+ }
405
+ if task:
406
+ request_kwargs["task_refs"] = list(task)
407
+ if val_task:
408
+ request_kwargs["val_task_refs"] = list(val_task)
409
+ if env_timeout_sec is not None:
410
+ request_kwargs["timeout_sec"] = env_timeout_sec
411
+
412
+ request = CreateGEPAOptimizationJobRequest(**request_kwargs)
261
413
  job = api.create_optimization_job(profile.org_key, profile.workspace_key, request)
262
414
  if wait:
263
415
  job = _wait_for_optimization_job(
@@ -132,6 +132,8 @@ class ManagedRuntimeClient(RuntimeClient):
132
132
  project: str | None = None,
133
133
  generate_params_extra: dict[str, t.Any] | None = None,
134
134
  policy: str | dict[str, t.Any] | None = None,
135
+ labels: dict[str, list[str]] | None = None,
136
+ origin: str | None = None,
135
137
  ) -> models.SessionInfo:
136
138
  """Create a session, defaulting project from the platform profile."""
137
139
  resolved_project = project or self._platform_project
@@ -143,6 +145,8 @@ class ManagedRuntimeClient(RuntimeClient):
143
145
  project=resolved_project,
144
146
  generate_params_extra=generate_params_extra,
145
147
  policy=policy,
148
+ labels=labels,
149
+ origin=origin,
146
150
  )
147
151
 
148
152
  # ── Server lifecycle ──────────────────────────────────────────