devsper 2.6.0__tar.gz → 2.7.0__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 (719) hide show
  1. {devsper-2.6.0 → devsper-2.7.0}/CHANGELOG.md +27 -1
  2. {devsper-2.6.0 → devsper-2.7.0}/PKG-INFO +6 -1
  3. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/init.py +25 -0
  4. {devsper-2.6.0 → devsper-2.7.0}/devsper/config/schema.py +33 -0
  5. {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/cli.py +11 -1
  6. {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/store.py +11 -0
  7. devsper-2.7.0/devsper/memory/context.py +134 -0
  8. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_index.py +73 -2
  9. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_router.py +35 -13
  10. devsper-2.7.0/devsper/memory/providers/__init__.py +5 -0
  11. devsper-2.7.0/devsper/memory/providers/backends/__init__.py +1 -0
  12. devsper-2.7.0/devsper/memory/providers/backends/platform_backend.py +74 -0
  13. devsper-2.7.0/devsper/memory/providers/backends/redis_backend.py +90 -0
  14. devsper-2.7.0/devsper/memory/providers/backends/snowflake_backend.py +449 -0
  15. devsper-2.7.0/devsper/memory/providers/backends/sqlite_backend.py +83 -0
  16. devsper-2.7.0/devsper/memory/providers/backends/vektori_backend.py +140 -0
  17. devsper-2.7.0/devsper/memory/providers/base.py +125 -0
  18. devsper-2.7.0/devsper/memory/providers/factory.py +162 -0
  19. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/registry.py +7 -0
  20. {devsper-2.6.0 → devsper-2.7.0}/pyproject.toml +3 -1
  21. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_e2e_redis_loop.py +4 -1
  22. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_pipelines.py +4 -7
  23. {devsper-2.6.0 → devsper-2.7.0}/uv.lock +158 -2
  24. devsper-2.6.0/devsper/memory/context.py +0 -53
  25. {devsper-2.6.0 → devsper-2.7.0}/.env.example +0 -0
  26. {devsper-2.6.0 → devsper-2.7.0}/.github/FUNDING.yml +0 -0
  27. {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/pypi-publish.yml +0 -0
  28. {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/release-on-tag.yml +0 -0
  29. {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/worker-release.yml +0 -0
  30. {devsper-2.6.0 → devsper-2.7.0}/.gitignore +0 -0
  31. {devsper-2.6.0 → devsper-2.7.0}/.python-version +0 -0
  32. {devsper-2.6.0 → devsper-2.7.0}/CODE_OF_CONDUCT.md +0 -0
  33. {devsper-2.6.0 → devsper-2.7.0}/CONTRIBUTING.md +0 -0
  34. {devsper-2.6.0 → devsper-2.7.0}/Cargo.lock +0 -0
  35. {devsper-2.6.0 → devsper-2.7.0}/Cargo.toml +0 -0
  36. {devsper-2.6.0 → devsper-2.7.0}/Dockerfile.local-pool +0 -0
  37. {devsper-2.6.0 → devsper-2.7.0}/LICENSE +0 -0
  38. {devsper-2.6.0 → devsper-2.7.0}/README.md +0 -0
  39. {devsper-2.6.0 → devsper-2.7.0}/SECURITY.md +0 -0
  40. {devsper-2.6.0 → devsper-2.7.0}/benchmarks/__init__.py +0 -0
  41. {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_dataset_analysis.py +0 -0
  42. {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_repository_analysis.py +0 -0
  43. {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_research_pipeline.py +0 -0
  44. {devsper-2.6.0 → devsper-2.7.0}/branding/logo.svg +0 -0
  45. {devsper-2.6.0 → devsper-2.7.0}/devsper/README.md +0 -0
  46. {devsper-2.6.0 → devsper-2.7.0}/devsper/__init__.py +0 -0
  47. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/__init__.py +0 -0
  48. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/client.py +0 -0
  49. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/discovery.py +0 -0
  50. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/server.py +0 -0
  51. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/tool_adapter.py +0 -0
  52. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/types.py +0 -0
  53. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/agent.py +0 -0
  54. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/critic.py +0 -0
  55. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/identity.py +0 -0
  56. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/message_bus.py +0 -0
  57. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/registry.py +0 -0
  58. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/roles.py +0 -0
  59. {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/run_agent.py +0 -0
  60. {devsper-2.6.0 → devsper-2.7.0}/devsper/analytics/__init__.py +0 -0
  61. {devsper-2.6.0 → devsper-2.7.0}/devsper/analytics/tool_analytics.py +0 -0
  62. {devsper-2.6.0 → devsper-2.7.0}/devsper/audit/__init__.py +0 -0
  63. {devsper-2.6.0 → devsper-2.7.0}/devsper/audit/logger.py +0 -0
  64. {devsper-2.6.0 → devsper-2.7.0}/devsper/budget.py +0 -0
  65. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/__init__.py +0 -0
  66. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/__init__.py +0 -0
  67. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/base.py +0 -0
  68. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/memory.py +0 -0
  69. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/redis.py +0 -0
  70. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/message.py +0 -0
  71. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/schema_version.py +0 -0
  72. {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/topics.py +0 -0
  73. {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/__init__.py +0 -0
  74. {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/embedding_index.py +0 -0
  75. {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/hashing.py +0 -0
  76. {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/store.py +0 -0
  77. {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/task_cache.py +0 -0
  78. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/__init__.py +0 -0
  79. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/commands/cloud.py +0 -0
  80. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/export.py +0 -0
  81. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/github_oauth.py +0 -0
  82. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/main.py +0 -0
  83. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/run_progress.py +0 -0
  84. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/__init__.py +0 -0
  85. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/components.py +0 -0
  86. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/controller_run_view.py +0 -0
  87. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/errors.py +0 -0
  88. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/logging.py +0 -0
  89. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/onboarding.py +0 -0
  90. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/progress.py +0 -0
  91. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/run_view.py +0 -0
  92. {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/theme.py +0 -0
  93. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/__init__.py +0 -0
  94. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/election.py +0 -0
  95. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/local.py +0 -0
  96. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/node_info.py +0 -0
  97. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/registry.py +0 -0
  98. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/router.py +0 -0
  99. {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/state_backend.py +0 -0
  100. {devsper-2.6.0 → devsper-2.7.0}/devsper/compliance/__init__.py +0 -0
  101. {devsper-2.6.0 → devsper-2.7.0}/devsper/compliance/pii.py +0 -0
  102. {devsper-2.6.0 → devsper-2.7.0}/devsper/config/__init__.py +0 -0
  103. {devsper-2.6.0 → devsper-2.7.0}/devsper/config/config_loader.py +0 -0
  104. {devsper-2.6.0 → devsper-2.7.0}/devsper/config/defaults.py +0 -0
  105. {devsper-2.6.0 → devsper-2.7.0}/devsper/config/resolver.py +0 -0
  106. {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/__init__.py +0 -0
  107. {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/base.py +0 -0
  108. {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/registry.py +0 -0
  109. {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/sample_connector.py +0 -0
  110. {devsper-2.6.0 → devsper-2.7.0}/devsper/contracts/__init__.py +0 -0
  111. {devsper-2.6.0 → devsper-2.7.0}/devsper/contracts/platform_event_type.py +0 -0
  112. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/__init__.py +0 -0
  113. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/agent/__init__.py +0 -0
  114. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/agent/runner.py +0 -0
  115. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/hitl/__init__.py +0 -0
  116. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/hitl/state_machine.py +0 -0
  117. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/memory/__init__.py +0 -0
  118. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/memory/shared_memory.py +0 -0
  119. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/reporting/__init__.py +0 -0
  120. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/reporting/publisher.py +0 -0
  121. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/__init__.py +0 -0
  122. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/durability.py +0 -0
  123. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/orchestrator.py +0 -0
  124. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/__init__.py +0 -0
  125. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/base_tool.py +0 -0
  126. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/loader.py +0 -0
  127. {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/registry.py +0 -0
  128. {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/__init__.py +0 -0
  129. {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/migration.py +0 -0
  130. {devsper-2.6.0 → devsper-2.7.0}/devsper/dashboard/__init__.py +0 -0
  131. {devsper-2.6.0 → devsper-2.7.0}/devsper/dashboard/dashboard.py +0 -0
  132. {devsper-2.6.0 → devsper-2.7.0}/devsper/debug_events.py +0 -0
  133. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/__init__.py +0 -0
  134. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/builder.py +0 -0
  135. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/debugger.py +0 -0
  136. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/repo_index.py +0 -0
  137. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/sandbox.py +0 -0
  138. {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/scaffold.py +0 -0
  139. {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/__init__.py +0 -0
  140. {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/controller.py +0 -0
  141. {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/worker_runtime.py +0 -0
  142. {devsper-2.6.0 → devsper-2.7.0}/devsper/docs/architecture/execution-model.md +0 -0
  143. {devsper-2.6.0 → devsper-2.7.0}/devsper/embeddings/__init__.py +0 -0
  144. {devsper-2.6.0 → devsper-2.7.0}/devsper/embeddings/service.py +0 -0
  145. {devsper-2.6.0 → devsper-2.7.0}/devsper/events.py +0 -0
  146. {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/__init__.py +0 -0
  147. {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/decision_tree.py +0 -0
  148. {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/rationale.py +0 -0
  149. {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/simulation.py +0 -0
  150. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/__init__.py +0 -0
  151. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/branding.py +0 -0
  152. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/collector.py +0 -0
  153. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/manifest.py +0 -0
  154. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/model.py +0 -0
  155. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/packager.py +0 -0
  156. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/pdf.py +0 -0
  157. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/service.py +0 -0
  158. {devsper-2.6.0 → devsper-2.7.0}/devsper/export/writers.py +0 -0
  159. {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/__init__.py +0 -0
  160. {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/approval.py +0 -0
  161. {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/escalation.py +0 -0
  162. {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/__init__.py +0 -0
  163. {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/langchain_adapter.py +0 -0
  164. {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/langgraph_adapter.py +0 -0
  165. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/__init__.py +0 -0
  166. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/adaptation.py +0 -0
  167. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/__init__.py +0 -0
  168. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/analyzer.py +0 -0
  169. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  170. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/formatter.py +0 -0
  171. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/run_report.py +0 -0
  172. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/learning_engine.py +0 -0
  173. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/__init__.py +0 -0
  174. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/base.py +0 -0
  175. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  176. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  177. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  178. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  179. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
  180. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategy_selector.py +0 -0
  181. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/synthesis.py +0 -0
  182. {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/task_optimizer.py +0 -0
  183. {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/__init__.py +0 -0
  184. {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/extractor.py +0 -0
  185. {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/knowledge_graph.py +0 -0
  186. {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/query.py +0 -0
  187. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/__init__.py +0 -0
  188. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/consolidation.py +0 -0
  189. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/embeddings.py +0 -0
  190. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_store.py +0 -0
  191. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_types.py +0 -0
  192. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/namespaces.py +0 -0
  193. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/platform_memory.py +0 -0
  194. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/redis_memory.py +0 -0
  195. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/scoring.py +0 -0
  196. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/store.py +0 -0
  197. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/summarizer.py +0 -0
  198. {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
  199. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/__init__.py +0 -0
  200. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/base_agent.py +0 -0
  201. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/__init__.py +0 -0
  202. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/architect_agent.py +0 -0
  203. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/coder_agent.py +0 -0
  204. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/debugger_agent.py +0 -0
  205. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/docs_agent.py +0 -0
  206. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/tester_agent.py +0 -0
  207. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/iteration_loop.py +0 -0
  208. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_memory.py +0 -0
  209. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_planner.py +0 -0
  210. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_runner.py +0 -0
  211. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/models.py +0 -0
  212. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/__init__.py +0 -0
  213. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/editor_agent.py +0 -0
  214. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/researcher_agent.py +0 -0
  215. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/reviewer_agent.py +0 -0
  216. {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/writer_agent.py +0 -0
  217. {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/__init__.py +0 -0
  218. {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/controller.py +0 -0
  219. {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/rpc.py +0 -0
  220. {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/single.py +0 -0
  221. {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/worker.py +0 -0
  222. {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/__init__.py +0 -0
  223. {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/meta_planner.py +0 -0
  224. {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/priority_queue.py +0 -0
  225. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/__init__.py +0 -0
  226. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/redis_results_sink.py +0 -0
  227. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/reporter.py +0 -0
  228. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/request_builder.py +0 -0
  229. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/run_context.py +0 -0
  230. {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/runtime_events.py +0 -0
  231. {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/__init__.py +0 -0
  232. {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/marketplace/__init__.py +0 -0
  233. {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/plugin_loader.py +0 -0
  234. {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/plugin_registry.py +0 -0
  235. {devsper-2.6.0 → devsper-2.7.0}/devsper/policy/client.py +0 -0
  236. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/__init__.py +0 -0
  237. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/config.py +0 -0
  238. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/crypto.py +0 -0
  239. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/local_pool.py +0 -0
  240. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/manager.py +0 -0
  241. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/models.py +0 -0
  242. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/org_pool.py +0 -0
  243. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/dev.toml +0 -0
  244. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/local.toml +0 -0
  245. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/prod.toml +0 -0
  246. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/security.py +0 -0
  247. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/store.py +0 -0
  248. {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/worker_runner.py +0 -0
  249. {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/__init__.py +0 -0
  250. {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/client.py +0 -0
  251. {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/schema.py +0 -0
  252. {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/server.py +0 -0
  253. {devsper-2.6.0 → devsper-2.7.0}/devsper/protocols/__init__.py +0 -0
  254. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/__init__.py +0 -0
  255. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/anthropic.py +0 -0
  256. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/base.py +0 -0
  257. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/complexity_router.py +0 -0
  258. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/gemini.py +0 -0
  259. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/github.py +0 -0
  260. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/model_router.py +0 -0
  261. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/openai.py +0 -0
  262. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/__init__.py +0 -0
  263. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/__init__.py +0 -0
  264. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  265. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/custom_backend.py +0 -0
  266. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
  267. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/github_backend.py +0 -0
  268. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
  269. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/openai_backend.py +0 -0
  270. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
  271. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/base.py +0 -0
  272. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/factory.py +0 -0
  273. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/legacy.py +0 -0
  274. {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/router.py +0 -0
  275. {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/__init__.py +0 -0
  276. {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/graph.py +0 -0
  277. {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/nodes.py +0 -0
  278. {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/store.py +0 -0
  279. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/__init__.py +0 -0
  280. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/agent_pool.py +0 -0
  281. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/agent_runner.py +0 -0
  282. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/clarification_manager.py +0 -0
  283. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/event_stream.py +0 -0
  284. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/execution_graph.py +0 -0
  285. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/executor.py +0 -0
  286. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/health.py +0 -0
  287. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/hitl.py +0 -0
  288. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/model_router.py +0 -0
  289. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/planner.py +0 -0
  290. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/replay.py +0 -0
  291. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/replay_engine.py +0 -0
  292. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/retry.py +0 -0
  293. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/run_history.py +0 -0
  294. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/speculative_planner.py +0 -0
  295. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/state_manager.py +0 -0
  296. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/task_runner.py +0 -0
  297. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/task_state.py +0 -0
  298. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/telemetry.py +0 -0
  299. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/tool_runner.py +0 -0
  300. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/trace_tree.py +0 -0
  301. {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/visualize.py +0 -0
  302. {devsper-2.6.0 → devsper-2.7.0}/devsper/sandbox/__init__.py +0 -0
  303. {devsper-2.6.0 → devsper-2.7.0}/devsper/sandbox/sandbox.py +0 -0
  304. {devsper-2.6.0 → devsper-2.7.0}/devsper/server/__init__.py +0 -0
  305. {devsper-2.6.0 → devsper-2.7.0}/devsper/server/events.py +0 -0
  306. {devsper-2.6.0 → devsper-2.7.0}/devsper/server/memory_utils.py +0 -0
  307. {devsper-2.6.0 → devsper-2.7.0}/devsper/server/swarmworker.py +0 -0
  308. {devsper-2.6.0 → devsper-2.7.0}/devsper/server/topology.py +0 -0
  309. {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/__init__.py +0 -0
  310. {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/uploads/__init__.py +0 -0
  311. {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/uploads/store.py +0 -0
  312. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/checkpointer.py +0 -0
  313. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/executor.py +0 -0
  314. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/map_reduce.py +0 -0
  315. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/planner.py +0 -0
  316. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/prefetcher.py +0 -0
  317. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/scheduler.py +0 -0
  318. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/speculation.py +0 -0
  319. {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/swarm.py +0 -0
  320. {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/__init__.py +0 -0
  321. {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/otel.py +0 -0
  322. {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/pricing.py +0 -0
  323. {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/trulens.py +0 -0
  324. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/__init__.py +0 -0
  325. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/base.py +0 -0
  326. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/__init__.py +0 -0
  327. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  328. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  329. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  330. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  331. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  332. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  333. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  334. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  335. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  336. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  337. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  338. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/__init__.py +0 -0
  339. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  340. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
  341. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/extract_functions.py +0 -0
  342. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/format_python.py +0 -0
  343. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/generate_docstrings.py +0 -0
  344. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
  345. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/lint_python.py +0 -0
  346. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/refactor_function.py +0 -0
  347. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/repo_structure_map.py +0 -0
  348. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/run_python.py +0 -0
  349. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/__init__.py +0 -0
  350. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/column_type_detection.py +0 -0
  351. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/csv_summary.py +0 -0
  352. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_filter.py +0 -0
  353. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_groupby.py +0 -0
  354. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_stats.py +0 -0
  355. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataset_sampling.py +0 -0
  356. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataset_schema.py +0 -0
  357. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/json_pretty_print.py +0 -0
  358. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/json_query.py +0 -0
  359. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/missing_value_report.py +0 -0
  360. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/__init__.py +0 -0
  361. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  362. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  363. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  364. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  365. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  366. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_profile.py +0 -0
  367. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  368. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  369. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  370. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/model_input_validator.py +0 -0
  371. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  372. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/__init__.py +0 -0
  373. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/fetch_url.py +0 -0
  374. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/python_exec.py +0 -0
  375. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/read_csv.py +0 -0
  376. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/upload_file.py +0 -0
  377. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/web_search.py +0 -0
  378. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/__init__.py +0 -0
  379. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/_docproc.py +0 -0
  380. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/document_to_markdown.py +0 -0
  381. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_images.py +0 -0
  382. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_text.py +0 -0
  383. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_equations.py +0 -0
  384. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_tables.py +0 -0
  385. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/summarize_document.py +0 -0
  386. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_latex_document.py +0 -0
  387. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_markdown_document.py +0 -0
  388. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_word_document.py +0 -0
  389. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/__init__.py +0 -0
  390. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  391. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  392. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
  393. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
  394. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  395. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  396. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  397. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/result_comparator.py +0 -0
  398. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/simulation_runner.py +0 -0
  399. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  400. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  401. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/__init__.py +0 -0
  402. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/append_file.py +0 -0
  403. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_hash.py +0 -0
  404. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_line_count.py +0 -0
  405. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_metadata.py +0 -0
  406. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_preview.py +0 -0
  407. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/find_large_files.py +0 -0
  408. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/list_directory.py +0 -0
  409. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/read_file.py +0 -0
  410. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/search_files.py +0 -0
  411. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/write_file.py +0 -0
  412. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/__init__.py +0 -0
  413. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  414. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  415. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  416. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
  417. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  418. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/hitl_request.py +0 -0
  419. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/__init__.py +0 -0
  420. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  421. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  422. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
  423. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  424. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  425. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  426. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  427. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  428. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/__init__.py +0 -0
  429. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/calculate_expression.py +0 -0
  430. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/correlation.py +0 -0
  431. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/distribution_summary.py +0 -0
  432. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/histogram.py +0 -0
  433. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/linear_regression.py +0 -0
  434. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/matrix_multiply.py +0 -0
  435. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/mean_std.py +0 -0
  436. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  437. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/polynomial_fit.py +0 -0
  438. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/random_sample.py +0 -0
  439. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/__init__.py +0 -0
  440. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/adapter.py +0 -0
  441. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/client.py +0 -0
  442. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/discovery.py +0 -0
  443. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/__init__.py +0 -0
  444. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/delete_memory.py +0 -0
  445. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/list_memory.py +0 -0
  446. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/search_memory.py +0 -0
  447. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/store_memory.py +0 -0
  448. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/summarize_memory.py +0 -0
  449. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/tag_memory.py +0 -0
  450. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/pipelines.py +0 -0
  451. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/__init__.py +0 -0
  452. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/arxiv_download.py +0 -0
  453. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/arxiv_search.py +0 -0
  454. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/citation_extractor.py +0 -0
  455. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/duckduckgo_search.py +0 -0
  456. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  457. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/paper_summarizer.py +0 -0
  458. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/research_question_generator.py +0 -0
  459. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/topic_cluster.py +0 -0
  460. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/web_search.py +0 -0
  461. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
  462. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/__init__.py +0 -0
  463. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  464. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  465. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  466. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  467. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  468. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  469. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  470. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  471. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  472. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  473. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  474. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  475. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/__init__.py +0 -0
  476. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/report.py +0 -0
  477. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/scorer.py +0 -0
  478. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/selector.py +0 -0
  479. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/store.py +0 -0
  480. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/selector.py +0 -0
  481. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/__init__.py +0 -0
  482. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/cpu_usage.py +0 -0
  483. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/disk_usage.py +0 -0
  484. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/environment_variables.py +0 -0
  485. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/memory_usage.py +0 -0
  486. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/pip_install.py +0 -0
  487. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/pip_search.py +0 -0
  488. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/process_list.py +0 -0
  489. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/python_package_list.py +0 -0
  490. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/run_shell_command.py +0 -0
  491. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/system_info.py +0 -0
  492. {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/tool_runner.py +0 -0
  493. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/__init__.py +0 -0
  494. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/activity_feed_view.py +0 -0
  495. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/adaptive_tasks_view.py +0 -0
  496. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/agent_role_view.py +0 -0
  497. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/app.py +0 -0
  498. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/dashboard_screen.py +0 -0
  499. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/dev_view.py +0 -0
  500. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/inject_screen.py +0 -0
  501. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/knowledge_graph_view.py +0 -0
  502. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/layout.py +0 -0
  503. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/logs_view.py +0 -0
  504. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/memory_view.py +0 -0
  505. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/mission_view.py +0 -0
  506. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/performance_view.py +0 -0
  507. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/reasoning_graph_view.py +0 -0
  508. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/results_view.py +0 -0
  509. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/swarm_view.py +0 -0
  510. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/task_detail_screen.py +0 -0
  511. {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/task_view.py +0 -0
  512. {devsper-2.6.0 → devsper-2.7.0}/devsper/types/event.py +0 -0
  513. {devsper-2.6.0 → devsper-2.7.0}/devsper/types/exceptions.py +0 -0
  514. {devsper-2.6.0 → devsper-2.7.0}/devsper/types/swarm.py +0 -0
  515. {devsper-2.6.0 → devsper-2.7.0}/devsper/types/task.py +0 -0
  516. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/__init__.py +0 -0
  517. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/changelog.py +0 -0
  518. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/cli.py +0 -0
  519. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/installer.py +0 -0
  520. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/notifier.py +0 -0
  521. {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/version_check.py +0 -0
  522. {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/event_logger.py +0 -0
  523. {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/http.py +0 -0
  524. {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/models.py +0 -0
  525. {devsper-2.6.0 → devsper-2.7.0}/devsper/visualization/__init__.py +0 -0
  526. {devsper-2.6.0 → devsper-2.7.0}/devsper/visualization/dag_export.py +0 -0
  527. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/__init__.py +0 -0
  528. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/conditions.py +0 -0
  529. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/context.py +0 -0
  530. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/loader.py +0 -0
  531. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/resolver.py +0 -0
  532. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/runner.py +0 -0
  533. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/schema.py +0 -0
  534. {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/validator.py +0 -0
  535. {devsper-2.6.0 → devsper-2.7.0}/devsper.toml +0 -0
  536. {devsper-2.6.0 → devsper-2.7.0}/docker-compose.yml +0 -0
  537. {devsper-2.6.0 → devsper-2.7.0}/examples/__init__.py +0 -0
  538. {devsper-2.6.0 → devsper-2.7.0}/examples/_common.py +0 -0
  539. {devsper-2.6.0 → devsper-2.7.0}/examples/_config.py +0 -0
  540. {devsper-2.6.0 → devsper-2.7.0}/examples/coding/__init__.py +0 -0
  541. {devsper-2.6.0 → devsper-2.7.0}/examples/coding/analyze_repository.py +0 -0
  542. {devsper-2.6.0 → devsper-2.7.0}/examples/coding/generate_docs.py +0 -0
  543. {devsper-2.6.0 → devsper-2.7.0}/examples/coding/refactor_candidates.py +0 -0
  544. {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/__init__.py +0 -0
  545. {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/dataset_analysis.py +0 -0
  546. {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/run_experiments.py +0 -0
  547. {devsper-2.6.0 → devsper-2.7.0}/examples/demo_swarm.py +0 -0
  548. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/README.md +0 -0
  549. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/controller.toml +0 -0
  550. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/parallel_survey.py +0 -0
  551. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_controller.py +0 -0
  552. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_demo.sh +0 -0
  553. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_worker.py +0 -0
  554. {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/worker.toml +0 -0
  555. {devsper-2.6.0 → devsper-2.7.0}/examples/documents/__init__.py +0 -0
  556. {devsper-2.6.0 → devsper-2.7.0}/examples/documents/analyze_documents.py +0 -0
  557. {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/__init__.py +0 -0
  558. {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/monte_carlo_demo.py +0 -0
  559. {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/parameter_sweep.py +0 -0
  560. {devsper-2.6.0 → devsper-2.7.0}/examples/langchain_agent.py +0 -0
  561. {devsper-2.6.0 → devsper-2.7.0}/examples/langgraph_swarm.py +0 -0
  562. {devsper-2.6.0 → devsper-2.7.0}/examples/research/__init__.py +0 -0
  563. {devsper-2.6.0 → devsper-2.7.0}/examples/research/literature_review.py +0 -0
  564. {devsper-2.6.0 → devsper-2.7.0}/examples/research/research_gap_analysis.py +0 -0
  565. {devsper-2.6.0 → devsper-2.7.0}/examples/research/research_graph.py +0 -0
  566. {devsper-2.6.0 → devsper-2.7.0}/memory_utils.py +0 -0
  567. {devsper-2.6.0 → devsper-2.7.0}/scripts/README.md +0 -0
  568. {devsper-2.6.0 → devsper-2.7.0}/scripts/qa_e2e_stabilization.sh +0 -0
  569. {devsper-2.6.0 → devsper-2.7.0}/scripts/seed_tool_scores.py +0 -0
  570. {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_cli.sh +0 -0
  571. {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_full.sh +0 -0
  572. {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_smoke.py +0 -0
  573. {devsper-2.6.0 → devsper-2.7.0}/scripts/test_v2_router.py +0 -0
  574. {devsper-2.6.0 → devsper-2.7.0}/supermemory-core/Cargo.toml +0 -0
  575. {devsper-2.6.0 → devsper-2.7.0}/supermemory-core/src/main.rs +0 -0
  576. {devsper-2.6.0 → devsper-2.7.0}/tests/agents/__init__.py +0 -0
  577. {devsper-2.6.0 → devsper-2.7.0}/tests/agents/test_roles.py +0 -0
  578. {devsper-2.6.0 → devsper-2.7.0}/tests/benchmarks/test_v16_perf.py +0 -0
  579. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_controller_restart_hitl.py +0 -0
  580. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
  581. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_event_idempotency.py +0 -0
  582. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_event_retry.py +0 -0
  583. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_hitl_pause_resume.py +0 -0
  584. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_sse_reconnect.py +0 -0
  585. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_sse_stream.py +0 -0
  586. {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_worker_crash_recovery.py +0 -0
  587. {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/__init__.py +0 -0
  588. {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_adaptation.py +0 -0
  589. {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_learning_engine.py +0 -0
  590. {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_strategy_selector.py +0 -0
  591. {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_task_optimizer.py +0 -0
  592. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/__init__.py +0 -0
  593. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_agent_memory_integration.py +0 -0
  594. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_context_run_scope.py +0 -0
  595. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_index.py +0 -0
  596. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_router.py +0 -0
  597. {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_store.py +0 -0
  598. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/__init__.py +0 -0
  599. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/fixtures.py +0 -0
  600. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_crypto.py +0 -0
  601. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_heartbeat_eviction.py +0 -0
  602. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_local_pool.py +0 -0
  603. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_org_pool.py +0 -0
  604. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_priority_chain.py +0 -0
  605. {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_rate_limiting.py +0 -0
  606. {devsper-2.6.0 → devsper-2.7.0}/tests/reasoning/__init__.py +0 -0
  607. {devsper-2.6.0 → devsper-2.7.0}/tests/reasoning/test_reasoning_graph.py +0 -0
  608. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/__init__.py +0 -0
  609. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_budget.py +0 -0
  610. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_otel_phase1.py +0 -0
  611. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_packager.py +0 -0
  612. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_protocol_schema.py +0 -0
  613. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_replay.py +0 -0
  614. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_replay_engine.py +0 -0
  615. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_telemetry.py +0 -0
  616. {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_visualize.py +0 -0
  617. {devsper-2.6.0 → devsper-2.7.0}/tests/test_agent.py +0 -0
  618. {devsper-2.6.0 → devsper-2.7.0}/tests/test_analysis.py +0 -0
  619. {devsper-2.6.0 → devsper-2.7.0}/tests/test_analytics.py +0 -0
  620. {devsper-2.6.0 → devsper-2.7.0}/tests/test_auto_model.py +0 -0
  621. {devsper-2.6.0 → devsper-2.7.0}/tests/test_clarification.py +0 -0
  622. {devsper-2.6.0 → devsper-2.7.0}/tests/test_clarification_multinode.py +0 -0
  623. {devsper-2.6.0 → devsper-2.7.0}/tests/test_config_loader.py +0 -0
  624. {devsper-2.6.0 → devsper-2.7.0}/tests/test_credentials.py +0 -0
  625. {devsper-2.6.0 → devsper-2.7.0}/tests/test_cross_boundary_serialization.py +0 -0
  626. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dag_export.py +0 -0
  627. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_agents.py +0 -0
  628. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_build_cmd.py +0 -0
  629. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_debugger.py +0 -0
  630. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_repo_index.py +0 -0
  631. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_sandbox.py +0 -0
  632. {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_scaffold.py +0 -0
  633. {devsper-2.6.0 → devsper-2.7.0}/tests/test_distributed_bugs.py +0 -0
  634. {devsper-2.6.0 → devsper-2.7.0}/tests/test_embeddings_service.py +0 -0
  635. {devsper-2.6.0 → devsper-2.7.0}/tests/test_event_logger.py +0 -0
  636. {devsper-2.6.0 → devsper-2.7.0}/tests/test_execution_graph_meta.py +0 -0
  637. {devsper-2.6.0 → devsper-2.7.0}/tests/test_executor.py +0 -0
  638. {devsper-2.6.0 → devsper-2.7.0}/tests/test_export_runs.py +0 -0
  639. {devsper-2.6.0 → devsper-2.7.0}/tests/test_github_provider.py +0 -0
  640. {devsper-2.6.0 → devsper-2.7.0}/tests/test_init.py +0 -0
  641. {devsper-2.6.0 → devsper-2.7.0}/tests/test_knowledge_graph.py +0 -0
  642. {devsper-2.6.0 → devsper-2.7.0}/tests/test_knowledge_query.py +0 -0
  643. {devsper-2.6.0 → devsper-2.7.0}/tests/test_langchain_adapter.py +0 -0
  644. {devsper-2.6.0 → devsper-2.7.0}/tests/test_langgraph_adapter.py +0 -0
  645. {devsper-2.6.0 → devsper-2.7.0}/tests/test_map_reduce.py +0 -0
  646. {devsper-2.6.0 → devsper-2.7.0}/tests/test_memory_evolution.py +0 -0
  647. {devsper-2.6.0 → devsper-2.7.0}/tests/test_memory_isolation.py +0 -0
  648. {devsper-2.6.0 → devsper-2.7.0}/tests/test_missions.py +0 -0
  649. {devsper-2.6.0 → devsper-2.7.0}/tests/test_model_router.py +0 -0
  650. {devsper-2.6.0 → devsper-2.7.0}/tests/test_planner.py +0 -0
  651. {devsper-2.6.0 → devsper-2.7.0}/tests/test_platform_runtime_events.py +0 -0
  652. {devsper-2.6.0 → devsper-2.7.0}/tests/test_plugins.py +0 -0
  653. {devsper-2.6.0 → devsper-2.7.0}/tests/test_protocols.py +0 -0
  654. {devsper-2.6.0 → devsper-2.7.0}/tests/test_router.py +0 -0
  655. {devsper-2.6.0 → devsper-2.7.0}/tests/test_scheduler.py +0 -0
  656. {devsper-2.6.0 → devsper-2.7.0}/tests/test_speculation.py +0 -0
  657. {devsper-2.6.0 → devsper-2.7.0}/tests/test_strategies.py +0 -0
  658. {devsper-2.6.0 → devsper-2.7.0}/tests/test_swarm.py +0 -0
  659. {devsper-2.6.0 → devsper-2.7.0}/tests/test_task_cache.py +0 -0
  660. {devsper-2.6.0 → devsper-2.7.0}/tests/test_tool_scoring.py +0 -0
  661. {devsper-2.6.0 → devsper-2.7.0}/tests/test_tool_selector.py +0 -0
  662. {devsper-2.6.0 → devsper-2.7.0}/tests/test_upgrade.py +0 -0
  663. {devsper-2.6.0 → devsper-2.7.0}/tests/test_v110.py +0 -0
  664. {devsper-2.6.0 → devsper-2.7.0}/tests/test_v16.py +0 -0
  665. {devsper-2.6.0 → devsper-2.7.0}/tests/test_v17.py +0 -0
  666. {devsper-2.6.0 → devsper-2.7.0}/tests/test_v18.py +0 -0
  667. {devsper-2.6.0 → devsper-2.7.0}/tests/test_v19.py +0 -0
  668. {devsper-2.6.0 → devsper-2.7.0}/tests/test_workflow.py +0 -0
  669. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/__init__.py +0 -0
  670. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_code_intelligence_tools.py +0 -0
  671. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_coding_tools.py +0 -0
  672. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_core_tool_registry.py +0 -0
  673. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_data_science_tools.py +0 -0
  674. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_data_tools.py +0 -0
  675. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_document_tools.py +0 -0
  676. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_experiments_tools.py +0 -0
  677. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_filesystem_tools.py +0 -0
  678. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_flagship_tools.py +0 -0
  679. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_knowledge_tools.py +0 -0
  680. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_math_tools.py +0 -0
  681. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_memory_tools.py +0 -0
  682. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_registry.py +0 -0
  683. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_research_advanced_tools.py +0 -0
  684. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_research_tools.py +0 -0
  685. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_system_tools.py +0 -0
  686. {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_tool_runner.py +0 -0
  687. {devsper-2.6.0 → devsper-2.7.0}/worker/.dockerignore +0 -0
  688. {devsper-2.6.0 → devsper-2.7.0}/worker/Cargo.lock +0 -0
  689. {devsper-2.6.0 → devsper-2.7.0}/worker/Cargo.toml +0 -0
  690. {devsper-2.6.0 → devsper-2.7.0}/worker/Dockerfile +0 -0
  691. {devsper-2.6.0 → devsper-2.7.0}/worker/README.md +0 -0
  692. {devsper-2.6.0 → devsper-2.7.0}/worker/src/budget.rs +0 -0
  693. {devsper-2.6.0 → devsper-2.7.0}/worker/src/bus.rs +0 -0
  694. {devsper-2.6.0 → devsper-2.7.0}/worker/src/claim.rs +0 -0
  695. {devsper-2.6.0 → devsper-2.7.0}/worker/src/clarification.rs +0 -0
  696. {devsper-2.6.0 → devsper-2.7.0}/worker/src/config.rs +0 -0
  697. {devsper-2.6.0 → devsper-2.7.0}/worker/src/controller.rs +0 -0
  698. {devsper-2.6.0 → devsper-2.7.0}/worker/src/election.rs +0 -0
  699. {devsper-2.6.0 → devsper-2.7.0}/worker/src/error.rs +0 -0
  700. {devsper-2.6.0 → devsper-2.7.0}/worker/src/executor.rs +0 -0
  701. {devsper-2.6.0 → devsper-2.7.0}/worker/src/health.rs +0 -0
  702. {devsper-2.6.0 → devsper-2.7.0}/worker/src/heartbeat.rs +0 -0
  703. {devsper-2.6.0 → devsper-2.7.0}/worker/src/lib.rs +0 -0
  704. {devsper-2.6.0 → devsper-2.7.0}/worker/src/main.rs +0 -0
  705. {devsper-2.6.0 → devsper-2.7.0}/worker/src/metrics.rs +0 -0
  706. {devsper-2.6.0 → devsper-2.7.0}/worker/src/reconnect.rs +0 -0
  707. {devsper-2.6.0 → devsper-2.7.0}/worker/src/registry.rs +0 -0
  708. {devsper-2.6.0 → devsper-2.7.0}/worker/src/router.rs +0 -0
  709. {devsper-2.6.0 → devsper-2.7.0}/worker/src/rpc.rs +0 -0
  710. {devsper-2.6.0 → devsper-2.7.0}/worker/src/scheduler.rs +0 -0
  711. {devsper-2.6.0 → devsper-2.7.0}/worker/src/snapshot.rs +0 -0
  712. {devsper-2.6.0 → devsper-2.7.0}/worker/src/telemetry.rs +0 -0
  713. {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/agent.rs +0 -0
  714. {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/event.rs +0 -0
  715. {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/mod.rs +0 -0
  716. {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/node.rs +0 -0
  717. {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/task.rs +0 -0
  718. {devsper-2.6.0 → devsper-2.7.0}/worker/src/worker_node.rs +0 -0
  719. {devsper-2.6.0 → devsper-2.7.0}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.7.0] — 2026-04-07
11
+
12
+ ### Added
13
+
14
+ - **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`.
15
+ - **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.
16
+ - **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.
17
+ - **SQLite, Redis, Vektori, Platform backends** — Existing stores wrapped as `MemoryBackend` implementations with `get_sync_store()` escape hatch for legacy sync callers.
18
+ - **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.
19
+ - **Config schema** — Added `RedisMemoryConfig` and `SnowflakeMemoryConfig` sub-models under `[memory]`. `SnowflakeMemoryConfig` has no `password` field — credentials are credential-store-only.
20
+ - **`devsper doctor` memory provider health check** — `run_doctor()` now calls `provider.health()` and reports the active backend name and status.
21
+ - **`devsper[snowflake]` and `devsper[redis-memory]` extras** — `snowflake-connector-python>=3.6.0` and `redis>=5.0.0` optional dependency groups.
22
+ - **`deregister(name)` in tool registry** — Public function to remove a single tool by name without clearing the whole registry.
23
+ - **`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.
24
+
25
+ ### Changed
26
+
27
+ - **`MemoryRouter` and `MemoryIndex`** accept an optional `backend: MemoryBackend` parameter. The `_build_memory_store()` fallback now calls the factory instead of constructing `MemoryStore()` directly.
28
+ - **`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.
29
+ - **Legacy `backend` values** (`local`, `supermemory`, `hybrid`) now map to `"vektori"` as the default production store.
30
+
31
+ ### Fixed
32
+
33
+ - **`test_pipelines.py`** — Replaced `registry._tools.pop()` (broken module-level access) with new `deregister()` function.
34
+ - **`test_e2e_redis_loop.py`** — Import guard prevents `ModuleNotFoundError` when `redis` is not installed; test now correctly skips instead of failing.
35
+
10
36
  ## [2.6.0] — 2026-04-06
11
37
 
12
38
  ### Added
@@ -82,7 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
82
108
 
83
109
  - **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
110
  - **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.
111
+ - **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
112
  - **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
113
  - **Devsper Cloud CLI** — `devsper cloud login`, `logout`, `run`, `status`, and `logs` for JWT authentication (OS keychain) and runs against the platform API.
88
114
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.6.0
3
+ Version: 2.7.0
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
@@ -68,6 +68,9 @@ Provides-Extra: mcp
68
68
  Requires-Dist: anyio>=4.0; extra == 'mcp'
69
69
  Requires-Dist: httpx>=0.27; extra == 'mcp'
70
70
  Provides-Extra: ollama
71
+ Provides-Extra: redis-memory
72
+ Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
73
+ Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
71
74
  Provides-Extra: research
72
75
  Requires-Dist: duckduckgo-search>=6.0.0; extra == 'research'
73
76
  Provides-Extra: server
@@ -75,6 +78,8 @@ Requires-Dist: fastapi>=0.110; extra == 'server'
75
78
  Requires-Dist: sse-starlette>=2.0; extra == 'server'
76
79
  Requires-Dist: uvicorn>=0.29; extra == 'server'
77
80
  Requires-Dist: vektori>=0.1.1; extra == 'server'
81
+ Provides-Extra: snowflake
82
+ Requires-Dist: snowflake-connector-python>=3.6.0; extra == 'snowflake'
78
83
  Provides-Extra: trulens
79
84
  Requires-Dist: trulens-core>=1.0; extra == 'trulens'
80
85
  Provides-Extra: worker
@@ -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())
@@ -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):
@@ -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,134 @@
1
+ """Process/async context for memory store + namespace (tools + agent execution)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from contextvars import ContextVar, Token
6
+ from typing import TYPE_CHECKING
7
+
8
+ if TYPE_CHECKING:
9
+ pass
10
+
11
+ _current_store: ContextVar[object | None] = ContextVar("devsper_memory_store", default=None)
12
+ _current_namespace: ContextVar[str | None] = ContextVar("devsper_memory_namespace", default=None)
13
+ _current_run_id: ContextVar[str | None] = ContextVar("devsper_memory_run_id", default=None)
14
+
15
+
16
+ def attach_memory_context(
17
+ store: object | None,
18
+ namespace: str | None,
19
+ run_id: str | None = None,
20
+ ) -> tuple[Token[object | None], Token[str | None], Token[str | None]]:
21
+ return (
22
+ _current_store.set(store),
23
+ _current_namespace.set(namespace),
24
+ _current_run_id.set(run_id),
25
+ )
26
+
27
+
28
+ def detach_memory_context(
29
+ tokens: tuple[Token[object | None], Token[str | None], Token[str | None]]
30
+ ) -> None:
31
+ _current_store.reset(tokens[0])
32
+ _current_namespace.reset(tokens[1])
33
+ _current_run_id.reset(tokens[2])
34
+
35
+
36
+ def get_effective_memory_backend():
37
+ """
38
+ Return the active MemoryBackend for the current context.
39
+ Prefers the context-var store (set by attach_memory_context) if it is a MemoryBackend,
40
+ otherwise returns the process-level singleton from the factory.
41
+ """
42
+ s = _current_store.get()
43
+ if s is not None and hasattr(s, "health"):
44
+ return s # it is already a MemoryBackend
45
+ from devsper.memory.providers.factory import get_memory_provider
46
+
47
+ return get_memory_provider()
48
+
49
+
50
+ def get_effective_memory_store():
51
+ """
52
+ Legacy: return a synchronous MemoryStore compatible object.
53
+ Backends that wrap a sync store (sqlite, redis, platform) expose get_sync_store().
54
+ Async-only backends (vektori, snowflake) return an _AsyncBridgeStore shim.
55
+ """
56
+ s = _current_store.get()
57
+ if s is not None and not hasattr(s, "health"):
58
+ # Legacy MemoryStore object set directly via attach_memory_context
59
+ return s
60
+ backend = get_effective_memory_backend()
61
+ if hasattr(backend, "get_sync_store"):
62
+ return backend.get_sync_store()
63
+ # Async-only backend: return a sync bridge so legacy callers still work
64
+ return _AsyncBridgeStore(backend)
65
+
66
+
67
+ class _AsyncBridgeStore:
68
+ """
69
+ Sync shim for async-only backends (VektoriBackend, SnowflakeBackend).
70
+ Runs coroutines via asyncio in a thread so sync callers don't need to be async.
71
+ This mirrors the _run_async() pattern already used in server/memory_utils.py.
72
+ """
73
+
74
+ def __init__(self, backend) -> None:
75
+ self._backend = backend
76
+
77
+ def _run(self, coro):
78
+ import asyncio
79
+
80
+ try:
81
+ loop = asyncio.get_running_loop()
82
+ except RuntimeError:
83
+ loop = None
84
+ if loop and loop.is_running():
85
+ import concurrent.futures
86
+
87
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
88
+ return pool.submit(asyncio.run, coro).result()
89
+ return asyncio.run(coro)
90
+
91
+ def store(self, record, namespace=None):
92
+ return self._run(self._backend.store(record, namespace))
93
+
94
+ def retrieve(self, memory_id, namespace=None):
95
+ try:
96
+ return self._run(self._backend.retrieve(memory_id, namespace))
97
+ except NotImplementedError:
98
+ return None
99
+
100
+ def delete(self, memory_id, namespace=None):
101
+ try:
102
+ return self._run(self._backend.delete(memory_id, namespace))
103
+ except NotImplementedError:
104
+ return False
105
+
106
+ def list_memory(
107
+ self,
108
+ memory_type=None,
109
+ limit=100,
110
+ offset=0,
111
+ tag_contains=None,
112
+ include_archived=False,
113
+ run_id_filter=None,
114
+ namespace=None,
115
+ ):
116
+ return self._run(
117
+ self._backend.list_memory(
118
+ memory_type, limit, offset, tag_contains,
119
+ include_archived, run_id_filter, namespace,
120
+ )
121
+ )
122
+
123
+ def list_all_ids(self, memory_type=None, namespace=None):
124
+ return self._run(self._backend.list_all_ids(memory_type, namespace))
125
+
126
+
127
+ def get_effective_memory_namespace() -> str | None:
128
+ """Active namespace for tool memory ops (None = legacy global/run default)."""
129
+ return _current_namespace.get()
130
+
131
+
132
+ def get_effective_run_id() -> str | None:
133
+ """Active run id for shared memory scope."""
134
+ return _current_run_id.get()
@@ -2,11 +2,18 @@
2
2
  Semantic search across stored memory via embeddings and top_k retrieval.
3
3
  """
4
4
 
5
+ from __future__ import annotations
6
+
7
+ from typing import TYPE_CHECKING
8
+
5
9
  from devsper.memory.embeddings import embed_text
6
10
  from devsper.memory.memory_store import MemoryStore
7
11
  from devsper.memory.memory_types import MemoryRecord
8
12
  from devsper.memory.supermemory_rust_ranker import rank_memories
9
13
 
14
+ if TYPE_CHECKING:
15
+ from devsper.memory.providers.base import MemoryBackend
16
+
10
17
 
11
18
  def _cosine_sim(a: list[float], b: list[float]) -> float:
12
19
  if not a or not b or len(a) != len(b):
@@ -19,14 +26,45 @@ def _cosine_sim(a: list[float], b: list[float]) -> float:
19
26
  return dot / (na * nb)
20
27
 
21
28
 
29
+ def _run_async_in_thread(coro):
30
+ """Run a coroutine synchronously, safely bridging from sync context."""
31
+ import asyncio
32
+ import concurrent.futures
33
+
34
+ try:
35
+ loop = asyncio.get_running_loop()
36
+ except RuntimeError:
37
+ loop = None
38
+ if loop and loop.is_running():
39
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
40
+ return pool.submit(asyncio.run, coro).result()
41
+ return asyncio.run(coro)
42
+
43
+
22
44
  class MemoryIndex:
23
45
  """
24
46
  Vector search over memory. Uses store for persistence and optional
25
47
  embeddings on records for query_memory(text, top_k).
48
+
49
+ When a MemoryBackend with supports_native_vector_search=True is provided,
50
+ query_memory() and query_across_runs() delegate to the backend's native
51
+ vector search (e.g. Snowflake VECTOR_COSINE_SIMILARITY, pgvector <=>),
52
+ bypassing in-process cosine ranking.
26
53
  """
27
54
 
28
- def __init__(self, store: MemoryStore | None = None, ranking_backend: str = "local") -> None:
29
- self.store = store or MemoryStore()
55
+ def __init__(
56
+ self,
57
+ store: MemoryStore | None = None,
58
+ ranking_backend: str = "local",
59
+ backend: "MemoryBackend | None" = None,
60
+ ) -> None:
61
+ self._backend = backend
62
+ if store is not None:
63
+ self.store = store
64
+ elif backend is not None and hasattr(backend, "get_sync_store"):
65
+ self.store = backend.get_sync_store()
66
+ else:
67
+ self.store = store or MemoryStore()
30
68
  self.ranking_backend = ranking_backend
31
69
 
32
70
  def query_memory(
@@ -39,6 +77,7 @@ class MemoryIndex:
39
77
  ) -> list[MemoryRecord]:
40
78
  """
41
79
  Semantic search via ranking strategy:
80
+ - native (vektori/snowflake): delegates to backend.query_similar() directly.
42
81
  - local (default): embed query, cosine-rank records that have embeddings.
43
82
  - supermemory: hybrid local ranking (lexical token overlap + optional embedding
44
83
  cosine similarity) using `rank_memories()`; records without embeddings can
@@ -48,6 +87,22 @@ class MemoryIndex:
48
87
  Use min_similarity > 0 (e.g. 0.45) to avoid injecting barely-related memory.
49
88
  By default excludes archived records (consolidation).
50
89
  """
90
+ # Fast path: delegate to native vector search when supported
91
+ if self._backend is not None and self._backend.supports_native_vector_search:
92
+ try:
93
+ from devsper.memory.providers.base import MemoryQuery
94
+
95
+ query = MemoryQuery(
96
+ text=text,
97
+ top_k=top_k,
98
+ min_similarity=min_similarity,
99
+ namespace=namespace,
100
+ include_archived=include_archived,
101
+ )
102
+ return _run_async_in_thread(self._backend.query_similar(query))
103
+ except Exception:
104
+ pass # fall through to in-process ranking
105
+
51
106
  records = self.store.list_memory(
52
107
  limit=500, include_archived=include_archived, namespace=namespace
53
108
  )
@@ -112,6 +167,22 @@ class MemoryIndex:
112
167
  v1.8: Same as query_memory but over more records (all runs), optional run_id filter.
113
168
  Used by CrossRunSynthesizer. Excludes archived by default.
114
169
  """
170
+ # Fast path: delegate to native vector search when supported
171
+ if self._backend is not None and self._backend.supports_native_vector_search:
172
+ try:
173
+ from devsper.memory.providers.base import MemoryQuery
174
+
175
+ query = MemoryQuery(
176
+ text=text,
177
+ top_k=top_k,
178
+ min_similarity=min_similarity,
179
+ namespace=namespace,
180
+ include_archived=include_archived,
181
+ )
182
+ return _run_async_in_thread(self._backend.query_similar(query))
183
+ except Exception:
184
+ pass # fall through to in-process ranking
185
+
115
186
  records = self.store.list_memory(
116
187
  limit=2000,
117
188
  include_archived=include_archived,
@@ -2,10 +2,17 @@
2
2
  Memory router: determine which memories are relevant to a task and return context for the agent.
3
3
  """
4
4
 
5
+ from __future__ import annotations
6
+
7
+ from typing import TYPE_CHECKING
8
+
5
9
  from devsper.memory.memory_index import MemoryIndex
6
10
  from devsper.memory.memory_store import MemoryStore
7
11
  from devsper.memory.memory_types import MemoryRecord
8
12
 
13
+ if TYPE_CHECKING:
14
+ from devsper.memory.providers.base import MemoryBackend
15
+
9
16
 
10
17
  class MemoryRouter:
11
18
  """
@@ -22,8 +29,16 @@ class MemoryRouter:
22
29
  min_similarity: float = 0.55,
23
30
  default_namespace: str | None = None,
24
31
  ranking_backend: str | None = None,
32
+ backend: "MemoryBackend | None" = None,
25
33
  ) -> None:
26
- self.store = store or _build_memory_store()
34
+ # Resolve the sync store from whichever source is provided
35
+ if backend is not None:
36
+ self.store = _sync_store_from_backend(backend)
37
+ elif store is not None:
38
+ self.store = store
39
+ else:
40
+ self.store = _build_memory_store()
41
+
27
42
  # Ranking backend only affects retrieval/ranking; persistence remains store-backed.
28
43
  try:
29
44
  from devsper.config import get_config
@@ -101,20 +116,27 @@ class MemoryRouter:
101
116
  return "\n".join(lines) if lines else ""
102
117
 
103
118
 
104
- def _build_memory_store() -> MemoryStore:
105
- try:
106
- from devsper.config import get_config
119
+ def _sync_store_from_backend(backend: "MemoryBackend"):
120
+ """
121
+ Return a sync-compatible store from a MemoryBackend.
122
+ Backends with get_sync_store() (sqlite, redis, platform) return their underlying store.
123
+ Async-only backends (vektori, snowflake) return an _AsyncBridgeStore shim.
124
+ """
125
+ if hasattr(backend, "get_sync_store"):
126
+ return backend.get_sync_store()
127
+ from devsper.memory.context import _AsyncBridgeStore
107
128
 
108
- cfg = get_config()
109
- backend = getattr(cfg.memory, "backend", "local")
110
- if backend == "platform":
111
- # Lazy import so local-only memory backends don't require optional HTTP deps.
112
- from devsper.memory.platform_memory import PlatformMemoryStore
129
+ return _AsyncBridgeStore(backend)
113
130
 
114
- return PlatformMemoryStore(
115
- base_url=getattr(cfg.memory, "platform_api_url", ""),
116
- org_slug=getattr(cfg.memory, "platform_org_slug", ""),
117
- )
131
+
132
+ def _build_memory_store():
133
+ """Build the default memory store via the provider factory."""
134
+ try:
135
+ from devsper.memory.providers.factory import get_memory_provider
136
+
137
+ backend = get_memory_provider()
138
+ return _sync_store_from_backend(backend)
118
139
  except Exception:
119
140
  pass
141
+ # Hard fallback: bare SQLite
120
142
  return MemoryStore()
@@ -0,0 +1,5 @@
1
+ """Memory provider abstraction — analogous to devsper/providers/router/."""
2
+
3
+ from devsper.memory.providers.base import MemoryBackend, MemoryQuery
4
+
5
+ __all__ = ["MemoryBackend", "MemoryQuery"]
@@ -0,0 +1 @@
1
+ """Concrete MemoryBackend implementations."""
@@ -0,0 +1,74 @@
1
+ """
2
+ PlatformBackend: wraps PlatformMemoryStore for users with backend = "platform".
3
+
4
+ Preserves existing behavior for the platform API memory path.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ from typing import TYPE_CHECKING
11
+
12
+ from devsper.memory.providers.base import MemoryBackend, MemoryQuery
13
+
14
+ if TYPE_CHECKING:
15
+ from devsper.memory.platform_memory import PlatformMemoryStore
16
+ from devsper.memory.memory_types import MemoryRecord, MemoryType
17
+
18
+
19
+ class PlatformBackend(MemoryBackend):
20
+ """Remote platform API memory store. Preserves backend = 'platform' behavior."""
21
+
22
+ def __init__(self, base_url: str = "", org_slug: str = "") -> None:
23
+ from devsper.memory.platform_memory import PlatformMemoryStore
24
+
25
+ self._store = PlatformMemoryStore(base_url=base_url, org_slug=org_slug)
26
+
27
+ @property
28
+ def name(self) -> str:
29
+ return "platform"
30
+
31
+ def get_sync_store(self) -> "PlatformMemoryStore":
32
+ return self._store
33
+
34
+ async def store(self, record: "MemoryRecord", namespace: str | None = None) -> str:
35
+ return await asyncio.to_thread(self._store.store, record, namespace)
36
+
37
+ async def retrieve(self, memory_id: str, namespace: str | None = None) -> "MemoryRecord | None":
38
+ return await asyncio.to_thread(self._store.retrieve, memory_id, namespace)
39
+
40
+ async def delete(self, memory_id: str, namespace: str | None = None) -> bool:
41
+ return await asyncio.to_thread(self._store.delete, memory_id, namespace)
42
+
43
+ async def list_memory(
44
+ self,
45
+ memory_type: "MemoryType | None" = None,
46
+ limit: int = 100,
47
+ offset: int = 0,
48
+ tag_contains: str | None = None,
49
+ include_archived: bool = False,
50
+ run_id_filter: str | None = None,
51
+ namespace: str | None = None,
52
+ ) -> "list[MemoryRecord]":
53
+ return await asyncio.to_thread(
54
+ self._store.list_memory,
55
+ memory_type, limit, offset, tag_contains,
56
+ include_archived, run_id_filter, namespace,
57
+ )
58
+
59
+ async def list_all_ids(
60
+ self,
61
+ memory_type: "MemoryType | None" = None,
62
+ namespace: str | None = None,
63
+ ) -> list[str]:
64
+ return await asyncio.to_thread(self._store.list_all_ids, memory_type, namespace)
65
+
66
+ async def query_similar(self, query: MemoryQuery) -> "list[MemoryRecord]":
67
+ return []
68
+
69
+ async def health(self) -> bool:
70
+ try:
71
+ await asyncio.to_thread(self._store.list_memory, None, 1)
72
+ return True
73
+ except Exception:
74
+ return False