dreadnode 2.0.9__tar.gz → 2.0.10__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 (459) hide show
  1. {dreadnode-2.0.9 → dreadnode-2.0.10}/PKG-INFO +2 -2
  2. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/agent.py +10 -15
  3. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/tools.py +4 -2
  4. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/beast.py +3 -0
  5. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/crescendo.py +3 -0
  6. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/deep_inception.py +3 -0
  7. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/drattack.py +3 -0
  8. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/goat.py +3 -0
  9. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/gptfuzzer.py +3 -0
  10. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/pair.py +3 -0
  11. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/rainbow.py +3 -0
  12. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/renellm.py +3 -0
  13. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/client.py +61 -26
  14. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/models.py +31 -12
  15. dreadnode-2.0.10/dreadnode/app/cli/airt.py +1057 -0
  16. dreadnode-2.0.10/dreadnode/app/cli/capability.py +1218 -0
  17. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/evaluation.py +96 -2
  18. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/shared.py +4 -0
  19. dreadnode-2.0.10/dreadnode/app/cli/task.py +2277 -0
  20. dreadnode-2.0.10/dreadnode/app/cli/templates/__init__.py +1 -0
  21. dreadnode-2.0.10/dreadnode/app/cli/templates/init/__init__.py +1 -0
  22. dreadnode-2.0.10/dreadnode/app/cli/templates/init/challenge/Dockerfile +4 -0
  23. dreadnode-2.0.10/dreadnode/app/cli/templates/init/docker-compose.yaml +10 -0
  24. dreadnode-2.0.10/dreadnode/app/cli/templates/init/provision.sh +27 -0
  25. dreadnode-2.0.10/dreadnode/app/cli/templates/init/solution.sh +21 -0
  26. dreadnode-2.0.10/dreadnode/app/cli/templates/init/task-remote.yaml.tmpl +120 -0
  27. dreadnode-2.0.10/dreadnode/app/cli/templates/init/task.yaml.tmpl +99 -0
  28. dreadnode-2.0.10/dreadnode/app/cli/templates/init/teardown.sh +22 -0
  29. dreadnode-2.0.10/dreadnode/app/cli/templates/init/verify.sh +28 -0
  30. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/config.py +2 -1
  31. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/main.py +1 -0
  32. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/app.py +302 -49
  33. dreadnode-2.0.10/dreadnode/app/server/prompt.py +217 -0
  34. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/app.py +661 -77
  35. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/client.py +12 -0
  36. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/commands.py +7 -1
  37. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/dreadnode.tcss +141 -33
  38. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/event_contract.py +13 -0
  39. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/__init__.py +6 -0
  40. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/base.py +1 -1
  41. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/capabilities.py +185 -147
  42. dreadnode-2.0.10/dreadnode/app/tui/screens/capability_docs.py +301 -0
  43. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/environments.py +185 -24
  44. dreadnode-2.0.10/dreadnode/app/tui/screens/models.py +875 -0
  45. dreadnode-2.0.10/dreadnode/app/tui/screens/raw_spans.py +186 -0
  46. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/runtimes.py +221 -135
  47. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/sessions.py +12 -2
  48. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/workspaces.py +104 -13
  49. dreadnode-2.0.10/dreadnode/app/tui/spans_reader.py +134 -0
  50. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/composer.py +36 -6
  51. dreadnode-2.0.10/dreadnode/builtin_capabilities/__init__.py +79 -0
  52. dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/agents/dreadnode.md +54 -0
  53. dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/capability.yaml +4 -0
  54. dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/skills/dreadnode-runtime-reference/SKILL.md +78 -0
  55. dreadnode-2.0.10/dreadnode/builtin_capabilities/dreadnode/system-prompt.md +7 -0
  56. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/base.py +7 -0
  57. dreadnode-2.0.10/dreadnode/optimization/adapters/stack.py +601 -0
  58. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/gepa.py +2 -1
  59. dreadnode-2.0.10/dreadnode/packaging/task_validation.py +993 -0
  60. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/creating-capabilities/SKILL.md +6 -0
  61. dreadnode-2.0.10/dreadnode/skills/creating-capabilities/capability-improvement.md +339 -0
  62. dreadnode-2.0.10/dreadnode/skills/creating-capabilities/runtime-default-capability.md +262 -0
  63. dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/SKILL.md +109 -0
  64. dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/references/command-groups.md +224 -0
  65. dreadnode-2.0.10/dreadnode/skills/dreadnode-cli/references/tui-crosswalk.md +27 -0
  66. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/__init__.py +35 -9
  67. dreadnode-2.0.10/dreadnode/tools/dreadnode_cli.py +63 -0
  68. dreadnode-2.0.10/dreadnode/tools/report.py +95 -0
  69. dreadnode-2.0.10/dreadnode/tools/trajectory_search.py +63 -0
  70. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/recipes.py +7 -5
  71. {dreadnode-2.0.9 → dreadnode-2.0.10}/pyproject.toml +2 -2
  72. dreadnode-2.0.9/dreadnode/app/cli/airt.py +0 -415
  73. dreadnode-2.0.9/dreadnode/app/cli/capability.py +0 -610
  74. dreadnode-2.0.9/dreadnode/app/cli/task.py +0 -868
  75. dreadnode-2.0.9/dreadnode/app/server/prompt.py +0 -182
  76. dreadnode-2.0.9/dreadnode/packaging/task_validation.py +0 -475
  77. {dreadnode-2.0.9 → dreadnode-2.0.10}/.gitignore +0 -0
  78. {dreadnode-2.0.9 → dreadnode-2.0.10}/LICENSE +0 -0
  79. {dreadnode-2.0.9 → dreadnode-2.0.10}/README.md +0 -0
  80. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/__init__.py +0 -0
  81. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/__main__.py +0 -0
  82. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/__init__.py +0 -0
  83. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/events.py +0 -0
  84. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/exceptions.py +0 -0
  85. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/format.py +0 -0
  86. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/hooks.py +0 -0
  87. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/__init__.py +0 -0
  88. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/auth.py +0 -0
  89. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/client.py +0 -0
  90. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/config.py +0 -0
  91. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/mcp/server.py +0 -0
  92. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/reactions.py +0 -0
  93. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/skills.py +0 -0
  94. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/stopping.py +0 -0
  95. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/subagent.py +0 -0
  96. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/agents/trajectory.py +0 -0
  97. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/__init__.py +0 -0
  98. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/__init__.py +0 -0
  99. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/aggregator.py +0 -0
  100. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/classifier.py +0 -0
  101. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/compliance.py +0 -0
  102. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/engine.py +0 -0
  103. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/recommendations.py +0 -0
  104. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/analytics/types.py +0 -0
  105. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/assessment.py +0 -0
  106. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/autodan_turbo.py +0 -0
  107. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/__init__.py +0 -0
  108. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/atlas.py +0 -0
  109. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/nist.py +0 -0
  110. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/owasp.py +0 -0
  111. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/owasp_agentic.py +0 -0
  112. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/compliance/saif.py +0 -0
  113. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/constants.py +0 -0
  114. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/__init__.py +0 -0
  115. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/audio/adversarial_query.mp3 +0 -0
  116. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/image/bomb.jpg +0 -0
  117. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/assets/image/meth.png +0 -0
  118. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/prompts/adversarial_benchmark_subset.csv +0 -0
  119. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/prompts/ai_safety.csv +0 -0
  120. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/data_exfiltration.yaml +0 -0
  121. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/goal_hijacking.yaml +0 -0
  122. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/memory_poisoning.yaml +0 -0
  123. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/privilege_escalation.yaml +0 -0
  124. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/rce.yaml +0 -0
  125. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/scope_creep.yaml +0 -0
  126. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/tool_chaining.yaml +0 -0
  127. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/tool_selection_safety.yaml +0 -0
  128. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/unbounded_agency.yaml +0 -0
  129. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/rubrics/web_chatbot_security.yaml +0 -0
  130. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_1.yaml +0 -0
  131. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_2.yaml +0 -0
  132. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_3.yaml +0 -0
  133. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_4.yaml +0 -0
  134. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/data/templates/crescendo/variant_5.yaml +0 -0
  135. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/events.py +0 -0
  136. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/image.py +0 -0
  137. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/multimodal.py +0 -0
  138. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/prompt.py +0 -0
  139. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/__init__.py +0 -0
  140. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/json_report.py +0 -0
  141. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/llm_summary.py +0 -0
  142. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/reporting/markdown.py +0 -0
  143. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/airt/tap.py +0 -0
  144. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/__init__.py +0 -0
  145. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/api/__init__.py +0 -0
  146. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/__init__.py +0 -0
  147. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/args.py +0 -0
  148. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/dataset.py +0 -0
  149. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/main.py +0 -0
  150. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/model.py +0 -0
  151. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/optimize.py +0 -0
  152. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/runtime.py +0 -0
  153. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/sandbox.py +0 -0
  154. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/train.py +0 -0
  155. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/cli/worlds.py +0 -0
  156. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/model_catalog.py +0 -0
  157. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/print_mode.py +0 -0
  158. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/__init__.py +0 -0
  159. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/auth.py +0 -0
  160. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/server/utils.py +0 -0
  161. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/__init__.py +0 -0
  162. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/connection.py +0 -0
  163. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/model_variants.py +0 -0
  164. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/runtime_cache.py +0 -0
  165. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/auth.py +0 -0
  166. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/connection_error.py +0 -0
  167. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/console.py +0 -0
  168. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/evaluations.py +0 -0
  169. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/mcp.py +0 -0
  170. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/model_picker.py +0 -0
  171. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/sandboxes.py +0 -0
  172. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/secrets.py +0 -0
  173. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/theme_showcase.py +0 -0
  174. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/screens/traces.py +0 -0
  175. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/theme.py +0 -0
  176. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/turn_lifecycle.py +0 -0
  177. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/turn_reducer.py +0 -0
  178. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/update_check.py +0 -0
  179. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/__init__.py +0 -0
  180. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/agent_dialog.py +0 -0
  181. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/agent_suggester.py +0 -0
  182. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/context_bar.py +0 -0
  183. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/conversation.py +0 -0
  184. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/flash.py +0 -0
  185. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/header_bar.py +0 -0
  186. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/help_panel.py +0 -0
  187. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/mention_overlay.py +0 -0
  188. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/message_queue.py +0 -0
  189. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/overlay_mixin.py +0 -0
  190. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/permission_prompt.py +0 -0
  191. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/profile_dialog.py +0 -0
  192. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/prompt_info.py +0 -0
  193. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/session_sidebar.py +0 -0
  194. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/skills_dialog.py +0 -0
  195. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/slash_overlay.py +0 -0
  196. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/status_bar.py +0 -0
  197. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/throbber.py +0 -0
  198. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tool.py +0 -0
  199. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tool_progress.py +0 -0
  200. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/tools_dialog.py +0 -0
  201. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/welcome.py +0 -0
  202. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/app/tui/widgets/whoami.py +0 -0
  203. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/__init__.py +0 -0
  204. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/capability.py +0 -0
  205. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/loader.py +0 -0
  206. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/sync.py +0 -0
  207. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/tool_rules.py +0 -0
  208. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/capabilities/types.py +0 -0
  209. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/__init__.py +0 -0
  210. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/conditions.py +0 -0
  211. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/discovery.py +0 -0
  212. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/environment.py +0 -0
  213. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/exceptions.py +0 -0
  214. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/execution.py +0 -0
  215. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/hook.py +0 -0
  216. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/judge.py +0 -0
  217. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/load.py +0 -0
  218. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/log.py +0 -0
  219. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/__init__.py +0 -0
  220. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/config.py +0 -0
  221. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/context.py +0 -0
  222. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/hydrate.py +0 -0
  223. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/meta/introspect.py +0 -0
  224. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/metric.py +0 -0
  225. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/object.py +0 -0
  226. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/scorer.py +0 -0
  227. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/serialization.py +0 -0
  228. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/stopping.py +0 -0
  229. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/task.py +0 -0
  230. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/transforms.py +0 -0
  231. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/__init__.py +0 -0
  232. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/audio.py +0 -0
  233. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/base.py +0 -0
  234. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/common.py +0 -0
  235. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/image.py +0 -0
  236. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/object_3d.py +0 -0
  237. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/table.py +0 -0
  238. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/text.py +0 -0
  239. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/types/video.py +0 -0
  240. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/core/util.py +0 -0
  241. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/__init__.py +0 -0
  242. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/dataset.py +0 -0
  243. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/hf.py +0 -0
  244. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/datasets/local.py +0 -0
  245. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/__init__.py +0 -0
  246. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/console.py +0 -0
  247. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/evaluation.py +0 -0
  248. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/events.py +0 -0
  249. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/format.py +0 -0
  250. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/result.py +0 -0
  251. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/evaluations/sample.py +0 -0
  252. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/__init__.py +0 -0
  253. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/caching.py +0 -0
  254. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/chat.py +0 -0
  255. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/data.py +0 -0
  256. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/exceptions.py +0 -0
  257. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/__init__.py +0 -0
  258. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/http.py +0 -0
  259. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/litellm_.py +0 -0
  260. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/transformers_.py +0 -0
  261. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/generator/vllm_.py +0 -0
  262. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/message.py +0 -0
  263. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/models.py +0 -0
  264. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/parsing.py +0 -0
  265. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/__init__.py +0 -0
  266. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/base.py +0 -0
  267. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/tokenizer/transformers_.py +0 -0
  268. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/generators/utils.py +0 -0
  269. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/__init__.py +0 -0
  270. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/hf.py +0 -0
  271. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/local.py +0 -0
  272. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/models/model.py +0 -0
  273. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/__init__.py +0 -0
  274. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/adapters/__init__.py +0 -0
  275. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/adapters/agent.py +0 -0
  276. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/api.py +0 -0
  277. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/__init__.py +0 -0
  278. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/backends/base.py +0 -0
  279. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/collectors.py +0 -0
  280. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/config.py +0 -0
  281. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/console.py +0 -0
  282. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/events.py +0 -0
  283. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/format.py +0 -0
  284. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/jobs.py +0 -0
  285. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/result.py +0 -0
  286. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/sampler.py +0 -0
  287. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/sampling.py +0 -0
  288. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/search.py +0 -0
  289. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/stopping.py +0 -0
  290. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/study.py +0 -0
  291. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/optimization/trial.py +0 -0
  292. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/__init__.py +0 -0
  293. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/loader.py +0 -0
  294. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/manifest.py +0 -0
  295. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/oci.py +0 -0
  296. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/packaging/package.py +0 -0
  297. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/py.typed +0 -0
  298. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/__init__.py +0 -0
  299. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/boundary.py +0 -0
  300. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/fuzzing.py +0 -0
  301. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/graph.py +0 -0
  302. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/grid.py +0 -0
  303. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/image.py +0 -0
  304. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/mapelites.py +0 -0
  305. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/optuna.py +0 -0
  306. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/random.py +0 -0
  307. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/registry.py +0 -0
  308. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/samplers/strategy.py +0 -0
  309. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/__init__.py +0 -0
  310. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/advanced_jailbreak_detection.py +0 -0
  311. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agent_security.py +0 -0
  312. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agentic.py +0 -0
  313. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/agentic_workflow.py +0 -0
  314. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/classification.py +0 -0
  315. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/consistency.py +0 -0
  316. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/contains.py +0 -0
  317. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/cosine_sim.py +0 -0
  318. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/credentials.py +0 -0
  319. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/crucible.py +0 -0
  320. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/documentation_security.py +0 -0
  321. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/exfiltration_detection.py +0 -0
  322. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/format.py +0 -0
  323. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/harm.py +0 -0
  324. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/ide_security.py +0 -0
  325. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/image.py +0 -0
  326. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/json.py +0 -0
  327. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/judge.py +0 -0
  328. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/length.py +0 -0
  329. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/lexical.py +0 -0
  330. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/mcp_security.py +0 -0
  331. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/memorization.py +0 -0
  332. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/multi_agent_security.py +0 -0
  333. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/pii.py +0 -0
  334. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/prompt_leak.py +0 -0
  335. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/readability.py +0 -0
  336. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/reasoning_security.py +0 -0
  337. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/sentiment.py +0 -0
  338. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/scorers/similarity.py +0 -0
  339. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/__init__.py +0 -0
  340. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/skills/creating-capabilities/capability-components.md +0 -0
  341. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/__init__.py +0 -0
  342. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/providers.py +0 -0
  343. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/session_store.py +0 -0
  344. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/storage/storage.py +0 -0
  345. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/_ripgrep.py +0 -0
  346. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/apply_patch.py +0 -0
  347. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/editing.py +0 -0
  348. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/execute.py +0 -0
  349. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/fetch.py +0 -0
  350. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/glob.py +0 -0
  351. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/grep.py +0 -0
  352. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/interaction.py +0 -0
  353. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/ls.py +0 -0
  354. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/memory.py +0 -0
  355. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/read.py +0 -0
  356. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/task.py +0 -0
  357. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/think.py +0 -0
  358. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/todo.py +0 -0
  359. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/web_search.py +0 -0
  360. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tools/write.py +0 -0
  361. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/__init__.py +0 -0
  362. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/constants.py +0 -0
  363. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/convert.py +0 -0
  364. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/exporter.py +0 -0
  365. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/exporters.py +0 -0
  366. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/span.py +0 -0
  367. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/spans.py +0 -0
  368. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/tracing/trace_converter.py +0 -0
  369. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/__init__.py +0 -0
  370. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/base.py +0 -0
  371. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/dpo.py +0 -0
  372. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/__init__.py +0 -0
  373. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/_common.py +0 -0
  374. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/rl.py +0 -0
  375. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/sft.py +0 -0
  376. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/etl/worlds.py +0 -0
  377. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/events.py +0 -0
  378. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/grpo.py +0 -0
  379. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/jobs.py +0 -0
  380. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ppo.py +0 -0
  381. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/prime.py +0 -0
  382. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/__init__.py +0 -0
  383. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/async_trainer.py +0 -0
  384. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/config.py +0 -0
  385. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/coordinator.py +0 -0
  386. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/distributed.py +0 -0
  387. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/dpo.py +0 -0
  388. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/experience.py +0 -0
  389. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/fsdp2_learner.py +0 -0
  390. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/inference.py +0 -0
  391. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/learner.py +0 -0
  392. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/multi_turn.py +0 -0
  393. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/ppo.py +0 -0
  394. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/reward_model.py +0 -0
  395. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/rollout_env.py +0 -0
  396. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/rollout_worker.py +0 -0
  397. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/sft.py +0 -0
  398. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/ray/trainer.py +0 -0
  399. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/__init__.py +0 -0
  400. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/aggregator.py +0 -0
  401. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/functions.py +0 -0
  402. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/scorer_bridge.py +0 -0
  403. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/shaping.py +0 -0
  404. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rewards/types.py +0 -0
  405. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/__init__.py +0 -0
  406. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/adapters.py +0 -0
  407. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/orchestrator.py +0 -0
  408. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/types.py +0 -0
  409. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/rollouts/worlds.py +0 -0
  410. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/serving/__init__.py +0 -0
  411. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/serving/vllm_client.py +0 -0
  412. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/sft.py +0 -0
  413. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/__init__.py +0 -0
  414. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/config.py +0 -0
  415. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/data.py +0 -0
  416. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/renderer.py +0 -0
  417. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/rl.py +0 -0
  418. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker/trainer.py +0 -0
  419. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/tinker_sft.py +0 -0
  420. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/training/utils.py +0 -0
  421. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/__init__.py +0 -0
  422. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/advanced_jailbreak.py +0 -0
  423. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/adversarial_suffix.py +0 -0
  424. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/agent_skill.py +0 -0
  425. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/agentic_workflow.py +0 -0
  426. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/audio.py +0 -0
  427. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/browser_agent_attacks.py +0 -0
  428. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/cipher.py +0 -0
  429. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/constitutional.py +0 -0
  430. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/document.py +0 -0
  431. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/documentation_poison.py +0 -0
  432. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/encoding.py +0 -0
  433. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/exfiltration.py +0 -0
  434. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/flip_attack.py +0 -0
  435. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/guardrail_bypass.py +0 -0
  436. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/ide_injection.py +0 -0
  437. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/image.py +0 -0
  438. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/injection.py +0 -0
  439. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/json_tools.py +0 -0
  440. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/language.py +0 -0
  441. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/logic_bomb.py +0 -0
  442. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/mcp_attacks.py +0 -0
  443. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/multi_agent_attacks.py +0 -0
  444. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/persuasion.py +0 -0
  445. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/perturbation.py +0 -0
  446. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/pii_extraction.py +0 -0
  447. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/pythonic_tools.py +0 -0
  448. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/rag_poisoning.py +0 -0
  449. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/reasoning_attacks.py +0 -0
  450. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/refine.py +0 -0
  451. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/response_steering.py +0 -0
  452. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/stylistic.py +0 -0
  453. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/substitution.py +0 -0
  454. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/swap.py +0 -0
  455. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/system_prompt_extraction.py +0 -0
  456. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/text.py +0 -0
  457. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/video.py +0 -0
  458. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/transforms/xml_tools.py +0 -0
  459. {dreadnode-2.0.9 → dreadnode-2.0.10}/dreadnode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dreadnode
3
- Version: 2.0.9
3
+ Version: 2.0.10
4
4
  Summary: Dreadnode SDK
5
5
  Project-URL: Homepage, https://dreadnode.io
6
6
  Project-URL: Documentation, https://docs.dreadnode.io
@@ -19,7 +19,7 @@ Requires-Dist: gepa>=0.1.1
19
19
  Requires-Dist: httpx<1.0.0,>=0.28.0
20
20
  Requires-Dist: jsonpath-ng>=1.7.0
21
21
  Requires-Dist: jsonref>=1.1.0
22
- Requires-Dist: litellm<=1.82.3,>=1.80.11
22
+ Requires-Dist: litellm<=1.83.0,>=1.83.0
23
23
  Requires-Dist: logfire<=3.20.0,>=3.5.3
24
24
  Requires-Dist: loguru>=0.7.3
25
25
  Requires-Dist: mcp<2.0.0,>=1.25.0
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
  import inspect
3
3
  import typing as t
4
- from contextlib import AsyncExitStack, asynccontextmanager, nullcontext, suppress
4
+ from contextlib import AsyncExitStack, asynccontextmanager, suppress
5
5
  from copy import deepcopy
6
6
  from pathlib import Path
7
7
  from textwrap import dedent
@@ -586,7 +586,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
586
586
  agent_name=self.name,
587
587
  inputs={"goal": self._current_input},
588
588
  params={
589
- "session_id": str(self.trajectory.session_id),
589
+ "session_id": str(traj.session_id),
590
590
  "max_steps": self.max_steps,
591
591
  **({"model": self.model_name} if self.model_name else {}),
592
592
  **({"tools": [tool.name for tool in self.all_tools]} if self.all_tools else {}),
@@ -683,7 +683,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
683
683
  )
684
684
 
685
685
  # Check stop conditions INSIDE span
686
- if any(cond(self.trajectory.steps) for cond in self.stop_conditions):
686
+ if any(cond(traj.steps) for cond in self.stop_conditions):
687
687
  logger.info("A stop condition was met. Ending run.")
688
688
  gen_end = GenerationEnd(
689
689
  agent_id=self.agent_id,
@@ -872,7 +872,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
872
872
  )
873
873
 
874
874
  # Check stop conditions again INSIDE span
875
- if any(cond(self.trajectory.steps) for cond in self.stop_conditions):
875
+ if any(cond(traj.steps) for cond in self.stop_conditions):
876
876
  break
877
877
 
878
878
  except Continue as e:
@@ -899,7 +899,7 @@ class Agent(Executor[AgentEvent, Trajectory]):
899
899
  stop_reason = "error"
900
900
  elif max_steps_reached:
901
901
  stop_reason = "max_steps_reached"
902
- elif self.trajectory.steps and isinstance(self.trajectory.steps[-1], AgentStalled):
902
+ elif traj.steps and isinstance(traj.steps[-1], AgentStalled):
903
903
  stop_reason = "stalled"
904
904
 
905
905
  async for event in self._dispatch(
@@ -961,17 +961,12 @@ class Agent(Executor[AgentEvent, Trajectory]):
961
961
  if hasattr(tool_container, "__aenter__") and hasattr(tool_container, "__aexit__"):
962
962
  await stack.enter_async_context(tool_container)
963
963
 
964
- # Parent span only on new conversation (not when borrowing external trajectory)
965
964
  display_name = self.name or str(self.agent_id)[:8]
966
- ctx = (
967
- dreadnode.task_span(
968
- f"agent:{display_name}",
969
- type="agent",
970
- label=display_name,
971
- tags=["agent"],
972
- )
973
- if reset and trajectory is None
974
- else nullcontext()
965
+ ctx = dreadnode.task_span(
966
+ f"agent:{display_name}",
967
+ type="agent",
968
+ label=display_name,
969
+ tags=["agent"],
975
970
  )
976
971
 
977
972
  with ctx as parent_span:
@@ -170,7 +170,8 @@ async def offload_tool_output(
170
170
  working_dir: Path,
171
171
  ) -> tuple[str, Path]:
172
172
  """Write tool output to disk and return middle-out summary plus file path."""
173
- output_dir = working_dir / ".dreadnode" / "tool-output"
173
+ output_root = working_dir if working_dir.name == ".dreadnode" else working_dir / ".dreadnode"
174
+ output_dir = output_root / "tool-output"
174
175
  await asyncio.to_thread(output_dir.mkdir, parents=True, exist_ok=True)
175
176
 
176
177
  safe_id = re.sub(r"[^a-zA-Z0-9_-]", "_", tool_call_id)
@@ -178,7 +179,8 @@ async def offload_tool_output(
178
179
  async with aiofiles.open(file_path, "w") as f:
179
180
  await f.write(content)
180
181
 
181
- relative_path = file_path.relative_to(working_dir)
182
+ relative_base = working_dir.parent if working_dir.name == ".dreadnode" else working_dir
183
+ relative_path = file_path.relative_to(relative_base)
182
184
 
183
185
  half = OFFLOAD_THRESHOLD // 2
184
186
  start = content[:half]
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
18
18
  tag_attack,
19
19
  )
20
20
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
21
+ from dreadnode.core.meta import TrialCandidate
21
22
  from dreadnode.core.scorer import Scorer
22
23
  from dreadnode.core.transforms import Transform, TransformsLike
23
24
  from dreadnode.generators.generator import GenerateParams, Generator, get_generator
@@ -232,6 +233,7 @@ def beast_attack(
232
233
  llm_judge(
233
234
  evaluator_model,
234
235
  rubric,
236
+ input=TrialCandidate(),
235
237
  min_score=1,
236
238
  max_score=10,
237
239
  )
@@ -247,6 +249,7 @@ def beast_attack(
247
249
  target=target,
248
250
  fitted_transforms=fitted_transforms,
249
251
  scorer=prompt_judge,
252
+ include_input=True,
250
253
  )
251
254
 
252
255
  attack = Study[str](
@@ -11,6 +11,7 @@ from dreadnode.airt.compliance import (
11
11
  tag_attack,
12
12
  )
13
13
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
14
+ from dreadnode.core.meta import TrialCandidate
14
15
  from dreadnode.core.scorer import Scorer
15
16
  from dreadnode.core.transforms import Transform, TransformsLike
16
17
  from dreadnode.generators.generator import Generator, get_generator
@@ -221,6 +222,7 @@ Return ONLY the question text."""
221
222
  llm_judge(
222
223
  evaluator_model,
223
224
  eval_rubric,
225
+ input=TrialCandidate(),
224
226
  min_score=0,
225
227
  max_score=1,
226
228
  )
@@ -235,6 +237,7 @@ Return ONLY the question text."""
235
237
  target=target,
236
238
  fitted_transforms=fitted_transforms,
237
239
  scorer=objective_judge,
240
+ include_input=True,
238
241
  )
239
242
 
240
243
  # Resolve model names for span attributes
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
18
18
  tag_attack,
19
19
  )
20
20
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
21
+ from dreadnode.core.meta import TrialCandidate
21
22
  from dreadnode.core.scorer import Scorer
22
23
  from dreadnode.core.transforms import Transform, TransformsLike
23
24
  from dreadnode.generators.generator import Generator
@@ -135,6 +136,7 @@ def deep_inception_attack(
135
136
  llm_judge(
136
137
  evaluator_model,
137
138
  rubric,
139
+ input=TrialCandidate(),
138
140
  min_score=1,
139
141
  max_score=10,
140
142
  )
@@ -150,6 +152,7 @@ def deep_inception_attack(
150
152
  target=target,
151
153
  fitted_transforms=fitted_transforms,
152
154
  scorer=prompt_judge,
155
+ include_input=True,
153
156
  )
154
157
 
155
158
  attack = Study[str](
@@ -19,6 +19,7 @@ from dreadnode.airt.compliance import (
19
19
  tag_attack,
20
20
  )
21
21
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
22
+ from dreadnode.core.meta import TrialCandidate
22
23
  from dreadnode.core.scorer import Scorer
23
24
  from dreadnode.core.transforms import Transform, TransformsLike
24
25
  from dreadnode.generators.generator import GenerateParams, Generator, get_generator
@@ -137,6 +138,7 @@ def drattack(
137
138
  llm_judge(
138
139
  evaluator_model,
139
140
  rubric,
141
+ input=TrialCandidate(),
140
142
  min_score=1,
141
143
  max_score=10,
142
144
  )
@@ -152,6 +154,7 @@ def drattack(
152
154
  target=target,
153
155
  fitted_transforms=fitted_transforms,
154
156
  scorer=prompt_judge,
157
+ include_input=True,
155
158
  )
156
159
 
157
160
  attack = Study[str](
@@ -8,6 +8,7 @@ from dreadnode.airt.compliance import (
8
8
  tag_attack,
9
9
  )
10
10
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
11
+ from dreadnode.core.meta import TrialCandidate
11
12
  from dreadnode.core.scorer import Scorer
12
13
  from dreadnode.core.transforms import Transform, TransformsLike
13
14
  from dreadnode.generators.generator import Generator
@@ -114,6 +115,7 @@ def goat_attack(
114
115
  llm_judge(
115
116
  evaluator_model,
116
117
  rubric,
118
+ input=TrialCandidate(),
117
119
  min_score=1,
118
120
  max_score=10,
119
121
  )
@@ -141,6 +143,7 @@ def goat_attack(
141
143
  target=target,
142
144
  fitted_transforms=fitted_transforms,
143
145
  scorer=prompt_judge,
146
+ include_input=True,
144
147
  )
145
148
 
146
149
  # Resolve model names for span attributes
@@ -17,6 +17,7 @@ from dreadnode.airt.compliance import (
17
17
  tag_attack,
18
18
  )
19
19
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
20
+ from dreadnode.core.meta import TrialCandidate
20
21
  from dreadnode.core.scorer import Scorer
21
22
  from dreadnode.core.transforms import Transform, TransformsLike
22
23
  from dreadnode.generators.generator import Generator
@@ -150,6 +151,7 @@ def gptfuzzer_attack(
150
151
  llm_judge(
151
152
  evaluator_model,
152
153
  rubric,
154
+ input=TrialCandidate(),
153
155
  min_score=1,
154
156
  max_score=10,
155
157
  )
@@ -165,6 +167,7 @@ def gptfuzzer_attack(
165
167
  target=target,
166
168
  fitted_transforms=fitted_transforms,
167
169
  scorer=prompt_judge,
170
+ include_input=True,
168
171
  )
169
172
 
170
173
  attack = Study[str](
@@ -15,6 +15,7 @@ from dreadnode.airt.compliance import (
15
15
  tag_attack,
16
16
  )
17
17
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
18
+ from dreadnode.core.meta import TrialCandidate
18
19
  from dreadnode.core.scorer import Scorer
19
20
  from dreadnode.core.transforms import Transform, TransformsLike
20
21
  from dreadnode.generators.generator import Generator
@@ -142,6 +143,7 @@ def pair_attack(
142
143
  llm_judge(
143
144
  evaluator_model,
144
145
  rubric,
146
+ input=TrialCandidate(),
145
147
  min_score=1,
146
148
  max_score=10,
147
149
  )
@@ -157,6 +159,7 @@ def pair_attack(
157
159
  target=target,
158
160
  fitted_transforms=fitted_transforms,
159
161
  scorer=prompt_judge,
162
+ include_input=True,
160
163
  )
161
164
 
162
165
  # Resolve model names for span attributes
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
18
18
  tag_attack,
19
19
  )
20
20
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
21
+ from dreadnode.core.meta import TrialCandidate
21
22
  from dreadnode.core.scorer import Scorer
22
23
  from dreadnode.core.transforms import Transform, TransformsLike
23
24
  from dreadnode.generators.generator import Generator
@@ -170,6 +171,7 @@ def rainbow_attack(
170
171
  llm_judge(
171
172
  evaluator_model,
172
173
  rubric,
174
+ input=TrialCandidate(),
173
175
  min_score=1,
174
176
  max_score=10,
175
177
  )
@@ -185,6 +187,7 @@ def rainbow_attack(
185
187
  target=target,
186
188
  fitted_transforms=fitted_transforms,
187
189
  scorer=prompt_judge,
190
+ include_input=True,
188
191
  )
189
192
 
190
193
  attack = Study[str](
@@ -18,6 +18,7 @@ from dreadnode.airt.compliance import (
18
18
  tag_attack,
19
19
  )
20
20
  from dreadnode.airt.prompt import OBJECTIVE_SCORE_KEY, _evaluate_prompt
21
+ from dreadnode.core.meta import TrialCandidate
21
22
  from dreadnode.core.scorer import Scorer
22
23
  from dreadnode.core.transforms import Transform, TransformsLike
23
24
  from dreadnode.generators.generator import GenerateParams, Generator, get_generator
@@ -165,6 +166,7 @@ def renellm_attack(
165
166
  llm_judge(
166
167
  evaluator_model,
167
168
  rubric,
169
+ input=TrialCandidate(),
168
170
  min_score=1,
169
171
  max_score=10,
170
172
  )
@@ -180,6 +182,7 @@ def renellm_attack(
180
182
  target=target,
181
183
  fitted_transforms=fitted_transforms,
182
184
  scorer=prompt_judge,
185
+ include_input=True,
183
186
  )
184
187
 
185
188
  attack = Study[str](
@@ -239,6 +239,45 @@ class ApiClient:
239
239
  response = self.request("GET", "/inference")
240
240
  return t.cast("list[dict[str, t.Any]]", response.json().get("models", []))
241
241
 
242
+ def list_catalog_models(
243
+ self,
244
+ *,
245
+ query: str | None = None,
246
+ limit: int | None = None,
247
+ provider: str | None = None,
248
+ capabilities: list[str] | None = None,
249
+ open_weights: bool | None = None,
250
+ min_context: int | None = None,
251
+ max_context: int | None = None,
252
+ min_price: float | None = None,
253
+ max_price: float | None = None,
254
+ featured: bool = False,
255
+ ) -> list[dict[str, t.Any]]:
256
+ """GET /api/v1/inference/catalog - List featured or searched BYOK catalog models."""
257
+ params: dict[str, t.Any] = {}
258
+ if query is not None:
259
+ params["query"] = query
260
+ if limit is not None:
261
+ params["limit"] = limit
262
+ if provider is not None:
263
+ params["provider"] = provider
264
+ if capabilities:
265
+ params["capabilities"] = capabilities
266
+ if open_weights is not None:
267
+ params["open_weights"] = open_weights
268
+ if min_context is not None:
269
+ params["min_context"] = min_context
270
+ if max_context is not None:
271
+ params["max_context"] = max_context
272
+ if min_price is not None:
273
+ params["min_price"] = min_price
274
+ if max_price is not None:
275
+ params["max_price"] = max_price
276
+ if featured:
277
+ params["featured"] = True
278
+ response = self.request("GET", "/inference/catalog", params=params)
279
+ return t.cast("list[dict[str, t.Any]]", response.json().get("models", []))
280
+
242
281
  def get_user_preferences(self) -> dict[str, t.Any]:
243
282
  """GET /api/v1/user/preferences - Get user's enabled models with status."""
244
283
  response = self.request("GET", "/user/preferences")
@@ -1729,7 +1768,6 @@ class ApiClient:
1729
1768
  *,
1730
1769
  page: int = 1,
1731
1770
  limit: int = 50,
1732
- category: list[str] | None = None,
1733
1771
  difficulty: list[str] | None = None,
1734
1772
  tags: list[str] | None = None,
1735
1773
  search: str | None = None,
@@ -1741,8 +1779,6 @@ class ApiClient:
1741
1779
  params: dict[str, t.Any] = {}
1742
1780
  params["page"] = page
1743
1781
  params["limit"] = limit
1744
- if category is not None:
1745
- params["category"] = category
1746
1782
  if difficulty is not None:
1747
1783
  params["difficulty"] = difficulty
1748
1784
  if tags is not None:
@@ -1762,7 +1798,6 @@ class ApiClient:
1762
1798
  self,
1763
1799
  org: str,
1764
1800
  *,
1765
- category: list[str] | None = None,
1766
1801
  difficulty: list[str] | None = None,
1767
1802
  search: str | None = None,
1768
1803
  tags: list[str] | None = None,
@@ -1772,8 +1807,6 @@ class ApiClient:
1772
1807
  ) -> dict[str, t.Any]:
1773
1808
  """GET /org/{org}/tasks/facets - Get task filter facets."""
1774
1809
  params: dict[str, t.Any] = {"include_public": include_public}
1775
- if category is not None:
1776
- params["category"] = category
1777
1810
  if difficulty is not None:
1778
1811
  params["difficulty"] = difficulty
1779
1812
  if search is not None:
@@ -1900,11 +1933,18 @@ class ApiClient:
1900
1933
  page: int = 1,
1901
1934
  page_size: int = 20,
1902
1935
  project_id: str | None = None,
1936
+ user_id: str | None = None,
1903
1937
  ) -> dict[str, t.Any]:
1904
- """GET /org/{org}/ws/{workspace}/sessions - List sessions."""
1938
+ """GET /org/{org}/ws/{workspace}/sessions - List sessions.
1939
+
1940
+ The platform endpoint defaults to workspace-wide. Pass ``user_id``
1941
+ to scope to a single creator (e.g. the TUI's "my sessions" view).
1942
+ """
1905
1943
  params: dict[str, t.Any] = {"page": page, "page_size": page_size}
1906
1944
  if project_id is not None:
1907
1945
  params["project_id"] = project_id
1946
+ if user_id is not None:
1947
+ params["user_id"] = user_id
1908
1948
  response = self.request("GET", f"/org/{org}/ws/{workspace}/sessions", params=params)
1909
1949
  return t.cast("dict[str, t.Any]", response.json())
1910
1950
 
@@ -1928,22 +1968,6 @@ class ApiClient:
1928
1968
  )
1929
1969
  return t.cast("dict[str, t.Any]", response.json())
1930
1970
 
1931
- def ingest_session_events(
1932
- self,
1933
- org: str,
1934
- workspace: str,
1935
- session_id: str,
1936
- events: list[dict[str, t.Any]],
1937
- wal_offset: int,
1938
- ) -> dict[str, t.Any]:
1939
- """POST /org/{org}/ws/{workspace}/sessions/{session_id}/events - Ingest events."""
1940
- response = self.request(
1941
- "POST",
1942
- f"/org/{org}/ws/{workspace}/sessions/{session_id}/events",
1943
- json_data={"events": events, "wal_offset": wal_offset},
1944
- )
1945
- return t.cast("dict[str, t.Any]", response.json())
1946
-
1947
1971
  # ------------------------------------------------------------------
1948
1972
  # Session transcripts (message-level persistence)
1949
1973
  # ------------------------------------------------------------------
@@ -1994,6 +2018,7 @@ class ApiClient:
1994
2018
  messages: list[t.Any],
1995
2019
  *,
1996
2020
  context: dict[str, t.Any] | None = None,
2021
+ usage_by_uuid: dict[str, dict[str, int]] | None = None,
1997
2022
  ) -> dict[str, t.Any]:
1998
2023
  """POST /org/{org}/ws/{workspace}/sessions/{session_id}/transcript — Append messages.
1999
2024
 
@@ -2004,10 +2029,20 @@ class ApiClient:
2004
2029
  messages: List of SDK Message objects to persist.
2005
2030
  context: Optional dict with ``model``, ``agent``, ``system_prompt``
2006
2031
  — include on first call or when agent/model changes.
2032
+ usage_by_uuid: Optional mapping of message uuid (str) → usage dict
2033
+ with ``input_tokens`` / ``output_tokens`` /
2034
+ ``cache_read_input_tokens`` / ``cache_creation_input_tokens``.
2035
+ Entries are attached to the matching message payload.
2007
2036
  """
2008
- payload: dict[str, t.Any] = {
2009
- "messages": [self._message_to_transcript_dict(m) for m in messages],
2010
- }
2037
+ payload_messages: list[dict[str, t.Any]] = []
2038
+ for m in messages:
2039
+ d = self._message_to_transcript_dict(m)
2040
+ msg_id = d.get("id")
2041
+ if usage_by_uuid and isinstance(msg_id, str) and msg_id in usage_by_uuid:
2042
+ d["usage"] = usage_by_uuid[msg_id]
2043
+ payload_messages.append(d)
2044
+
2045
+ payload: dict[str, t.Any] = {"messages": payload_messages}
2011
2046
  if context is not None:
2012
2047
  payload["context"] = context
2013
2048
 
@@ -16,6 +16,20 @@ if t.TYPE_CHECKING:
16
16
 
17
17
  AnyDict = dict[str, t.Any]
18
18
 
19
+
20
+ def _normalize_default_agent_fields(data: t.Any) -> t.Any:
21
+ """Normalize legacy `default` agent/capability inputs to no override."""
22
+ if not isinstance(data, dict):
23
+ return data
24
+
25
+ normalized = dict(data)
26
+ for field in ("agent", "capability"):
27
+ value = normalized.get(field)
28
+ if isinstance(value, str) and value.strip().lower() == "default":
29
+ normalized[field] = None
30
+ return normalized
31
+
32
+
19
33
  # -----------------------------------------------------------------------------
20
34
  # Type Aliases for Exports
21
35
  # -----------------------------------------------------------------------------
@@ -749,6 +763,11 @@ class ChatRequest(BaseModel):
749
763
 
750
764
  model_config = ConfigDict(populate_by_name=True)
751
765
 
766
+ @model_validator(mode="before")
767
+ @classmethod
768
+ def _normalize_default_agent(cls, data: t.Any) -> t.Any:
769
+ return _normalize_default_agent_fields(data)
770
+
752
771
 
753
772
  class ChatResponse(BaseModel):
754
773
  """Response body for chat completion."""
@@ -798,6 +817,11 @@ class SessionCreateRequest(BaseModel):
798
817
 
799
818
  model_config = ConfigDict(populate_by_name=True)
800
819
 
820
+ @model_validator(mode="before")
821
+ @classmethod
822
+ def _normalize_default_agent(cls, data: t.Any) -> t.Any:
823
+ return _normalize_default_agent_fields(data)
824
+
801
825
 
802
826
  class SessionRestoreRequest(BaseModel):
803
827
  """Request body for restoring a server-side session runtime."""
@@ -809,6 +833,11 @@ class SessionRestoreRequest(BaseModel):
809
833
  messages: list[SessionMessage] = Field(default_factory=list)
810
834
  trajectory: dict[str, t.Any] | None = None
811
835
 
836
+ @model_validator(mode="before")
837
+ @classmethod
838
+ def _normalize_default_agent(cls, data: t.Any) -> t.Any:
839
+ return _normalize_default_agent_fields(data)
840
+
812
841
 
813
842
  class SessionRestoreResponse(BaseModel):
814
843
  """Response returned after restoring a server-side session runtime."""
@@ -853,7 +882,7 @@ class CapabilityAgentInfo(BaseModel):
853
882
  class ComponentStatusInfo(BaseModel):
854
883
  """Component-level load/runtime status."""
855
884
 
856
- kind: t.Literal["agent", "tool", "skill", "mcp_server", "capability", "check"]
885
+ kind: t.Literal["agent", "tool", "hook", "skill", "mcp_server", "capability", "check"]
857
886
  name: str
858
887
  status: t.Literal["ok", "error", "degraded"]
859
888
  error: str | None = None
@@ -871,6 +900,7 @@ class CapabilityInfo(BaseModel):
871
900
  name: str
872
901
  display_name: str
873
902
  canonical_name: str | None = None
903
+ local_path: str | None = None
874
904
  source: t.Literal["runtime", "local", "package"] | None = None
875
905
  provenance: t.Literal["local", "org", "public"] | None = None
876
906
  version: str | None = None
@@ -997,17 +1027,6 @@ class PlatformSessionResponse(BaseModel):
997
1027
  """Update timestamp."""
998
1028
 
999
1029
 
1000
- class PlatformSessionEvent(BaseModel):
1001
- """Session event for platform ingestion (maps to API SessionEventCreate)."""
1002
-
1003
- event_type: str
1004
- """Event type (e.g. 'message', 'tool_use')."""
1005
- data: dict[str, t.Any] = Field(default_factory=dict)
1006
- """Event payload."""
1007
- timestamp: datetime | None = None
1008
- """Event timestamp."""
1009
-
1010
-
1011
1030
  # -----------------------------------------------------------------------------
1012
1031
  # Training
1013
1032
  # -----------------------------------------------------------------------------