devsper 2.4.1__tar.gz → 2.5.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 (712) hide show
  1. {devsper-2.4.1 → devsper-2.5.0}/CHANGELOG.md +6 -0
  2. {devsper-2.4.1 → devsper-2.5.0}/PKG-INFO +28 -1
  3. {devsper-2.4.1 → devsper-2.5.0}/README.md +24 -0
  4. devsper-2.5.0/devsper/contracts/__init__.py +5 -0
  5. devsper-2.5.0/devsper/contracts/platform_event_type.py +68 -0
  6. devsper-2.5.0/devsper/debug_events.py +38 -0
  7. {devsper-2.4.1 → devsper-2.5.0}/devsper/docs/architecture/execution-model.md +1 -1
  8. devsper-2.5.0/devsper/integrations/__init__.py +34 -0
  9. devsper-2.5.0/devsper/integrations/langchain_adapter.py +80 -0
  10. devsper-2.5.0/devsper/integrations/langgraph_adapter.py +151 -0
  11. devsper-2.5.0/devsper/platform/__init__.py +1 -0
  12. devsper-2.5.0/devsper/platform/run_context.py +53 -0
  13. {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/runtime_events.py +46 -19
  14. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/execution_graph.py +58 -4
  15. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/executor.py +77 -10
  16. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/task_runner.py +31 -2
  17. devsper-2.5.0/devsper/server/memory_utils.py +475 -0
  18. devsper-2.5.0/devsper/server/swarmworker.py +786 -0
  19. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/swarm.py +26 -5
  20. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/client.py +47 -19
  21. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/discovery.py +12 -1
  22. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/tool_runner.py +28 -2
  23. {devsper-2.4.1 → devsper-2.5.0}/devsper/types/event.py +9 -0
  24. {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/event_logger.py +10 -0
  25. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/loader.py +1 -1
  26. {devsper-2.4.1 → devsper-2.5.0}/devsper.toml +8 -3
  27. devsper-2.5.0/examples/langchain_agent.py +70 -0
  28. devsper-2.5.0/examples/langgraph_swarm.py +83 -0
  29. devsper-2.5.0/memory_utils.py +10 -0
  30. {devsper-2.4.1 → devsper-2.5.0}/pyproject.toml +4 -2
  31. devsper-2.5.0/scripts/qa_e2e_stabilization.sh +15 -0
  32. devsper-2.5.0/tests/test_execution_graph_meta.py +31 -0
  33. devsper-2.5.0/tests/test_langchain_adapter.py +24 -0
  34. devsper-2.5.0/tests/test_langgraph_adapter.py +63 -0
  35. devsper-2.5.0/tests/test_platform_runtime_events.py +66 -0
  36. {devsper-2.4.1 → devsper-2.5.0}/uv.lock +21 -2
  37. devsper-2.4.1/devsper/platform/__init__.py +0 -6
  38. devsper-2.4.1/devsper/server/swarmworker.py +0 -215
  39. devsper-2.4.1/requirements-docs.txt +0 -4
  40. devsper-2.4.1/tests/test_platform_runtime_events.py +0 -37
  41. {devsper-2.4.1 → devsper-2.5.0}/.env.example +0 -0
  42. {devsper-2.4.1 → devsper-2.5.0}/.github/FUNDING.yml +0 -0
  43. {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/pypi-publish.yml +0 -0
  44. {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/release-on-tag.yml +0 -0
  45. {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/worker-release.yml +0 -0
  46. {devsper-2.4.1 → devsper-2.5.0}/.gitignore +0 -0
  47. {devsper-2.4.1 → devsper-2.5.0}/.python-version +0 -0
  48. {devsper-2.4.1 → devsper-2.5.0}/CODE_OF_CONDUCT.md +0 -0
  49. {devsper-2.4.1 → devsper-2.5.0}/CONTRIBUTING.md +0 -0
  50. {devsper-2.4.1 → devsper-2.5.0}/Cargo.lock +0 -0
  51. {devsper-2.4.1 → devsper-2.5.0}/Cargo.toml +0 -0
  52. {devsper-2.4.1 → devsper-2.5.0}/Dockerfile.local-pool +0 -0
  53. {devsper-2.4.1 → devsper-2.5.0}/LICENSE +0 -0
  54. {devsper-2.4.1 → devsper-2.5.0}/SECURITY.md +0 -0
  55. {devsper-2.4.1 → devsper-2.5.0}/benchmarks/__init__.py +0 -0
  56. {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_dataset_analysis.py +0 -0
  57. {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_repository_analysis.py +0 -0
  58. {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_research_pipeline.py +0 -0
  59. {devsper-2.4.1 → devsper-2.5.0}/branding/logo.svg +0 -0
  60. {devsper-2.4.1 → devsper-2.5.0}/devsper/README.md +0 -0
  61. {devsper-2.4.1 → devsper-2.5.0}/devsper/__init__.py +0 -0
  62. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/__init__.py +0 -0
  63. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/client.py +0 -0
  64. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/discovery.py +0 -0
  65. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/server.py +0 -0
  66. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/tool_adapter.py +0 -0
  67. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/types.py +0 -0
  68. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/agent.py +0 -0
  69. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/critic.py +0 -0
  70. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/identity.py +0 -0
  71. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/message_bus.py +0 -0
  72. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/registry.py +0 -0
  73. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/roles.py +0 -0
  74. {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/run_agent.py +0 -0
  75. {devsper-2.4.1 → devsper-2.5.0}/devsper/analytics/__init__.py +0 -0
  76. {devsper-2.4.1 → devsper-2.5.0}/devsper/analytics/tool_analytics.py +0 -0
  77. {devsper-2.4.1 → devsper-2.5.0}/devsper/audit/__init__.py +0 -0
  78. {devsper-2.4.1 → devsper-2.5.0}/devsper/audit/logger.py +0 -0
  79. {devsper-2.4.1 → devsper-2.5.0}/devsper/budget.py +0 -0
  80. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/__init__.py +0 -0
  81. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/__init__.py +0 -0
  82. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/base.py +0 -0
  83. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/memory.py +0 -0
  84. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/redis.py +0 -0
  85. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/message.py +0 -0
  86. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/schema_version.py +0 -0
  87. {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/topics.py +0 -0
  88. {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/__init__.py +0 -0
  89. {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/embedding_index.py +0 -0
  90. {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/hashing.py +0 -0
  91. {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/store.py +0 -0
  92. {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/task_cache.py +0 -0
  93. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/__init__.py +0 -0
  94. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/commands/cloud.py +0 -0
  95. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/export.py +0 -0
  96. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/github_oauth.py +0 -0
  97. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/init.py +0 -0
  98. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/main.py +0 -0
  99. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/run_progress.py +0 -0
  100. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/__init__.py +0 -0
  101. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/components.py +0 -0
  102. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/controller_run_view.py +0 -0
  103. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/errors.py +0 -0
  104. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/logging.py +0 -0
  105. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/onboarding.py +0 -0
  106. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/progress.py +0 -0
  107. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/run_view.py +0 -0
  108. {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/theme.py +0 -0
  109. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/__init__.py +0 -0
  110. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/election.py +0 -0
  111. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/local.py +0 -0
  112. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/node_info.py +0 -0
  113. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/registry.py +0 -0
  114. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/router.py +0 -0
  115. {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/state_backend.py +0 -0
  116. {devsper-2.4.1 → devsper-2.5.0}/devsper/compliance/__init__.py +0 -0
  117. {devsper-2.4.1 → devsper-2.5.0}/devsper/compliance/pii.py +0 -0
  118. {devsper-2.4.1 → devsper-2.5.0}/devsper/config/__init__.py +0 -0
  119. {devsper-2.4.1 → devsper-2.5.0}/devsper/config/config_loader.py +0 -0
  120. {devsper-2.4.1 → devsper-2.5.0}/devsper/config/defaults.py +0 -0
  121. {devsper-2.4.1 → devsper-2.5.0}/devsper/config/resolver.py +0 -0
  122. {devsper-2.4.1 → devsper-2.5.0}/devsper/config/schema.py +0 -0
  123. {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/__init__.py +0 -0
  124. {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/base.py +0 -0
  125. {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/registry.py +0 -0
  126. {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/sample_connector.py +0 -0
  127. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/__init__.py +0 -0
  128. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/agent/__init__.py +0 -0
  129. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/agent/runner.py +0 -0
  130. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/hitl/__init__.py +0 -0
  131. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/hitl/state_machine.py +0 -0
  132. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/memory/__init__.py +0 -0
  133. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/memory/shared_memory.py +0 -0
  134. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/reporting/__init__.py +0 -0
  135. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/reporting/publisher.py +0 -0
  136. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/__init__.py +0 -0
  137. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/durability.py +0 -0
  138. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/orchestrator.py +0 -0
  139. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/__init__.py +0 -0
  140. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/base_tool.py +0 -0
  141. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/loader.py +0 -0
  142. {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/registry.py +0 -0
  143. {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/__init__.py +0 -0
  144. {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/cli.py +0 -0
  145. {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/migration.py +0 -0
  146. {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/store.py +0 -0
  147. {devsper-2.4.1 → devsper-2.5.0}/devsper/dashboard/__init__.py +0 -0
  148. {devsper-2.4.1 → devsper-2.5.0}/devsper/dashboard/dashboard.py +0 -0
  149. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/__init__.py +0 -0
  150. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/builder.py +0 -0
  151. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/debugger.py +0 -0
  152. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/repo_index.py +0 -0
  153. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/sandbox.py +0 -0
  154. {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/scaffold.py +0 -0
  155. {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/__init__.py +0 -0
  156. {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/controller.py +0 -0
  157. {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/worker_runtime.py +0 -0
  158. {devsper-2.4.1 → devsper-2.5.0}/devsper/embeddings/__init__.py +0 -0
  159. {devsper-2.4.1 → devsper-2.5.0}/devsper/embeddings/service.py +0 -0
  160. {devsper-2.4.1 → devsper-2.5.0}/devsper/events.py +0 -0
  161. {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/__init__.py +0 -0
  162. {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/decision_tree.py +0 -0
  163. {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/rationale.py +0 -0
  164. {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/simulation.py +0 -0
  165. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/__init__.py +0 -0
  166. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/branding.py +0 -0
  167. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/collector.py +0 -0
  168. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/manifest.py +0 -0
  169. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/model.py +0 -0
  170. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/packager.py +0 -0
  171. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/pdf.py +0 -0
  172. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/service.py +0 -0
  173. {devsper-2.4.1 → devsper-2.5.0}/devsper/export/writers.py +0 -0
  174. {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/__init__.py +0 -0
  175. {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/approval.py +0 -0
  176. {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/escalation.py +0 -0
  177. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/__init__.py +0 -0
  178. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/adaptation.py +0 -0
  179. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/__init__.py +0 -0
  180. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/analyzer.py +0 -0
  181. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  182. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/formatter.py +0 -0
  183. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/run_report.py +0 -0
  184. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/learning_engine.py +0 -0
  185. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/__init__.py +0 -0
  186. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/base.py +0 -0
  187. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  188. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  189. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  190. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  191. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
  192. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategy_selector.py +0 -0
  193. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/synthesis.py +0 -0
  194. {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/task_optimizer.py +0 -0
  195. {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/__init__.py +0 -0
  196. {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/extractor.py +0 -0
  197. {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/knowledge_graph.py +0 -0
  198. {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/query.py +0 -0
  199. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/__init__.py +0 -0
  200. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/consolidation.py +0 -0
  201. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/context.py +0 -0
  202. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/embeddings.py +0 -0
  203. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_index.py +0 -0
  204. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_router.py +0 -0
  205. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_store.py +0 -0
  206. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_types.py +0 -0
  207. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/namespaces.py +0 -0
  208. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/platform_memory.py +0 -0
  209. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/redis_memory.py +0 -0
  210. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/scoring.py +0 -0
  211. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/store.py +0 -0
  212. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/summarizer.py +0 -0
  213. {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
  214. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/__init__.py +0 -0
  215. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/base_agent.py +0 -0
  216. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/__init__.py +0 -0
  217. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/architect_agent.py +0 -0
  218. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/coder_agent.py +0 -0
  219. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/debugger_agent.py +0 -0
  220. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/docs_agent.py +0 -0
  221. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/tester_agent.py +0 -0
  222. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/iteration_loop.py +0 -0
  223. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_memory.py +0 -0
  224. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_planner.py +0 -0
  225. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_runner.py +0 -0
  226. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/models.py +0 -0
  227. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/__init__.py +0 -0
  228. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/editor_agent.py +0 -0
  229. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/researcher_agent.py +0 -0
  230. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/reviewer_agent.py +0 -0
  231. {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/writer_agent.py +0 -0
  232. {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/__init__.py +0 -0
  233. {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/controller.py +0 -0
  234. {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/rpc.py +0 -0
  235. {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/single.py +0 -0
  236. {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/worker.py +0 -0
  237. {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/__init__.py +0 -0
  238. {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/meta_planner.py +0 -0
  239. {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/priority_queue.py +0 -0
  240. {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/redis_results_sink.py +0 -0
  241. {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/reporter.py +0 -0
  242. {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/request_builder.py +0 -0
  243. {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/__init__.py +0 -0
  244. {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/marketplace/__init__.py +0 -0
  245. {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/plugin_loader.py +0 -0
  246. {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/plugin_registry.py +0 -0
  247. {devsper-2.4.1 → devsper-2.5.0}/devsper/policy/client.py +0 -0
  248. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/__init__.py +0 -0
  249. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/config.py +0 -0
  250. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/crypto.py +0 -0
  251. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/local_pool.py +0 -0
  252. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/manager.py +0 -0
  253. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/models.py +0 -0
  254. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/org_pool.py +0 -0
  255. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/dev.toml +0 -0
  256. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/local.toml +0 -0
  257. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/prod.toml +0 -0
  258. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/security.py +0 -0
  259. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/store.py +0 -0
  260. {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/worker_runner.py +0 -0
  261. {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/__init__.py +0 -0
  262. {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/client.py +0 -0
  263. {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/schema.py +0 -0
  264. {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/server.py +0 -0
  265. {devsper-2.4.1 → devsper-2.5.0}/devsper/protocols/__init__.py +0 -0
  266. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/__init__.py +0 -0
  267. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/anthropic.py +0 -0
  268. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/base.py +0 -0
  269. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/complexity_router.py +0 -0
  270. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/gemini.py +0 -0
  271. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/github.py +0 -0
  272. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/model_router.py +0 -0
  273. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/openai.py +0 -0
  274. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/__init__.py +0 -0
  275. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/__init__.py +0 -0
  276. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  277. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/custom_backend.py +0 -0
  278. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
  279. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/github_backend.py +0 -0
  280. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
  281. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/openai_backend.py +0 -0
  282. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
  283. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/base.py +0 -0
  284. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/factory.py +0 -0
  285. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/legacy.py +0 -0
  286. {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/router.py +0 -0
  287. {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/__init__.py +0 -0
  288. {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/graph.py +0 -0
  289. {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/nodes.py +0 -0
  290. {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/store.py +0 -0
  291. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/__init__.py +0 -0
  292. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/agent_pool.py +0 -0
  293. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/agent_runner.py +0 -0
  294. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/clarification_manager.py +0 -0
  295. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/event_stream.py +0 -0
  296. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/health.py +0 -0
  297. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/hitl.py +0 -0
  298. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/model_router.py +0 -0
  299. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/planner.py +0 -0
  300. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/replay.py +0 -0
  301. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/replay_engine.py +0 -0
  302. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/retry.py +0 -0
  303. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/run_history.py +0 -0
  304. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/speculative_planner.py +0 -0
  305. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/state_manager.py +0 -0
  306. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/task_state.py +0 -0
  307. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/telemetry.py +0 -0
  308. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/tool_runner.py +0 -0
  309. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/trace_tree.py +0 -0
  310. {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/visualize.py +0 -0
  311. {devsper-2.4.1 → devsper-2.5.0}/devsper/sandbox/__init__.py +0 -0
  312. {devsper-2.4.1 → devsper-2.5.0}/devsper/sandbox/sandbox.py +0 -0
  313. {devsper-2.4.1 → devsper-2.5.0}/devsper/server/__init__.py +0 -0
  314. {devsper-2.4.1 → devsper-2.5.0}/devsper/server/events.py +0 -0
  315. {devsper-2.4.1 → devsper-2.5.0}/devsper/server/topology.py +0 -0
  316. {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/__init__.py +0 -0
  317. {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/uploads/__init__.py +0 -0
  318. {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/uploads/store.py +0 -0
  319. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/checkpointer.py +0 -0
  320. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/executor.py +0 -0
  321. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/map_reduce.py +0 -0
  322. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/planner.py +0 -0
  323. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/prefetcher.py +0 -0
  324. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/scheduler.py +0 -0
  325. {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/speculation.py +0 -0
  326. {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/__init__.py +0 -0
  327. {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/otel.py +0 -0
  328. {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/pricing.py +0 -0
  329. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/__init__.py +0 -0
  330. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/base.py +0 -0
  331. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/__init__.py +0 -0
  332. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  333. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  334. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  335. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  336. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  337. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  338. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  339. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  340. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  341. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  342. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  343. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/__init__.py +0 -0
  344. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  345. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
  346. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/extract_functions.py +0 -0
  347. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/format_python.py +0 -0
  348. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/generate_docstrings.py +0 -0
  349. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
  350. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/lint_python.py +0 -0
  351. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/refactor_function.py +0 -0
  352. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/repo_structure_map.py +0 -0
  353. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/run_python.py +0 -0
  354. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/__init__.py +0 -0
  355. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/column_type_detection.py +0 -0
  356. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/csv_summary.py +0 -0
  357. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_filter.py +0 -0
  358. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_groupby.py +0 -0
  359. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_stats.py +0 -0
  360. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataset_sampling.py +0 -0
  361. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataset_schema.py +0 -0
  362. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/json_pretty_print.py +0 -0
  363. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/json_query.py +0 -0
  364. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/missing_value_report.py +0 -0
  365. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/__init__.py +0 -0
  366. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  367. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  368. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  369. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  370. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  371. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_profile.py +0 -0
  372. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  373. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  374. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  375. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/model_input_validator.py +0 -0
  376. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  377. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/__init__.py +0 -0
  378. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/fetch_url.py +0 -0
  379. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/python_exec.py +0 -0
  380. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/read_csv.py +0 -0
  381. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/upload_file.py +0 -0
  382. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/web_search.py +0 -0
  383. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/__init__.py +0 -0
  384. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/_docproc.py +0 -0
  385. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/document_to_markdown.py +0 -0
  386. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_document_images.py +0 -0
  387. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_document_text.py +0 -0
  388. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_equations.py +0 -0
  389. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_tables.py +0 -0
  390. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/summarize_document.py +0 -0
  391. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_latex_document.py +0 -0
  392. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_markdown_document.py +0 -0
  393. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_word_document.py +0 -0
  394. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/__init__.py +0 -0
  395. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  396. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  397. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
  398. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
  399. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  400. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  401. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  402. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/result_comparator.py +0 -0
  403. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/simulation_runner.py +0 -0
  404. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  405. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  406. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/__init__.py +0 -0
  407. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/append_file.py +0 -0
  408. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_hash.py +0 -0
  409. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_line_count.py +0 -0
  410. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_metadata.py +0 -0
  411. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_preview.py +0 -0
  412. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/find_large_files.py +0 -0
  413. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/list_directory.py +0 -0
  414. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/read_file.py +0 -0
  415. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/search_files.py +0 -0
  416. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/write_file.py +0 -0
  417. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/__init__.py +0 -0
  418. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  419. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  420. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  421. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
  422. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  423. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/hitl_request.py +0 -0
  424. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/__init__.py +0 -0
  425. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  426. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  427. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
  428. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  429. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  430. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  431. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  432. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  433. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/__init__.py +0 -0
  434. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/calculate_expression.py +0 -0
  435. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/correlation.py +0 -0
  436. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/distribution_summary.py +0 -0
  437. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/histogram.py +0 -0
  438. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/linear_regression.py +0 -0
  439. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/matrix_multiply.py +0 -0
  440. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/mean_std.py +0 -0
  441. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  442. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/polynomial_fit.py +0 -0
  443. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/random_sample.py +0 -0
  444. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/__init__.py +0 -0
  445. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/adapter.py +0 -0
  446. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/__init__.py +0 -0
  447. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/delete_memory.py +0 -0
  448. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/list_memory.py +0 -0
  449. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/search_memory.py +0 -0
  450. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/store_memory.py +0 -0
  451. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/summarize_memory.py +0 -0
  452. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/tag_memory.py +0 -0
  453. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/pipelines.py +0 -0
  454. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/registry.py +0 -0
  455. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/__init__.py +0 -0
  456. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/arxiv_download.py +0 -0
  457. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/arxiv_search.py +0 -0
  458. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/citation_extractor.py +0 -0
  459. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/duckduckgo_search.py +0 -0
  460. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  461. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/paper_summarizer.py +0 -0
  462. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/research_question_generator.py +0 -0
  463. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/topic_cluster.py +0 -0
  464. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/web_search.py +0 -0
  465. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
  466. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/__init__.py +0 -0
  467. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  468. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  469. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  470. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  471. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  472. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  473. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  474. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  475. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  476. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  477. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  478. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  479. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/__init__.py +0 -0
  480. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/report.py +0 -0
  481. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/scorer.py +0 -0
  482. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/selector.py +0 -0
  483. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/store.py +0 -0
  484. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/selector.py +0 -0
  485. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/__init__.py +0 -0
  486. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/cpu_usage.py +0 -0
  487. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/disk_usage.py +0 -0
  488. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/environment_variables.py +0 -0
  489. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/memory_usage.py +0 -0
  490. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/pip_install.py +0 -0
  491. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/pip_search.py +0 -0
  492. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/process_list.py +0 -0
  493. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/python_package_list.py +0 -0
  494. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/run_shell_command.py +0 -0
  495. {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/system_info.py +0 -0
  496. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/__init__.py +0 -0
  497. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/activity_feed_view.py +0 -0
  498. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/adaptive_tasks_view.py +0 -0
  499. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/agent_role_view.py +0 -0
  500. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/app.py +0 -0
  501. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/dashboard_screen.py +0 -0
  502. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/dev_view.py +0 -0
  503. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/inject_screen.py +0 -0
  504. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/knowledge_graph_view.py +0 -0
  505. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/layout.py +0 -0
  506. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/logs_view.py +0 -0
  507. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/memory_view.py +0 -0
  508. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/mission_view.py +0 -0
  509. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/performance_view.py +0 -0
  510. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/reasoning_graph_view.py +0 -0
  511. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/results_view.py +0 -0
  512. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/swarm_view.py +0 -0
  513. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/task_detail_screen.py +0 -0
  514. {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/task_view.py +0 -0
  515. {devsper-2.4.1 → devsper-2.5.0}/devsper/types/exceptions.py +0 -0
  516. {devsper-2.4.1 → devsper-2.5.0}/devsper/types/swarm.py +0 -0
  517. {devsper-2.4.1 → devsper-2.5.0}/devsper/types/task.py +0 -0
  518. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/__init__.py +0 -0
  519. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/changelog.py +0 -0
  520. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/cli.py +0 -0
  521. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/installer.py +0 -0
  522. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/notifier.py +0 -0
  523. {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/version_check.py +0 -0
  524. {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/http.py +0 -0
  525. {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/models.py +0 -0
  526. {devsper-2.4.1 → devsper-2.5.0}/devsper/visualization/__init__.py +0 -0
  527. {devsper-2.4.1 → devsper-2.5.0}/devsper/visualization/dag_export.py +0 -0
  528. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/__init__.py +0 -0
  529. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/conditions.py +0 -0
  530. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/context.py +0 -0
  531. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/resolver.py +0 -0
  532. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/runner.py +0 -0
  533. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/schema.py +0 -0
  534. {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/validator.py +0 -0
  535. {devsper-2.4.1 → devsper-2.5.0}/docker-compose.yml +0 -0
  536. {devsper-2.4.1 → devsper-2.5.0}/examples/__init__.py +0 -0
  537. {devsper-2.4.1 → devsper-2.5.0}/examples/_common.py +0 -0
  538. {devsper-2.4.1 → devsper-2.5.0}/examples/_config.py +0 -0
  539. {devsper-2.4.1 → devsper-2.5.0}/examples/coding/__init__.py +0 -0
  540. {devsper-2.4.1 → devsper-2.5.0}/examples/coding/analyze_repository.py +0 -0
  541. {devsper-2.4.1 → devsper-2.5.0}/examples/coding/generate_docs.py +0 -0
  542. {devsper-2.4.1 → devsper-2.5.0}/examples/coding/refactor_candidates.py +0 -0
  543. {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/__init__.py +0 -0
  544. {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/dataset_analysis.py +0 -0
  545. {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/run_experiments.py +0 -0
  546. {devsper-2.4.1 → devsper-2.5.0}/examples/demo_swarm.py +0 -0
  547. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/README.md +0 -0
  548. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/controller.toml +0 -0
  549. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/parallel_survey.py +0 -0
  550. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_controller.py +0 -0
  551. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_demo.sh +0 -0
  552. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_worker.py +0 -0
  553. {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/worker.toml +0 -0
  554. {devsper-2.4.1 → devsper-2.5.0}/examples/documents/__init__.py +0 -0
  555. {devsper-2.4.1 → devsper-2.5.0}/examples/documents/analyze_documents.py +0 -0
  556. {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/__init__.py +0 -0
  557. {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/monte_carlo_demo.py +0 -0
  558. {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/parameter_sweep.py +0 -0
  559. {devsper-2.4.1 → devsper-2.5.0}/examples/research/__init__.py +0 -0
  560. {devsper-2.4.1 → devsper-2.5.0}/examples/research/literature_review.py +0 -0
  561. {devsper-2.4.1 → devsper-2.5.0}/examples/research/research_gap_analysis.py +0 -0
  562. {devsper-2.4.1 → devsper-2.5.0}/examples/research/research_graph.py +0 -0
  563. {devsper-2.4.1 → devsper-2.5.0}/scripts/README.md +0 -0
  564. {devsper-2.4.1 → devsper-2.5.0}/scripts/seed_tool_scores.py +0 -0
  565. {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_cli.sh +0 -0
  566. {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_full.sh +0 -0
  567. {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_smoke.py +0 -0
  568. {devsper-2.4.1 → devsper-2.5.0}/scripts/test_v2_router.py +0 -0
  569. {devsper-2.4.1 → devsper-2.5.0}/supermemory-core/Cargo.toml +0 -0
  570. {devsper-2.4.1 → devsper-2.5.0}/supermemory-core/src/main.rs +0 -0
  571. {devsper-2.4.1 → devsper-2.5.0}/tests/agents/__init__.py +0 -0
  572. {devsper-2.4.1 → devsper-2.5.0}/tests/agents/test_roles.py +0 -0
  573. {devsper-2.4.1 → devsper-2.5.0}/tests/benchmarks/test_v16_perf.py +0 -0
  574. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_controller_restart_hitl.py +0 -0
  575. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
  576. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_event_idempotency.py +0 -0
  577. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_event_retry.py +0 -0
  578. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_hitl_pause_resume.py +0 -0
  579. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_sse_reconnect.py +0 -0
  580. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_sse_stream.py +0 -0
  581. {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_worker_crash_recovery.py +0 -0
  582. {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/__init__.py +0 -0
  583. {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_adaptation.py +0 -0
  584. {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_learning_engine.py +0 -0
  585. {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_strategy_selector.py +0 -0
  586. {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_task_optimizer.py +0 -0
  587. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/__init__.py +0 -0
  588. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_agent_memory_integration.py +0 -0
  589. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_context_run_scope.py +0 -0
  590. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_index.py +0 -0
  591. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_router.py +0 -0
  592. {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_store.py +0 -0
  593. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/__init__.py +0 -0
  594. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/fixtures.py +0 -0
  595. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_crypto.py +0 -0
  596. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_e2e_redis_loop.py +0 -0
  597. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_heartbeat_eviction.py +0 -0
  598. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_local_pool.py +0 -0
  599. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_org_pool.py +0 -0
  600. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_priority_chain.py +0 -0
  601. {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_rate_limiting.py +0 -0
  602. {devsper-2.4.1 → devsper-2.5.0}/tests/reasoning/__init__.py +0 -0
  603. {devsper-2.4.1 → devsper-2.5.0}/tests/reasoning/test_reasoning_graph.py +0 -0
  604. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/__init__.py +0 -0
  605. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_budget.py +0 -0
  606. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_otel_phase1.py +0 -0
  607. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_packager.py +0 -0
  608. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_protocol_schema.py +0 -0
  609. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_replay.py +0 -0
  610. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_replay_engine.py +0 -0
  611. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_telemetry.py +0 -0
  612. {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_visualize.py +0 -0
  613. {devsper-2.4.1 → devsper-2.5.0}/tests/test_agent.py +0 -0
  614. {devsper-2.4.1 → devsper-2.5.0}/tests/test_analysis.py +0 -0
  615. {devsper-2.4.1 → devsper-2.5.0}/tests/test_analytics.py +0 -0
  616. {devsper-2.4.1 → devsper-2.5.0}/tests/test_auto_model.py +0 -0
  617. {devsper-2.4.1 → devsper-2.5.0}/tests/test_clarification.py +0 -0
  618. {devsper-2.4.1 → devsper-2.5.0}/tests/test_clarification_multinode.py +0 -0
  619. {devsper-2.4.1 → devsper-2.5.0}/tests/test_config_loader.py +0 -0
  620. {devsper-2.4.1 → devsper-2.5.0}/tests/test_credentials.py +0 -0
  621. {devsper-2.4.1 → devsper-2.5.0}/tests/test_cross_boundary_serialization.py +0 -0
  622. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dag_export.py +0 -0
  623. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_agents.py +0 -0
  624. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_build_cmd.py +0 -0
  625. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_debugger.py +0 -0
  626. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_repo_index.py +0 -0
  627. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_sandbox.py +0 -0
  628. {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_scaffold.py +0 -0
  629. {devsper-2.4.1 → devsper-2.5.0}/tests/test_distributed_bugs.py +0 -0
  630. {devsper-2.4.1 → devsper-2.5.0}/tests/test_embeddings_service.py +0 -0
  631. {devsper-2.4.1 → devsper-2.5.0}/tests/test_event_logger.py +0 -0
  632. {devsper-2.4.1 → devsper-2.5.0}/tests/test_executor.py +0 -0
  633. {devsper-2.4.1 → devsper-2.5.0}/tests/test_export_runs.py +0 -0
  634. {devsper-2.4.1 → devsper-2.5.0}/tests/test_github_provider.py +0 -0
  635. {devsper-2.4.1 → devsper-2.5.0}/tests/test_init.py +0 -0
  636. {devsper-2.4.1 → devsper-2.5.0}/tests/test_knowledge_graph.py +0 -0
  637. {devsper-2.4.1 → devsper-2.5.0}/tests/test_knowledge_query.py +0 -0
  638. {devsper-2.4.1 → devsper-2.5.0}/tests/test_map_reduce.py +0 -0
  639. {devsper-2.4.1 → devsper-2.5.0}/tests/test_memory_evolution.py +0 -0
  640. {devsper-2.4.1 → devsper-2.5.0}/tests/test_memory_isolation.py +0 -0
  641. {devsper-2.4.1 → devsper-2.5.0}/tests/test_missions.py +0 -0
  642. {devsper-2.4.1 → devsper-2.5.0}/tests/test_model_router.py +0 -0
  643. {devsper-2.4.1 → devsper-2.5.0}/tests/test_planner.py +0 -0
  644. {devsper-2.4.1 → devsper-2.5.0}/tests/test_plugins.py +0 -0
  645. {devsper-2.4.1 → devsper-2.5.0}/tests/test_protocols.py +0 -0
  646. {devsper-2.4.1 → devsper-2.5.0}/tests/test_router.py +0 -0
  647. {devsper-2.4.1 → devsper-2.5.0}/tests/test_scheduler.py +0 -0
  648. {devsper-2.4.1 → devsper-2.5.0}/tests/test_speculation.py +0 -0
  649. {devsper-2.4.1 → devsper-2.5.0}/tests/test_strategies.py +0 -0
  650. {devsper-2.4.1 → devsper-2.5.0}/tests/test_swarm.py +0 -0
  651. {devsper-2.4.1 → devsper-2.5.0}/tests/test_task_cache.py +0 -0
  652. {devsper-2.4.1 → devsper-2.5.0}/tests/test_tool_scoring.py +0 -0
  653. {devsper-2.4.1 → devsper-2.5.0}/tests/test_tool_selector.py +0 -0
  654. {devsper-2.4.1 → devsper-2.5.0}/tests/test_upgrade.py +0 -0
  655. {devsper-2.4.1 → devsper-2.5.0}/tests/test_v110.py +0 -0
  656. {devsper-2.4.1 → devsper-2.5.0}/tests/test_v16.py +0 -0
  657. {devsper-2.4.1 → devsper-2.5.0}/tests/test_v17.py +0 -0
  658. {devsper-2.4.1 → devsper-2.5.0}/tests/test_v18.py +0 -0
  659. {devsper-2.4.1 → devsper-2.5.0}/tests/test_v19.py +0 -0
  660. {devsper-2.4.1 → devsper-2.5.0}/tests/test_workflow.py +0 -0
  661. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/__init__.py +0 -0
  662. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_code_intelligence_tools.py +0 -0
  663. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_coding_tools.py +0 -0
  664. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_core_tool_registry.py +0 -0
  665. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_data_science_tools.py +0 -0
  666. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_data_tools.py +0 -0
  667. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_document_tools.py +0 -0
  668. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_experiments_tools.py +0 -0
  669. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_filesystem_tools.py +0 -0
  670. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_flagship_tools.py +0 -0
  671. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_knowledge_tools.py +0 -0
  672. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_math_tools.py +0 -0
  673. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_memory_tools.py +0 -0
  674. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_pipelines.py +0 -0
  675. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_registry.py +0 -0
  676. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_research_advanced_tools.py +0 -0
  677. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_research_tools.py +0 -0
  678. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_system_tools.py +0 -0
  679. {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_tool_runner.py +0 -0
  680. {devsper-2.4.1 → devsper-2.5.0}/worker/.dockerignore +0 -0
  681. {devsper-2.4.1 → devsper-2.5.0}/worker/Cargo.lock +0 -0
  682. {devsper-2.4.1 → devsper-2.5.0}/worker/Cargo.toml +0 -0
  683. {devsper-2.4.1 → devsper-2.5.0}/worker/Dockerfile +0 -0
  684. {devsper-2.4.1 → devsper-2.5.0}/worker/README.md +0 -0
  685. {devsper-2.4.1 → devsper-2.5.0}/worker/src/budget.rs +0 -0
  686. {devsper-2.4.1 → devsper-2.5.0}/worker/src/bus.rs +0 -0
  687. {devsper-2.4.1 → devsper-2.5.0}/worker/src/claim.rs +0 -0
  688. {devsper-2.4.1 → devsper-2.5.0}/worker/src/clarification.rs +0 -0
  689. {devsper-2.4.1 → devsper-2.5.0}/worker/src/config.rs +0 -0
  690. {devsper-2.4.1 → devsper-2.5.0}/worker/src/controller.rs +0 -0
  691. {devsper-2.4.1 → devsper-2.5.0}/worker/src/election.rs +0 -0
  692. {devsper-2.4.1 → devsper-2.5.0}/worker/src/error.rs +0 -0
  693. {devsper-2.4.1 → devsper-2.5.0}/worker/src/executor.rs +0 -0
  694. {devsper-2.4.1 → devsper-2.5.0}/worker/src/health.rs +0 -0
  695. {devsper-2.4.1 → devsper-2.5.0}/worker/src/heartbeat.rs +0 -0
  696. {devsper-2.4.1 → devsper-2.5.0}/worker/src/lib.rs +0 -0
  697. {devsper-2.4.1 → devsper-2.5.0}/worker/src/main.rs +0 -0
  698. {devsper-2.4.1 → devsper-2.5.0}/worker/src/metrics.rs +0 -0
  699. {devsper-2.4.1 → devsper-2.5.0}/worker/src/reconnect.rs +0 -0
  700. {devsper-2.4.1 → devsper-2.5.0}/worker/src/registry.rs +0 -0
  701. {devsper-2.4.1 → devsper-2.5.0}/worker/src/router.rs +0 -0
  702. {devsper-2.4.1 → devsper-2.5.0}/worker/src/rpc.rs +0 -0
  703. {devsper-2.4.1 → devsper-2.5.0}/worker/src/scheduler.rs +0 -0
  704. {devsper-2.4.1 → devsper-2.5.0}/worker/src/snapshot.rs +0 -0
  705. {devsper-2.4.1 → devsper-2.5.0}/worker/src/telemetry.rs +0 -0
  706. {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/agent.rs +0 -0
  707. {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/event.rs +0 -0
  708. {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/mod.rs +0 -0
  709. {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/node.rs +0 -0
  710. {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/task.rs +0 -0
  711. {devsper-2.4.1 → devsper-2.5.0}/worker/src/worker_node.rs +0 -0
  712. {devsper-2.4.1 → devsper-2.5.0}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.5.0] — 2026-04-06
11
+
12
+ ### Added
13
+
14
+ - **LangChain / LangGraph integrations** — `devsper.integrations.langchain_adapter` and `langgraph_adapter` for wrapping LangChain runnables as Devsper tasks and running compiled LangGraph nodes with Devsper DAG scheduling; CLI-friendly examples under `examples/langchain_agent.py` and `examples/langgraph_swarm.py`; optional extra `pip install 'devsper[langgraph]'` to pin LangGraph.
15
+
10
16
  ## [2.4.1] — 2026-03-31
11
17
 
12
18
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.4.1
3
+ Version: 2.5.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
@@ -62,6 +62,8 @@ Requires-Dist: sentence-transformers>=3.0.0; extra == 'embeddings'
62
62
  Provides-Extra: explainability
63
63
  Provides-Extra: hitl
64
64
  Requires-Dist: httpx>=0.27; extra == 'hitl'
65
+ Provides-Extra: langgraph
66
+ Requires-Dist: langgraph<2,>=1.0.0; extra == 'langgraph'
65
67
  Provides-Extra: mcp
66
68
  Requires-Dist: anyio>=4.0; extra == 'mcp'
67
69
  Requires-Dist: httpx>=0.27; extra == 'mcp'
@@ -72,6 +74,7 @@ Provides-Extra: server
72
74
  Requires-Dist: fastapi>=0.110; extra == 'server'
73
75
  Requires-Dist: sse-starlette>=2.0; extra == 'server'
74
76
  Requires-Dist: uvicorn>=0.29; extra == 'server'
77
+ Requires-Dist: vektori>=0.1.1; extra == 'server'
75
78
  Provides-Extra: worker
76
79
  Description-Content-Type: text/markdown
77
80
 
@@ -206,6 +209,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
206
209
 
207
210
  ---
208
211
 
212
+ ## LangChain integration
213
+
214
+ Devsper ships a **small adapter layer** (not a parallel orchestration stack) so you can keep building in **LangChain** and **LangGraph** while aligning execution with Devsper’s **task / DAG** mental model.
215
+
216
+ | Module | Purpose |
217
+ |--------|---------|
218
+ | `devsper.integrations.langchain_adapter` | Wrap LangChain runnables and agents as tagged `Task`s; `run_langchain_runnable()` runs `ainvoke` / `invoke` and normalizes output for `Task.result`. |
219
+ | `devsper.integrations.langgraph_adapter` | Derive a Devsper task graph from a compiled LangGraph graph (`compiled_graph_to_tasks`); `run_compiled_graph_as_devsper_tasks()` runs each node with bounded concurrency and pluggable state merge (default: concatenate list fields—good for `MessagesState`). |
220
+
221
+ **Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
222
+
223
+ **Examples (from the runtime repo root):**
224
+
225
+ ```bash
226
+ uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
227
+ uv run python examples/langgraph_swarm.py --workers 4
228
+ ```
229
+
230
+ Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
231
+
232
+ ---
233
+
209
234
  ## Credentials
210
235
 
211
236
  API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
@@ -363,6 +388,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
363
388
  | Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
364
389
  | Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
365
390
  | Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
391
+ | LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
392
+ | LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
366
393
 
367
394
  Outputs under `examples/output/`. Run from project root when using script paths.
368
395
 
@@ -129,6 +129,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
129
129
 
130
130
  ---
131
131
 
132
+ ## LangChain integration
133
+
134
+ Devsper ships a **small adapter layer** (not a parallel orchestration stack) so you can keep building in **LangChain** and **LangGraph** while aligning execution with Devsper’s **task / DAG** mental model.
135
+
136
+ | Module | Purpose |
137
+ |--------|---------|
138
+ | `devsper.integrations.langchain_adapter` | Wrap LangChain runnables and agents as tagged `Task`s; `run_langchain_runnable()` runs `ainvoke` / `invoke` and normalizes output for `Task.result`. |
139
+ | `devsper.integrations.langgraph_adapter` | Derive a Devsper task graph from a compiled LangGraph graph (`compiled_graph_to_tasks`); `run_compiled_graph_as_devsper_tasks()` runs each node with bounded concurrency and pluggable state merge (default: concatenate list fields—good for `MessagesState`). |
140
+
141
+ **Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
142
+
143
+ **Examples (from the runtime repo root):**
144
+
145
+ ```bash
146
+ uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
147
+ uv run python examples/langgraph_swarm.py --workers 4
148
+ ```
149
+
150
+ Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
151
+
152
+ ---
153
+
132
154
  ## Credentials
133
155
 
134
156
  API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
@@ -286,6 +308,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
286
308
  | Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
287
309
  | Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
288
310
  | Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
311
+ | LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
312
+ | LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
289
313
 
290
314
  Outputs under `examples/output/`. Run from project root when using script paths.
291
315
 
@@ -0,0 +1,5 @@
1
+ """Shared contracts between runtime and platform (event type strings, etc.)."""
2
+
3
+ from devsper.contracts.platform_event_type import DEVSPER_TO_PLATFORM, PlatformEventType
4
+
5
+ __all__ = ["DEVSPER_TO_PLATFORM", "PlatformEventType"]
@@ -0,0 +1,68 @@
1
+ """
2
+ Canonical `event_type` strings accepted by the platform runtime ingest API and
3
+ emitted by the runtime forwarder.
4
+
5
+ **Single source of truth for Python.** Mirror:
6
+ `platform/services/api/internal/contracts/runtime_events.go`
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+
12
+ class PlatformEventType:
13
+ """Platform SSE / run_events.event_type values (string constants only)."""
14
+
15
+ RUN_STARTED = "run_started"
16
+ STEP_STARTED = "step_started"
17
+ STEP_COMPLETED = "step_completed"
18
+ AGENT_STARTED = "agent_started"
19
+ AGENT_FINISHED = "agent_finished"
20
+ RUN_PROGRESS = "run_progress"
21
+ TOOL_CALLED = "tool_called"
22
+ RUN_COMPLETED = "run_completed"
23
+ RUN_FAILED = "run_failed"
24
+ CLARIFICATION_REQUESTED = "clarification_requested"
25
+ CLARIFICATION_ANSWERED = "clarification_answered"
26
+ RUN_PAUSED = "run_paused"
27
+ RUN_RESUMED = "run_resumed"
28
+ LOG = "log"
29
+ EXECUTION_GRAPH_UPDATED = "EXECUTION_GRAPH_UPDATED"
30
+ SPECULATIVE_TASK_STARTED = "SPECULATIVE_TASK_STARTED"
31
+ SPECULATIVE_TASK_CANCELLED = "SPECULATIVE_TASK_CANCELLED"
32
+ HITL_REQUESTED = "HITL_REQUESTED"
33
+ HITL_RESOLVED = "HITL_RESOLVED"
34
+ WORKER_ASSIGNED = "WORKER_ASSIGNED"
35
+ AGENT_POOL_USED = "AGENT_POOL_USED"
36
+ EXECUTOR_FINISHED = "executor_finished"
37
+
38
+
39
+ # DevSper `events` enum value (as string) -> platform ingest type
40
+ DEVSPER_TO_PLATFORM: dict[str, str] = {
41
+ "swarm_started": PlatformEventType.RUN_STARTED,
42
+ "executor_started": PlatformEventType.RUN_STARTED,
43
+ "task_started": PlatformEventType.STEP_STARTED,
44
+ "task_completed": PlatformEventType.STEP_COMPLETED,
45
+ "agent_started": PlatformEventType.AGENT_STARTED,
46
+ "agent_finished": PlatformEventType.AGENT_FINISHED,
47
+ "run_completed": PlatformEventType.RUN_COMPLETED,
48
+ "task_failed": PlatformEventType.RUN_FAILED,
49
+ "run_failed": PlatformEventType.RUN_FAILED,
50
+ "tool_called": PlatformEventType.TOOL_CALLED,
51
+ "clarification_requested": PlatformEventType.CLARIFICATION_REQUESTED,
52
+ "clarification_needed": PlatformEventType.CLARIFICATION_REQUESTED,
53
+ "clarification_received": PlatformEventType.CLARIFICATION_ANSWERED,
54
+ "planner_started": PlatformEventType.RUN_PROGRESS,
55
+ "planner_finished": PlatformEventType.RUN_PROGRESS,
56
+ "reasoning_node_added": PlatformEventType.RUN_PROGRESS,
57
+ "budget_warning": PlatformEventType.RUN_PROGRESS,
58
+ "task_created": PlatformEventType.RUN_PROGRESS,
59
+ "task_model_selected": PlatformEventType.RUN_PROGRESS,
60
+ "agent_broadcast": PlatformEventType.RUN_PROGRESS,
61
+ "run_manifest_emitted": PlatformEventType.RUN_PROGRESS,
62
+ "worker_assigned": PlatformEventType.WORKER_ASSIGNED,
63
+ "speculative_started": PlatformEventType.SPECULATIVE_TASK_STARTED,
64
+ "speculative_cancelled": PlatformEventType.SPECULATIVE_TASK_CANCELLED,
65
+ "hitl_requested": PlatformEventType.HITL_REQUESTED,
66
+ "hitl_resolved": PlatformEventType.HITL_RESOLVED,
67
+ "executor_finished": PlatformEventType.EXECUTOR_FINISHED,
68
+ }
@@ -0,0 +1,38 @@
1
+ """DEVSPER_DEBUG_EVENTS=1 — log runtime → platform → delivery trail (stderr / logging)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import logging
7
+ import os
8
+ from typing import Any
9
+
10
+ _LOG = logging.getLogger("devsper.debug_events")
11
+
12
+
13
+ def debug_events_enabled() -> bool:
14
+ return os.environ.get("DEVSPER_DEBUG_EVENTS", "").strip().lower() in (
15
+ "1",
16
+ "true",
17
+ "yes",
18
+ "on",
19
+ )
20
+
21
+
22
+ def log_runtime_emit(stage: str, payload: dict[str, Any]) -> None:
23
+ if not debug_events_enabled():
24
+ return
25
+ try:
26
+ line = json.dumps({"debug_events": stage, **payload}, default=str)
27
+ except TypeError:
28
+ line = str(payload)
29
+ _LOG.info(line)
30
+
31
+
32
+ def log_platform_body(body: dict[str, Any]) -> None:
33
+ if not debug_events_enabled():
34
+ return
35
+ try:
36
+ _LOG.info("[platform_event] %s", json.dumps(body, default=str))
37
+ except TypeError:
38
+ _LOG.info("[platform_event] %s", body)
@@ -6,7 +6,7 @@ The canonical execution model document lives under **docs**:
6
6
 
7
7
  That document is the source of truth for DAG execution, task state machine, HITL clarification (single-node and distributed, including Rust worker), bus topics, TUI lifecycle, and headless mode.
8
8
 
9
- For the latest runtime release notes (including 2.4.1 stabilization fixes), see:
9
+ For the latest runtime release notes (including 2.5.0 LangChain/LangGraph adapters), see:
10
10
 
11
11
  - `https://docs.devsper.com/docs/release_notes`
12
12
  - `https://devsper.com/blog/distributed-runtime-upgrade-2-4-0`
@@ -0,0 +1,34 @@
1
+ """Optional bridges between Devsper and popular agent frameworks (LangChain, LangGraph)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "langchain_task",
7
+ "run_langchain_runnable",
8
+ "stringify_langchain_output",
9
+ "LANGCHAIN_TASK_PREFIX",
10
+ "compiled_graph_to_tasks",
11
+ "default_list_merge_state",
12
+ "run_compiled_graph_as_devsper_tasks",
13
+ ]
14
+
15
+
16
+ def __getattr__(name: str):
17
+ if name in (
18
+ "langchain_task",
19
+ "run_langchain_runnable",
20
+ "stringify_langchain_output",
21
+ "LANGCHAIN_TASK_PREFIX",
22
+ ):
23
+ from devsper.integrations import langchain_adapter as m
24
+
25
+ return getattr(m, name)
26
+ if name in (
27
+ "compiled_graph_to_tasks",
28
+ "default_list_merge_state",
29
+ "run_compiled_graph_as_devsper_tasks",
30
+ ):
31
+ from devsper.integrations import langgraph_adapter as m
32
+
33
+ return getattr(m, name)
34
+ raise AttributeError(name)
@@ -0,0 +1,80 @@
1
+ """Wrap LangChain runnables and agent pipelines as Devsper tasks (minimal surface, no extra framework)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ from typing import Any
8
+
9
+ from devsper.types.task import Task, TaskStatus
10
+
11
+ LANGCHAIN_TASK_PREFIX = "[devsper:langchain]"
12
+
13
+
14
+ def langchain_task(
15
+ task_id: str,
16
+ *,
17
+ description: str = "",
18
+ dependencies: list[str] | None = None,
19
+ role: str | None = None,
20
+ ) -> Task:
21
+ """Return a Devsper `Task` tagged for LangChain execution (visible in logs and DAG exports)."""
22
+ desc = (description or "").strip() or f"LangChain runnable ({task_id})"
23
+ if LANGCHAIN_TASK_PREFIX not in desc:
24
+ desc = f"{LANGCHAIN_TASK_PREFIX} {desc}"
25
+ return Task(
26
+ id=task_id,
27
+ description=desc,
28
+ dependencies=list(dependencies or []),
29
+ status=TaskStatus.PENDING,
30
+ role=role,
31
+ )
32
+
33
+
34
+ def stringify_langchain_output(value: Any, *, max_len: int = 32000) -> str:
35
+ """Normalize LangChain/LangGraph outputs to a string suitable for `Task.result`."""
36
+ if value is None:
37
+ return ""
38
+ if hasattr(value, "content"):
39
+ text = getattr(value, "content", value)
40
+ return str(text)[:max_len]
41
+ if isinstance(value, dict):
42
+ if "output" in value:
43
+ return stringify_langchain_output(value["output"], max_len=max_len)
44
+ if "messages" in value:
45
+ parts: list[str] = []
46
+ for m in value["messages"]:
47
+ if hasattr(m, "content"):
48
+ parts.append(str(getattr(m, "content", m)))
49
+ else:
50
+ parts.append(str(m))
51
+ return "\n".join(parts).strip()[:max_len]
52
+ try:
53
+ return json.dumps(value, default=str)[:max_len]
54
+ except TypeError:
55
+ return str(value)[:max_len]
56
+ if isinstance(value, str):
57
+ return value[:max_len]
58
+ return str(value)[:max_len]
59
+
60
+
61
+ async def run_langchain_runnable(
62
+ task: Task,
63
+ runnable: Any,
64
+ input_data: dict[str, Any] | str | list[Any],
65
+ *,
66
+ config: Any | None = None,
67
+ ) -> str:
68
+ """
69
+ Run a LangChain `Runnable`, agent, or legacy executor with async `ainvoke` when available.
70
+
71
+ `input_data` may be a string (wrapped as `{"input": ...}`), a message list (chat models), or a dict.
72
+ """
73
+ inp: Any = input_data
74
+ if isinstance(inp, str):
75
+ inp = {"input": inp}
76
+ if hasattr(runnable, "ainvoke"):
77
+ out = await runnable.ainvoke(inp, config=config)
78
+ else:
79
+ out = await asyncio.to_thread(runnable.invoke, inp, config)
80
+ return stringify_langchain_output(out)
@@ -0,0 +1,151 @@
1
+ """Map LangGraph compiled graphs to Devsper task DAGs and run nodes with bounded concurrency."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ import logging
8
+ from collections.abc import Awaitable, Callable
9
+ from typing import Any
10
+
11
+ from devsper.swarm.scheduler import Scheduler
12
+ from devsper.types.task import Task, TaskStatus
13
+
14
+ log = logging.getLogger(__name__)
15
+
16
+ _SKIP = frozenset({"__start__", "__end__"})
17
+
18
+
19
+ def default_list_merge_state(state: dict[str, Any], patch: dict[str, Any]) -> dict[str, Any]:
20
+ """
21
+ Merge a node patch into accumulated graph state.
22
+
23
+ For keys present in both sides with list values, lists are concatenated (typical for `MessagesState`).
24
+ Otherwise values from `patch` replace.
25
+ """
26
+ out = dict(state)
27
+ for k, v in patch.items():
28
+ if k in out and isinstance(out[k], list) and isinstance(v, list):
29
+ out[k] = list(out[k]) + list(v)
30
+ else:
31
+ out[k] = v
32
+ return out
33
+
34
+
35
+ def _patch_summary(patch: dict[str, Any], *, max_len: int = 2000) -> str:
36
+ try:
37
+ return json.dumps(patch, default=str)[:max_len]
38
+ except TypeError:
39
+ return str(patch)[:max_len]
40
+
41
+
42
+ def compiled_graph_to_tasks(compiled: Any, *, description_fmt: str | None = None) -> list[Task]:
43
+ """
44
+ Build a list of Devsper `Task` objects from a compiled LangGraph graph's static topology.
45
+
46
+ Task ids match LangGraph node names. Dependencies follow edges, ignoring `__start__` / `__end__`.
47
+ Raises if the topology is not a DAG (same validation as `Scheduler.add_tasks`).
48
+ """
49
+ try:
50
+ G = compiled.get_graph()
51
+ except Exception as exc:
52
+ raise TypeError("object must be a compiled LangGraph graph with get_graph()") from exc
53
+ fmt = description_fmt or "LangGraph node `{name}`"
54
+ predecessors: dict[str, list[str]] = {}
55
+ for edge in G.edges:
56
+ predecessors.setdefault(edge.target, []).append(edge.source)
57
+ tasks: list[Task] = []
58
+ for name in G.nodes:
59
+ if name in _SKIP:
60
+ continue
61
+ preds = [p for p in predecessors.get(name, []) if p not in _SKIP]
62
+ desc = fmt.format(name=name)
63
+ tasks.append(
64
+ Task(
65
+ id=str(name),
66
+ description=desc,
67
+ dependencies=list(preds),
68
+ status=TaskStatus.PENDING,
69
+ )
70
+ )
71
+ if not tasks:
72
+ raise ValueError("no executable LangGraph nodes found (excluding __start__/__end__)")
73
+ probe = Scheduler()
74
+ probe.add_tasks(tasks)
75
+ return tasks
76
+
77
+
78
+ async def run_compiled_graph_as_devsper_tasks(
79
+ compiled: Any,
80
+ initial_state: dict[str, Any],
81
+ *,
82
+ worker_count: int = 4,
83
+ state_merge: Callable[[dict[str, Any], dict[str, Any]], dict[str, Any]] | None = None,
84
+ on_node_complete: Callable[[str, dict[str, Any]], Awaitable[None] | None] | None = None,
85
+ ) -> dict[str, Any]:
86
+ """
87
+ Execute a compiled LangGraph using Devsper's task DAG semantics: each node is one schedulable unit.
88
+
89
+ Ready nodes (dependencies satisfied) run concurrently up to `worker_count`. Shared graph state is
90
+ updated under a lock so parallel branches merge safely; use a custom `state_merge` if your
91
+ schema needs different rules than `default_list_merge_state`.
92
+ """
93
+ merge = state_merge or default_list_merge_state
94
+ nodes_map = getattr(compiled, "nodes", None)
95
+ if not isinstance(nodes_map, dict):
96
+ raise TypeError("compiled graph has no nodes mapping")
97
+
98
+ tasks = compiled_graph_to_tasks(compiled)
99
+ scheduler = Scheduler()
100
+ scheduler.add_tasks(tasks)
101
+
102
+ state: dict[str, Any] = dict(initial_state)
103
+ lock = asyncio.Lock()
104
+ sem = asyncio.Semaphore(max(1, int(worker_count)))
105
+ failures: list[BaseException] = []
106
+
107
+ async def run_one(task: Task) -> None:
108
+ name = task.id
109
+ node = nodes_map.get(name)
110
+ if node is None:
111
+ async with lock:
112
+ scheduler.mark_failed(name, f"no Pregel node for {name!r}")
113
+ failures.append(KeyError(name))
114
+ return
115
+ try:
116
+ async with sem:
117
+ async with lock:
118
+ snapshot = dict(state)
119
+ patch = await node.ainvoke(snapshot)
120
+ if not isinstance(patch, dict):
121
+ patch = {"output": patch}
122
+ async with lock:
123
+ merged = merge(state, patch)
124
+ state.clear()
125
+ state.update(merged)
126
+ scheduler.mark_completed(name, _patch_summary(patch))
127
+ if on_node_complete is not None:
128
+ async with lock:
129
+ snap = dict(state)
130
+ await on_node_complete(name, snap)
131
+ except Exception as exc: # noqa: BLE001 — surface as task failure + aggregate
132
+ log.exception("langgraph node %s failed", name)
133
+ async with lock:
134
+ scheduler.mark_failed(name, f"{type(exc).__name__}: {exc}")
135
+ failures.append(exc)
136
+
137
+ while not scheduler.is_finished():
138
+ if any(t.status == TaskStatus.FAILED for t in scheduler.get_all_tasks()):
139
+ for t in scheduler.get_all_tasks():
140
+ if t.status == TaskStatus.PENDING:
141
+ scheduler.mark_failed(t.id, "aborted: upstream LangGraph node failure")
142
+ break
143
+ ready = scheduler.get_ready_tasks()
144
+ if not ready:
145
+ await asyncio.sleep(0.01)
146
+ continue
147
+ await asyncio.gather(*(run_one(t) for t in ready))
148
+
149
+ if failures:
150
+ raise failures[0]
151
+ return dict(state)
@@ -0,0 +1 @@
1
+ """Platform integration helpers (swarmworker, metrics, run context)."""
@@ -0,0 +1,53 @@
1
+ """
2
+ Per-request execution context for platform swarmworker (thread-local).
3
+ Used for org-scoped tool metrics in Redis.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import logging
9
+ import os
10
+ import threading
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ _tls = threading.local()
15
+
16
+
17
+ def set_execution_org(org_id: str) -> None:
18
+ _tls.org_id = (org_id or "").strip()
19
+
20
+
21
+ def clear_execution_org() -> None:
22
+ _tls.org_id = ""
23
+
24
+
25
+ def get_execution_org_id() -> str:
26
+ return getattr(_tls, "org_id", "") or ""
27
+
28
+
29
+ def record_tool_call(tool_name: str, ok: bool, latency_ms: int) -> None:
30
+ """Best-effort Redis counters: devsper:tool_metrics:{org_id} hash fields {tool}:calls, :fail, :lat_ms."""
31
+ oid = get_execution_org_id()
32
+ if not oid or not tool_name:
33
+ return
34
+ url = (os.environ.get("REDIS_URL") or "").strip()
35
+ if not url:
36
+ return
37
+ try:
38
+ import redis # type: ignore[import-untyped]
39
+ except ImportError:
40
+ return
41
+ key = f"devsper:tool_metrics:{oid}"
42
+ prefix = f"{tool_name}:"
43
+ try:
44
+ r = redis.Redis.from_url(url, decode_responses=True)
45
+ p = r.pipeline()
46
+ p.hincrby(key, prefix + "calls", 1)
47
+ if not ok:
48
+ p.hincrby(key, prefix + "fail", 1)
49
+ p.hincrby(key, prefix + "lat_ms", max(0, int(latency_ms)))
50
+ p.expire(key, 86400 * 30) # 30d retention
51
+ p.execute()
52
+ except Exception as ex:
53
+ logger.debug("tool metrics redis skipped: %s", ex)