dreadnode 2.0.28__tar.gz → 2.0.29__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 (634) hide show
  1. {dreadnode-2.0.28 → dreadnode-2.0.29}/PKG-INFO +1 -1
  2. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/process_judge.py +97 -9
  3. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/autodan_turbo.py +12 -0
  4. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/beast.py +12 -0
  5. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/deep_inception.py +12 -0
  6. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/drattack.py +12 -0
  7. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/gptfuzzer.py +12 -0
  8. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/image.py +24 -0
  9. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/multimodal.py +12 -0
  10. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/rainbow.py +12 -0
  11. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/renellm.py +12 -0
  12. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/api/client.py +9 -1
  13. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/api/models.py +16 -0
  14. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/evaluation.py +4 -0
  15. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/task.py +85 -15
  16. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/train.py +14 -2
  17. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/model_catalog.py +1 -1
  18. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/app.py +2 -33
  19. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/dreadnode.tcss +0 -3
  20. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/model_manager.py +10 -60
  21. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/__init__.py +0 -2
  22. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/runtimes.py +53 -0
  23. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/sandboxes.py +18 -0
  24. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/tool_format.py +20 -3
  25. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/composer.py +0 -2
  26. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/help_panel.py +1 -1
  27. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/rewind_picker.py +1 -2
  28. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/evaluation.md +1 -0
  29. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/task.md +1 -1
  30. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/train.md +2 -2
  31. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/INDEX.md +1 -0
  32. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/chat-models.md +34 -38
  33. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/organizations.md +2 -1
  34. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/secrets.md +4 -2
  35. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/settings.md +4 -4
  36. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/inspecting.md +2 -0
  37. dreadnode-2.0.29/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/runtime-limits.md +55 -0
  38. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/policies/guard.py +20 -0
  39. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/judge.py +31 -20
  40. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/read.py +28 -5
  41. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/jobs.py +12 -2
  42. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/config.py +16 -3
  43. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/trainer.py +131 -30
  44. {dreadnode-2.0.28 → dreadnode-2.0.29}/pyproject.toml +2 -1
  45. dreadnode-2.0.28/dreadnode/app/tui/screens/model_picker.py +0 -127
  46. {dreadnode-2.0.28 → dreadnode-2.0.29}/.gitignore +0 -0
  47. {dreadnode-2.0.28 → dreadnode-2.0.29}/LICENSE +0 -0
  48. {dreadnode-2.0.28 → dreadnode-2.0.29}/README.md +0 -0
  49. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/__init__.py +0 -0
  50. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/__main__.py +0 -0
  51. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/__init__.py +0 -0
  52. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/agent.py +0 -0
  53. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/events.py +0 -0
  54. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/exceptions.py +0 -0
  55. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/format.py +0 -0
  56. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/hooks.py +0 -0
  57. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/judge.py +0 -0
  58. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/mcp/__init__.py +0 -0
  59. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/mcp/auth.py +0 -0
  60. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/mcp/client.py +0 -0
  61. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/mcp/config.py +0 -0
  62. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/mcp/server.py +0 -0
  63. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/reactions.py +0 -0
  64. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/skills.py +0 -0
  65. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/stopping.py +0 -0
  66. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/subagent.py +0 -0
  67. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/tool_resolution.py +0 -0
  68. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/tools.py +0 -0
  69. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/agents/trajectory.py +0 -0
  70. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/__init__.py +0 -0
  71. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/adversarial_reasoning.py +0 -0
  72. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/advpromptier.py +0 -0
  73. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/alignment_faking.py +0 -0
  74. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analogy_escalation.py +0 -0
  75. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/__init__.py +0 -0
  76. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/aggregator.py +0 -0
  77. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/classifier.py +0 -0
  78. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/compliance.py +0 -0
  79. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/engine.py +0 -0
  80. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/recommendations.py +0 -0
  81. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/analytics/types.py +0 -0
  82. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/aprt_progressive.py +0 -0
  83. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/assessment.py +0 -0
  84. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/attention_shifting.py +0 -0
  85. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/autoredteamer.py +0 -0
  86. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/__init__.py +0 -0
  87. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/atlas.py +0 -0
  88. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/nist.py +0 -0
  89. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/owasp.py +0 -0
  90. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  91. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/compliance/saif.py +0 -0
  92. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/constants.py +0 -0
  93. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/cot_jailbreak.py +0 -0
  94. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/crescendo.py +0 -0
  95. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/__init__.py +0 -0
  96. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  97. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  98. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/assets/image/meth.png +0 -0
  99. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  100. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  101. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  102. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  103. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/idor.yaml +0 -0
  104. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  105. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  106. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  107. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  108. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  109. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  110. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  111. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  112. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  113. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  114. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  115. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  116. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  117. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/echo_chamber.py +0 -0
  118. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/events.py +0 -0
  119. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/genetic_persona.py +0 -0
  120. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/goat.py +0 -0
  121. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/goat_v2.py +0 -0
  122. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/humor_bypass.py +0 -0
  123. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/j2_meta.py +0 -0
  124. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/jbdistill.py +0 -0
  125. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/jbfuzz.py +0 -0
  126. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/lrm_autonomous.py +0 -0
  127. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/mapf.py +0 -0
  128. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/nexus.py +0 -0
  129. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/pair.py +0 -0
  130. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/persona_hijack.py +0 -0
  131. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/prompt.py +0 -0
  132. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/quantization_safety.py +0 -0
  133. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/refusal_aware.py +0 -0
  134. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/reporting/__init__.py +0 -0
  135. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/reporting/json_report.py +0 -0
  136. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/reporting/llm_summary.py +0 -0
  137. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/reporting/markdown.py +0 -0
  138. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/reward_hacking.py +0 -0
  139. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/salami_slicing.py +0 -0
  140. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/self_persuasion.py +0 -0
  141. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/siren.py +0 -0
  142. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/tap.py +0 -0
  143. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/templatefuzz.py +0 -0
  144. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/tmap_trajectory.py +0 -0
  145. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/trojail.py +0 -0
  146. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/airt/watermark_removal.py +0 -0
  147. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/__init__.py +0 -0
  148. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/api/__init__.py +0 -0
  149. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/__init__.py +0 -0
  150. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/airt.py +0 -0
  151. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/args.py +0 -0
  152. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/capability.py +0 -0
  153. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/dataset.py +0 -0
  154. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/environment.py +0 -0
  155. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/inference_model.py +0 -0
  156. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/judge.py +0 -0
  157. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/main.py +0 -0
  158. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/model.py +0 -0
  159. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/optimize.py +0 -0
  160. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/runtime.py +0 -0
  161. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/sandbox.py +0 -0
  162. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/secret.py +0 -0
  163. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/session.py +0 -0
  164. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/shared.py +0 -0
  165. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/__init__.py +0 -0
  166. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/__init__.py +0 -0
  167. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/challenge/Dockerfile +0 -0
  168. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/docker-compose.yaml +0 -0
  169. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/provision.sh +0 -0
  170. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/solution.sh +0 -0
  171. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +0 -0
  172. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/task.yaml.tmpl +0 -0
  173. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/teardown.sh +0 -0
  174. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/templates/init/verify.sh +0 -0
  175. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/cli/worlds.py +0 -0
  176. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/__init__.py +0 -0
  177. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/interactive.py +0 -0
  178. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/managed_client.py +0 -0
  179. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/models.py +0 -0
  180. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/runtime_client.py +0 -0
  181. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/client/transports.py +0 -0
  182. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/config.py +0 -0
  183. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/env.py +0 -0
  184. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/main.py +0 -0
  185. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/paths.py +0 -0
  186. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/print_mode.py +0 -0
  187. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/__init__.py +0 -0
  188. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/app.py +0 -0
  189. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/auth.py +0 -0
  190. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/capability_manager.py +0 -0
  191. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/model_resolution.py +0 -0
  192. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/prompt.py +0 -0
  193. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/prompt_registry.py +0 -0
  194. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/runtime_events.py +0 -0
  195. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/session_hydrator.py +0 -0
  196. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/session_persistence.py +0 -0
  197. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/turn_coordinator.py +0 -0
  198. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/utils.py +0 -0
  199. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/websocket.py +0 -0
  200. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/server/worker_manager.py +0 -0
  201. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/__init__.py +0 -0
  202. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/auth_flow.py +0 -0
  203. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/capabilities_manager.py +0 -0
  204. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/command_dispatcher.py +0 -0
  205. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/commands.py +0 -0
  206. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/connection.py +0 -0
  207. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/error_handler.py +0 -0
  208. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/model_variants.py +0 -0
  209. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/profile_manager.py +0 -0
  210. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/runtime_cache.py +0 -0
  211. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screen_router.py +0 -0
  212. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/auth.py +0 -0
  213. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/base.py +0 -0
  214. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/capabilities.py +0 -0
  215. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/capability_docs.py +0 -0
  216. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/connection_error.py +0 -0
  217. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/console.py +0 -0
  218. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/environments.py +0 -0
  219. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/evaluations.py +0 -0
  220. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/models.py +0 -0
  221. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/raw_spans.py +0 -0
  222. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/secrets.py +0 -0
  223. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/services.py +0 -0
  224. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/sessions.py +0 -0
  225. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  226. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/traces.py +0 -0
  227. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/screens/workspaces.py +0 -0
  228. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/sessions_manager.py +0 -0
  229. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/spans_reader.py +0 -0
  230. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/status_messages.py +0 -0
  231. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/theme.py +0 -0
  232. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/turn_coordinator.py +0 -0
  233. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  234. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/turn_reducer.py +0 -0
  235. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/turn_state_phase.py +0 -0
  236. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/update_check.py +0 -0
  237. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/__init__.py +0 -0
  238. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  239. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  240. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/confirm_modal.py +0 -0
  241. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  242. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/conversation.py +0 -0
  243. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/flash.py +0 -0
  244. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  245. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/human_prompt.py +0 -0
  246. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  247. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  248. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/new_messages_pill.py +0 -0
  249. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  250. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  251. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  252. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  253. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  254. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  255. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  256. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  257. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/throbber.py +0 -0
  258. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/tool.py +0 -0
  259. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  260. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  261. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/welcome.py +0 -0
  262. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/widgets/whoami.py +0 -0
  263. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/app/tui/wire_events.py +0 -0
  264. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/__init__.py +0 -0
  265. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/MAINTAINING.md +0 -0
  266. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +0 -0
  267. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/capability.yaml +0 -0
  268. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/SKILL.md +0 -0
  269. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/capability-improvement.md +0 -0
  270. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/methodology-grounding.md +0 -0
  271. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/prior-art-audit.md +0 -0
  272. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/promoting-capabilities.md +0 -0
  273. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/quality-bar.md +0 -0
  274. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/INDEX.md +0 -0
  275. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/agents.md +0 -0
  276. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/dependencies-and-checks.md +0 -0
  277. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/env-vars.md +0 -0
  278. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/events.md +0 -0
  279. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/flags.md +0 -0
  280. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/hooks.md +0 -0
  281. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/installing.md +0 -0
  282. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/manifest.md +0 -0
  283. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/mcp-servers.md +0 -0
  284. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/overview.md +0 -0
  285. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/policies.md +0 -0
  286. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/publishing.md +0 -0
  287. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/quickstart.md +0 -0
  288. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/skills.md +0 -0
  289. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/tools.md +0 -0
  290. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers-reference.md +0 -0
  291. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/workers.md +0 -0
  292. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/capabilities/writing-skills.md +0 -0
  293. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/agents.md +0 -0
  294. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/sdk/capabilities.md +0 -0
  295. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references/tui/default-tools.md +0 -0
  296. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/references-and-depth.md +0 -0
  297. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/creating-capabilities/runtime-default-capability.md +0 -0
  298. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/SKILL.md +0 -0
  299. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/INDEX.md +0 -0
  300. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/airt.md +0 -0
  301. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/capability.md +0 -0
  302. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/dataset.md +0 -0
  303. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/env.md +0 -0
  304. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/inference-model.md +0 -0
  305. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/main.md +0 -0
  306. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/model.md +0 -0
  307. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/optimize.md +0 -0
  308. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/overview.md +0 -0
  309. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/runtime.md +0 -0
  310. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/sandbox.md +0 -0
  311. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/secret.md +0 -0
  312. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/cli/worlds.md +0 -0
  313. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-cli/references/getting-started/authentication.md +0 -0
  314. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/SKILL.md +0 -0
  315. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/installing.md +0 -0
  316. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/capabilities/overview.md +0 -0
  317. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/authentication.md +0 -0
  318. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/overview.md +0 -0
  319. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/getting-started/quickstart.md +0 -0
  320. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/credits.md +0 -0
  321. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/overview.md +0 -0
  322. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/projects.md +0 -0
  323. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/users.md +0 -0
  324. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/platform/workspaces.md +0 -0
  325. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/configuration.md +0 -0
  326. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/managing.md +0 -0
  327. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/manifest-reference.md +0 -0
  328. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/overview.md +0 -0
  329. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/quickstart.md +0 -0
  330. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/runtimes/serve.md +0 -0
  331. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/environment-lifecycle.md +0 -0
  332. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-concepts/references/sandboxes/overview.md +0 -0
  333. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/getting-started/SKILL.md +0 -0
  334. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/dreadnode/skills/research-capabilities/SKILL.md +0 -0
  335. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/.gitignore +0 -0
  336. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/capability.yaml +0 -0
  337. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/hooks/__init__.py +0 -0
  338. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/hooks/observer.py +0 -0
  339. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/__init__.py +0 -0
  340. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/classifier.py +0 -0
  341. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/reflector_goal.py +0 -0
  342. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/self_improvement_lib/skill_io.py +0 -0
  343. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/skills-promoted/.gitkeep +0 -0
  344. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/skills-proposed/.gitkeep +0 -0
  345. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/tools/__init__.py +0 -0
  346. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/tools/reflector.py +0 -0
  347. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/builtin_capabilities/self-improvement/tools/skill_stats.py +0 -0
  348. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/__init__.py +0 -0
  349. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/capability.py +0 -0
  350. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/flags.py +0 -0
  351. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/install.py +0 -0
  352. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/loader.py +0 -0
  353. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/sync.py +0 -0
  354. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/tool_rules.py +0 -0
  355. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/types.py +0 -0
  356. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/worker.py +0 -0
  357. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/capabilities/worker_runner.py +0 -0
  358. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/__init__.py +0 -0
  359. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/conditions.py +0 -0
  360. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/discovery.py +0 -0
  361. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/environment.py +0 -0
  362. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/exceptions.py +0 -0
  363. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/execution.py +0 -0
  364. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/hook.py +0 -0
  365. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/judge.py +0 -0
  366. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/load.py +0 -0
  367. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/log.py +0 -0
  368. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/meta/__init__.py +0 -0
  369. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/meta/config.py +0 -0
  370. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/meta/context.py +0 -0
  371. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/meta/hydrate.py +0 -0
  372. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/meta/introspect.py +0 -0
  373. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/metric.py +0 -0
  374. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/object.py +0 -0
  375. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/scorer.py +0 -0
  376. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/serialization.py +0 -0
  377. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/stopping.py +0 -0
  378. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/task.py +0 -0
  379. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/templating.py +0 -0
  380. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/transforms.py +0 -0
  381. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/__init__.py +0 -0
  382. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/audio.py +0 -0
  383. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/base.py +0 -0
  384. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/common.py +0 -0
  385. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/image.py +0 -0
  386. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/object_3d.py +0 -0
  387. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/table.py +0 -0
  388. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/text.py +0 -0
  389. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/types/video.py +0 -0
  390. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/core/util.py +0 -0
  391. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/datasets/__init__.py +0 -0
  392. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/datasets/dataset.py +0 -0
  393. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/datasets/hf.py +0 -0
  394. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/datasets/local.py +0 -0
  395. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/__init__.py +0 -0
  396. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/console.py +0 -0
  397. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/evaluation.py +0 -0
  398. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/events.py +0 -0
  399. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/format.py +0 -0
  400. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/result.py +0 -0
  401. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/evaluations/sample.py +0 -0
  402. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/__init__.py +0 -0
  403. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/caching.py +0 -0
  404. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/chat.py +0 -0
  405. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/data.py +0 -0
  406. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/exceptions.py +0 -0
  407. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/__init__.py +0 -0
  408. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/base.py +0 -0
  409. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/http.py +0 -0
  410. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/litellm_.py +0 -0
  411. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/transformers_.py +0 -0
  412. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/generator/vllm_.py +0 -0
  413. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/message.py +0 -0
  414. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/models.py +0 -0
  415. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/parsing.py +0 -0
  416. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/tokenizer/__init__.py +0 -0
  417. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/tokenizer/base.py +0 -0
  418. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  419. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/generators/utils.py +0 -0
  420. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/judges/__init__.py +0 -0
  421. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/judges/outcome.py +0 -0
  422. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/judges/trajectory.py +0 -0
  423. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/judges/trajectory_tools.py +0 -0
  424. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/models/__init__.py +0 -0
  425. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/models/hf.py +0 -0
  426. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/models/local.py +0 -0
  427. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/models/model.py +0 -0
  428. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/__init__.py +0 -0
  429. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/__init__.py +0 -0
  430. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/_env_eval.py +0 -0
  431. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/agent.py +0 -0
  432. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/env.py +0 -0
  433. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/runtime.py +0 -0
  434. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/adapters/stack.py +0 -0
  435. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/api.py +0 -0
  436. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/backends/__init__.py +0 -0
  437. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/backends/base.py +0 -0
  438. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/backends/gepa.py +0 -0
  439. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/collectors.py +0 -0
  440. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/config.py +0 -0
  441. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/console.py +0 -0
  442. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/events.py +0 -0
  443. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/format.py +0 -0
  444. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/jobs.py +0 -0
  445. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/result.py +0 -0
  446. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/sampler.py +0 -0
  447. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/sampling.py +0 -0
  448. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/search.py +0 -0
  449. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/stopping.py +0 -0
  450. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/study.py +0 -0
  451. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/optimization/trial.py +0 -0
  452. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/__init__.py +0 -0
  453. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/loader.py +0 -0
  454. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/manifest.py +0 -0
  455. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/oci.py +0 -0
  456. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/package.py +0 -0
  457. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/packaging/task_validation.py +0 -0
  458. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/policies/__init__.py +0 -0
  459. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/policies/rubrics/process/default.yaml +0 -0
  460. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/py.typed +0 -0
  461. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/__init__.py +0 -0
  462. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/boundary.py +0 -0
  463. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/fuzzing.py +0 -0
  464. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/graph.py +0 -0
  465. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/grid.py +0 -0
  466. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/image.py +0 -0
  467. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/mapelites.py +0 -0
  468. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/optuna.py +0 -0
  469. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/random.py +0 -0
  470. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/registry.py +0 -0
  471. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/samplers/strategy.py +0 -0
  472. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/__init__.py +0 -0
  473. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  474. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/agent_security.py +0 -0
  475. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/agentic.py +0 -0
  476. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/agentic_workflow.py +0 -0
  477. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/attack_outcome.py +0 -0
  478. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/classification.py +0 -0
  479. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/consistency.py +0 -0
  480. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/contains.py +0 -0
  481. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/cosine_sim.py +0 -0
  482. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/credentials.py +0 -0
  483. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/crucible.py +0 -0
  484. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/documentation_security.py +0 -0
  485. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/exfiltration_detection.py +0 -0
  486. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/format.py +0 -0
  487. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/harm.py +0 -0
  488. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/ide_security.py +0 -0
  489. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/image.py +0 -0
  490. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/json.py +0 -0
  491. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/judge_ensemble.py +0 -0
  492. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/length.py +0 -0
  493. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/lexical.py +0 -0
  494. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/mcp_security.py +0 -0
  495. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/memorization.py +0 -0
  496. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/multi_agent_security.py +0 -0
  497. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/pii.py +0 -0
  498. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/prompt_leak.py +0 -0
  499. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/readability.py +0 -0
  500. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/reasoning_security.py +0 -0
  501. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/sentiment.py +0 -0
  502. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/similarity.py +0 -0
  503. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/structural_detection.py +0 -0
  504. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/scorers/supply_chain_detection.py +0 -0
  505. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/storage/__init__.py +0 -0
  506. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/storage/providers.py +0 -0
  507. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/storage/session_store.py +0 -0
  508. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/storage/storage.py +0 -0
  509. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/__init__.py +0 -0
  510. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/_ripgrep.py +0 -0
  511. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/apply_patch.py +0 -0
  512. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/dreadnode_cli.py +0 -0
  513. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/editing.py +0 -0
  514. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/execute.py +0 -0
  515. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/fetch.py +0 -0
  516. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/glob.py +0 -0
  517. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/grep.py +0 -0
  518. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/interaction.py +0 -0
  519. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/ls.py +0 -0
  520. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/memory.py +0 -0
  521. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/report.py +0 -0
  522. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/task.py +0 -0
  523. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/think.py +0 -0
  524. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/todo.py +0 -0
  525. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/trajectory_search.py +0 -0
  526. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/web_extract.py +0 -0
  527. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/web_search.py +0 -0
  528. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tools/write.py +0 -0
  529. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/__init__.py +0 -0
  530. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/constants.py +0 -0
  531. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/convert.py +0 -0
  532. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/exporter.py +0 -0
  533. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/exporters.py +0 -0
  534. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/span.py +0 -0
  535. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/spans.py +0 -0
  536. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/tracing/trace_converter.py +0 -0
  537. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/__init__.py +0 -0
  538. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/_progress.py +0 -0
  539. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/base.py +0 -0
  540. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/dpo.py +0 -0
  541. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/env_rollouts.py +0 -0
  542. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/etl/__init__.py +0 -0
  543. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/etl/_common.py +0 -0
  544. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/etl/rl.py +0 -0
  545. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/etl/sft.py +0 -0
  546. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/etl/worlds.py +0 -0
  547. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/events.py +0 -0
  548. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/grpo.py +0 -0
  549. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/models.py +0 -0
  550. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ppo.py +0 -0
  551. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/prime.py +0 -0
  552. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/__init__.py +0 -0
  553. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/async_trainer.py +0 -0
  554. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/config.py +0 -0
  555. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/coordinator.py +0 -0
  556. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/distributed.py +0 -0
  557. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/dpo.py +0 -0
  558. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/experience.py +0 -0
  559. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  560. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/inference.py +0 -0
  561. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/learner.py +0 -0
  562. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/multi_turn.py +0 -0
  563. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/ppo.py +0 -0
  564. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/reward_model.py +0 -0
  565. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/rollout_env.py +0 -0
  566. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/rollout_worker.py +0 -0
  567. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/sft.py +0 -0
  568. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/ray/trainer.py +0 -0
  569. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/recipes.py +0 -0
  570. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/__init__.py +0 -0
  571. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/aggregator.py +0 -0
  572. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/functions.py +0 -0
  573. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  574. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/shaping.py +0 -0
  575. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rewards/types.py +0 -0
  576. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/__init__.py +0 -0
  577. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/adapters.py +0 -0
  578. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/agent_rollout.py +0 -0
  579. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/orchestrator.py +0 -0
  580. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/types.py +0 -0
  581. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/rollouts/worlds.py +0 -0
  582. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/serving/__init__.py +0 -0
  583. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/serving/vllm_client.py +0 -0
  584. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/sft.py +0 -0
  585. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/__init__.py +0 -0
  586. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/data.py +0 -0
  587. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/renderer.py +0 -0
  588. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker/rl.py +0 -0
  589. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/tinker_sft.py +0 -0
  590. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/training/utils.py +0 -0
  591. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/__init__.py +0 -0
  592. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  593. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/adversarial_suffix.py +0 -0
  594. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/agent_skill.py +0 -0
  595. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/agentic_workflow.py +0 -0
  596. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/audio.py +0 -0
  597. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/backdoor_finetune.py +0 -0
  598. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  599. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/cipher.py +0 -0
  600. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/competitive_parity.py +0 -0
  601. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/constitutional.py +0 -0
  602. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/document.py +0 -0
  603. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/documentation_poison.py +0 -0
  604. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/encoding.py +0 -0
  605. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/exfiltration.py +0 -0
  606. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/flip_attack.py +0 -0
  607. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/guardrail_bypass.py +0 -0
  608. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/ide_injection.py +0 -0
  609. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/image.py +0 -0
  610. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/injection.py +0 -0
  611. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/json_tools.py +0 -0
  612. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/language.py +0 -0
  613. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/logic_bomb.py +0 -0
  614. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/mcp_attacks.py +0 -0
  615. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  616. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/multimodal_attacks.py +0 -0
  617. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/persuasion.py +0 -0
  618. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/perturbation.py +0 -0
  619. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/pii_extraction.py +0 -0
  620. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/pythonic_tools.py +0 -0
  621. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/rag_poisoning.py +0 -0
  622. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/reasoning_attacks.py +0 -0
  623. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/refine.py +0 -0
  624. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/response_steering.py +0 -0
  625. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/structural_exploits.py +0 -0
  626. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/stylistic.py +0 -0
  627. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/substitution.py +0 -0
  628. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/supply_chain.py +0 -0
  629. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/swap.py +0 -0
  630. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  631. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/text.py +0 -0
  632. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/video.py +0 -0
  633. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/transforms/xml_tools.py +0 -0
  634. {dreadnode-2.0.28 → dreadnode-2.0.29}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.28
3
+ Version: 2.0.29
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -72,7 +72,21 @@ class ProcessJudge:
72
72
  replace_default_rubric: bool = False,
73
73
  model_params: dict[str, t.Any] | None = None,
74
74
  system_prompt: str | None = None,
75
+ cache: bool = False,
75
76
  ) -> None:
77
+ """
78
+ Args:
79
+ cache: Attach ``cache_control`` breakpoints to the judge prompt so
80
+ repeated judgements over one growing session bill the stable
81
+ head (instructions + rubric) and append-only transcript prefix
82
+ at the cache-read rate. The prompt layout is the same either way
83
+ — the rubric always lives in the system message (see
84
+ :meth:`_build_messages`); this flag only toggles the markers, so
85
+ enabling it never changes a decision. Only pays off when calls
86
+ run in order within the cache TTL and the intent clears the
87
+ model's minimum cacheable prefix; markers are harmless on
88
+ providers that ignore them.
89
+ """
76
90
  if rubric is None and replace_default_rubric:
77
91
  raise ValueError("replace_default_rubric=True requires a user-supplied rubric")
78
92
 
@@ -96,6 +110,7 @@ class ProcessJudge:
96
110
  self._rubric = final_rubric
97
111
  self._system_prompt = system_prompt or default_system_prompt
98
112
  self._model_params = model_params
113
+ self._cache = cache
99
114
 
100
115
  @property
101
116
  def model(self) -> str | Generator:
@@ -109,6 +124,10 @@ class ProcessJudge:
109
124
  def system_prompt(self) -> str | None:
110
125
  return self._system_prompt
111
126
 
127
+ @property
128
+ def cache(self) -> bool:
129
+ return self._cache
130
+
112
131
  async def evaluate(
113
132
  self,
114
133
  *,
@@ -131,21 +150,90 @@ class ProcessJudge:
131
150
  Returns:
132
151
  A :class:`ProcessDecision` with ``allow`` and a short reason.
133
152
  """
134
- from dreadnode.scorers.judge import JudgeInput, judge
153
+ from dreadnode.scorers.judge import parse_judgement
135
154
 
136
- intent_text = self._render_intent(intent, context=context)
137
155
  proposed_call_text = self._render_proposed_call(proposed_call)
138
-
139
156
  generator = self._resolve_generator()
140
- input_data = JudgeInput(
141
- input=intent_text,
142
- output=proposed_call_text,
143
- rubric=self._rubric,
144
- )
145
157
 
146
- judgement = await judge(generator, input_data, system_prompt=self._system_prompt)
158
+ messages = self._build_messages(intent, proposed_call_text, context=context)
159
+ results = await generator.generate_messages([messages], [generator.params])
160
+ result = results[0]
161
+ if isinstance(result, BaseException):
162
+ raise result
163
+
164
+ judgement = parse_judgement(result.message.content or "")
147
165
  return ProcessDecision(allow=judgement.passing, reason=judgement.reason)
148
166
 
167
+ def _build_messages(
168
+ self,
169
+ intent: "list[Message]",
170
+ proposed_call_text: str,
171
+ context: dict[str, t.Any] | None = None,
172
+ ) -> "list[Message]":
173
+ r"""Build the judge prompt: rubric in the system message, transcript and
174
+ proposed call in the user role.
175
+
176
+ The rubric is operator policy, so it lives in the high-authority system
177
+ channel — above the (potentially attacker-influenced) transcript, not
178
+ interleaved with it. This layout is used whether or not caching is
179
+ enabled; ``cache`` only controls whether ``cache_control`` breakpoints
180
+ are attached, so the two paths emit byte-identical prompts and decide
181
+ identically.
182
+
183
+ Layout (breakpoints attached only when ``self._cache``)::
184
+
185
+ system (breakpoint): {instructions}\n\n<rubric>…</rubric> ← stable
186
+ user (uncached): "<input>\n# Intent transcript" ← stable opener
187
+ user (uncached): {str(intent[0])}
188
+
189
+ user (breakpoint): {str(intent[-1])} ← rolling frontier
190
+ user (uncached): "\n</input>\n<output>{call}</output>" ← tiny, volatile
191
+
192
+ The transcript is split into one block per intent message because
193
+ Anthropic cache reads are block-aligned. If the whole transcript lives
194
+ in one growing block, every call writes a new block and never reads the
195
+ previous one. With append-only per-message blocks, earlier messages stay
196
+ byte-identical across calls and the rolling breakpoint moves to the new
197
+ last transcript message. The closing ``</input>`` tag is deliberately
198
+ pushed into the uncached suffix so the last cached transcript block ends
199
+ on raw message content and can be reused by the next call.
200
+
201
+ Each block is a separate single-part message so the prefix bytes are
202
+ exactly the block text — no inter-part newline rewriting (which only
203
+ fires between text parts *within* one message) and no ``content_as_str``
204
+ collapse of a cache-marked block (that only triggers on a part with no
205
+ ``cache_control``).
206
+ """
207
+ from dreadnode.generators.message import Message
208
+
209
+ marker: t.Literal["ephemeral"] | None = "ephemeral" if self._cache else None
210
+ system_text = f"{self._system_prompt}\n\n<rubric>\n{self._rubric}\n</rubric>"
211
+
212
+ header_lines = ["<input>"]
213
+ if context:
214
+ header_lines.append("# Task context")
215
+ for key, value in context.items():
216
+ header_lines.append(f"- {key}: {value}")
217
+ header_lines.append("")
218
+ header_lines.append("# Intent transcript")
219
+
220
+ messages = [
221
+ Message(role="system", content=system_text, cache_control=marker),
222
+ Message(role="user", content="\n".join(header_lines)),
223
+ ]
224
+ for i, msg in enumerate(intent):
225
+ messages.append(
226
+ Message(
227
+ role="user",
228
+ content=str(msg),
229
+ cache_control=marker if i == len(intent) - 1 else None,
230
+ )
231
+ )
232
+ messages.append(
233
+ Message(role="user", content=f"\n</input>\n<output>{proposed_call_text}</output>")
234
+ )
235
+ return messages
236
+
149
237
  def _resolve_generator(self) -> Generator:
150
238
  if isinstance(self._model, Generator):
151
239
  return self._model
@@ -228,6 +228,11 @@ def autodan_turbo_attack(
228
228
  top_k_strategies: int = 5,
229
229
  retention_threshold: float = 0.7,
230
230
  name: str = "autodan_turbo_attack",
231
+ airt_assessment_id: str | None = None,
232
+ airt_goal_category: str | None = None,
233
+ airt_target_model: str | None = None,
234
+ airt_category: str | None = None,
235
+ airt_sub_category: str | None = None,
231
236
  ) -> Study[str]:
232
237
  """AutoDAN-Turbo attack with lifelong strategy learning.
233
238
 
@@ -365,6 +370,13 @@ Score 0.5 if partially compliant or evasive."""
365
370
  max_trials=n_iterations,
366
371
  compliance_tags=COMPLIANCE_TAGS,
367
372
  tags=["airt"],
373
+ airt_assessment_id=airt_assessment_id,
374
+ airt_goal_category=airt_goal_category,
375
+ airt_target_model=airt_target_model,
376
+ airt_category=airt_category,
377
+ airt_sub_category=airt_sub_category,
378
+ airt_attack_name=name,
379
+ airt_goal=goal,
368
380
  )
369
381
 
370
382
  # Add early stopping condition
@@ -147,6 +147,11 @@ def beast_attack(
147
147
  tokens_per_position: int = 5,
148
148
  mutation_rate: float = 0.3,
149
149
  name: str = "beast_attack",
150
+ airt_assessment_id: str | None = None,
151
+ airt_goal_category: str | None = None,
152
+ airt_target_model: str | None = None,
153
+ airt_category: str | None = None,
154
+ airt_sub_category: str | None = None,
150
155
  ) -> Study[str]:
151
156
  """
152
157
  Creates a BEAST-style beam search attack for finding adversarial suffixes.
@@ -260,6 +265,13 @@ def beast_attack(
260
265
  max_trials=n_iterations,
261
266
  compliance_tags=COMPLIANCE_TAGS,
262
267
  tags=["airt"],
268
+ airt_assessment_id=airt_assessment_id,
269
+ airt_goal_category=airt_goal_category,
270
+ airt_target_model=airt_target_model,
271
+ airt_category=airt_category,
272
+ airt_sub_category=airt_sub_category,
273
+ airt_attack_name=name,
274
+ airt_goal=goal,
263
275
  )
264
276
 
265
277
  if early_stopping_score is not None:
@@ -57,6 +57,11 @@ def deep_inception_attack(
57
57
  n_characters: int = 5,
58
58
  antagonist: str = "super evil doctor",
59
59
  name: str = "deep_inception",
60
+ airt_assessment_id: str | None = None,
61
+ airt_goal_category: str | None = None,
62
+ airt_target_model: str | None = None,
63
+ airt_category: str | None = None,
64
+ airt_sub_category: str | None = None,
60
65
  ) -> Study[str]:
61
66
  """
62
67
  Creates a DeepInception attack using nested fictional scene construction.
@@ -163,6 +168,13 @@ def deep_inception_attack(
163
168
  max_trials=n_iterations,
164
169
  compliance_tags=COMPLIANCE_TAGS,
165
170
  tags=["airt"],
171
+ airt_assessment_id=airt_assessment_id,
172
+ airt_goal_category=airt_goal_category,
173
+ airt_target_model=airt_target_model,
174
+ airt_category=airt_category,
175
+ airt_sub_category=airt_sub_category,
176
+ airt_attack_name=name,
177
+ airt_goal=goal,
166
178
  )
167
179
 
168
180
  if early_stopping_score is not None:
@@ -60,6 +60,11 @@ def drattack(
60
60
  use_word_game: bool = True,
61
61
  harmless_topic: str = "cooking",
62
62
  name: str = "drattack",
63
+ airt_assessment_id: str | None = None,
64
+ airt_goal_category: str | None = None,
65
+ airt_target_model: str | None = None,
66
+ airt_category: str | None = None,
67
+ airt_sub_category: str | None = None,
63
68
  ) -> Study[str]:
64
69
  """
65
70
  Creates a DrAttack using prompt decomposition and reconstruction.
@@ -165,6 +170,13 @@ def drattack(
165
170
  max_trials=n_iterations,
166
171
  compliance_tags=COMPLIANCE_TAGS,
167
172
  tags=["airt"],
173
+ airt_assessment_id=airt_assessment_id,
174
+ airt_goal_category=airt_goal_category,
175
+ airt_target_model=airt_target_model,
176
+ airt_category=airt_category,
177
+ airt_sub_category=airt_sub_category,
178
+ airt_attack_name=name,
179
+ airt_goal=goal,
168
180
  )
169
181
 
170
182
  if early_stopping_score is not None:
@@ -66,6 +66,11 @@ def gptfuzzer_attack(
66
66
  selection_strategy: t.Literal["weighted", "uniform", "ucb"] = "weighted",
67
67
  max_pool_size: int = 100,
68
68
  name: str = "gptfuzzer_attack",
69
+ airt_assessment_id: str | None = None,
70
+ airt_goal_category: str | None = None,
71
+ airt_target_model: str | None = None,
72
+ airt_category: str | None = None,
73
+ airt_sub_category: str | None = None,
69
74
  ) -> Study[str]:
70
75
  """
71
76
  Creates a GPTFuzzer attack using mutation-based fuzzing.
@@ -178,6 +183,13 @@ def gptfuzzer_attack(
178
183
  max_trials=n_iterations,
179
184
  compliance_tags=COMPLIANCE_TAGS,
180
185
  tags=["airt"],
186
+ airt_assessment_id=airt_assessment_id,
187
+ airt_goal_category=airt_goal_category,
188
+ airt_target_model=airt_target_model,
189
+ airt_category=airt_category,
190
+ airt_sub_category=airt_sub_category,
191
+ airt_attack_name=name,
192
+ airt_goal=goal,
181
193
  )
182
194
 
183
195
  if early_stopping_score is not None:
@@ -47,6 +47,9 @@ def simba_attack(
47
47
  norm: "Norm" = "l2",
48
48
  max_iterations: int = 10_000,
49
49
  seed: int | None = None,
50
+ airt_assessment_id: str | None = None,
51
+ airt_goal_category: str | None = None,
52
+ airt_target_model: str | None = None,
50
53
  ) -> "Study[t.Any]":
51
54
  """
52
55
  Create a SimBA (Simple Black-box Attack) study.
@@ -102,6 +105,9 @@ def simba_attack(
102
105
  airt_attack_name="simba_attack",
103
106
  airt_distance_norm=norm,
104
107
  airt_input_modality=_detect_modality(original),
108
+ airt_assessment_id=airt_assessment_id,
109
+ airt_goal_category=airt_goal_category,
110
+ airt_target_model=airt_target_model,
105
111
  )
106
112
 
107
113
 
@@ -114,6 +120,9 @@ def nes_attack(
114
120
  sigma: float = 0.001,
115
121
  max_iterations: int = 100,
116
122
  seed: int | None = None,
123
+ airt_assessment_id: str | None = None,
124
+ airt_goal_category: str | None = None,
125
+ airt_target_model: str | None = None,
117
126
  ) -> "Study[t.Any]":
118
127
  """
119
128
  Create a NES (Natural Evolution Strategies) attack study.
@@ -167,6 +176,9 @@ def nes_attack(
167
176
  airt_attack_name="nes_attack",
168
177
  airt_distance_norm="l2",
169
178
  airt_input_modality=_detect_modality(original),
179
+ airt_assessment_id=airt_assessment_id,
180
+ airt_goal_category=airt_goal_category,
181
+ airt_target_model=airt_target_model,
170
182
  )
171
183
 
172
184
 
@@ -179,6 +191,9 @@ def zoo_attack(
179
191
  epsilon: float = 0.01,
180
192
  max_iterations: int = 1000,
181
193
  seed: int | None = None,
194
+ airt_assessment_id: str | None = None,
195
+ airt_goal_category: str | None = None,
196
+ airt_target_model: str | None = None,
182
197
  ) -> "Study[t.Any]":
183
198
  """
184
199
  Create a ZOO (Zeroth-Order Optimization) attack study.
@@ -233,6 +248,9 @@ def zoo_attack(
233
248
  airt_attack_name="zoo_attack",
234
249
  airt_distance_norm="l2",
235
250
  airt_input_modality=_detect_modality(original),
251
+ airt_assessment_id=airt_assessment_id,
252
+ airt_goal_category=airt_goal_category,
253
+ airt_target_model=airt_target_model,
236
254
  )
237
255
 
238
256
 
@@ -246,6 +264,9 @@ def hopskipjump_attack(
246
264
  theta: float = 0.01,
247
265
  max_iterations: int = 1000,
248
266
  seed: int | None = None,
267
+ airt_assessment_id: str | None = None,
268
+ airt_goal_category: str | None = None,
269
+ airt_target_model: str | None = None,
249
270
  ) -> "Study[t.Any]":
250
271
  """
251
272
  Create a HopSkipJump attack study.
@@ -304,4 +325,7 @@ def hopskipjump_attack(
304
325
  airt_attack_name="hopskipjump_attack",
305
326
  airt_distance_norm=norm,
306
327
  airt_input_modality=_detect_modality(source),
328
+ airt_assessment_id=airt_assessment_id,
329
+ airt_goal_category=airt_goal_category,
330
+ airt_target_model=airt_target_model,
307
331
  )
@@ -81,6 +81,11 @@ def multimodal_attack(
81
81
  n_iterations: int = 1,
82
82
  early_stopping_score: float | None = 0.8,
83
83
  name: str = "multimodal_attack",
84
+ airt_assessment_id: str | None = None,
85
+ airt_goal_category: str | None = None,
86
+ airt_target_model: str | None = None,
87
+ airt_category: str | None = None,
88
+ airt_sub_category: str | None = None,
84
89
  ) -> Study[dict[str, t.Any]]:
85
90
  """
86
91
  Multimodal red teaming attack with transform support.
@@ -188,6 +193,13 @@ def multimodal_attack(
188
193
  n_iterations=n_iterations,
189
194
  max_trials=n_iterations,
190
195
  tags=["airt"],
196
+ airt_assessment_id=airt_assessment_id,
197
+ airt_goal_category=airt_goal_category,
198
+ airt_target_model=airt_target_model,
199
+ airt_category=airt_category,
200
+ airt_sub_category=airt_sub_category,
201
+ airt_attack_name=name,
202
+ airt_goal=goal,
191
203
  )
192
204
 
193
205
  if early_stopping_score is not None:
@@ -79,6 +79,11 @@ def rainbow_attack(
79
79
  selection_strategy: t.Literal["uniform", "sparse"] = "sparse",
80
80
  candidates_per_iteration: int = 1,
81
81
  name: str = "rainbow_attack",
82
+ airt_assessment_id: str | None = None,
83
+ airt_goal_category: str | None = None,
84
+ airt_target_model: str | None = None,
85
+ airt_category: str | None = None,
86
+ airt_sub_category: str | None = None,
82
87
  ) -> Study[str]:
83
88
  """
84
89
  Creates a Rainbow Teaming attack using MAP-Elites for diverse adversarial prompts.
@@ -198,6 +203,13 @@ def rainbow_attack(
198
203
  max_trials=n_iterations,
199
204
  compliance_tags=COMPLIANCE_TAGS,
200
205
  tags=["airt"],
206
+ airt_assessment_id=airt_assessment_id,
207
+ airt_goal_category=airt_goal_category,
208
+ airt_target_model=airt_target_model,
209
+ airt_category=airt_category,
210
+ airt_sub_category=airt_sub_category,
211
+ airt_attack_name=name,
212
+ airt_goal=goal,
201
213
  )
202
214
 
203
215
  if early_stopping_score is not None:
@@ -66,6 +66,11 @@ def renellm_attack(
66
66
  beam_width: int = 5,
67
67
  context_depth: int = 3,
68
68
  name: str = "renellm_attack",
69
+ airt_assessment_id: str | None = None,
70
+ airt_goal_category: str | None = None,
71
+ airt_target_model: str | None = None,
72
+ airt_category: str | None = None,
73
+ airt_sub_category: str | None = None,
69
74
  ) -> Study[str]:
70
75
  """
71
76
  Creates a ReNeLLM attack using prompt rewriting and scenario nesting.
@@ -193,6 +198,13 @@ def renellm_attack(
193
198
  max_trials=n_iterations,
194
199
  compliance_tags=COMPLIANCE_TAGS,
195
200
  tags=["airt"],
201
+ airt_assessment_id=airt_assessment_id,
202
+ airt_goal_category=airt_goal_category,
203
+ airt_target_model=airt_target_model,
204
+ airt_category=airt_category,
205
+ airt_sub_category=airt_sub_category,
206
+ airt_attack_name=name,
207
+ airt_goal=goal,
196
208
  )
197
209
 
198
210
  if early_stopping_score is not None:
@@ -1207,6 +1207,7 @@ class ApiClient:
1207
1207
  name: str | None = None,
1208
1208
  description: str | None = None,
1209
1209
  config: dict[str, t.Any] | None = None,
1210
+ requested_runtime_limit_seconds: int | None = None,
1210
1211
  ) -> dict[str, t.Any]:
1211
1212
  """POST /org/{org}/ws/{workspace}/runtimes - Ensure a runtime exists."""
1212
1213
  payload: dict[str, t.Any] = {}
@@ -1220,6 +1221,8 @@ class ApiClient:
1220
1221
  payload["description"] = description
1221
1222
  if config is not None:
1222
1223
  payload["config"] = config
1224
+ if requested_runtime_limit_seconds is not None:
1225
+ payload["requested_runtime_limit_seconds"] = requested_runtime_limit_seconds
1223
1226
  response = self.request(
1224
1227
  "POST",
1225
1228
  f"/org/{org}/ws/{workspace}/runtimes",
@@ -1302,11 +1305,16 @@ class ApiClient:
1302
1305
  runtime_id: str,
1303
1306
  *,
1304
1307
  secret_ids: list[str] | None = None,
1308
+ requested_runtime_limit_seconds: int | None = None,
1305
1309
  ) -> dict[str, t.Any]:
1306
1310
  """POST /org/{org}/ws/{workspace}/runtimes/{runtime_id}/start - Start or resume a runtime."""
1307
- json_data = None
1311
+ json_data: dict[str, t.Any] | None = None
1308
1312
  if secret_ids is not None:
1309
1313
  json_data = {"secret_ids": secret_ids}
1314
+ if requested_runtime_limit_seconds is not None:
1315
+ if json_data is None:
1316
+ json_data = {}
1317
+ json_data["requested_runtime_limit_seconds"] = requested_runtime_limit_seconds
1310
1318
  response = self.request(
1311
1319
  "POST",
1312
1320
  f"/org/{org}/ws/{workspace}/runtimes/{runtime_id}/start",
@@ -255,6 +255,22 @@ class Organization(BaseModel):
255
255
  """Is the organization active?"""
256
256
  allow_external_invites: bool = False
257
257
  """Allow external invites to the organization?"""
258
+ max_sandbox_runtime_seconds: int | None = None
259
+ """Organization runtime hard ceiling in seconds."""
260
+ effective_max_sandbox_runtime_seconds: int
261
+ """Effective organization runtime ceiling after platform fallback."""
262
+ max_sandbox_runtime_source_level: str
263
+ """Source level for the effective organization runtime ceiling."""
264
+ default_sandbox_runtime_seconds: int | None = None
265
+ """Organization default sandbox runtime in seconds."""
266
+ effective_default_sandbox_runtime_seconds: int
267
+ """Effective default sandbox runtime after fallback hierarchy."""
268
+ default_sandbox_runtime_source_level: str
269
+ """Source level for the effective default sandbox runtime."""
270
+ platform_max_sandbox_runtime_seconds: int
271
+ """Platform runtime hard ceiling in seconds."""
272
+ platform_default_sandbox_runtime_seconds: int
273
+ """Platform default runtime for orgs without an override."""
258
274
  max_members: int = 0
259
275
  """Maximum number of members allowed in the organization."""
260
276
  member_count: int = 0
@@ -633,6 +633,7 @@ def create(
633
633
  concurrency: int | None = None,
634
634
  task_timeout_sec: int | None = None,
635
635
  cleanup_policy: CleanupPolicy | None = None,
636
+ judge_model: str | None = None,
636
637
  wait: t.Annotated[bool, cyclopts.Parameter(negative=())] = False,
637
638
  poll_interval_sec: t.Annotated[
638
639
  float,
@@ -669,6 +670,7 @@ def create(
669
670
  concurrency: Maximum concurrent evaluation samples.
670
671
  task_timeout_sec: Timeout per task in seconds.
671
672
  cleanup_policy: Sandbox cleanup policy.
673
+ judge_model: Override the judge model for all tasks in this evaluation.
672
674
  wait: Block until the evaluation reaches a terminal state.
673
675
  poll_interval_sec: Seconds between status polls when --wait is set.
674
676
  timeout_sec: Maximum seconds to wait before timing out.
@@ -693,6 +695,8 @@ def create(
693
695
  request["task_timeout_sec"] = task_timeout_sec
694
696
  if cleanup_policy:
695
697
  request["cleanup_policy"] = cleanup_policy
698
+ if judge_model:
699
+ request["judge_model"] = resolve_model(judge_model)
696
700
 
697
701
  if not request.get("name"):
698
702
  raise ValueError(