devsper 2.6.0__tar.gz → 2.7.1__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 (733) hide show
  1. {devsper-2.6.0 → devsper-2.7.1}/CHANGELOG.md +47 -1
  2. {devsper-2.6.0 → devsper-2.7.1}/PKG-INFO +13 -1
  3. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/roles.py +28 -4
  4. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/init.py +25 -0
  5. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/main.py +218 -2
  6. {devsper-2.6.0 → devsper-2.7.1}/devsper/config/schema.py +61 -0
  7. {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/cli.py +11 -1
  8. {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/store.py +11 -0
  9. devsper-2.7.1/devsper/evals/__init__.py +19 -0
  10. devsper-2.7.1/devsper/evals/dataset.py +107 -0
  11. devsper-2.7.1/devsper/evals/metrics.py +192 -0
  12. devsper-2.7.1/devsper/evals/runner.py +179 -0
  13. devsper-2.7.1/devsper/evals/types.py +114 -0
  14. devsper-2.7.1/devsper/memory/context.py +134 -0
  15. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_index.py +73 -2
  16. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_router.py +35 -13
  17. devsper-2.7.1/devsper/memory/providers/__init__.py +5 -0
  18. devsper-2.7.1/devsper/memory/providers/backends/__init__.py +1 -0
  19. devsper-2.7.1/devsper/memory/providers/backends/platform_backend.py +74 -0
  20. devsper-2.7.1/devsper/memory/providers/backends/redis_backend.py +90 -0
  21. devsper-2.7.1/devsper/memory/providers/backends/snowflake_backend.py +449 -0
  22. devsper-2.7.1/devsper/memory/providers/backends/sqlite_backend.py +83 -0
  23. devsper-2.7.1/devsper/memory/providers/backends/vektori_backend.py +140 -0
  24. devsper-2.7.1/devsper/memory/providers/base.py +125 -0
  25. devsper-2.7.1/devsper/memory/providers/factory.py +162 -0
  26. devsper-2.7.1/devsper/prompt_optimizer/__init__.py +16 -0
  27. devsper-2.7.1/devsper/prompt_optimizer/backends/__init__.py +1 -0
  28. devsper-2.7.1/devsper/prompt_optimizer/backends/dspy_backend.py +205 -0
  29. devsper-2.7.1/devsper/prompt_optimizer/backends/gepa_backend.py +203 -0
  30. devsper-2.7.1/devsper/prompt_optimizer/backends/noop.py +25 -0
  31. devsper-2.7.1/devsper/prompt_optimizer/base.py +56 -0
  32. devsper-2.7.1/devsper/prompt_optimizer/factory.py +89 -0
  33. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/registry.py +7 -0
  34. {devsper-2.6.0 → devsper-2.7.1}/pyproject.toml +14 -1
  35. devsper-2.7.1/tests/integration/test_evals_e2e.py +508 -0
  36. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_e2e_redis_loop.py +4 -1
  37. devsper-2.7.1/tests/test_evals.py +289 -0
  38. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_pipelines.py +4 -7
  39. {devsper-2.6.0 → devsper-2.7.1}/uv.lock +481 -2
  40. devsper-2.6.0/devsper/memory/context.py +0 -53
  41. {devsper-2.6.0 → devsper-2.7.1}/.env.example +0 -0
  42. {devsper-2.6.0 → devsper-2.7.1}/.github/FUNDING.yml +0 -0
  43. {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/pypi-publish.yml +0 -0
  44. {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/release-on-tag.yml +0 -0
  45. {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/worker-release.yml +0 -0
  46. {devsper-2.6.0 → devsper-2.7.1}/.gitignore +0 -0
  47. {devsper-2.6.0 → devsper-2.7.1}/.python-version +0 -0
  48. {devsper-2.6.0 → devsper-2.7.1}/CODE_OF_CONDUCT.md +0 -0
  49. {devsper-2.6.0 → devsper-2.7.1}/CONTRIBUTING.md +0 -0
  50. {devsper-2.6.0 → devsper-2.7.1}/Cargo.lock +0 -0
  51. {devsper-2.6.0 → devsper-2.7.1}/Cargo.toml +0 -0
  52. {devsper-2.6.0 → devsper-2.7.1}/Dockerfile.local-pool +0 -0
  53. {devsper-2.6.0 → devsper-2.7.1}/LICENSE +0 -0
  54. {devsper-2.6.0 → devsper-2.7.1}/README.md +0 -0
  55. {devsper-2.6.0 → devsper-2.7.1}/SECURITY.md +0 -0
  56. {devsper-2.6.0 → devsper-2.7.1}/benchmarks/__init__.py +0 -0
  57. {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_dataset_analysis.py +0 -0
  58. {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_repository_analysis.py +0 -0
  59. {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_research_pipeline.py +0 -0
  60. {devsper-2.6.0 → devsper-2.7.1}/branding/logo.svg +0 -0
  61. {devsper-2.6.0 → devsper-2.7.1}/devsper/README.md +0 -0
  62. {devsper-2.6.0 → devsper-2.7.1}/devsper/__init__.py +0 -0
  63. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/__init__.py +0 -0
  64. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/client.py +0 -0
  65. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/discovery.py +0 -0
  66. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/server.py +0 -0
  67. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/tool_adapter.py +0 -0
  68. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/types.py +0 -0
  69. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/agent.py +0 -0
  70. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/critic.py +0 -0
  71. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/identity.py +0 -0
  72. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/message_bus.py +0 -0
  73. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/registry.py +0 -0
  74. {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/run_agent.py +0 -0
  75. {devsper-2.6.0 → devsper-2.7.1}/devsper/analytics/__init__.py +0 -0
  76. {devsper-2.6.0 → devsper-2.7.1}/devsper/analytics/tool_analytics.py +0 -0
  77. {devsper-2.6.0 → devsper-2.7.1}/devsper/audit/__init__.py +0 -0
  78. {devsper-2.6.0 → devsper-2.7.1}/devsper/audit/logger.py +0 -0
  79. {devsper-2.6.0 → devsper-2.7.1}/devsper/budget.py +0 -0
  80. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/__init__.py +0 -0
  81. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/__init__.py +0 -0
  82. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/base.py +0 -0
  83. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/memory.py +0 -0
  84. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/redis.py +0 -0
  85. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/message.py +0 -0
  86. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/schema_version.py +0 -0
  87. {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/topics.py +0 -0
  88. {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/__init__.py +0 -0
  89. {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/embedding_index.py +0 -0
  90. {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/hashing.py +0 -0
  91. {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/store.py +0 -0
  92. {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/task_cache.py +0 -0
  93. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/__init__.py +0 -0
  94. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/commands/cloud.py +0 -0
  95. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/export.py +0 -0
  96. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/github_oauth.py +0 -0
  97. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/run_progress.py +0 -0
  98. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/__init__.py +0 -0
  99. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/components.py +0 -0
  100. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/controller_run_view.py +0 -0
  101. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/errors.py +0 -0
  102. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/logging.py +0 -0
  103. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/onboarding.py +0 -0
  104. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/progress.py +0 -0
  105. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/run_view.py +0 -0
  106. {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/theme.py +0 -0
  107. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/__init__.py +0 -0
  108. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/election.py +0 -0
  109. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/local.py +0 -0
  110. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/node_info.py +0 -0
  111. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/registry.py +0 -0
  112. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/router.py +0 -0
  113. {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/state_backend.py +0 -0
  114. {devsper-2.6.0 → devsper-2.7.1}/devsper/compliance/__init__.py +0 -0
  115. {devsper-2.6.0 → devsper-2.7.1}/devsper/compliance/pii.py +0 -0
  116. {devsper-2.6.0 → devsper-2.7.1}/devsper/config/__init__.py +0 -0
  117. {devsper-2.6.0 → devsper-2.7.1}/devsper/config/config_loader.py +0 -0
  118. {devsper-2.6.0 → devsper-2.7.1}/devsper/config/defaults.py +0 -0
  119. {devsper-2.6.0 → devsper-2.7.1}/devsper/config/resolver.py +0 -0
  120. {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/__init__.py +0 -0
  121. {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/base.py +0 -0
  122. {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/registry.py +0 -0
  123. {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/sample_connector.py +0 -0
  124. {devsper-2.6.0 → devsper-2.7.1}/devsper/contracts/__init__.py +0 -0
  125. {devsper-2.6.0 → devsper-2.7.1}/devsper/contracts/platform_event_type.py +0 -0
  126. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/__init__.py +0 -0
  127. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/agent/__init__.py +0 -0
  128. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/agent/runner.py +0 -0
  129. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/hitl/__init__.py +0 -0
  130. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/hitl/state_machine.py +0 -0
  131. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/memory/__init__.py +0 -0
  132. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/memory/shared_memory.py +0 -0
  133. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/reporting/__init__.py +0 -0
  134. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/reporting/publisher.py +0 -0
  135. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/__init__.py +0 -0
  136. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/durability.py +0 -0
  137. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/orchestrator.py +0 -0
  138. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/__init__.py +0 -0
  139. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/base_tool.py +0 -0
  140. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/loader.py +0 -0
  141. {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/registry.py +0 -0
  142. {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/__init__.py +0 -0
  143. {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/migration.py +0 -0
  144. {devsper-2.6.0 → devsper-2.7.1}/devsper/dashboard/__init__.py +0 -0
  145. {devsper-2.6.0 → devsper-2.7.1}/devsper/dashboard/dashboard.py +0 -0
  146. {devsper-2.6.0 → devsper-2.7.1}/devsper/debug_events.py +0 -0
  147. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/__init__.py +0 -0
  148. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/builder.py +0 -0
  149. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/debugger.py +0 -0
  150. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/repo_index.py +0 -0
  151. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/sandbox.py +0 -0
  152. {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/scaffold.py +0 -0
  153. {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/__init__.py +0 -0
  154. {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/controller.py +0 -0
  155. {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/worker_runtime.py +0 -0
  156. {devsper-2.6.0 → devsper-2.7.1}/devsper/docs/architecture/execution-model.md +0 -0
  157. {devsper-2.6.0 → devsper-2.7.1}/devsper/embeddings/__init__.py +0 -0
  158. {devsper-2.6.0 → devsper-2.7.1}/devsper/embeddings/service.py +0 -0
  159. {devsper-2.6.0 → devsper-2.7.1}/devsper/events.py +0 -0
  160. {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/__init__.py +0 -0
  161. {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/decision_tree.py +0 -0
  162. {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/rationale.py +0 -0
  163. {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/simulation.py +0 -0
  164. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/__init__.py +0 -0
  165. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/branding.py +0 -0
  166. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/collector.py +0 -0
  167. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/manifest.py +0 -0
  168. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/model.py +0 -0
  169. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/packager.py +0 -0
  170. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/pdf.py +0 -0
  171. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/service.py +0 -0
  172. {devsper-2.6.0 → devsper-2.7.1}/devsper/export/writers.py +0 -0
  173. {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/__init__.py +0 -0
  174. {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/approval.py +0 -0
  175. {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/escalation.py +0 -0
  176. {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/__init__.py +0 -0
  177. {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/langchain_adapter.py +0 -0
  178. {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/langgraph_adapter.py +0 -0
  179. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/__init__.py +0 -0
  180. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/adaptation.py +0 -0
  181. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/__init__.py +0 -0
  182. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/analyzer.py +0 -0
  183. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  184. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/formatter.py +0 -0
  185. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/run_report.py +0 -0
  186. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/learning_engine.py +0 -0
  187. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/__init__.py +0 -0
  188. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/base.py +0 -0
  189. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  190. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  191. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  192. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  193. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/research_strategy.py +0 -0
  194. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategy_selector.py +0 -0
  195. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/synthesis.py +0 -0
  196. {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/task_optimizer.py +0 -0
  197. {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/__init__.py +0 -0
  198. {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/extractor.py +0 -0
  199. {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/knowledge_graph.py +0 -0
  200. {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/query.py +0 -0
  201. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/__init__.py +0 -0
  202. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/consolidation.py +0 -0
  203. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/embeddings.py +0 -0
  204. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_store.py +0 -0
  205. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_types.py +0 -0
  206. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/namespaces.py +0 -0
  207. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/platform_memory.py +0 -0
  208. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/redis_memory.py +0 -0
  209. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/scoring.py +0 -0
  210. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/store.py +0 -0
  211. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/summarizer.py +0 -0
  212. {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/supermemory_rust_ranker.py +0 -0
  213. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/__init__.py +0 -0
  214. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/base_agent.py +0 -0
  215. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/__init__.py +0 -0
  216. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/architect_agent.py +0 -0
  217. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/coder_agent.py +0 -0
  218. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/debugger_agent.py +0 -0
  219. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/docs_agent.py +0 -0
  220. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/tester_agent.py +0 -0
  221. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/iteration_loop.py +0 -0
  222. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_memory.py +0 -0
  223. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_planner.py +0 -0
  224. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_runner.py +0 -0
  225. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/models.py +0 -0
  226. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/__init__.py +0 -0
  227. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/editor_agent.py +0 -0
  228. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/researcher_agent.py +0 -0
  229. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/reviewer_agent.py +0 -0
  230. {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/writer_agent.py +0 -0
  231. {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/__init__.py +0 -0
  232. {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/controller.py +0 -0
  233. {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/rpc.py +0 -0
  234. {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/single.py +0 -0
  235. {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/worker.py +0 -0
  236. {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/__init__.py +0 -0
  237. {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/meta_planner.py +0 -0
  238. {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/priority_queue.py +0 -0
  239. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/__init__.py +0 -0
  240. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/redis_results_sink.py +0 -0
  241. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/reporter.py +0 -0
  242. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/request_builder.py +0 -0
  243. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/run_context.py +0 -0
  244. {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/runtime_events.py +0 -0
  245. {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/__init__.py +0 -0
  246. {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/marketplace/__init__.py +0 -0
  247. {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/plugin_loader.py +0 -0
  248. {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/plugin_registry.py +0 -0
  249. {devsper-2.6.0 → devsper-2.7.1}/devsper/policy/client.py +0 -0
  250. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/__init__.py +0 -0
  251. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/config.py +0 -0
  252. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/crypto.py +0 -0
  253. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/local_pool.py +0 -0
  254. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/manager.py +0 -0
  255. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/models.py +0 -0
  256. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/org_pool.py +0 -0
  257. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/dev.toml +0 -0
  258. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/local.toml +0 -0
  259. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/prod.toml +0 -0
  260. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/security.py +0 -0
  261. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/store.py +0 -0
  262. {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/worker_runner.py +0 -0
  263. {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/__init__.py +0 -0
  264. {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/client.py +0 -0
  265. {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/schema.py +0 -0
  266. {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/server.py +0 -0
  267. {devsper-2.6.0 → devsper-2.7.1}/devsper/protocols/__init__.py +0 -0
  268. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/__init__.py +0 -0
  269. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/anthropic.py +0 -0
  270. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/base.py +0 -0
  271. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/complexity_router.py +0 -0
  272. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/gemini.py +0 -0
  273. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/github.py +0 -0
  274. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/model_router.py +0 -0
  275. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/openai.py +0 -0
  276. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/__init__.py +0 -0
  277. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/__init__.py +0 -0
  278. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  279. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/custom_backend.py +0 -0
  280. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/gemini_backend.py +0 -0
  281. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/github_backend.py +0 -0
  282. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/ollama_backend.py +0 -0
  283. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/openai_backend.py +0 -0
  284. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/vllm_backend.py +0 -0
  285. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/base.py +0 -0
  286. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/factory.py +0 -0
  287. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/legacy.py +0 -0
  288. {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/router.py +0 -0
  289. {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/__init__.py +0 -0
  290. {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/graph.py +0 -0
  291. {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/nodes.py +0 -0
  292. {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/store.py +0 -0
  293. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/__init__.py +0 -0
  294. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/agent_pool.py +0 -0
  295. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/agent_runner.py +0 -0
  296. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/clarification_manager.py +0 -0
  297. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/event_stream.py +0 -0
  298. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/execution_graph.py +0 -0
  299. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/executor.py +0 -0
  300. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/health.py +0 -0
  301. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/hitl.py +0 -0
  302. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/model_router.py +0 -0
  303. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/planner.py +0 -0
  304. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/replay.py +0 -0
  305. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/replay_engine.py +0 -0
  306. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/retry.py +0 -0
  307. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/run_history.py +0 -0
  308. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/speculative_planner.py +0 -0
  309. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/state_manager.py +0 -0
  310. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/task_runner.py +0 -0
  311. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/task_state.py +0 -0
  312. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/telemetry.py +0 -0
  313. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/tool_runner.py +0 -0
  314. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/trace_tree.py +0 -0
  315. {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/visualize.py +0 -0
  316. {devsper-2.6.0 → devsper-2.7.1}/devsper/sandbox/__init__.py +0 -0
  317. {devsper-2.6.0 → devsper-2.7.1}/devsper/sandbox/sandbox.py +0 -0
  318. {devsper-2.6.0 → devsper-2.7.1}/devsper/server/__init__.py +0 -0
  319. {devsper-2.6.0 → devsper-2.7.1}/devsper/server/events.py +0 -0
  320. {devsper-2.6.0 → devsper-2.7.1}/devsper/server/memory_utils.py +0 -0
  321. {devsper-2.6.0 → devsper-2.7.1}/devsper/server/swarmworker.py +0 -0
  322. {devsper-2.6.0 → devsper-2.7.1}/devsper/server/topology.py +0 -0
  323. {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/__init__.py +0 -0
  324. {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/uploads/__init__.py +0 -0
  325. {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/uploads/store.py +0 -0
  326. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/checkpointer.py +0 -0
  327. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/executor.py +0 -0
  328. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/map_reduce.py +0 -0
  329. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/planner.py +0 -0
  330. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/prefetcher.py +0 -0
  331. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/scheduler.py +0 -0
  332. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/speculation.py +0 -0
  333. {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/swarm.py +0 -0
  334. {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/__init__.py +0 -0
  335. {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/otel.py +0 -0
  336. {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/pricing.py +0 -0
  337. {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/trulens.py +0 -0
  338. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/__init__.py +0 -0
  339. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/base.py +0 -0
  340. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/__init__.py +0 -0
  341. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  342. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  343. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  344. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  345. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  346. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  347. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  348. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  349. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  350. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  351. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  352. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/__init__.py +0 -0
  353. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  354. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/dependency_analyzer.py +0 -0
  355. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/extract_functions.py +0 -0
  356. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/format_python.py +0 -0
  357. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/generate_docstrings.py +0 -0
  358. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/generate_unit_tests.py +0 -0
  359. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/lint_python.py +0 -0
  360. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/refactor_function.py +0 -0
  361. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/repo_structure_map.py +0 -0
  362. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/run_python.py +0 -0
  363. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/__init__.py +0 -0
  364. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/column_type_detection.py +0 -0
  365. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/csv_summary.py +0 -0
  366. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_filter.py +0 -0
  367. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_groupby.py +0 -0
  368. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_stats.py +0 -0
  369. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataset_sampling.py +0 -0
  370. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataset_schema.py +0 -0
  371. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/json_pretty_print.py +0 -0
  372. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/json_query.py +0 -0
  373. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/missing_value_report.py +0 -0
  374. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/__init__.py +0 -0
  375. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  376. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  377. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  378. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  379. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  380. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_profile.py +0 -0
  381. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  382. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  383. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  384. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/model_input_validator.py +0 -0
  385. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  386. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/__init__.py +0 -0
  387. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/fetch_url.py +0 -0
  388. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/python_exec.py +0 -0
  389. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/read_csv.py +0 -0
  390. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/upload_file.py +0 -0
  391. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/web_search.py +0 -0
  392. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/__init__.py +0 -0
  393. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/_docproc.py +0 -0
  394. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/document_to_markdown.py +0 -0
  395. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_document_images.py +0 -0
  396. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_document_text.py +0 -0
  397. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_equations.py +0 -0
  398. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_tables.py +0 -0
  399. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/summarize_document.py +0 -0
  400. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_latex_document.py +0 -0
  401. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_markdown_document.py +0 -0
  402. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_word_document.py +0 -0
  403. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/__init__.py +0 -0
  404. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  405. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  406. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/experiment_tracker.py +0 -0
  407. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/grid_search_runner.py +0 -0
  408. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  409. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  410. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  411. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/result_comparator.py +0 -0
  412. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/simulation_runner.py +0 -0
  413. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  414. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  415. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/__init__.py +0 -0
  416. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/append_file.py +0 -0
  417. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_hash.py +0 -0
  418. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_line_count.py +0 -0
  419. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_metadata.py +0 -0
  420. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_preview.py +0 -0
  421. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/find_large_files.py +0 -0
  422. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/list_directory.py +0 -0
  423. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/read_file.py +0 -0
  424. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/search_files.py +0 -0
  425. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/write_file.py +0 -0
  426. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/__init__.py +0 -0
  427. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  428. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  429. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  430. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/research_graph_builder.py +0 -0
  431. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  432. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/hitl_request.py +0 -0
  433. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/__init__.py +0 -0
  434. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  435. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  436. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/corpus_builder.py +0 -0
  437. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  438. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  439. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  440. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  441. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  442. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/__init__.py +0 -0
  443. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/calculate_expression.py +0 -0
  444. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/correlation.py +0 -0
  445. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/distribution_summary.py +0 -0
  446. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/histogram.py +0 -0
  447. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/linear_regression.py +0 -0
  448. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/matrix_multiply.py +0 -0
  449. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/mean_std.py +0 -0
  450. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  451. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/polynomial_fit.py +0 -0
  452. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/random_sample.py +0 -0
  453. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/__init__.py +0 -0
  454. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/adapter.py +0 -0
  455. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/client.py +0 -0
  456. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/discovery.py +0 -0
  457. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/__init__.py +0 -0
  458. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/delete_memory.py +0 -0
  459. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/list_memory.py +0 -0
  460. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/search_memory.py +0 -0
  461. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/store_memory.py +0 -0
  462. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/summarize_memory.py +0 -0
  463. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/tag_memory.py +0 -0
  464. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/pipelines.py +0 -0
  465. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/__init__.py +0 -0
  466. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/arxiv_download.py +0 -0
  467. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/arxiv_search.py +0 -0
  468. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/citation_extractor.py +0 -0
  469. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/duckduckgo_search.py +0 -0
  470. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  471. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/paper_summarizer.py +0 -0
  472. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/research_question_generator.py +0 -0
  473. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/topic_cluster.py +0 -0
  474. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/web_search.py +0 -0
  475. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/wikipedia_lookup.py +0 -0
  476. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/__init__.py +0 -0
  477. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  478. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  479. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  480. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  481. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  482. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  483. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  484. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  485. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  486. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  487. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  488. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  489. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/__init__.py +0 -0
  490. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/report.py +0 -0
  491. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/scorer.py +0 -0
  492. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/selector.py +0 -0
  493. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/store.py +0 -0
  494. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/selector.py +0 -0
  495. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/__init__.py +0 -0
  496. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/cpu_usage.py +0 -0
  497. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/disk_usage.py +0 -0
  498. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/environment_variables.py +0 -0
  499. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/memory_usage.py +0 -0
  500. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/pip_install.py +0 -0
  501. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/pip_search.py +0 -0
  502. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/process_list.py +0 -0
  503. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/python_package_list.py +0 -0
  504. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/run_shell_command.py +0 -0
  505. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/system_info.py +0 -0
  506. {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/tool_runner.py +0 -0
  507. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/__init__.py +0 -0
  508. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/activity_feed_view.py +0 -0
  509. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/adaptive_tasks_view.py +0 -0
  510. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/agent_role_view.py +0 -0
  511. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/app.py +0 -0
  512. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/dashboard_screen.py +0 -0
  513. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/dev_view.py +0 -0
  514. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/inject_screen.py +0 -0
  515. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/knowledge_graph_view.py +0 -0
  516. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/layout.py +0 -0
  517. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/logs_view.py +0 -0
  518. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/memory_view.py +0 -0
  519. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/mission_view.py +0 -0
  520. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/performance_view.py +0 -0
  521. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/reasoning_graph_view.py +0 -0
  522. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/results_view.py +0 -0
  523. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/swarm_view.py +0 -0
  524. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/task_detail_screen.py +0 -0
  525. {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/task_view.py +0 -0
  526. {devsper-2.6.0 → devsper-2.7.1}/devsper/types/event.py +0 -0
  527. {devsper-2.6.0 → devsper-2.7.1}/devsper/types/exceptions.py +0 -0
  528. {devsper-2.6.0 → devsper-2.7.1}/devsper/types/swarm.py +0 -0
  529. {devsper-2.6.0 → devsper-2.7.1}/devsper/types/task.py +0 -0
  530. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/__init__.py +0 -0
  531. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/changelog.py +0 -0
  532. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/cli.py +0 -0
  533. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/installer.py +0 -0
  534. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/notifier.py +0 -0
  535. {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/version_check.py +0 -0
  536. {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/event_logger.py +0 -0
  537. {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/http.py +0 -0
  538. {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/models.py +0 -0
  539. {devsper-2.6.0 → devsper-2.7.1}/devsper/visualization/__init__.py +0 -0
  540. {devsper-2.6.0 → devsper-2.7.1}/devsper/visualization/dag_export.py +0 -0
  541. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/__init__.py +0 -0
  542. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/conditions.py +0 -0
  543. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/context.py +0 -0
  544. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/loader.py +0 -0
  545. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/resolver.py +0 -0
  546. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/runner.py +0 -0
  547. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/schema.py +0 -0
  548. {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/validator.py +0 -0
  549. {devsper-2.6.0 → devsper-2.7.1}/devsper.toml +0 -0
  550. {devsper-2.6.0 → devsper-2.7.1}/docker-compose.yml +0 -0
  551. {devsper-2.6.0 → devsper-2.7.1}/examples/__init__.py +0 -0
  552. {devsper-2.6.0 → devsper-2.7.1}/examples/_common.py +0 -0
  553. {devsper-2.6.0 → devsper-2.7.1}/examples/_config.py +0 -0
  554. {devsper-2.6.0 → devsper-2.7.1}/examples/coding/__init__.py +0 -0
  555. {devsper-2.6.0 → devsper-2.7.1}/examples/coding/analyze_repository.py +0 -0
  556. {devsper-2.6.0 → devsper-2.7.1}/examples/coding/generate_docs.py +0 -0
  557. {devsper-2.6.0 → devsper-2.7.1}/examples/coding/refactor_candidates.py +0 -0
  558. {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/__init__.py +0 -0
  559. {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/dataset_analysis.py +0 -0
  560. {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/run_experiments.py +0 -0
  561. {devsper-2.6.0 → devsper-2.7.1}/examples/demo_swarm.py +0 -0
  562. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/README.md +0 -0
  563. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/controller.toml +0 -0
  564. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/parallel_survey.py +0 -0
  565. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_controller.py +0 -0
  566. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_demo.sh +0 -0
  567. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_worker.py +0 -0
  568. {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/worker.toml +0 -0
  569. {devsper-2.6.0 → devsper-2.7.1}/examples/documents/__init__.py +0 -0
  570. {devsper-2.6.0 → devsper-2.7.1}/examples/documents/analyze_documents.py +0 -0
  571. {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/__init__.py +0 -0
  572. {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/monte_carlo_demo.py +0 -0
  573. {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/parameter_sweep.py +0 -0
  574. {devsper-2.6.0 → devsper-2.7.1}/examples/langchain_agent.py +0 -0
  575. {devsper-2.6.0 → devsper-2.7.1}/examples/langgraph_swarm.py +0 -0
  576. {devsper-2.6.0 → devsper-2.7.1}/examples/research/__init__.py +0 -0
  577. {devsper-2.6.0 → devsper-2.7.1}/examples/research/literature_review.py +0 -0
  578. {devsper-2.6.0 → devsper-2.7.1}/examples/research/research_gap_analysis.py +0 -0
  579. {devsper-2.6.0 → devsper-2.7.1}/examples/research/research_graph.py +0 -0
  580. {devsper-2.6.0 → devsper-2.7.1}/memory_utils.py +0 -0
  581. {devsper-2.6.0 → devsper-2.7.1}/scripts/README.md +0 -0
  582. {devsper-2.6.0 → devsper-2.7.1}/scripts/qa_e2e_stabilization.sh +0 -0
  583. {devsper-2.6.0 → devsper-2.7.1}/scripts/seed_tool_scores.py +0 -0
  584. {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_cli.sh +0 -0
  585. {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_full.sh +0 -0
  586. {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_smoke.py +0 -0
  587. {devsper-2.6.0 → devsper-2.7.1}/scripts/test_v2_router.py +0 -0
  588. {devsper-2.6.0 → devsper-2.7.1}/supermemory-core/Cargo.toml +0 -0
  589. {devsper-2.6.0 → devsper-2.7.1}/supermemory-core/src/main.rs +0 -0
  590. {devsper-2.6.0 → devsper-2.7.1}/tests/agents/__init__.py +0 -0
  591. {devsper-2.6.0 → devsper-2.7.1}/tests/agents/test_roles.py +0 -0
  592. {devsper-2.6.0 → devsper-2.7.1}/tests/benchmarks/test_v16_perf.py +0 -0
  593. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_controller_restart_hitl.py +0 -0
  594. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_duplicate_event_delivery.py +0 -0
  595. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_event_idempotency.py +0 -0
  596. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_event_retry.py +0 -0
  597. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_hitl_pause_resume.py +0 -0
  598. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_sse_reconnect.py +0 -0
  599. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_sse_stream.py +0 -0
  600. {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_worker_crash_recovery.py +0 -0
  601. {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/__init__.py +0 -0
  602. {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_adaptation.py +0 -0
  603. {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_learning_engine.py +0 -0
  604. {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_strategy_selector.py +0 -0
  605. {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_task_optimizer.py +0 -0
  606. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/__init__.py +0 -0
  607. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_agent_memory_integration.py +0 -0
  608. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_context_run_scope.py +0 -0
  609. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_index.py +0 -0
  610. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_router.py +0 -0
  611. {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_store.py +0 -0
  612. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/__init__.py +0 -0
  613. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/fixtures.py +0 -0
  614. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_crypto.py +0 -0
  615. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_heartbeat_eviction.py +0 -0
  616. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_local_pool.py +0 -0
  617. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_org_pool.py +0 -0
  618. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_priority_chain.py +0 -0
  619. {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_rate_limiting.py +0 -0
  620. {devsper-2.6.0 → devsper-2.7.1}/tests/reasoning/__init__.py +0 -0
  621. {devsper-2.6.0 → devsper-2.7.1}/tests/reasoning/test_reasoning_graph.py +0 -0
  622. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/__init__.py +0 -0
  623. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_budget.py +0 -0
  624. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_otel_phase1.py +0 -0
  625. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_packager.py +0 -0
  626. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_protocol_schema.py +0 -0
  627. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_replay.py +0 -0
  628. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_replay_engine.py +0 -0
  629. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_telemetry.py +0 -0
  630. {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_visualize.py +0 -0
  631. {devsper-2.6.0 → devsper-2.7.1}/tests/test_agent.py +0 -0
  632. {devsper-2.6.0 → devsper-2.7.1}/tests/test_analysis.py +0 -0
  633. {devsper-2.6.0 → devsper-2.7.1}/tests/test_analytics.py +0 -0
  634. {devsper-2.6.0 → devsper-2.7.1}/tests/test_auto_model.py +0 -0
  635. {devsper-2.6.0 → devsper-2.7.1}/tests/test_clarification.py +0 -0
  636. {devsper-2.6.0 → devsper-2.7.1}/tests/test_clarification_multinode.py +0 -0
  637. {devsper-2.6.0 → devsper-2.7.1}/tests/test_config_loader.py +0 -0
  638. {devsper-2.6.0 → devsper-2.7.1}/tests/test_credentials.py +0 -0
  639. {devsper-2.6.0 → devsper-2.7.1}/tests/test_cross_boundary_serialization.py +0 -0
  640. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dag_export.py +0 -0
  641. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_agents.py +0 -0
  642. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_build_cmd.py +0 -0
  643. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_debugger.py +0 -0
  644. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_repo_index.py +0 -0
  645. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_sandbox.py +0 -0
  646. {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_scaffold.py +0 -0
  647. {devsper-2.6.0 → devsper-2.7.1}/tests/test_distributed_bugs.py +0 -0
  648. {devsper-2.6.0 → devsper-2.7.1}/tests/test_embeddings_service.py +0 -0
  649. {devsper-2.6.0 → devsper-2.7.1}/tests/test_event_logger.py +0 -0
  650. {devsper-2.6.0 → devsper-2.7.1}/tests/test_execution_graph_meta.py +0 -0
  651. {devsper-2.6.0 → devsper-2.7.1}/tests/test_executor.py +0 -0
  652. {devsper-2.6.0 → devsper-2.7.1}/tests/test_export_runs.py +0 -0
  653. {devsper-2.6.0 → devsper-2.7.1}/tests/test_github_provider.py +0 -0
  654. {devsper-2.6.0 → devsper-2.7.1}/tests/test_init.py +0 -0
  655. {devsper-2.6.0 → devsper-2.7.1}/tests/test_knowledge_graph.py +0 -0
  656. {devsper-2.6.0 → devsper-2.7.1}/tests/test_knowledge_query.py +0 -0
  657. {devsper-2.6.0 → devsper-2.7.1}/tests/test_langchain_adapter.py +0 -0
  658. {devsper-2.6.0 → devsper-2.7.1}/tests/test_langgraph_adapter.py +0 -0
  659. {devsper-2.6.0 → devsper-2.7.1}/tests/test_map_reduce.py +0 -0
  660. {devsper-2.6.0 → devsper-2.7.1}/tests/test_memory_evolution.py +0 -0
  661. {devsper-2.6.0 → devsper-2.7.1}/tests/test_memory_isolation.py +0 -0
  662. {devsper-2.6.0 → devsper-2.7.1}/tests/test_missions.py +0 -0
  663. {devsper-2.6.0 → devsper-2.7.1}/tests/test_model_router.py +0 -0
  664. {devsper-2.6.0 → devsper-2.7.1}/tests/test_planner.py +0 -0
  665. {devsper-2.6.0 → devsper-2.7.1}/tests/test_platform_runtime_events.py +0 -0
  666. {devsper-2.6.0 → devsper-2.7.1}/tests/test_plugins.py +0 -0
  667. {devsper-2.6.0 → devsper-2.7.1}/tests/test_protocols.py +0 -0
  668. {devsper-2.6.0 → devsper-2.7.1}/tests/test_router.py +0 -0
  669. {devsper-2.6.0 → devsper-2.7.1}/tests/test_scheduler.py +0 -0
  670. {devsper-2.6.0 → devsper-2.7.1}/tests/test_speculation.py +0 -0
  671. {devsper-2.6.0 → devsper-2.7.1}/tests/test_strategies.py +0 -0
  672. {devsper-2.6.0 → devsper-2.7.1}/tests/test_swarm.py +0 -0
  673. {devsper-2.6.0 → devsper-2.7.1}/tests/test_task_cache.py +0 -0
  674. {devsper-2.6.0 → devsper-2.7.1}/tests/test_tool_scoring.py +0 -0
  675. {devsper-2.6.0 → devsper-2.7.1}/tests/test_tool_selector.py +0 -0
  676. {devsper-2.6.0 → devsper-2.7.1}/tests/test_upgrade.py +0 -0
  677. {devsper-2.6.0 → devsper-2.7.1}/tests/test_v110.py +0 -0
  678. {devsper-2.6.0 → devsper-2.7.1}/tests/test_v16.py +0 -0
  679. {devsper-2.6.0 → devsper-2.7.1}/tests/test_v17.py +0 -0
  680. {devsper-2.6.0 → devsper-2.7.1}/tests/test_v18.py +0 -0
  681. {devsper-2.6.0 → devsper-2.7.1}/tests/test_v19.py +0 -0
  682. {devsper-2.6.0 → devsper-2.7.1}/tests/test_workflow.py +0 -0
  683. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/__init__.py +0 -0
  684. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_code_intelligence_tools.py +0 -0
  685. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_coding_tools.py +0 -0
  686. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_core_tool_registry.py +0 -0
  687. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_data_science_tools.py +0 -0
  688. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_data_tools.py +0 -0
  689. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_document_tools.py +0 -0
  690. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_experiments_tools.py +0 -0
  691. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_filesystem_tools.py +0 -0
  692. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_flagship_tools.py +0 -0
  693. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_knowledge_tools.py +0 -0
  694. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_math_tools.py +0 -0
  695. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_memory_tools.py +0 -0
  696. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_registry.py +0 -0
  697. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_research_advanced_tools.py +0 -0
  698. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_research_tools.py +0 -0
  699. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_system_tools.py +0 -0
  700. {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_tool_runner.py +0 -0
  701. {devsper-2.6.0 → devsper-2.7.1}/worker/.dockerignore +0 -0
  702. {devsper-2.6.0 → devsper-2.7.1}/worker/Cargo.lock +0 -0
  703. {devsper-2.6.0 → devsper-2.7.1}/worker/Cargo.toml +0 -0
  704. {devsper-2.6.0 → devsper-2.7.1}/worker/Dockerfile +0 -0
  705. {devsper-2.6.0 → devsper-2.7.1}/worker/README.md +0 -0
  706. {devsper-2.6.0 → devsper-2.7.1}/worker/src/budget.rs +0 -0
  707. {devsper-2.6.0 → devsper-2.7.1}/worker/src/bus.rs +0 -0
  708. {devsper-2.6.0 → devsper-2.7.1}/worker/src/claim.rs +0 -0
  709. {devsper-2.6.0 → devsper-2.7.1}/worker/src/clarification.rs +0 -0
  710. {devsper-2.6.0 → devsper-2.7.1}/worker/src/config.rs +0 -0
  711. {devsper-2.6.0 → devsper-2.7.1}/worker/src/controller.rs +0 -0
  712. {devsper-2.6.0 → devsper-2.7.1}/worker/src/election.rs +0 -0
  713. {devsper-2.6.0 → devsper-2.7.1}/worker/src/error.rs +0 -0
  714. {devsper-2.6.0 → devsper-2.7.1}/worker/src/executor.rs +0 -0
  715. {devsper-2.6.0 → devsper-2.7.1}/worker/src/health.rs +0 -0
  716. {devsper-2.6.0 → devsper-2.7.1}/worker/src/heartbeat.rs +0 -0
  717. {devsper-2.6.0 → devsper-2.7.1}/worker/src/lib.rs +0 -0
  718. {devsper-2.6.0 → devsper-2.7.1}/worker/src/main.rs +0 -0
  719. {devsper-2.6.0 → devsper-2.7.1}/worker/src/metrics.rs +0 -0
  720. {devsper-2.6.0 → devsper-2.7.1}/worker/src/reconnect.rs +0 -0
  721. {devsper-2.6.0 → devsper-2.7.1}/worker/src/registry.rs +0 -0
  722. {devsper-2.6.0 → devsper-2.7.1}/worker/src/router.rs +0 -0
  723. {devsper-2.6.0 → devsper-2.7.1}/worker/src/rpc.rs +0 -0
  724. {devsper-2.6.0 → devsper-2.7.1}/worker/src/scheduler.rs +0 -0
  725. {devsper-2.6.0 → devsper-2.7.1}/worker/src/snapshot.rs +0 -0
  726. {devsper-2.6.0 → devsper-2.7.1}/worker/src/telemetry.rs +0 -0
  727. {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/agent.rs +0 -0
  728. {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/event.rs +0 -0
  729. {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/mod.rs +0 -0
  730. {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/node.rs +0 -0
  731. {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/task.rs +0 -0
  732. {devsper-2.6.0 → devsper-2.7.1}/worker/src/worker_node.rs +0 -0
  733. {devsper-2.6.0 → devsper-2.7.1}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.7.1] — 2026-04-07
11
+
12
+ ### Added
13
+
14
+ - **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=)`.
15
+ - **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"`.
16
+ - **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`.
17
+ - **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.
18
+ - **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.
19
+ - **`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).
20
+ - **Config sections** — `[prompt_optimizer]` and `[evals]` added to `devsperConfigModel`.
21
+ - **Optimized prompt persistence** — `EvalRunner` saves results to `.devsper/optimized_prompts/{role}.json`. `get_role_config()` auto-loads these on the next run.
22
+ - **`devsper[evals]`, `devsper[dspy]`, `devsper[gepa]`, `devsper[openevals]` extras.**
23
+ - **pytest `live` marker** — Gates tests that require real API keys.
24
+
25
+ ### Changed
26
+
27
+ - **`get_metric(name)`** extended: now accepts `"openevals:<evaluator>"` in addition to built-in names.
28
+ - **`get_role_config()`** — Checks `.devsper/optimized_prompts/{role}.json` and uses the optimized prefix if present.
29
+
30
+ ## [2.7.0] — 2026-04-07
31
+
32
+ ### Added
33
+
34
+ - **MemoryProvider abstraction** — Introduced `MemoryBackend` ABC (`devsper/memory/providers/base.py`) mirroring the `LLMBackend` pattern. All memory backends implement a unified async interface: `store`, `retrieve`, `delete`, `list_memory`, `list_all_ids`, `query_similar`, `health`.
35
+ - **MemoryProvider factory** — `get_memory_provider()` singleton factory resolves the active backend from config (`[memory] provider`), `DEVSPER_MEMORY_PROVIDER` env var, or legacy `backend` field. Defaults to Vektori (pgvector) with automatic SQLite fallback when `DATABASE_URL` is not set.
36
+ - **Snowflake memory backend** — New `SnowflakeBackend` using `VECTOR(FLOAT, 1536)` columns and `VECTOR_COSINE_SIMILARITY` for native semantic search. Credentials resolved exclusively via the devsper credential store or `SNOWFLAKE_*` env vars — never from config files.
37
+ - **SQLite, Redis, Vektori, Platform backends** — Existing stores wrapped as `MemoryBackend` implementations with `get_sync_store()` escape hatch for legacy sync callers.
38
+ - **Credential store: Snowflake + Redis** — Added `snowflake` and `redis_memory` providers to keyring mappings. `devsper credentials set snowflake password` stores the Snowflake password securely; `inject_into_env()` propagates all `SNOWFLAKE_*` vars automatically.
39
+ - **Config schema** — Added `RedisMemoryConfig` and `SnowflakeMemoryConfig` sub-models under `[memory]`. `SnowflakeMemoryConfig` has no `password` field — credentials are credential-store-only.
40
+ - **`devsper doctor` memory provider health check** — `run_doctor()` now calls `provider.health()` and reports the active backend name and status.
41
+ - **`devsper[snowflake]` and `devsper[redis-memory]` extras** — `snowflake-connector-python>=3.6.0` and `redis>=5.0.0` optional dependency groups.
42
+ - **`deregister(name)` in tool registry** — Public function to remove a single tool by name without clearing the whole registry.
43
+ - **`MemoryIndex` native search delegation** — When the active backend has `supports_native_vector_search=True`, `query_memory()` and `query_across_runs()` delegate directly to `backend.query_similar()`, bypassing in-process cosine ranking.
44
+
45
+ ### Changed
46
+
47
+ - **`MemoryRouter` and `MemoryIndex`** accept an optional `backend: MemoryBackend` parameter. The `_build_memory_store()` fallback now calls the factory instead of constructing `MemoryStore()` directly.
48
+ - **`get_effective_memory_store()`** preserved as a backwards-compatible alias; new `get_effective_memory_backend()` returns the full `MemoryBackend`. Async-only backends (Vektori, Snowflake) are bridged via `_AsyncBridgeStore` for sync callers.
49
+ - **Legacy `backend` values** (`local`, `supermemory`, `hybrid`) now map to `"vektori"` as the default production store.
50
+
51
+ ### Fixed
52
+
53
+ - **`test_pipelines.py`** — Replaced `registry._tools.pop()` (broken module-level access) with new `deregister()` function.
54
+ - **`test_e2e_redis_loop.py`** — Import guard prevents `ModuleNotFoundError` when `redis` is not installed; test now correctly skips instead of failing.
55
+
10
56
  ## [2.6.0] — 2026-04-06
11
57
 
12
58
  ### Added
@@ -82,7 +128,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
82
128
 
83
129
  - **Supermemory ranking backend** — `[memory] backend = "supermemory"` (default) uses the Rust `supermemory-core` ranker for hybrid lexical (+ optional embedding) memory retrieval, deduplication, and recency-aware context formatting.
84
130
  - **Platform memory backends** — `[memory] backend` can be `platform` or `hybrid` with `platform_api_url` and `platform_org_slug`; config resolver honors `DEVSPER_PLATFORM_API_URL` and `DEVSPER_PLATFORM_ORG` when set.
85
- - **Remote platform workflows** — `load_workflow("org/pkg@N")` fetches workflow specs from the Devsper Platform API when `DEVSPER_PLATFORM_API_URL`, `DEVSPER_PLATFORM_ORG`, and (when required) `DEVSPER_PLATFORM_TOKEN` are configured.
131
+ - **Remote platform workflows** — `load_workflow("org/pkg@N")` fetches workflow specs from the Devsper Cloud API when `DEVSPER_PLATFORM_API_URL`, `DEVSPER_PLATFORM_ORG`, and (when required) `DEVSPER_PLATFORM_TOKEN` are configured.
86
132
  - **Local worker pool** — `devsper pool` subcommands to run the local worker pool manager (foreground spawner) alongside improved swarm execution when using pool-backed paths.
87
133
  - **Devsper Cloud CLI** — `devsper cloud login`, `logout`, `run`, `status`, and `logs` for JWT authentication (OS keychain) and runs against the platform API.
88
134
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.6.0
3
+ Version: 2.7.1
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,11 @@ 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'
78
+ Provides-Extra: redis-memory
79
+ Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
80
+ Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
71
81
  Provides-Extra: research
72
82
  Requires-Dist: duckduckgo-search>=6.0.0; extra == 'research'
73
83
  Provides-Extra: server
@@ -75,6 +85,8 @@ Requires-Dist: fastapi>=0.110; extra == 'server'
75
85
  Requires-Dist: sse-starlette>=2.0; extra == 'server'
76
86
  Requires-Dist: uvicorn>=0.29; extra == 'server'
77
87
  Requires-Dist: vektori>=0.1.1; extra == 'server'
88
+ Provides-Extra: snowflake
89
+ Requires-Dist: snowflake-connector-python>=3.6.0; extra == 'snowflake'
78
90
  Provides-Extra: trulens
79
91
  Requires-Dist: trulens-core>=1.0; extra == 'trulens'
80
92
  Provides-Extra: worker
@@ -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
@@ -534,6 +534,31 @@ def run_doctor() -> int:
534
534
  except Exception as e:
535
535
  warnings.append(f"Memory store: {e}")
536
536
 
537
+ # Memory provider health check
538
+ try:
539
+ import asyncio
540
+ from devsper.memory.providers.factory import get_memory_provider
541
+ provider = get_memory_provider()
542
+ try:
543
+ loop = asyncio.get_event_loop()
544
+ if loop.is_running():
545
+ import concurrent.futures
546
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
547
+ healthy = pool.submit(asyncio.run, provider.health()).result()
548
+ else:
549
+ healthy = loop.run_until_complete(provider.health())
550
+ except Exception:
551
+ healthy = False
552
+ if healthy:
553
+ ok.append(f"Memory provider: {provider.name} — healthy")
554
+ else:
555
+ warnings.append(
556
+ f"Memory provider: {provider.name} — health check failed. "
557
+ "Check credentials and connectivity."
558
+ )
559
+ except Exception as e:
560
+ warnings.append(f"Memory provider health check failed: {e}")
561
+
537
562
  try:
538
563
  from devsper.knowledge.knowledge_graph import KnowledgeGraph
539
564
  kg = KnowledgeGraph(store=get_default_store())
@@ -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",
@@ -74,13 +74,46 @@ class ModelsConfig(BaseModel):
74
74
  quality: str | None = None # v1.6: complex tier (defaults to planner)
75
75
 
76
76
 
77
+ class RedisMemoryConfig(BaseModel):
78
+ """Connection config for Redis memory backend."""
79
+
80
+ redis_url: str = "redis://localhost:6379"
81
+ run_id: str = "" # empty = auto-generated from os.getpid()
82
+
83
+
84
+ class SnowflakeMemoryConfig(BaseModel):
85
+ """Connection config for Snowflake memory backend.
86
+
87
+ Credentials (account, user, password, etc.) are resolved from:
88
+ 1. devsper credential store (devsper credentials set snowflake <key>)
89
+ 2. SNOWFLAKE_* environment variables
90
+ 3. These TOML fields as a last fallback (non-secret fields only)
91
+
92
+ NEVER put passwords in config files — use the credential store.
93
+ """
94
+
95
+ account: str = "" # or SNOWFLAKE_ACCOUNT env var
96
+ user: str = "" # or SNOWFLAKE_USER env var
97
+ database: str = "" # or SNOWFLAKE_DATABASE env var
98
+ schema_name: str = "" # "schema" is reserved by Pydantic; or SNOWFLAKE_SCHEMA
99
+ warehouse: str = "" # or SNOWFLAKE_WAREHOUSE env var
100
+ role: str = "" # or SNOWFLAKE_ROLE env var
101
+ table: str = "devsper_memory"
102
+
103
+
77
104
  class MemoryConfig(BaseModel):
78
105
  enabled: bool = True
79
106
  store_results: bool = True
80
107
  top_k: int = 5
108
+ # New explicit provider field. Takes precedence over legacy `backend`.
109
+ # Values: "sqlite" | "redis" | "snowflake" | "vektori"
110
+ # Empty string = auto-detect (vektori if DATABASE_URL set, else sqlite).
111
+ provider: str = ""
81
112
  backend: Literal["local", "platform", "hybrid", "supermemory"] = "supermemory"
82
113
  platform_api_url: str = ""
83
114
  platform_org_slug: str = ""
115
+ redis: RedisMemoryConfig = Field(default_factory=RedisMemoryConfig)
116
+ snowflake: SnowflakeMemoryConfig = Field(default_factory=SnowflakeMemoryConfig)
84
117
 
85
118
 
86
119
  class KnowledgeConfig(BaseModel):
@@ -276,6 +309,32 @@ class HitlConfig(BaseModel):
276
309
  policies: list[HitlPolicyConfig] = Field(default_factory=list)
277
310
 
278
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 = "noop"
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
+
279
338
  class devsperConfigModel(BaseModel):
280
339
  """Full resolved configuration with Pydantic validation."""
281
340
 
@@ -300,6 +359,8 @@ class devsperConfigModel(BaseModel):
300
359
  sandbox: SandboxConfig = Field(default_factory=SandboxConfig)
301
360
  compliance: ComplianceConfig = Field(default_factory=ComplianceConfig)
302
361
  hitl: HitlConfig = Field(default_factory=HitlConfig)
362
+ prompt_optimizer: PromptOptimizerConfig = Field(default_factory=PromptOptimizerConfig)
363
+ evals: EvalConfig = Field(default_factory=EvalConfig)
303
364
 
304
365
  # Backward-compat aliases (property-style access from old devsperConfig)
305
366
  @property
@@ -22,10 +22,12 @@ KNOWN_CREDENTIALS = {
22
22
  "gemini": ["api_key"],
23
23
  "azure": ["endpoint", "api_key", "deployment", "api_version"],
24
24
  "azure_anthropic": ["endpoint", "api_key", "deployment"],
25
+ "snowflake": ["account", "user", "password", "database", "schema", "warehouse", "role"],
26
+ "redis_memory": ["url"],
25
27
  }
26
28
 
27
29
  # Keys that must never be shown in list (only "(stored)"); all others can show value
28
- SENSITIVE_KEYS = {"api_key", "token"}
30
+ SENSITIVE_KEYS = {"api_key", "token", "password"}
29
31
 
30
32
  # (provider, key) -> env var name for export
31
33
  PROVIDER_KEY_TO_ENV: dict[tuple[str, str], str] = {
@@ -40,6 +42,14 @@ PROVIDER_KEY_TO_ENV: dict[tuple[str, str], str] = {
40
42
  ("azure_anthropic", "endpoint"): "AZURE_ANTHROPIC_ENDPOINT",
41
43
  ("azure_anthropic", "api_key"): "AZURE_ANTHROPIC_API_KEY",
42
44
  ("azure_anthropic", "deployment"): "AZURE_ANTHROPIC_DEPLOYMENT_NAME",
45
+ ("snowflake", "account"): "SNOWFLAKE_ACCOUNT",
46
+ ("snowflake", "user"): "SNOWFLAKE_USER",
47
+ ("snowflake", "password"): "SNOWFLAKE_PASSWORD",
48
+ ("snowflake", "database"): "SNOWFLAKE_DATABASE",
49
+ ("snowflake", "schema"): "SNOWFLAKE_SCHEMA",
50
+ ("snowflake", "warehouse"): "SNOWFLAKE_WAREHOUSE",
51
+ ("snowflake", "role"): "SNOWFLAKE_ROLE",
52
+ ("redis_memory", "url"): "REDIS_URL",
43
53
  }
44
54
 
45
55
 
@@ -19,6 +19,15 @@ _PROVIDER_KEY_TO_ENV: list[tuple[str, str, str]] = [
19
19
  ("azure_anthropic", "api_key", "AZURE_ANTHROPIC_API_KEY"),
20
20
  ("azure_anthropic", "endpoint", "AZURE_ANTHROPIC_ENDPOINT"),
21
21
  ("azure_anthropic", "deployment", "AZURE_ANTHROPIC_DEPLOYMENT_NAME"),
22
+ # Memory backends
23
+ ("snowflake", "account", "SNOWFLAKE_ACCOUNT"),
24
+ ("snowflake", "user", "SNOWFLAKE_USER"),
25
+ ("snowflake", "password", "SNOWFLAKE_PASSWORD"),
26
+ ("snowflake", "database", "SNOWFLAKE_DATABASE"),
27
+ ("snowflake", "schema", "SNOWFLAKE_SCHEMA"),
28
+ ("snowflake", "warehouse", "SNOWFLAKE_WAREHOUSE"),
29
+ ("snowflake", "role", "SNOWFLAKE_ROLE"),
30
+ ("redis_memory", "url", "REDIS_URL"),
22
31
  ]
23
32
 
24
33
  SERVICE_NAME = "devsper"
@@ -31,6 +40,8 @@ KNOWN_CREDENTIALS = {
31
40
  "gemini": ["api_key"],
32
41
  "azure": ["endpoint", "api_key", "deployment", "api_version"],
33
42
  "azure_anthropic": ["endpoint", "api_key", "deployment"],
43
+ "snowflake": ["account", "user", "password", "database", "schema", "warehouse", "role"],
44
+ "redis_memory": ["url"],
34
45
  }
35
46
 
36
47
 
@@ -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
+ ]