devsper 2.7.0__tar.gz → 2.7.2__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 (732) hide show
  1. {devsper-2.7.0 → devsper-2.7.2}/CHANGELOG.md +27 -0
  2. {devsper-2.7.0 → devsper-2.7.2}/PKG-INFO +8 -1
  3. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/roles.py +28 -4
  4. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/main.py +218 -2
  5. {devsper-2.7.0 → devsper-2.7.2}/devsper/config/schema.py +28 -0
  6. devsper-2.7.2/devsper/evals/__init__.py +19 -0
  7. devsper-2.7.2/devsper/evals/dataset.py +107 -0
  8. devsper-2.7.2/devsper/evals/metrics.py +192 -0
  9. devsper-2.7.2/devsper/evals/runner.py +179 -0
  10. devsper-2.7.2/devsper/evals/types.py +114 -0
  11. devsper-2.7.2/devsper/prompt_optimizer/__init__.py +16 -0
  12. devsper-2.7.2/devsper/prompt_optimizer/backends/__init__.py +1 -0
  13. devsper-2.7.2/devsper/prompt_optimizer/backends/dspy_backend.py +205 -0
  14. devsper-2.7.2/devsper/prompt_optimizer/backends/gepa_backend.py +203 -0
  15. devsper-2.7.2/devsper/prompt_optimizer/backends/noop.py +25 -0
  16. devsper-2.7.2/devsper/prompt_optimizer/base.py +56 -0
  17. devsper-2.7.2/devsper/prompt_optimizer/factory.py +102 -0
  18. {devsper-2.7.0 → devsper-2.7.2}/pyproject.toml +12 -1
  19. devsper-2.7.2/tests/integration/test_evals_e2e.py +508 -0
  20. devsper-2.7.2/tests/test_evals.py +290 -0
  21. {devsper-2.7.0 → devsper-2.7.2}/uv.lock +325 -2
  22. {devsper-2.7.0 → devsper-2.7.2}/.env.example +0 -0
  23. {devsper-2.7.0 → devsper-2.7.2}/.github/FUNDING.yml +0 -0
  24. {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/pypi-publish.yml +0 -0
  25. {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/release-on-tag.yml +0 -0
  26. {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/worker-release.yml +0 -0
  27. {devsper-2.7.0 → devsper-2.7.2}/.gitignore +0 -0
  28. {devsper-2.7.0 → devsper-2.7.2}/.python-version +0 -0
  29. {devsper-2.7.0 → devsper-2.7.2}/CODE_OF_CONDUCT.md +0 -0
  30. {devsper-2.7.0 → devsper-2.7.2}/CONTRIBUTING.md +0 -0
  31. {devsper-2.7.0 → devsper-2.7.2}/Cargo.lock +0 -0
  32. {devsper-2.7.0 → devsper-2.7.2}/Cargo.toml +0 -0
  33. {devsper-2.7.0 → devsper-2.7.2}/Dockerfile.local-pool +0 -0
  34. {devsper-2.7.0 → devsper-2.7.2}/LICENSE +0 -0
  35. {devsper-2.7.0 → devsper-2.7.2}/README.md +0 -0
  36. {devsper-2.7.0 → devsper-2.7.2}/SECURITY.md +0 -0
  37. {devsper-2.7.0 → devsper-2.7.2}/benchmarks/__init__.py +0 -0
  38. {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_dataset_analysis.py +0 -0
  39. {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_repository_analysis.py +0 -0
  40. {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_research_pipeline.py +0 -0
  41. {devsper-2.7.0 → devsper-2.7.2}/branding/logo.svg +0 -0
  42. {devsper-2.7.0 → devsper-2.7.2}/devsper/README.md +0 -0
  43. {devsper-2.7.0 → devsper-2.7.2}/devsper/__init__.py +0 -0
  44. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/__init__.py +0 -0
  45. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/client.py +0 -0
  46. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/discovery.py +0 -0
  47. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/server.py +0 -0
  48. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/tool_adapter.py +0 -0
  49. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/types.py +0 -0
  50. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/agent.py +0 -0
  51. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/critic.py +0 -0
  52. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/identity.py +0 -0
  53. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/message_bus.py +0 -0
  54. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/registry.py +0 -0
  55. {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/run_agent.py +0 -0
  56. {devsper-2.7.0 → devsper-2.7.2}/devsper/analytics/__init__.py +0 -0
  57. {devsper-2.7.0 → devsper-2.7.2}/devsper/analytics/tool_analytics.py +0 -0
  58. {devsper-2.7.0 → devsper-2.7.2}/devsper/audit/__init__.py +0 -0
  59. {devsper-2.7.0 → devsper-2.7.2}/devsper/audit/logger.py +0 -0
  60. {devsper-2.7.0 → devsper-2.7.2}/devsper/budget.py +0 -0
  61. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/__init__.py +0 -0
  62. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/__init__.py +0 -0
  63. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/base.py +0 -0
  64. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/memory.py +0 -0
  65. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/redis.py +0 -0
  66. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/message.py +0 -0
  67. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/schema_version.py +0 -0
  68. {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/topics.py +0 -0
  69. {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/__init__.py +0 -0
  70. {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/embedding_index.py +0 -0
  71. {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/hashing.py +0 -0
  72. {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/store.py +0 -0
  73. {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/task_cache.py +0 -0
  74. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/__init__.py +0 -0
  75. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/commands/cloud.py +0 -0
  76. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/export.py +0 -0
  77. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/github_oauth.py +0 -0
  78. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/init.py +0 -0
  79. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/run_progress.py +0 -0
  80. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/__init__.py +0 -0
  81. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/components.py +0 -0
  82. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/controller_run_view.py +0 -0
  83. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/errors.py +0 -0
  84. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/logging.py +0 -0
  85. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/onboarding.py +0 -0
  86. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/progress.py +0 -0
  87. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/run_view.py +0 -0
  88. {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/theme.py +0 -0
  89. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/__init__.py +0 -0
  90. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/election.py +0 -0
  91. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/local.py +0 -0
  92. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/node_info.py +0 -0
  93. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/registry.py +0 -0
  94. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/router.py +0 -0
  95. {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/state_backend.py +0 -0
  96. {devsper-2.7.0 → devsper-2.7.2}/devsper/compliance/__init__.py +0 -0
  97. {devsper-2.7.0 → devsper-2.7.2}/devsper/compliance/pii.py +0 -0
  98. {devsper-2.7.0 → devsper-2.7.2}/devsper/config/__init__.py +0 -0
  99. {devsper-2.7.0 → devsper-2.7.2}/devsper/config/config_loader.py +0 -0
  100. {devsper-2.7.0 → devsper-2.7.2}/devsper/config/defaults.py +0 -0
  101. {devsper-2.7.0 → devsper-2.7.2}/devsper/config/resolver.py +0 -0
  102. {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/__init__.py +0 -0
  103. {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/base.py +0 -0
  104. {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/registry.py +0 -0
  105. {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/sample_connector.py +0 -0
  106. {devsper-2.7.0 → devsper-2.7.2}/devsper/contracts/__init__.py +0 -0
  107. {devsper-2.7.0 → devsper-2.7.2}/devsper/contracts/platform_event_type.py +0 -0
  108. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/__init__.py +0 -0
  109. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/agent/__init__.py +0 -0
  110. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/agent/runner.py +0 -0
  111. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/hitl/__init__.py +0 -0
  112. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/hitl/state_machine.py +0 -0
  113. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/memory/__init__.py +0 -0
  114. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/memory/shared_memory.py +0 -0
  115. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/reporting/__init__.py +0 -0
  116. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/reporting/publisher.py +0 -0
  117. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/__init__.py +0 -0
  118. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/durability.py +0 -0
  119. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/orchestrator.py +0 -0
  120. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/__init__.py +0 -0
  121. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/base_tool.py +0 -0
  122. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/loader.py +0 -0
  123. {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/registry.py +0 -0
  124. {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/__init__.py +0 -0
  125. {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/cli.py +0 -0
  126. {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/migration.py +0 -0
  127. {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/store.py +0 -0
  128. {devsper-2.7.0 → devsper-2.7.2}/devsper/dashboard/__init__.py +0 -0
  129. {devsper-2.7.0 → devsper-2.7.2}/devsper/dashboard/dashboard.py +0 -0
  130. {devsper-2.7.0 → devsper-2.7.2}/devsper/debug_events.py +0 -0
  131. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/__init__.py +0 -0
  132. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/builder.py +0 -0
  133. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/debugger.py +0 -0
  134. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/repo_index.py +0 -0
  135. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/sandbox.py +0 -0
  136. {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/scaffold.py +0 -0
  137. {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/__init__.py +0 -0
  138. {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/controller.py +0 -0
  139. {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/worker_runtime.py +0 -0
  140. {devsper-2.7.0 → devsper-2.7.2}/devsper/docs/architecture/execution-model.md +0 -0
  141. {devsper-2.7.0 → devsper-2.7.2}/devsper/embeddings/__init__.py +0 -0
  142. {devsper-2.7.0 → devsper-2.7.2}/devsper/embeddings/service.py +0 -0
  143. {devsper-2.7.0 → devsper-2.7.2}/devsper/events.py +0 -0
  144. {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/__init__.py +0 -0
  145. {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/decision_tree.py +0 -0
  146. {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/rationale.py +0 -0
  147. {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/simulation.py +0 -0
  148. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/__init__.py +0 -0
  149. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/branding.py +0 -0
  150. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/collector.py +0 -0
  151. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/manifest.py +0 -0
  152. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/model.py +0 -0
  153. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/packager.py +0 -0
  154. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/pdf.py +0 -0
  155. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/service.py +0 -0
  156. {devsper-2.7.0 → devsper-2.7.2}/devsper/export/writers.py +0 -0
  157. {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/__init__.py +0 -0
  158. {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/approval.py +0 -0
  159. {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/escalation.py +0 -0
  160. {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/__init__.py +0 -0
  161. {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/langchain_adapter.py +0 -0
  162. {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/langgraph_adapter.py +0 -0
  163. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/__init__.py +0 -0
  164. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/adaptation.py +0 -0
  165. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/__init__.py +0 -0
  166. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/analyzer.py +0 -0
  167. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  168. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/formatter.py +0 -0
  169. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/run_report.py +0 -0
  170. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/learning_engine.py +0 -0
  171. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/__init__.py +0 -0
  172. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/base.py +0 -0
  173. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  174. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  175. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  176. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  177. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/research_strategy.py +0 -0
  178. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategy_selector.py +0 -0
  179. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/synthesis.py +0 -0
  180. {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/task_optimizer.py +0 -0
  181. {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/__init__.py +0 -0
  182. {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/extractor.py +0 -0
  183. {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/knowledge_graph.py +0 -0
  184. {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/query.py +0 -0
  185. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/__init__.py +0 -0
  186. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/consolidation.py +0 -0
  187. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/context.py +0 -0
  188. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/embeddings.py +0 -0
  189. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_index.py +0 -0
  190. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_router.py +0 -0
  191. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_store.py +0 -0
  192. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_types.py +0 -0
  193. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/namespaces.py +0 -0
  194. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/platform_memory.py +0 -0
  195. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/__init__.py +0 -0
  196. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/__init__.py +0 -0
  197. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/platform_backend.py +0 -0
  198. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/redis_backend.py +0 -0
  199. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/snowflake_backend.py +0 -0
  200. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/sqlite_backend.py +0 -0
  201. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/vektori_backend.py +0 -0
  202. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/base.py +0 -0
  203. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/factory.py +0 -0
  204. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/redis_memory.py +0 -0
  205. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/scoring.py +0 -0
  206. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/store.py +0 -0
  207. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/summarizer.py +0 -0
  208. {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/supermemory_rust_ranker.py +0 -0
  209. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/__init__.py +0 -0
  210. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/base_agent.py +0 -0
  211. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/__init__.py +0 -0
  212. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/architect_agent.py +0 -0
  213. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/coder_agent.py +0 -0
  214. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/debugger_agent.py +0 -0
  215. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/docs_agent.py +0 -0
  216. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/tester_agent.py +0 -0
  217. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/iteration_loop.py +0 -0
  218. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_memory.py +0 -0
  219. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_planner.py +0 -0
  220. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_runner.py +0 -0
  221. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/models.py +0 -0
  222. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/__init__.py +0 -0
  223. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/editor_agent.py +0 -0
  224. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/researcher_agent.py +0 -0
  225. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/reviewer_agent.py +0 -0
  226. {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/writer_agent.py +0 -0
  227. {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/__init__.py +0 -0
  228. {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/controller.py +0 -0
  229. {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/rpc.py +0 -0
  230. {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/single.py +0 -0
  231. {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/worker.py +0 -0
  232. {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/__init__.py +0 -0
  233. {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/meta_planner.py +0 -0
  234. {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/priority_queue.py +0 -0
  235. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/__init__.py +0 -0
  236. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/redis_results_sink.py +0 -0
  237. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/reporter.py +0 -0
  238. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/request_builder.py +0 -0
  239. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/run_context.py +0 -0
  240. {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/runtime_events.py +0 -0
  241. {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/__init__.py +0 -0
  242. {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/marketplace/__init__.py +0 -0
  243. {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/plugin_loader.py +0 -0
  244. {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/plugin_registry.py +0 -0
  245. {devsper-2.7.0 → devsper-2.7.2}/devsper/policy/client.py +0 -0
  246. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/__init__.py +0 -0
  247. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/config.py +0 -0
  248. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/crypto.py +0 -0
  249. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/local_pool.py +0 -0
  250. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/manager.py +0 -0
  251. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/models.py +0 -0
  252. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/org_pool.py +0 -0
  253. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/dev.toml +0 -0
  254. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/local.toml +0 -0
  255. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/prod.toml +0 -0
  256. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/security.py +0 -0
  257. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/store.py +0 -0
  258. {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/worker_runner.py +0 -0
  259. {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/__init__.py +0 -0
  260. {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/client.py +0 -0
  261. {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/schema.py +0 -0
  262. {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/server.py +0 -0
  263. {devsper-2.7.0 → devsper-2.7.2}/devsper/protocols/__init__.py +0 -0
  264. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/__init__.py +0 -0
  265. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/anthropic.py +0 -0
  266. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/base.py +0 -0
  267. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/complexity_router.py +0 -0
  268. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/gemini.py +0 -0
  269. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/github.py +0 -0
  270. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/model_router.py +0 -0
  271. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/openai.py +0 -0
  272. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/__init__.py +0 -0
  273. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/__init__.py +0 -0
  274. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  275. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/custom_backend.py +0 -0
  276. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/gemini_backend.py +0 -0
  277. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/github_backend.py +0 -0
  278. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/ollama_backend.py +0 -0
  279. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/openai_backend.py +0 -0
  280. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/vllm_backend.py +0 -0
  281. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/base.py +0 -0
  282. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/factory.py +0 -0
  283. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/legacy.py +0 -0
  284. {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/router.py +0 -0
  285. {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/__init__.py +0 -0
  286. {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/graph.py +0 -0
  287. {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/nodes.py +0 -0
  288. {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/store.py +0 -0
  289. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/__init__.py +0 -0
  290. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/agent_pool.py +0 -0
  291. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/agent_runner.py +0 -0
  292. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/clarification_manager.py +0 -0
  293. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/event_stream.py +0 -0
  294. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/execution_graph.py +0 -0
  295. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/executor.py +0 -0
  296. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/health.py +0 -0
  297. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/hitl.py +0 -0
  298. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/model_router.py +0 -0
  299. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/planner.py +0 -0
  300. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/replay.py +0 -0
  301. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/replay_engine.py +0 -0
  302. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/retry.py +0 -0
  303. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/run_history.py +0 -0
  304. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/speculative_planner.py +0 -0
  305. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/state_manager.py +0 -0
  306. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/task_runner.py +0 -0
  307. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/task_state.py +0 -0
  308. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/telemetry.py +0 -0
  309. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/tool_runner.py +0 -0
  310. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/trace_tree.py +0 -0
  311. {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/visualize.py +0 -0
  312. {devsper-2.7.0 → devsper-2.7.2}/devsper/sandbox/__init__.py +0 -0
  313. {devsper-2.7.0 → devsper-2.7.2}/devsper/sandbox/sandbox.py +0 -0
  314. {devsper-2.7.0 → devsper-2.7.2}/devsper/server/__init__.py +0 -0
  315. {devsper-2.7.0 → devsper-2.7.2}/devsper/server/events.py +0 -0
  316. {devsper-2.7.0 → devsper-2.7.2}/devsper/server/memory_utils.py +0 -0
  317. {devsper-2.7.0 → devsper-2.7.2}/devsper/server/swarmworker.py +0 -0
  318. {devsper-2.7.0 → devsper-2.7.2}/devsper/server/topology.py +0 -0
  319. {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/__init__.py +0 -0
  320. {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/uploads/__init__.py +0 -0
  321. {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/uploads/store.py +0 -0
  322. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/checkpointer.py +0 -0
  323. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/executor.py +0 -0
  324. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/map_reduce.py +0 -0
  325. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/planner.py +0 -0
  326. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/prefetcher.py +0 -0
  327. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/scheduler.py +0 -0
  328. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/speculation.py +0 -0
  329. {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/swarm.py +0 -0
  330. {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/__init__.py +0 -0
  331. {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/otel.py +0 -0
  332. {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/pricing.py +0 -0
  333. {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/trulens.py +0 -0
  334. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/__init__.py +0 -0
  335. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/base.py +0 -0
  336. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/__init__.py +0 -0
  337. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  338. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  339. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  340. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  341. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  342. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  343. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  344. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  345. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  346. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  347. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  348. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/__init__.py +0 -0
  349. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  350. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/dependency_analyzer.py +0 -0
  351. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/extract_functions.py +0 -0
  352. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/format_python.py +0 -0
  353. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/generate_docstrings.py +0 -0
  354. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/generate_unit_tests.py +0 -0
  355. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/lint_python.py +0 -0
  356. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/refactor_function.py +0 -0
  357. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/repo_structure_map.py +0 -0
  358. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/run_python.py +0 -0
  359. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/__init__.py +0 -0
  360. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/column_type_detection.py +0 -0
  361. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/csv_summary.py +0 -0
  362. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_filter.py +0 -0
  363. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_groupby.py +0 -0
  364. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_stats.py +0 -0
  365. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataset_sampling.py +0 -0
  366. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataset_schema.py +0 -0
  367. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/json_pretty_print.py +0 -0
  368. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/json_query.py +0 -0
  369. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/missing_value_report.py +0 -0
  370. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/__init__.py +0 -0
  371. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  372. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  373. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  374. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  375. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  376. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_profile.py +0 -0
  377. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  378. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  379. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  380. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/model_input_validator.py +0 -0
  381. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  382. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/__init__.py +0 -0
  383. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/fetch_url.py +0 -0
  384. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/python_exec.py +0 -0
  385. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/read_csv.py +0 -0
  386. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/upload_file.py +0 -0
  387. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/web_search.py +0 -0
  388. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/__init__.py +0 -0
  389. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/_docproc.py +0 -0
  390. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/document_to_markdown.py +0 -0
  391. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_document_images.py +0 -0
  392. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_document_text.py +0 -0
  393. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_equations.py +0 -0
  394. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_tables.py +0 -0
  395. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/summarize_document.py +0 -0
  396. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_latex_document.py +0 -0
  397. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_markdown_document.py +0 -0
  398. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_word_document.py +0 -0
  399. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/__init__.py +0 -0
  400. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  401. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  402. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/experiment_tracker.py +0 -0
  403. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/grid_search_runner.py +0 -0
  404. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  405. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  406. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  407. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/result_comparator.py +0 -0
  408. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/simulation_runner.py +0 -0
  409. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  410. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  411. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/__init__.py +0 -0
  412. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/append_file.py +0 -0
  413. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_hash.py +0 -0
  414. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_line_count.py +0 -0
  415. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_metadata.py +0 -0
  416. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_preview.py +0 -0
  417. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/find_large_files.py +0 -0
  418. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/list_directory.py +0 -0
  419. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/read_file.py +0 -0
  420. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/search_files.py +0 -0
  421. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/write_file.py +0 -0
  422. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/__init__.py +0 -0
  423. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  424. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  425. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  426. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/research_graph_builder.py +0 -0
  427. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  428. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/hitl_request.py +0 -0
  429. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/__init__.py +0 -0
  430. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  431. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  432. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/corpus_builder.py +0 -0
  433. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  434. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  435. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  436. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  437. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  438. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/__init__.py +0 -0
  439. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/calculate_expression.py +0 -0
  440. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/correlation.py +0 -0
  441. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/distribution_summary.py +0 -0
  442. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/histogram.py +0 -0
  443. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/linear_regression.py +0 -0
  444. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/matrix_multiply.py +0 -0
  445. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/mean_std.py +0 -0
  446. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  447. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/polynomial_fit.py +0 -0
  448. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/random_sample.py +0 -0
  449. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/__init__.py +0 -0
  450. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/adapter.py +0 -0
  451. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/client.py +0 -0
  452. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/discovery.py +0 -0
  453. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/__init__.py +0 -0
  454. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/delete_memory.py +0 -0
  455. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/list_memory.py +0 -0
  456. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/search_memory.py +0 -0
  457. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/store_memory.py +0 -0
  458. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/summarize_memory.py +0 -0
  459. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/tag_memory.py +0 -0
  460. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/pipelines.py +0 -0
  461. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/registry.py +0 -0
  462. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/__init__.py +0 -0
  463. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/arxiv_download.py +0 -0
  464. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/arxiv_search.py +0 -0
  465. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/citation_extractor.py +0 -0
  466. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/duckduckgo_search.py +0 -0
  467. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  468. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/paper_summarizer.py +0 -0
  469. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/research_question_generator.py +0 -0
  470. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/topic_cluster.py +0 -0
  471. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/web_search.py +0 -0
  472. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/wikipedia_lookup.py +0 -0
  473. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/__init__.py +0 -0
  474. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  475. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  476. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  477. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  478. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  479. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  480. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  481. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  482. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  483. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  484. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  485. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  486. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/__init__.py +0 -0
  487. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/report.py +0 -0
  488. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/scorer.py +0 -0
  489. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/selector.py +0 -0
  490. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/store.py +0 -0
  491. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/selector.py +0 -0
  492. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/__init__.py +0 -0
  493. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/cpu_usage.py +0 -0
  494. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/disk_usage.py +0 -0
  495. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/environment_variables.py +0 -0
  496. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/memory_usage.py +0 -0
  497. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/pip_install.py +0 -0
  498. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/pip_search.py +0 -0
  499. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/process_list.py +0 -0
  500. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/python_package_list.py +0 -0
  501. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/run_shell_command.py +0 -0
  502. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/system_info.py +0 -0
  503. {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/tool_runner.py +0 -0
  504. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/__init__.py +0 -0
  505. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/activity_feed_view.py +0 -0
  506. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/adaptive_tasks_view.py +0 -0
  507. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/agent_role_view.py +0 -0
  508. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/app.py +0 -0
  509. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/dashboard_screen.py +0 -0
  510. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/dev_view.py +0 -0
  511. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/inject_screen.py +0 -0
  512. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/knowledge_graph_view.py +0 -0
  513. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/layout.py +0 -0
  514. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/logs_view.py +0 -0
  515. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/memory_view.py +0 -0
  516. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/mission_view.py +0 -0
  517. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/performance_view.py +0 -0
  518. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/reasoning_graph_view.py +0 -0
  519. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/results_view.py +0 -0
  520. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/swarm_view.py +0 -0
  521. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/task_detail_screen.py +0 -0
  522. {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/task_view.py +0 -0
  523. {devsper-2.7.0 → devsper-2.7.2}/devsper/types/event.py +0 -0
  524. {devsper-2.7.0 → devsper-2.7.2}/devsper/types/exceptions.py +0 -0
  525. {devsper-2.7.0 → devsper-2.7.2}/devsper/types/swarm.py +0 -0
  526. {devsper-2.7.0 → devsper-2.7.2}/devsper/types/task.py +0 -0
  527. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/__init__.py +0 -0
  528. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/changelog.py +0 -0
  529. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/cli.py +0 -0
  530. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/installer.py +0 -0
  531. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/notifier.py +0 -0
  532. {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/version_check.py +0 -0
  533. {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/event_logger.py +0 -0
  534. {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/http.py +0 -0
  535. {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/models.py +0 -0
  536. {devsper-2.7.0 → devsper-2.7.2}/devsper/visualization/__init__.py +0 -0
  537. {devsper-2.7.0 → devsper-2.7.2}/devsper/visualization/dag_export.py +0 -0
  538. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/__init__.py +0 -0
  539. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/conditions.py +0 -0
  540. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/context.py +0 -0
  541. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/loader.py +0 -0
  542. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/resolver.py +0 -0
  543. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/runner.py +0 -0
  544. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/schema.py +0 -0
  545. {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/validator.py +0 -0
  546. {devsper-2.7.0 → devsper-2.7.2}/devsper.toml +0 -0
  547. {devsper-2.7.0 → devsper-2.7.2}/docker-compose.yml +0 -0
  548. {devsper-2.7.0 → devsper-2.7.2}/examples/__init__.py +0 -0
  549. {devsper-2.7.0 → devsper-2.7.2}/examples/_common.py +0 -0
  550. {devsper-2.7.0 → devsper-2.7.2}/examples/_config.py +0 -0
  551. {devsper-2.7.0 → devsper-2.7.2}/examples/coding/__init__.py +0 -0
  552. {devsper-2.7.0 → devsper-2.7.2}/examples/coding/analyze_repository.py +0 -0
  553. {devsper-2.7.0 → devsper-2.7.2}/examples/coding/generate_docs.py +0 -0
  554. {devsper-2.7.0 → devsper-2.7.2}/examples/coding/refactor_candidates.py +0 -0
  555. {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/__init__.py +0 -0
  556. {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/dataset_analysis.py +0 -0
  557. {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/run_experiments.py +0 -0
  558. {devsper-2.7.0 → devsper-2.7.2}/examples/demo_swarm.py +0 -0
  559. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/README.md +0 -0
  560. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/controller.toml +0 -0
  561. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/parallel_survey.py +0 -0
  562. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_controller.py +0 -0
  563. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_demo.sh +0 -0
  564. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_worker.py +0 -0
  565. {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/worker.toml +0 -0
  566. {devsper-2.7.0 → devsper-2.7.2}/examples/documents/__init__.py +0 -0
  567. {devsper-2.7.0 → devsper-2.7.2}/examples/documents/analyze_documents.py +0 -0
  568. {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/__init__.py +0 -0
  569. {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/monte_carlo_demo.py +0 -0
  570. {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/parameter_sweep.py +0 -0
  571. {devsper-2.7.0 → devsper-2.7.2}/examples/langchain_agent.py +0 -0
  572. {devsper-2.7.0 → devsper-2.7.2}/examples/langgraph_swarm.py +0 -0
  573. {devsper-2.7.0 → devsper-2.7.2}/examples/research/__init__.py +0 -0
  574. {devsper-2.7.0 → devsper-2.7.2}/examples/research/literature_review.py +0 -0
  575. {devsper-2.7.0 → devsper-2.7.2}/examples/research/research_gap_analysis.py +0 -0
  576. {devsper-2.7.0 → devsper-2.7.2}/examples/research/research_graph.py +0 -0
  577. {devsper-2.7.0 → devsper-2.7.2}/memory_utils.py +0 -0
  578. {devsper-2.7.0 → devsper-2.7.2}/scripts/README.md +0 -0
  579. {devsper-2.7.0 → devsper-2.7.2}/scripts/qa_e2e_stabilization.sh +0 -0
  580. {devsper-2.7.0 → devsper-2.7.2}/scripts/seed_tool_scores.py +0 -0
  581. {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_cli.sh +0 -0
  582. {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_full.sh +0 -0
  583. {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_smoke.py +0 -0
  584. {devsper-2.7.0 → devsper-2.7.2}/scripts/test_v2_router.py +0 -0
  585. {devsper-2.7.0 → devsper-2.7.2}/supermemory-core/Cargo.toml +0 -0
  586. {devsper-2.7.0 → devsper-2.7.2}/supermemory-core/src/main.rs +0 -0
  587. {devsper-2.7.0 → devsper-2.7.2}/tests/agents/__init__.py +0 -0
  588. {devsper-2.7.0 → devsper-2.7.2}/tests/agents/test_roles.py +0 -0
  589. {devsper-2.7.0 → devsper-2.7.2}/tests/benchmarks/test_v16_perf.py +0 -0
  590. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_controller_restart_hitl.py +0 -0
  591. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_duplicate_event_delivery.py +0 -0
  592. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_event_idempotency.py +0 -0
  593. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_event_retry.py +0 -0
  594. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_hitl_pause_resume.py +0 -0
  595. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_sse_reconnect.py +0 -0
  596. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_sse_stream.py +0 -0
  597. {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_worker_crash_recovery.py +0 -0
  598. {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/__init__.py +0 -0
  599. {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_adaptation.py +0 -0
  600. {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_learning_engine.py +0 -0
  601. {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_strategy_selector.py +0 -0
  602. {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_task_optimizer.py +0 -0
  603. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/__init__.py +0 -0
  604. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_agent_memory_integration.py +0 -0
  605. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_context_run_scope.py +0 -0
  606. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_index.py +0 -0
  607. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_router.py +0 -0
  608. {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_store.py +0 -0
  609. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/__init__.py +0 -0
  610. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/fixtures.py +0 -0
  611. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_crypto.py +0 -0
  612. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_e2e_redis_loop.py +0 -0
  613. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_heartbeat_eviction.py +0 -0
  614. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_local_pool.py +0 -0
  615. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_org_pool.py +0 -0
  616. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_priority_chain.py +0 -0
  617. {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_rate_limiting.py +0 -0
  618. {devsper-2.7.0 → devsper-2.7.2}/tests/reasoning/__init__.py +0 -0
  619. {devsper-2.7.0 → devsper-2.7.2}/tests/reasoning/test_reasoning_graph.py +0 -0
  620. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/__init__.py +0 -0
  621. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_budget.py +0 -0
  622. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_otel_phase1.py +0 -0
  623. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_packager.py +0 -0
  624. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_protocol_schema.py +0 -0
  625. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_replay.py +0 -0
  626. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_replay_engine.py +0 -0
  627. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_telemetry.py +0 -0
  628. {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_visualize.py +0 -0
  629. {devsper-2.7.0 → devsper-2.7.2}/tests/test_agent.py +0 -0
  630. {devsper-2.7.0 → devsper-2.7.2}/tests/test_analysis.py +0 -0
  631. {devsper-2.7.0 → devsper-2.7.2}/tests/test_analytics.py +0 -0
  632. {devsper-2.7.0 → devsper-2.7.2}/tests/test_auto_model.py +0 -0
  633. {devsper-2.7.0 → devsper-2.7.2}/tests/test_clarification.py +0 -0
  634. {devsper-2.7.0 → devsper-2.7.2}/tests/test_clarification_multinode.py +0 -0
  635. {devsper-2.7.0 → devsper-2.7.2}/tests/test_config_loader.py +0 -0
  636. {devsper-2.7.0 → devsper-2.7.2}/tests/test_credentials.py +0 -0
  637. {devsper-2.7.0 → devsper-2.7.2}/tests/test_cross_boundary_serialization.py +0 -0
  638. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dag_export.py +0 -0
  639. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_agents.py +0 -0
  640. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_build_cmd.py +0 -0
  641. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_debugger.py +0 -0
  642. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_repo_index.py +0 -0
  643. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_sandbox.py +0 -0
  644. {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_scaffold.py +0 -0
  645. {devsper-2.7.0 → devsper-2.7.2}/tests/test_distributed_bugs.py +0 -0
  646. {devsper-2.7.0 → devsper-2.7.2}/tests/test_embeddings_service.py +0 -0
  647. {devsper-2.7.0 → devsper-2.7.2}/tests/test_event_logger.py +0 -0
  648. {devsper-2.7.0 → devsper-2.7.2}/tests/test_execution_graph_meta.py +0 -0
  649. {devsper-2.7.0 → devsper-2.7.2}/tests/test_executor.py +0 -0
  650. {devsper-2.7.0 → devsper-2.7.2}/tests/test_export_runs.py +0 -0
  651. {devsper-2.7.0 → devsper-2.7.2}/tests/test_github_provider.py +0 -0
  652. {devsper-2.7.0 → devsper-2.7.2}/tests/test_init.py +0 -0
  653. {devsper-2.7.0 → devsper-2.7.2}/tests/test_knowledge_graph.py +0 -0
  654. {devsper-2.7.0 → devsper-2.7.2}/tests/test_knowledge_query.py +0 -0
  655. {devsper-2.7.0 → devsper-2.7.2}/tests/test_langchain_adapter.py +0 -0
  656. {devsper-2.7.0 → devsper-2.7.2}/tests/test_langgraph_adapter.py +0 -0
  657. {devsper-2.7.0 → devsper-2.7.2}/tests/test_map_reduce.py +0 -0
  658. {devsper-2.7.0 → devsper-2.7.2}/tests/test_memory_evolution.py +0 -0
  659. {devsper-2.7.0 → devsper-2.7.2}/tests/test_memory_isolation.py +0 -0
  660. {devsper-2.7.0 → devsper-2.7.2}/tests/test_missions.py +0 -0
  661. {devsper-2.7.0 → devsper-2.7.2}/tests/test_model_router.py +0 -0
  662. {devsper-2.7.0 → devsper-2.7.2}/tests/test_planner.py +0 -0
  663. {devsper-2.7.0 → devsper-2.7.2}/tests/test_platform_runtime_events.py +0 -0
  664. {devsper-2.7.0 → devsper-2.7.2}/tests/test_plugins.py +0 -0
  665. {devsper-2.7.0 → devsper-2.7.2}/tests/test_protocols.py +0 -0
  666. {devsper-2.7.0 → devsper-2.7.2}/tests/test_router.py +0 -0
  667. {devsper-2.7.0 → devsper-2.7.2}/tests/test_scheduler.py +0 -0
  668. {devsper-2.7.0 → devsper-2.7.2}/tests/test_speculation.py +0 -0
  669. {devsper-2.7.0 → devsper-2.7.2}/tests/test_strategies.py +0 -0
  670. {devsper-2.7.0 → devsper-2.7.2}/tests/test_swarm.py +0 -0
  671. {devsper-2.7.0 → devsper-2.7.2}/tests/test_task_cache.py +0 -0
  672. {devsper-2.7.0 → devsper-2.7.2}/tests/test_tool_scoring.py +0 -0
  673. {devsper-2.7.0 → devsper-2.7.2}/tests/test_tool_selector.py +0 -0
  674. {devsper-2.7.0 → devsper-2.7.2}/tests/test_upgrade.py +0 -0
  675. {devsper-2.7.0 → devsper-2.7.2}/tests/test_v110.py +0 -0
  676. {devsper-2.7.0 → devsper-2.7.2}/tests/test_v16.py +0 -0
  677. {devsper-2.7.0 → devsper-2.7.2}/tests/test_v17.py +0 -0
  678. {devsper-2.7.0 → devsper-2.7.2}/tests/test_v18.py +0 -0
  679. {devsper-2.7.0 → devsper-2.7.2}/tests/test_v19.py +0 -0
  680. {devsper-2.7.0 → devsper-2.7.2}/tests/test_workflow.py +0 -0
  681. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/__init__.py +0 -0
  682. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_code_intelligence_tools.py +0 -0
  683. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_coding_tools.py +0 -0
  684. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_core_tool_registry.py +0 -0
  685. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_data_science_tools.py +0 -0
  686. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_data_tools.py +0 -0
  687. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_document_tools.py +0 -0
  688. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_experiments_tools.py +0 -0
  689. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_filesystem_tools.py +0 -0
  690. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_flagship_tools.py +0 -0
  691. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_knowledge_tools.py +0 -0
  692. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_math_tools.py +0 -0
  693. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_memory_tools.py +0 -0
  694. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_pipelines.py +0 -0
  695. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_registry.py +0 -0
  696. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_research_advanced_tools.py +0 -0
  697. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_research_tools.py +0 -0
  698. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_system_tools.py +0 -0
  699. {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_tool_runner.py +0 -0
  700. {devsper-2.7.0 → devsper-2.7.2}/worker/.dockerignore +0 -0
  701. {devsper-2.7.0 → devsper-2.7.2}/worker/Cargo.lock +0 -0
  702. {devsper-2.7.0 → devsper-2.7.2}/worker/Cargo.toml +0 -0
  703. {devsper-2.7.0 → devsper-2.7.2}/worker/Dockerfile +0 -0
  704. {devsper-2.7.0 → devsper-2.7.2}/worker/README.md +0 -0
  705. {devsper-2.7.0 → devsper-2.7.2}/worker/src/budget.rs +0 -0
  706. {devsper-2.7.0 → devsper-2.7.2}/worker/src/bus.rs +0 -0
  707. {devsper-2.7.0 → devsper-2.7.2}/worker/src/claim.rs +0 -0
  708. {devsper-2.7.0 → devsper-2.7.2}/worker/src/clarification.rs +0 -0
  709. {devsper-2.7.0 → devsper-2.7.2}/worker/src/config.rs +0 -0
  710. {devsper-2.7.0 → devsper-2.7.2}/worker/src/controller.rs +0 -0
  711. {devsper-2.7.0 → devsper-2.7.2}/worker/src/election.rs +0 -0
  712. {devsper-2.7.0 → devsper-2.7.2}/worker/src/error.rs +0 -0
  713. {devsper-2.7.0 → devsper-2.7.2}/worker/src/executor.rs +0 -0
  714. {devsper-2.7.0 → devsper-2.7.2}/worker/src/health.rs +0 -0
  715. {devsper-2.7.0 → devsper-2.7.2}/worker/src/heartbeat.rs +0 -0
  716. {devsper-2.7.0 → devsper-2.7.2}/worker/src/lib.rs +0 -0
  717. {devsper-2.7.0 → devsper-2.7.2}/worker/src/main.rs +0 -0
  718. {devsper-2.7.0 → devsper-2.7.2}/worker/src/metrics.rs +0 -0
  719. {devsper-2.7.0 → devsper-2.7.2}/worker/src/reconnect.rs +0 -0
  720. {devsper-2.7.0 → devsper-2.7.2}/worker/src/registry.rs +0 -0
  721. {devsper-2.7.0 → devsper-2.7.2}/worker/src/router.rs +0 -0
  722. {devsper-2.7.0 → devsper-2.7.2}/worker/src/rpc.rs +0 -0
  723. {devsper-2.7.0 → devsper-2.7.2}/worker/src/scheduler.rs +0 -0
  724. {devsper-2.7.0 → devsper-2.7.2}/worker/src/snapshot.rs +0 -0
  725. {devsper-2.7.0 → devsper-2.7.2}/worker/src/telemetry.rs +0 -0
  726. {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/agent.rs +0 -0
  727. {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/event.rs +0 -0
  728. {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/mod.rs +0 -0
  729. {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/node.rs +0 -0
  730. {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/task.rs +0 -0
  731. {devsper-2.7.0 → devsper-2.7.2}/worker/src/worker_node.rs +0 -0
  732. {devsper-2.7.0 → devsper-2.7.2}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.7.2] — 2026-04-07
11
+
12
+ ### Changed
13
+
14
+ - **Prompt optimizer default** — Auto-detect replaces hard-coded `noop` default. Factory resolves to `dspy` if `dspy-ai` is importable, else `gepa` (built-in evolutionary loop, no extra install required). Set `provider = "noop"` explicitly to disable.
15
+ - **`PromptOptimizerConfig.provider`** — Default changed from `"noop"` to `""` (auto-detect).
16
+
17
+ ## [2.7.1] — 2026-04-07
18
+
19
+ ### Added
20
+
21
+ - **Eval harness** — New `devsper/evals/` module: `EvalCase`, `EvalDataset` (JSONL-backed), `EvalRunner` (async, bounded concurrency), `EvalSummary`, and `MetricFn` protocol. Built-in metrics: `exact_match`, `contains`, `regex_match`, `word_overlap`, `non_empty`, `llm_judge(model=)`.
22
+ - **Prompt optimizer abstraction** — `PromptOptimizerBackend` ABC mirroring the `MemoryBackend` / `LLMBackend` hot-swap pattern. Active backend resolved from `DEVSPER_PROMPT_OPTIMIZER` env var → `[prompt_optimizer] provider` config → default `"noop"`.
23
+ - **DSPy backend** (`devsper[dspy]`) — `DSPyBackend` compiles few-shot examples into an optimized system prompt using `BootstrapFewShot`, `MIPROv2`, or `BootstrapFewShotWithRandomSearch`. Configured via `[prompt_optimizer] dspy_optimizer`, `max_demos`, `num_candidates`.
24
+ - **GEPA backend** (`devsper[gepa]`) — `GEPABackend` runs an evolutionary prompt optimization loop. Uses the `gepa` library when installed; falls back to a built-in LLM-driven mutation loop so it works without any extra dependencies.
25
+ - **OpenEvals metric adapter** (`devsper[openevals]`) — `openevals_metric(name)` wraps any OpenEvals LLM-as-judge evaluator as a `MetricFn`. Prebuilt names: `correctness`, `conciseness`, `groundedness`, `relevance`. Accessible via `get_metric("openevals:correctness")`. Falls back to built-in `llm_judge` when the package is absent.
26
+ - **`devsper eval` CLI** — Three subcommands: `eval stub` (generate JSONL stub datasets per role), `eval run` (score a dataset, optional `--optimize` flag, `--optimizer dspy|gepa`), `eval results` (list persisted result files).
27
+ - **Config sections** — `[prompt_optimizer]` and `[evals]` added to `devsperConfigModel`.
28
+ - **Optimized prompt persistence** — `EvalRunner` saves results to `.devsper/optimized_prompts/{role}.json`. `get_role_config()` auto-loads these on the next run.
29
+ - **`devsper[evals]`, `devsper[dspy]`, `devsper[gepa]`, `devsper[openevals]` extras.**
30
+ - **pytest `live` marker** — Gates tests that require real API keys.
31
+
32
+ ### Changed
33
+
34
+ - **`get_metric(name)`** extended: now accepts `"openevals:<evaluator>"` in addition to built-in names.
35
+ - **`get_role_config()`** — Checks `.devsper/optimized_prompts/{role}.json` and uses the optimized prefix if present.
36
+
10
37
  ## [2.7.0] — 2026-04-07
11
38
 
12
39
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
5
5
  Project-URL: Homepage, https://github.com/devsper-com/runtime
6
6
  Project-URL: Documentation, https://docs.devsper.com
@@ -57,9 +57,14 @@ Requires-Dist: mkdocs<2,>=1.6.0; extra == 'docs'
57
57
  Provides-Extra: document
58
58
  Requires-Dist: docproc>=2.0.0; extra == 'document'
59
59
  Requires-Dist: python-docx>=1.0.0; extra == 'document'
60
+ Provides-Extra: dspy
61
+ Requires-Dist: dspy-ai>=2.4; extra == 'dspy'
60
62
  Provides-Extra: embeddings
61
63
  Requires-Dist: sentence-transformers>=3.0.0; extra == 'embeddings'
64
+ Provides-Extra: evals
62
65
  Provides-Extra: explainability
66
+ Provides-Extra: gepa
67
+ Requires-Dist: gepa>=0.1; extra == 'gepa'
63
68
  Provides-Extra: hitl
64
69
  Requires-Dist: httpx>=0.27; extra == 'hitl'
65
70
  Provides-Extra: langgraph
@@ -68,6 +73,8 @@ Provides-Extra: mcp
68
73
  Requires-Dist: anyio>=4.0; extra == 'mcp'
69
74
  Requires-Dist: httpx>=0.27; extra == 'mcp'
70
75
  Provides-Extra: ollama
76
+ Provides-Extra: openevals
77
+ Requires-Dist: openevals>=0.0.6; extra == 'openevals'
71
78
  Provides-Extra: redis-memory
72
79
  Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
73
80
  Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
@@ -105,10 +105,34 @@ ROLE_CONFIGS: dict[str, RoleConfig] = {
105
105
 
106
106
 
107
107
  def get_role_config(role: str | None) -> RoleConfig:
108
- """Return config for the given role, or default if unknown/None."""
109
- if role and role in ROLE_CONFIGS:
110
- return ROLE_CONFIGS[role]
111
- return ROLE_CONFIGS[DEFAULT_ROLE]
108
+ """Return config for the given role, or default if unknown/None.
109
+
110
+ If an optimized prompt exists at .devsper/optimized_prompts/{role}.json
111
+ (written by EvalRunner after prompt optimization), it is used in place of
112
+ the hardcoded prompt_prefix.
113
+ """
114
+ base = ROLE_CONFIGS.get(role or DEFAULT_ROLE, ROLE_CONFIGS[DEFAULT_ROLE]) if role else ROLE_CONFIGS[DEFAULT_ROLE]
115
+ optimized = _load_optimized_prompt(base.name)
116
+ if optimized:
117
+ from dataclasses import replace
118
+ return replace(base, prompt_prefix=optimized)
119
+ return base
120
+
121
+
122
+ def _load_optimized_prompt(role: str) -> str | None:
123
+ """Load persisted optimized prompt for a role, if it exists."""
124
+ import json
125
+ from pathlib import Path
126
+
127
+ p = Path(".devsper/optimized_prompts") / f"{role}.json"
128
+ if not p.exists():
129
+ return None
130
+ try:
131
+ data = json.loads(p.read_text())
132
+ prompt = data.get("prompt_prefix", "")
133
+ return prompt if prompt else None
134
+ except Exception:
135
+ return None
112
136
 
113
137
 
114
138
  # Keywords to infer role from task description
@@ -145,7 +145,7 @@ def _run_platform_once(task: str, args: object) -> tuple[int, dict, float]:
145
145
  api = _platform_api_builder()
146
146
  if not api.enabled():
147
147
  print(
148
- "Platform routing is not configured. Run `devsper platform connect` first.",
148
+ "Cloud routing is not configured. Run `devsper platform connect` first.",
149
149
  file=sys.stderr,
150
150
  )
151
151
  return 2, {}, 0.0
@@ -2721,6 +2721,164 @@ def _run_version(args: object) -> int:
2721
2721
  return 0
2722
2722
 
2723
2723
 
2724
+ def _run_eval(args: object) -> int:
2725
+ """Eval harness: run dataset, score results, optionally optimize prompts."""
2726
+ import asyncio
2727
+ import json
2728
+ from pathlib import Path
2729
+
2730
+ eval_cmd = getattr(args, "eval_cmd", None)
2731
+
2732
+ if eval_cmd == "stub" or eval_cmd is None and not hasattr(args, "dataset"):
2733
+ # Generate stub dataset
2734
+ from devsper.evals.dataset import EvalDataset
2735
+
2736
+ role = getattr(args, "role", "general")
2737
+ n = getattr(args, "n", 5)
2738
+ out = getattr(args, "out", None)
2739
+ dataset = EvalDataset.stub(role=role, n=n)
2740
+ if out:
2741
+ dataset.save(out)
2742
+ print(f"Stub dataset ({len(dataset)} cases) written to {out}")
2743
+ else:
2744
+ for case in dataset:
2745
+ print(json.dumps(case.to_dict()))
2746
+ return 0
2747
+
2748
+ if eval_cmd == "results":
2749
+ from devsper.config import get_config
2750
+
2751
+ try:
2752
+ results_dir = Path(getattr(args, "dir", None) or get_config().evals.results_dir)
2753
+ except Exception:
2754
+ results_dir = Path(".devsper/eval_results")
2755
+ if not results_dir.exists():
2756
+ print(f"No results found in {results_dir}")
2757
+ return 0
2758
+ files = sorted(results_dir.glob("*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
2759
+ if not files:
2760
+ print("No eval result files found.")
2761
+ return 0
2762
+ for f in files[:20]:
2763
+ try:
2764
+ data = json.loads(f.read_text())
2765
+ print(
2766
+ f" {f.name} role={data.get('role', '?')} "
2767
+ f"pass_rate={data.get('pass_rate', '?')} "
2768
+ f"mean_score={data.get('mean_score', '?')}"
2769
+ )
2770
+ except Exception:
2771
+ print(f" {f.name}")
2772
+ return 0
2773
+
2774
+ # eval_cmd == "run"
2775
+ from devsper.evals.dataset import EvalDataset
2776
+ from devsper.evals.metrics import get_metric
2777
+ from devsper.evals.runner import EvalRunner
2778
+ from devsper.config import get_config
2779
+
2780
+ try:
2781
+ cfg = get_config()
2782
+ except Exception:
2783
+ from devsper.config.schema import devsperConfigModel
2784
+ cfg = devsperConfigModel()
2785
+
2786
+ dataset_path = getattr(args, "dataset", None)
2787
+ if not dataset_path:
2788
+ print("Error: --dataset is required for 'eval run'")
2789
+ return 1
2790
+
2791
+ dataset = EvalDataset.load(dataset_path)
2792
+ role = getattr(args, "role", None)
2793
+ metric_name = getattr(args, "metric", None) or cfg.evals.default_metric
2794
+ threshold = getattr(args, "threshold", None) or cfg.evals.pass_threshold
2795
+ concurrency = getattr(args, "concurrency", None) or cfg.evals.concurrency
2796
+ do_optimize = getattr(args, "optimize", False)
2797
+ optimizer_override = getattr(args, "optimizer", None)
2798
+ out_path = getattr(args, "out", None)
2799
+
2800
+ metric = get_metric(metric_name)
2801
+
2802
+ # Build optimizer if requested
2803
+ optimizer = None
2804
+ if do_optimize:
2805
+ from devsper.prompt_optimizer.factory import get_prompt_optimizer, reset_prompt_optimizer
2806
+
2807
+ if optimizer_override:
2808
+ import os
2809
+ os.environ["DEVSPER_PROMPT_OPTIMIZER"] = optimizer_override
2810
+ reset_prompt_optimizer()
2811
+ optimizer = get_prompt_optimizer(cfg)
2812
+
2813
+ # Build a minimal agent for evaluation
2814
+ from devsper.agents.agent import Agent
2815
+
2816
+ agent = Agent(model_name=cfg.models.worker, use_tools=False)
2817
+
2818
+ runner = EvalRunner(
2819
+ agent=agent,
2820
+ metric=metric,
2821
+ pass_threshold=threshold,
2822
+ concurrency=concurrency,
2823
+ optimize_after=do_optimize,
2824
+ optimizer=optimizer,
2825
+ )
2826
+
2827
+ try:
2828
+ summary = asyncio.run(runner.run_async(dataset, role=role))
2829
+ except RuntimeError:
2830
+ loop = asyncio.new_event_loop()
2831
+ summary = loop.run_until_complete(runner.run_async(dataset, role=role))
2832
+
2833
+ # Print summary
2834
+ try:
2835
+ from rich.console import Console
2836
+ from rich.table import Table
2837
+
2838
+ console = Console()
2839
+ console.print(
2840
+ f"\n[bold]Eval Results[/bold] role=[cyan]{summary.role}[/cyan] "
2841
+ f"metric=[cyan]{summary.metric_name}[/cyan] "
2842
+ f"optimizer=[cyan]{summary.optimizer_backend}[/cyan]"
2843
+ )
2844
+ console.print(
2845
+ f" Passed: [green]{summary.passed}[/green]/{summary.total} "
2846
+ f"Pass rate: [bold]{summary.pass_rate:.1%}[/bold] "
2847
+ f"Mean score: [bold]{summary.mean_score:.3f}[/bold]\n"
2848
+ )
2849
+ table = Table(show_header=True, header_style="bold")
2850
+ table.add_column("ID", style="dim")
2851
+ table.add_column("Task", max_width=40)
2852
+ table.add_column("Score")
2853
+ table.add_column("Pass")
2854
+ for r in summary.results:
2855
+ color = "green" if r.passed else "red"
2856
+ table.add_row(
2857
+ r.case.id,
2858
+ r.case.task[:40],
2859
+ f"{r.score:.2f}",
2860
+ f"[{color}]{'✓' if r.passed else '✗'}[/{color}]",
2861
+ )
2862
+ console.print(table)
2863
+ except ImportError:
2864
+ print(f"\nEval: role={summary.role} metric={summary.metric_name}")
2865
+ print(f" {summary.passed}/{summary.total} passed ({summary.pass_rate:.1%})")
2866
+ print(f" Mean score: {summary.mean_score:.3f}")
2867
+
2868
+ # Persist results
2869
+ results_dir = Path(cfg.evals.results_dir)
2870
+ results_dir.mkdir(parents=True, exist_ok=True)
2871
+ ts = __import__("datetime").datetime.now().strftime("%Y%m%d_%H%M%S")
2872
+ result_file = results_dir / f"eval_{summary.role}_{ts}.json"
2873
+ result_file.write_text(summary.to_json())
2874
+ print(f"\nResults saved to {result_file}")
2875
+
2876
+ if out_path:
2877
+ Path(out_path).write_text(summary.to_json())
2878
+
2879
+ return 0 if summary.pass_rate >= threshold else 1
2880
+
2881
+
2724
2882
  def _run_health(args: object) -> int:
2725
2883
  """Run health checks. Exit 0 if healthy, 1 otherwise. Print ✓/✗ per check."""
2726
2884
  import asyncio
@@ -2811,7 +2969,7 @@ def _run_upgrade(args: object) -> int:
2811
2969
 
2812
2970
 
2813
2971
  def _run_cloud_dispatch(args: object) -> int:
2814
- """Devsper Platform (cloud): login, run, status, logs."""
2972
+ """Devsper Cloud: login, run, status, logs."""
2815
2973
  cmd = getattr(args, "cloud_cmd", None)
2816
2974
  if not cmd:
2817
2975
  return 0
@@ -4082,6 +4240,64 @@ Examples:
4082
4240
  )
4083
4241
  observe_parser.set_defaults(func=lambda a: _run_observe(a.port, a.db))
4084
4242
 
4243
+ eval_parser = subparsers.add_parser(
4244
+ "eval",
4245
+ help="Eval harness and prompt optimization",
4246
+ description="Run evals against a JSONL dataset and optionally optimize prompts.",
4247
+ epilog="""
4248
+ Examples:
4249
+ devsper eval run --dataset evals.jsonl --metric contains
4250
+ devsper eval run --dataset evals.jsonl --role research --optimize --optimizer dspy
4251
+ devsper eval stub --role research --out evals.jsonl
4252
+ devsper eval results
4253
+ """,
4254
+ formatter_class=argparse.RawDescriptionHelpFormatter,
4255
+ )
4256
+ eval_sub = eval_parser.add_subparsers(dest="eval_cmd", help="Subcommand")
4257
+
4258
+ eval_run_p = eval_sub.add_parser("run", help="Run eval dataset")
4259
+ eval_run_p.add_argument("--dataset", required=True, help="Path to JSONL dataset")
4260
+ eval_run_p.add_argument("--role", default=None, help="Filter to this agent role")
4261
+ eval_run_p.add_argument(
4262
+ "--metric",
4263
+ default=None,
4264
+ help="Metric name: exact_match | contains | regex_match | word_overlap | llm_judge (default: config)",
4265
+ )
4266
+ eval_run_p.add_argument(
4267
+ "--threshold", type=float, default=None, help="Pass threshold (default: config)"
4268
+ )
4269
+ eval_run_p.add_argument(
4270
+ "--optimize",
4271
+ action="store_true",
4272
+ help="Run prompt optimization after eval using the configured optimizer",
4273
+ )
4274
+ eval_run_p.add_argument(
4275
+ "--optimizer",
4276
+ default=None,
4277
+ help="Override optimizer backend: noop | dspy | gepa",
4278
+ )
4279
+ eval_run_p.add_argument(
4280
+ "--concurrency", type=int, default=None, help="Parallel eval cases"
4281
+ )
4282
+ eval_run_p.add_argument("--out", default=None, help="Save JSON results to this path")
4283
+ eval_run_p.set_defaults(eval_cmd="run")
4284
+
4285
+ eval_stub_p = eval_sub.add_parser("stub", help="Generate a stub dataset")
4286
+ eval_stub_p.add_argument(
4287
+ "--role", default="general", help="Agent role (research/code/analysis/general)"
4288
+ )
4289
+ eval_stub_p.add_argument("-n", type=int, default=5, help="Number of examples")
4290
+ eval_stub_p.add_argument(
4291
+ "--out", default=None, help="Output JSONL path (default: prints to stdout)"
4292
+ )
4293
+ eval_stub_p.set_defaults(eval_cmd="stub")
4294
+
4295
+ eval_results_p = eval_sub.add_parser("results", help="List recent eval result files")
4296
+ eval_results_p.add_argument("--dir", default=None, help="Results directory")
4297
+ eval_results_p.set_defaults(eval_cmd="results")
4298
+
4299
+ eval_parser.set_defaults(func=_run_eval)
4300
+
4085
4301
  health_parser = subparsers.add_parser(
4086
4302
  "health",
4087
4303
  help="Health and readiness check",
@@ -309,6 +309,32 @@ class HitlConfig(BaseModel):
309
309
  policies: list[HitlPolicyConfig] = Field(default_factory=list)
310
310
 
311
311
 
312
+ class PromptOptimizerConfig(BaseModel):
313
+ """v2.7: Prompt optimization backend config.
314
+
315
+ provider: "noop" | "dspy" | "gepa" (override with DEVSPER_PROMPT_OPTIMIZER env var)
316
+ """
317
+
318
+ provider: str = "" # "" = auto (dspy if installed, else gepa). "noop" disables.
319
+ # DSPy-specific
320
+ dspy_optimizer: str = "bootstrap" # "bootstrap" | "mipro" | "bootstrap_random"
321
+ max_demos: int = 4
322
+ num_candidates: int = 10 # MIPROv2 only
323
+ # GEPA-specific
324
+ population_size: int = 5
325
+ n_iterations: int = 10
326
+
327
+
328
+ class EvalConfig(BaseModel):
329
+ """v2.7: Eval harness config."""
330
+
331
+ dataset_dir: str = ".devsper/evals" # default location for JSONL datasets
332
+ results_dir: str = ".devsper/eval_results"
333
+ pass_threshold: float = 0.5
334
+ concurrency: int = 4
335
+ default_metric: str = "contains" # metric name from devsper.evals.metrics
336
+
337
+
312
338
  class devsperConfigModel(BaseModel):
313
339
  """Full resolved configuration with Pydantic validation."""
314
340
 
@@ -333,6 +359,8 @@ class devsperConfigModel(BaseModel):
333
359
  sandbox: SandboxConfig = Field(default_factory=SandboxConfig)
334
360
  compliance: ComplianceConfig = Field(default_factory=ComplianceConfig)
335
361
  hitl: HitlConfig = Field(default_factory=HitlConfig)
362
+ prompt_optimizer: PromptOptimizerConfig = Field(default_factory=PromptOptimizerConfig)
363
+ evals: EvalConfig = Field(default_factory=EvalConfig)
336
364
 
337
365
  # Backward-compat aliases (property-style access from old devsperConfig)
338
366
  @property
@@ -0,0 +1,19 @@
1
+ """
2
+ devsper evals — eval harness and prompt optimization integration.
3
+ """
4
+
5
+ from devsper.evals.types import EvalCase, EvalResult, EvalSummary, MetricFn
6
+ from devsper.evals.dataset import EvalDataset
7
+ from devsper.evals.metrics import get_metric, BUILTIN_METRICS
8
+ from devsper.evals.runner import EvalRunner
9
+
10
+ __all__ = [
11
+ "EvalCase",
12
+ "EvalResult",
13
+ "EvalSummary",
14
+ "EvalDataset",
15
+ "EvalRunner",
16
+ "MetricFn",
17
+ "get_metric",
18
+ "BUILTIN_METRICS",
19
+ ]
@@ -0,0 +1,107 @@
1
+ """
2
+ JSONL-backed eval dataset: load, save, and generate stub datasets.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import json
8
+ import uuid
9
+ from pathlib import Path
10
+
11
+ from devsper.evals.types import EvalCase
12
+
13
+
14
+ class EvalDataset:
15
+ """Ordered collection of EvalCases backed by a JSONL file."""
16
+
17
+ def __init__(self, cases: list[EvalCase] | None = None, name: str = "dataset"):
18
+ self.cases: list[EvalCase] = cases or []
19
+ self.name = name
20
+
21
+ def __len__(self) -> int:
22
+ return len(self.cases)
23
+
24
+ def __iter__(self):
25
+ return iter(self.cases)
26
+
27
+ def add(self, case: EvalCase) -> None:
28
+ self.cases.append(case)
29
+
30
+ def filter_by_role(self, role: str) -> "EvalDataset":
31
+ return EvalDataset(
32
+ [c for c in self.cases if c.role == role],
33
+ name=f"{self.name}[{role}]",
34
+ )
35
+
36
+ @classmethod
37
+ def load(cls, path: str | Path) -> "EvalDataset":
38
+ """Load from a JSONL file. Each line is a JSON object (EvalCase dict)."""
39
+ p = Path(path)
40
+ if not p.exists():
41
+ raise FileNotFoundError(f"Dataset not found: {path}")
42
+ cases = []
43
+ with p.open() as f:
44
+ for i, line in enumerate(f):
45
+ line = line.strip()
46
+ if not line or line.startswith("#"):
47
+ continue
48
+ try:
49
+ d = json.loads(line)
50
+ if "id" not in d:
51
+ d["id"] = str(uuid.uuid4())[:8]
52
+ cases.append(EvalCase.from_dict(d))
53
+ except json.JSONDecodeError as e:
54
+ raise ValueError(f"Bad JSON on line {i + 1} of {path}: {e}") from e
55
+ return cls(cases, name=p.stem)
56
+
57
+ def save(self, path: str | Path) -> None:
58
+ """Write to a JSONL file (overwrites)."""
59
+ p = Path(path)
60
+ p.parent.mkdir(parents=True, exist_ok=True)
61
+ with p.open("w") as f:
62
+ for case in self.cases:
63
+ f.write(json.dumps(case.to_dict()) + "\n")
64
+
65
+ @classmethod
66
+ def from_dicts(cls, records: list[dict], name: str = "dataset") -> "EvalDataset":
67
+ cases = []
68
+ for i, d in enumerate(records):
69
+ if "id" not in d:
70
+ d["id"] = str(i)
71
+ cases.append(EvalCase.from_dict(d))
72
+ return cls(cases, name=name)
73
+
74
+ @classmethod
75
+ def stub(cls, role: str = "general", n: int = 5) -> "EvalDataset":
76
+ """Generate a minimal stub dataset for smoke-testing."""
77
+ stubs = {
78
+ "research": [
79
+ ("What is transformer architecture?", "attention mechanism"),
80
+ ("Summarize BERT vs GPT", "bidirectional"),
81
+ ("What year was AlexNet published?", "2012"),
82
+ ("Who invented backpropagation?", "Rumelhart"),
83
+ ("What is RLHF?", "reinforcement learning from human feedback"),
84
+ ],
85
+ "code": [
86
+ ("Write a Python function to reverse a string", "def"),
87
+ ("What is a decorator in Python?", "wraps"),
88
+ ("Implement binary search", "mid"),
89
+ ("What does __init__ do?", "constructor"),
90
+ ("How do you open a file in Python?", "open("),
91
+ ],
92
+ "analysis": [
93
+ ("What is mean absolute error?", "absolute"),
94
+ ("Explain p-value", "null hypothesis"),
95
+ ("What is overfitting?", "training data"),
96
+ ("Define precision and recall", "true positive"),
97
+ ("What is cross-validation?", "fold"),
98
+ ],
99
+ }
100
+ pairs = stubs.get(role, [
101
+ (f"Task {i}", f"expected {i}") for i in range(n)
102
+ ])[:n]
103
+ cases = [
104
+ EvalCase(id=str(i), task=t, expected=e, role=role)
105
+ for i, (t, e) in enumerate(pairs)
106
+ ]
107
+ return cls(cases, name=f"stub_{role}")