devsper 2.4.1__tar.gz → 2.6.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 (713) hide show
  1. {devsper-2.4.1 → devsper-2.6.0}/CHANGELOG.md +20 -0
  2. {devsper-2.4.1 → devsper-2.6.0}/PKG-INFO +30 -1
  3. {devsper-2.4.1 → devsper-2.6.0}/README.md +24 -0
  4. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/agent.py +2 -0
  5. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/main.py +50 -0
  6. {devsper-2.4.1 → devsper-2.6.0}/devsper/config/schema.py +2 -0
  7. devsper-2.6.0/devsper/contracts/__init__.py +5 -0
  8. devsper-2.6.0/devsper/contracts/platform_event_type.py +68 -0
  9. devsper-2.6.0/devsper/debug_events.py +38 -0
  10. {devsper-2.4.1 → devsper-2.6.0}/devsper/docs/architecture/execution-model.md +1 -1
  11. devsper-2.6.0/devsper/integrations/__init__.py +34 -0
  12. devsper-2.6.0/devsper/integrations/langchain_adapter.py +80 -0
  13. devsper-2.6.0/devsper/integrations/langgraph_adapter.py +151 -0
  14. devsper-2.6.0/devsper/platform/__init__.py +1 -0
  15. devsper-2.6.0/devsper/platform/run_context.py +53 -0
  16. {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/runtime_events.py +46 -19
  17. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/execution_graph.py +58 -4
  18. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/executor.py +77 -10
  19. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/task_runner.py +31 -2
  20. devsper-2.6.0/devsper/server/memory_utils.py +475 -0
  21. devsper-2.6.0/devsper/server/swarmworker.py +786 -0
  22. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/swarm.py +87 -5
  23. {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/__init__.py +8 -0
  24. devsper-2.6.0/devsper/telemetry/trulens.py +119 -0
  25. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/client.py +47 -19
  26. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/discovery.py +12 -1
  27. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/tool_runner.py +28 -2
  28. {devsper-2.4.1 → devsper-2.6.0}/devsper/types/event.py +9 -0
  29. {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/event_logger.py +10 -0
  30. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/loader.py +1 -1
  31. {devsper-2.4.1 → devsper-2.6.0}/devsper.toml +10 -3
  32. devsper-2.6.0/examples/langchain_agent.py +70 -0
  33. devsper-2.6.0/examples/langgraph_swarm.py +83 -0
  34. devsper-2.6.0/memory_utils.py +10 -0
  35. {devsper-2.4.1 → devsper-2.6.0}/pyproject.toml +13 -2
  36. devsper-2.6.0/scripts/qa_e2e_stabilization.sh +15 -0
  37. devsper-2.6.0/tests/test_execution_graph_meta.py +31 -0
  38. devsper-2.6.0/tests/test_langchain_adapter.py +24 -0
  39. devsper-2.6.0/tests/test_langgraph_adapter.py +63 -0
  40. devsper-2.6.0/tests/test_platform_runtime_events.py +66 -0
  41. {devsper-2.4.1 → devsper-2.6.0}/uv.lock +217 -2
  42. devsper-2.4.1/devsper/platform/__init__.py +0 -6
  43. devsper-2.4.1/devsper/server/swarmworker.py +0 -215
  44. devsper-2.4.1/requirements-docs.txt +0 -4
  45. devsper-2.4.1/tests/test_platform_runtime_events.py +0 -37
  46. {devsper-2.4.1 → devsper-2.6.0}/.env.example +0 -0
  47. {devsper-2.4.1 → devsper-2.6.0}/.github/FUNDING.yml +0 -0
  48. {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/pypi-publish.yml +0 -0
  49. {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/release-on-tag.yml +0 -0
  50. {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/worker-release.yml +0 -0
  51. {devsper-2.4.1 → devsper-2.6.0}/.gitignore +0 -0
  52. {devsper-2.4.1 → devsper-2.6.0}/.python-version +0 -0
  53. {devsper-2.4.1 → devsper-2.6.0}/CODE_OF_CONDUCT.md +0 -0
  54. {devsper-2.4.1 → devsper-2.6.0}/CONTRIBUTING.md +0 -0
  55. {devsper-2.4.1 → devsper-2.6.0}/Cargo.lock +0 -0
  56. {devsper-2.4.1 → devsper-2.6.0}/Cargo.toml +0 -0
  57. {devsper-2.4.1 → devsper-2.6.0}/Dockerfile.local-pool +0 -0
  58. {devsper-2.4.1 → devsper-2.6.0}/LICENSE +0 -0
  59. {devsper-2.4.1 → devsper-2.6.0}/SECURITY.md +0 -0
  60. {devsper-2.4.1 → devsper-2.6.0}/benchmarks/__init__.py +0 -0
  61. {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_dataset_analysis.py +0 -0
  62. {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_repository_analysis.py +0 -0
  63. {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_research_pipeline.py +0 -0
  64. {devsper-2.4.1 → devsper-2.6.0}/branding/logo.svg +0 -0
  65. {devsper-2.4.1 → devsper-2.6.0}/devsper/README.md +0 -0
  66. {devsper-2.4.1 → devsper-2.6.0}/devsper/__init__.py +0 -0
  67. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/__init__.py +0 -0
  68. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/client.py +0 -0
  69. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/discovery.py +0 -0
  70. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/server.py +0 -0
  71. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/tool_adapter.py +0 -0
  72. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/types.py +0 -0
  73. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/critic.py +0 -0
  74. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/identity.py +0 -0
  75. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/message_bus.py +0 -0
  76. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/registry.py +0 -0
  77. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/roles.py +0 -0
  78. {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/run_agent.py +0 -0
  79. {devsper-2.4.1 → devsper-2.6.0}/devsper/analytics/__init__.py +0 -0
  80. {devsper-2.4.1 → devsper-2.6.0}/devsper/analytics/tool_analytics.py +0 -0
  81. {devsper-2.4.1 → devsper-2.6.0}/devsper/audit/__init__.py +0 -0
  82. {devsper-2.4.1 → devsper-2.6.0}/devsper/audit/logger.py +0 -0
  83. {devsper-2.4.1 → devsper-2.6.0}/devsper/budget.py +0 -0
  84. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/__init__.py +0 -0
  85. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/__init__.py +0 -0
  86. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/base.py +0 -0
  87. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/memory.py +0 -0
  88. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/redis.py +0 -0
  89. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/message.py +0 -0
  90. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/schema_version.py +0 -0
  91. {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/topics.py +0 -0
  92. {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/__init__.py +0 -0
  93. {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/embedding_index.py +0 -0
  94. {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/hashing.py +0 -0
  95. {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/store.py +0 -0
  96. {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/task_cache.py +0 -0
  97. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/__init__.py +0 -0
  98. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/commands/cloud.py +0 -0
  99. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/export.py +0 -0
  100. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/github_oauth.py +0 -0
  101. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/init.py +0 -0
  102. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/run_progress.py +0 -0
  103. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/__init__.py +0 -0
  104. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/components.py +0 -0
  105. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/controller_run_view.py +0 -0
  106. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/errors.py +0 -0
  107. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/logging.py +0 -0
  108. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/onboarding.py +0 -0
  109. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/progress.py +0 -0
  110. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/run_view.py +0 -0
  111. {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/theme.py +0 -0
  112. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/__init__.py +0 -0
  113. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/election.py +0 -0
  114. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/local.py +0 -0
  115. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/node_info.py +0 -0
  116. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/registry.py +0 -0
  117. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/router.py +0 -0
  118. {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/state_backend.py +0 -0
  119. {devsper-2.4.1 → devsper-2.6.0}/devsper/compliance/__init__.py +0 -0
  120. {devsper-2.4.1 → devsper-2.6.0}/devsper/compliance/pii.py +0 -0
  121. {devsper-2.4.1 → devsper-2.6.0}/devsper/config/__init__.py +0 -0
  122. {devsper-2.4.1 → devsper-2.6.0}/devsper/config/config_loader.py +0 -0
  123. {devsper-2.4.1 → devsper-2.6.0}/devsper/config/defaults.py +0 -0
  124. {devsper-2.4.1 → devsper-2.6.0}/devsper/config/resolver.py +0 -0
  125. {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/__init__.py +0 -0
  126. {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/base.py +0 -0
  127. {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/registry.py +0 -0
  128. {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/sample_connector.py +0 -0
  129. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/__init__.py +0 -0
  130. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/agent/__init__.py +0 -0
  131. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/agent/runner.py +0 -0
  132. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/hitl/__init__.py +0 -0
  133. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/hitl/state_machine.py +0 -0
  134. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/memory/__init__.py +0 -0
  135. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/memory/shared_memory.py +0 -0
  136. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/reporting/__init__.py +0 -0
  137. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/reporting/publisher.py +0 -0
  138. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/__init__.py +0 -0
  139. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/durability.py +0 -0
  140. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/orchestrator.py +0 -0
  141. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/__init__.py +0 -0
  142. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/base_tool.py +0 -0
  143. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/loader.py +0 -0
  144. {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/registry.py +0 -0
  145. {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/__init__.py +0 -0
  146. {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/cli.py +0 -0
  147. {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/migration.py +0 -0
  148. {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/store.py +0 -0
  149. {devsper-2.4.1 → devsper-2.6.0}/devsper/dashboard/__init__.py +0 -0
  150. {devsper-2.4.1 → devsper-2.6.0}/devsper/dashboard/dashboard.py +0 -0
  151. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/__init__.py +0 -0
  152. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/builder.py +0 -0
  153. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/debugger.py +0 -0
  154. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/repo_index.py +0 -0
  155. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/sandbox.py +0 -0
  156. {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/scaffold.py +0 -0
  157. {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/__init__.py +0 -0
  158. {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/controller.py +0 -0
  159. {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/worker_runtime.py +0 -0
  160. {devsper-2.4.1 → devsper-2.6.0}/devsper/embeddings/__init__.py +0 -0
  161. {devsper-2.4.1 → devsper-2.6.0}/devsper/embeddings/service.py +0 -0
  162. {devsper-2.4.1 → devsper-2.6.0}/devsper/events.py +0 -0
  163. {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/__init__.py +0 -0
  164. {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/decision_tree.py +0 -0
  165. {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/rationale.py +0 -0
  166. {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/simulation.py +0 -0
  167. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/__init__.py +0 -0
  168. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/branding.py +0 -0
  169. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/collector.py +0 -0
  170. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/manifest.py +0 -0
  171. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/model.py +0 -0
  172. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/packager.py +0 -0
  173. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/pdf.py +0 -0
  174. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/service.py +0 -0
  175. {devsper-2.4.1 → devsper-2.6.0}/devsper/export/writers.py +0 -0
  176. {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/__init__.py +0 -0
  177. {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/approval.py +0 -0
  178. {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/escalation.py +0 -0
  179. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/__init__.py +0 -0
  180. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/adaptation.py +0 -0
  181. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/__init__.py +0 -0
  182. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/analyzer.py +0 -0
  183. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  184. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/formatter.py +0 -0
  185. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/run_report.py +0 -0
  186. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/learning_engine.py +0 -0
  187. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/__init__.py +0 -0
  188. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/base.py +0 -0
  189. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  190. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  191. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  192. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  193. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
  194. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategy_selector.py +0 -0
  195. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/synthesis.py +0 -0
  196. {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/task_optimizer.py +0 -0
  197. {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/__init__.py +0 -0
  198. {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/extractor.py +0 -0
  199. {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/knowledge_graph.py +0 -0
  200. {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/query.py +0 -0
  201. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/__init__.py +0 -0
  202. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/consolidation.py +0 -0
  203. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/context.py +0 -0
  204. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/embeddings.py +0 -0
  205. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_index.py +0 -0
  206. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_router.py +0 -0
  207. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_store.py +0 -0
  208. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_types.py +0 -0
  209. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/namespaces.py +0 -0
  210. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/platform_memory.py +0 -0
  211. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/redis_memory.py +0 -0
  212. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/scoring.py +0 -0
  213. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/store.py +0 -0
  214. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/summarizer.py +0 -0
  215. {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
  216. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/__init__.py +0 -0
  217. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/base_agent.py +0 -0
  218. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/__init__.py +0 -0
  219. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/architect_agent.py +0 -0
  220. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/coder_agent.py +0 -0
  221. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/debugger_agent.py +0 -0
  222. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/docs_agent.py +0 -0
  223. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/tester_agent.py +0 -0
  224. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/iteration_loop.py +0 -0
  225. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_memory.py +0 -0
  226. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_planner.py +0 -0
  227. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_runner.py +0 -0
  228. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/models.py +0 -0
  229. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/__init__.py +0 -0
  230. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/editor_agent.py +0 -0
  231. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/researcher_agent.py +0 -0
  232. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/reviewer_agent.py +0 -0
  233. {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/writer_agent.py +0 -0
  234. {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/__init__.py +0 -0
  235. {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/controller.py +0 -0
  236. {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/rpc.py +0 -0
  237. {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/single.py +0 -0
  238. {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/worker.py +0 -0
  239. {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/__init__.py +0 -0
  240. {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/meta_planner.py +0 -0
  241. {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/priority_queue.py +0 -0
  242. {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/redis_results_sink.py +0 -0
  243. {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/reporter.py +0 -0
  244. {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/request_builder.py +0 -0
  245. {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/__init__.py +0 -0
  246. {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/marketplace/__init__.py +0 -0
  247. {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/plugin_loader.py +0 -0
  248. {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/plugin_registry.py +0 -0
  249. {devsper-2.4.1 → devsper-2.6.0}/devsper/policy/client.py +0 -0
  250. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/__init__.py +0 -0
  251. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/config.py +0 -0
  252. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/crypto.py +0 -0
  253. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/local_pool.py +0 -0
  254. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/manager.py +0 -0
  255. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/models.py +0 -0
  256. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/org_pool.py +0 -0
  257. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/dev.toml +0 -0
  258. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/local.toml +0 -0
  259. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/prod.toml +0 -0
  260. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/security.py +0 -0
  261. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/store.py +0 -0
  262. {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/worker_runner.py +0 -0
  263. {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/__init__.py +0 -0
  264. {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/client.py +0 -0
  265. {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/schema.py +0 -0
  266. {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/server.py +0 -0
  267. {devsper-2.4.1 → devsper-2.6.0}/devsper/protocols/__init__.py +0 -0
  268. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/__init__.py +0 -0
  269. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/anthropic.py +0 -0
  270. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/base.py +0 -0
  271. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/complexity_router.py +0 -0
  272. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/gemini.py +0 -0
  273. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/github.py +0 -0
  274. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/model_router.py +0 -0
  275. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/openai.py +0 -0
  276. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/__init__.py +0 -0
  277. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/__init__.py +0 -0
  278. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  279. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/custom_backend.py +0 -0
  280. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
  281. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/github_backend.py +0 -0
  282. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
  283. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/openai_backend.py +0 -0
  284. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
  285. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/base.py +0 -0
  286. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/factory.py +0 -0
  287. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/legacy.py +0 -0
  288. {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/router.py +0 -0
  289. {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/__init__.py +0 -0
  290. {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/graph.py +0 -0
  291. {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/nodes.py +0 -0
  292. {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/store.py +0 -0
  293. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/__init__.py +0 -0
  294. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/agent_pool.py +0 -0
  295. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/agent_runner.py +0 -0
  296. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/clarification_manager.py +0 -0
  297. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/event_stream.py +0 -0
  298. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/health.py +0 -0
  299. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/hitl.py +0 -0
  300. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/model_router.py +0 -0
  301. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/planner.py +0 -0
  302. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/replay.py +0 -0
  303. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/replay_engine.py +0 -0
  304. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/retry.py +0 -0
  305. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/run_history.py +0 -0
  306. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/speculative_planner.py +0 -0
  307. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/state_manager.py +0 -0
  308. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/task_state.py +0 -0
  309. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/telemetry.py +0 -0
  310. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/tool_runner.py +0 -0
  311. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/trace_tree.py +0 -0
  312. {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/visualize.py +0 -0
  313. {devsper-2.4.1 → devsper-2.6.0}/devsper/sandbox/__init__.py +0 -0
  314. {devsper-2.4.1 → devsper-2.6.0}/devsper/sandbox/sandbox.py +0 -0
  315. {devsper-2.4.1 → devsper-2.6.0}/devsper/server/__init__.py +0 -0
  316. {devsper-2.4.1 → devsper-2.6.0}/devsper/server/events.py +0 -0
  317. {devsper-2.4.1 → devsper-2.6.0}/devsper/server/topology.py +0 -0
  318. {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/__init__.py +0 -0
  319. {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/uploads/__init__.py +0 -0
  320. {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/uploads/store.py +0 -0
  321. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/checkpointer.py +0 -0
  322. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/executor.py +0 -0
  323. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/map_reduce.py +0 -0
  324. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/planner.py +0 -0
  325. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/prefetcher.py +0 -0
  326. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/scheduler.py +0 -0
  327. {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/speculation.py +0 -0
  328. {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/otel.py +0 -0
  329. {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/pricing.py +0 -0
  330. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/__init__.py +0 -0
  331. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/base.py +0 -0
  332. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/__init__.py +0 -0
  333. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  334. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  335. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  336. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  337. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  338. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  339. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  340. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  341. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  342. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  343. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  344. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/__init__.py +0 -0
  345. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  346. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
  347. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/extract_functions.py +0 -0
  348. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/format_python.py +0 -0
  349. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/generate_docstrings.py +0 -0
  350. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
  351. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/lint_python.py +0 -0
  352. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/refactor_function.py +0 -0
  353. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/repo_structure_map.py +0 -0
  354. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/run_python.py +0 -0
  355. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/__init__.py +0 -0
  356. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/column_type_detection.py +0 -0
  357. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/csv_summary.py +0 -0
  358. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_filter.py +0 -0
  359. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_groupby.py +0 -0
  360. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_stats.py +0 -0
  361. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataset_sampling.py +0 -0
  362. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataset_schema.py +0 -0
  363. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/json_pretty_print.py +0 -0
  364. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/json_query.py +0 -0
  365. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/missing_value_report.py +0 -0
  366. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/__init__.py +0 -0
  367. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  368. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  369. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  370. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  371. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  372. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_profile.py +0 -0
  373. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  374. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  375. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  376. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/model_input_validator.py +0 -0
  377. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  378. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/__init__.py +0 -0
  379. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/fetch_url.py +0 -0
  380. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/python_exec.py +0 -0
  381. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/read_csv.py +0 -0
  382. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/upload_file.py +0 -0
  383. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/web_search.py +0 -0
  384. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/__init__.py +0 -0
  385. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/_docproc.py +0 -0
  386. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/document_to_markdown.py +0 -0
  387. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_document_images.py +0 -0
  388. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_document_text.py +0 -0
  389. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_equations.py +0 -0
  390. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_tables.py +0 -0
  391. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/summarize_document.py +0 -0
  392. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_latex_document.py +0 -0
  393. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_markdown_document.py +0 -0
  394. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_word_document.py +0 -0
  395. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/__init__.py +0 -0
  396. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  397. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  398. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
  399. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
  400. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  401. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  402. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  403. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/result_comparator.py +0 -0
  404. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/simulation_runner.py +0 -0
  405. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  406. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  407. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/__init__.py +0 -0
  408. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/append_file.py +0 -0
  409. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_hash.py +0 -0
  410. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_line_count.py +0 -0
  411. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_metadata.py +0 -0
  412. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_preview.py +0 -0
  413. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/find_large_files.py +0 -0
  414. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/list_directory.py +0 -0
  415. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/read_file.py +0 -0
  416. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/search_files.py +0 -0
  417. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/write_file.py +0 -0
  418. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/__init__.py +0 -0
  419. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  420. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  421. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  422. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
  423. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  424. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/hitl_request.py +0 -0
  425. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/__init__.py +0 -0
  426. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  427. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  428. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
  429. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  430. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  431. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  432. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  433. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  434. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/__init__.py +0 -0
  435. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/calculate_expression.py +0 -0
  436. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/correlation.py +0 -0
  437. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/distribution_summary.py +0 -0
  438. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/histogram.py +0 -0
  439. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/linear_regression.py +0 -0
  440. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/matrix_multiply.py +0 -0
  441. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/mean_std.py +0 -0
  442. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  443. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/polynomial_fit.py +0 -0
  444. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/random_sample.py +0 -0
  445. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/__init__.py +0 -0
  446. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/adapter.py +0 -0
  447. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/__init__.py +0 -0
  448. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/delete_memory.py +0 -0
  449. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/list_memory.py +0 -0
  450. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/search_memory.py +0 -0
  451. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/store_memory.py +0 -0
  452. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/summarize_memory.py +0 -0
  453. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/tag_memory.py +0 -0
  454. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/pipelines.py +0 -0
  455. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/registry.py +0 -0
  456. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/__init__.py +0 -0
  457. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/arxiv_download.py +0 -0
  458. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/arxiv_search.py +0 -0
  459. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/citation_extractor.py +0 -0
  460. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/duckduckgo_search.py +0 -0
  461. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  462. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/paper_summarizer.py +0 -0
  463. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/research_question_generator.py +0 -0
  464. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/topic_cluster.py +0 -0
  465. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/web_search.py +0 -0
  466. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
  467. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/__init__.py +0 -0
  468. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  469. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  470. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  471. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  472. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  473. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  474. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  475. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  476. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  477. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  478. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  479. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  480. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/__init__.py +0 -0
  481. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/report.py +0 -0
  482. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/scorer.py +0 -0
  483. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/selector.py +0 -0
  484. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/store.py +0 -0
  485. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/selector.py +0 -0
  486. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/__init__.py +0 -0
  487. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/cpu_usage.py +0 -0
  488. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/disk_usage.py +0 -0
  489. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/environment_variables.py +0 -0
  490. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/memory_usage.py +0 -0
  491. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/pip_install.py +0 -0
  492. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/pip_search.py +0 -0
  493. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/process_list.py +0 -0
  494. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/python_package_list.py +0 -0
  495. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/run_shell_command.py +0 -0
  496. {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/system_info.py +0 -0
  497. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/__init__.py +0 -0
  498. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/activity_feed_view.py +0 -0
  499. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/adaptive_tasks_view.py +0 -0
  500. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/agent_role_view.py +0 -0
  501. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/app.py +0 -0
  502. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/dashboard_screen.py +0 -0
  503. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/dev_view.py +0 -0
  504. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/inject_screen.py +0 -0
  505. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/knowledge_graph_view.py +0 -0
  506. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/layout.py +0 -0
  507. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/logs_view.py +0 -0
  508. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/memory_view.py +0 -0
  509. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/mission_view.py +0 -0
  510. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/performance_view.py +0 -0
  511. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/reasoning_graph_view.py +0 -0
  512. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/results_view.py +0 -0
  513. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/swarm_view.py +0 -0
  514. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/task_detail_screen.py +0 -0
  515. {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/task_view.py +0 -0
  516. {devsper-2.4.1 → devsper-2.6.0}/devsper/types/exceptions.py +0 -0
  517. {devsper-2.4.1 → devsper-2.6.0}/devsper/types/swarm.py +0 -0
  518. {devsper-2.4.1 → devsper-2.6.0}/devsper/types/task.py +0 -0
  519. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/__init__.py +0 -0
  520. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/changelog.py +0 -0
  521. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/cli.py +0 -0
  522. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/installer.py +0 -0
  523. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/notifier.py +0 -0
  524. {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/version_check.py +0 -0
  525. {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/http.py +0 -0
  526. {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/models.py +0 -0
  527. {devsper-2.4.1 → devsper-2.6.0}/devsper/visualization/__init__.py +0 -0
  528. {devsper-2.4.1 → devsper-2.6.0}/devsper/visualization/dag_export.py +0 -0
  529. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/__init__.py +0 -0
  530. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/conditions.py +0 -0
  531. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/context.py +0 -0
  532. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/resolver.py +0 -0
  533. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/runner.py +0 -0
  534. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/schema.py +0 -0
  535. {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/validator.py +0 -0
  536. {devsper-2.4.1 → devsper-2.6.0}/docker-compose.yml +0 -0
  537. {devsper-2.4.1 → devsper-2.6.0}/examples/__init__.py +0 -0
  538. {devsper-2.4.1 → devsper-2.6.0}/examples/_common.py +0 -0
  539. {devsper-2.4.1 → devsper-2.6.0}/examples/_config.py +0 -0
  540. {devsper-2.4.1 → devsper-2.6.0}/examples/coding/__init__.py +0 -0
  541. {devsper-2.4.1 → devsper-2.6.0}/examples/coding/analyze_repository.py +0 -0
  542. {devsper-2.4.1 → devsper-2.6.0}/examples/coding/generate_docs.py +0 -0
  543. {devsper-2.4.1 → devsper-2.6.0}/examples/coding/refactor_candidates.py +0 -0
  544. {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/__init__.py +0 -0
  545. {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/dataset_analysis.py +0 -0
  546. {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/run_experiments.py +0 -0
  547. {devsper-2.4.1 → devsper-2.6.0}/examples/demo_swarm.py +0 -0
  548. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/README.md +0 -0
  549. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/controller.toml +0 -0
  550. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/parallel_survey.py +0 -0
  551. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_controller.py +0 -0
  552. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_demo.sh +0 -0
  553. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_worker.py +0 -0
  554. {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/worker.toml +0 -0
  555. {devsper-2.4.1 → devsper-2.6.0}/examples/documents/__init__.py +0 -0
  556. {devsper-2.4.1 → devsper-2.6.0}/examples/documents/analyze_documents.py +0 -0
  557. {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/__init__.py +0 -0
  558. {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/monte_carlo_demo.py +0 -0
  559. {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/parameter_sweep.py +0 -0
  560. {devsper-2.4.1 → devsper-2.6.0}/examples/research/__init__.py +0 -0
  561. {devsper-2.4.1 → devsper-2.6.0}/examples/research/literature_review.py +0 -0
  562. {devsper-2.4.1 → devsper-2.6.0}/examples/research/research_gap_analysis.py +0 -0
  563. {devsper-2.4.1 → devsper-2.6.0}/examples/research/research_graph.py +0 -0
  564. {devsper-2.4.1 → devsper-2.6.0}/scripts/README.md +0 -0
  565. {devsper-2.4.1 → devsper-2.6.0}/scripts/seed_tool_scores.py +0 -0
  566. {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_cli.sh +0 -0
  567. {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_full.sh +0 -0
  568. {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_smoke.py +0 -0
  569. {devsper-2.4.1 → devsper-2.6.0}/scripts/test_v2_router.py +0 -0
  570. {devsper-2.4.1 → devsper-2.6.0}/supermemory-core/Cargo.toml +0 -0
  571. {devsper-2.4.1 → devsper-2.6.0}/supermemory-core/src/main.rs +0 -0
  572. {devsper-2.4.1 → devsper-2.6.0}/tests/agents/__init__.py +0 -0
  573. {devsper-2.4.1 → devsper-2.6.0}/tests/agents/test_roles.py +0 -0
  574. {devsper-2.4.1 → devsper-2.6.0}/tests/benchmarks/test_v16_perf.py +0 -0
  575. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_controller_restart_hitl.py +0 -0
  576. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
  577. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_event_idempotency.py +0 -0
  578. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_event_retry.py +0 -0
  579. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_hitl_pause_resume.py +0 -0
  580. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_sse_reconnect.py +0 -0
  581. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_sse_stream.py +0 -0
  582. {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_worker_crash_recovery.py +0 -0
  583. {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/__init__.py +0 -0
  584. {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_adaptation.py +0 -0
  585. {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_learning_engine.py +0 -0
  586. {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_strategy_selector.py +0 -0
  587. {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_task_optimizer.py +0 -0
  588. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/__init__.py +0 -0
  589. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_agent_memory_integration.py +0 -0
  590. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_context_run_scope.py +0 -0
  591. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_index.py +0 -0
  592. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_router.py +0 -0
  593. {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_store.py +0 -0
  594. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/__init__.py +0 -0
  595. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/fixtures.py +0 -0
  596. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_crypto.py +0 -0
  597. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_e2e_redis_loop.py +0 -0
  598. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_heartbeat_eviction.py +0 -0
  599. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_local_pool.py +0 -0
  600. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_org_pool.py +0 -0
  601. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_priority_chain.py +0 -0
  602. {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_rate_limiting.py +0 -0
  603. {devsper-2.4.1 → devsper-2.6.0}/tests/reasoning/__init__.py +0 -0
  604. {devsper-2.4.1 → devsper-2.6.0}/tests/reasoning/test_reasoning_graph.py +0 -0
  605. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/__init__.py +0 -0
  606. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_budget.py +0 -0
  607. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_otel_phase1.py +0 -0
  608. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_packager.py +0 -0
  609. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_protocol_schema.py +0 -0
  610. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_replay.py +0 -0
  611. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_replay_engine.py +0 -0
  612. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_telemetry.py +0 -0
  613. {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_visualize.py +0 -0
  614. {devsper-2.4.1 → devsper-2.6.0}/tests/test_agent.py +0 -0
  615. {devsper-2.4.1 → devsper-2.6.0}/tests/test_analysis.py +0 -0
  616. {devsper-2.4.1 → devsper-2.6.0}/tests/test_analytics.py +0 -0
  617. {devsper-2.4.1 → devsper-2.6.0}/tests/test_auto_model.py +0 -0
  618. {devsper-2.4.1 → devsper-2.6.0}/tests/test_clarification.py +0 -0
  619. {devsper-2.4.1 → devsper-2.6.0}/tests/test_clarification_multinode.py +0 -0
  620. {devsper-2.4.1 → devsper-2.6.0}/tests/test_config_loader.py +0 -0
  621. {devsper-2.4.1 → devsper-2.6.0}/tests/test_credentials.py +0 -0
  622. {devsper-2.4.1 → devsper-2.6.0}/tests/test_cross_boundary_serialization.py +0 -0
  623. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dag_export.py +0 -0
  624. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_agents.py +0 -0
  625. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_build_cmd.py +0 -0
  626. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_debugger.py +0 -0
  627. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_repo_index.py +0 -0
  628. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_sandbox.py +0 -0
  629. {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_scaffold.py +0 -0
  630. {devsper-2.4.1 → devsper-2.6.0}/tests/test_distributed_bugs.py +0 -0
  631. {devsper-2.4.1 → devsper-2.6.0}/tests/test_embeddings_service.py +0 -0
  632. {devsper-2.4.1 → devsper-2.6.0}/tests/test_event_logger.py +0 -0
  633. {devsper-2.4.1 → devsper-2.6.0}/tests/test_executor.py +0 -0
  634. {devsper-2.4.1 → devsper-2.6.0}/tests/test_export_runs.py +0 -0
  635. {devsper-2.4.1 → devsper-2.6.0}/tests/test_github_provider.py +0 -0
  636. {devsper-2.4.1 → devsper-2.6.0}/tests/test_init.py +0 -0
  637. {devsper-2.4.1 → devsper-2.6.0}/tests/test_knowledge_graph.py +0 -0
  638. {devsper-2.4.1 → devsper-2.6.0}/tests/test_knowledge_query.py +0 -0
  639. {devsper-2.4.1 → devsper-2.6.0}/tests/test_map_reduce.py +0 -0
  640. {devsper-2.4.1 → devsper-2.6.0}/tests/test_memory_evolution.py +0 -0
  641. {devsper-2.4.1 → devsper-2.6.0}/tests/test_memory_isolation.py +0 -0
  642. {devsper-2.4.1 → devsper-2.6.0}/tests/test_missions.py +0 -0
  643. {devsper-2.4.1 → devsper-2.6.0}/tests/test_model_router.py +0 -0
  644. {devsper-2.4.1 → devsper-2.6.0}/tests/test_planner.py +0 -0
  645. {devsper-2.4.1 → devsper-2.6.0}/tests/test_plugins.py +0 -0
  646. {devsper-2.4.1 → devsper-2.6.0}/tests/test_protocols.py +0 -0
  647. {devsper-2.4.1 → devsper-2.6.0}/tests/test_router.py +0 -0
  648. {devsper-2.4.1 → devsper-2.6.0}/tests/test_scheduler.py +0 -0
  649. {devsper-2.4.1 → devsper-2.6.0}/tests/test_speculation.py +0 -0
  650. {devsper-2.4.1 → devsper-2.6.0}/tests/test_strategies.py +0 -0
  651. {devsper-2.4.1 → devsper-2.6.0}/tests/test_swarm.py +0 -0
  652. {devsper-2.4.1 → devsper-2.6.0}/tests/test_task_cache.py +0 -0
  653. {devsper-2.4.1 → devsper-2.6.0}/tests/test_tool_scoring.py +0 -0
  654. {devsper-2.4.1 → devsper-2.6.0}/tests/test_tool_selector.py +0 -0
  655. {devsper-2.4.1 → devsper-2.6.0}/tests/test_upgrade.py +0 -0
  656. {devsper-2.4.1 → devsper-2.6.0}/tests/test_v110.py +0 -0
  657. {devsper-2.4.1 → devsper-2.6.0}/tests/test_v16.py +0 -0
  658. {devsper-2.4.1 → devsper-2.6.0}/tests/test_v17.py +0 -0
  659. {devsper-2.4.1 → devsper-2.6.0}/tests/test_v18.py +0 -0
  660. {devsper-2.4.1 → devsper-2.6.0}/tests/test_v19.py +0 -0
  661. {devsper-2.4.1 → devsper-2.6.0}/tests/test_workflow.py +0 -0
  662. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/__init__.py +0 -0
  663. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_code_intelligence_tools.py +0 -0
  664. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_coding_tools.py +0 -0
  665. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_core_tool_registry.py +0 -0
  666. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_data_science_tools.py +0 -0
  667. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_data_tools.py +0 -0
  668. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_document_tools.py +0 -0
  669. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_experiments_tools.py +0 -0
  670. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_filesystem_tools.py +0 -0
  671. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_flagship_tools.py +0 -0
  672. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_knowledge_tools.py +0 -0
  673. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_math_tools.py +0 -0
  674. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_memory_tools.py +0 -0
  675. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_pipelines.py +0 -0
  676. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_registry.py +0 -0
  677. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_research_advanced_tools.py +0 -0
  678. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_research_tools.py +0 -0
  679. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_system_tools.py +0 -0
  680. {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_tool_runner.py +0 -0
  681. {devsper-2.4.1 → devsper-2.6.0}/worker/.dockerignore +0 -0
  682. {devsper-2.4.1 → devsper-2.6.0}/worker/Cargo.lock +0 -0
  683. {devsper-2.4.1 → devsper-2.6.0}/worker/Cargo.toml +0 -0
  684. {devsper-2.4.1 → devsper-2.6.0}/worker/Dockerfile +0 -0
  685. {devsper-2.4.1 → devsper-2.6.0}/worker/README.md +0 -0
  686. {devsper-2.4.1 → devsper-2.6.0}/worker/src/budget.rs +0 -0
  687. {devsper-2.4.1 → devsper-2.6.0}/worker/src/bus.rs +0 -0
  688. {devsper-2.4.1 → devsper-2.6.0}/worker/src/claim.rs +0 -0
  689. {devsper-2.4.1 → devsper-2.6.0}/worker/src/clarification.rs +0 -0
  690. {devsper-2.4.1 → devsper-2.6.0}/worker/src/config.rs +0 -0
  691. {devsper-2.4.1 → devsper-2.6.0}/worker/src/controller.rs +0 -0
  692. {devsper-2.4.1 → devsper-2.6.0}/worker/src/election.rs +0 -0
  693. {devsper-2.4.1 → devsper-2.6.0}/worker/src/error.rs +0 -0
  694. {devsper-2.4.1 → devsper-2.6.0}/worker/src/executor.rs +0 -0
  695. {devsper-2.4.1 → devsper-2.6.0}/worker/src/health.rs +0 -0
  696. {devsper-2.4.1 → devsper-2.6.0}/worker/src/heartbeat.rs +0 -0
  697. {devsper-2.4.1 → devsper-2.6.0}/worker/src/lib.rs +0 -0
  698. {devsper-2.4.1 → devsper-2.6.0}/worker/src/main.rs +0 -0
  699. {devsper-2.4.1 → devsper-2.6.0}/worker/src/metrics.rs +0 -0
  700. {devsper-2.4.1 → devsper-2.6.0}/worker/src/reconnect.rs +0 -0
  701. {devsper-2.4.1 → devsper-2.6.0}/worker/src/registry.rs +0 -0
  702. {devsper-2.4.1 → devsper-2.6.0}/worker/src/router.rs +0 -0
  703. {devsper-2.4.1 → devsper-2.6.0}/worker/src/rpc.rs +0 -0
  704. {devsper-2.4.1 → devsper-2.6.0}/worker/src/scheduler.rs +0 -0
  705. {devsper-2.4.1 → devsper-2.6.0}/worker/src/snapshot.rs +0 -0
  706. {devsper-2.4.1 → devsper-2.6.0}/worker/src/telemetry.rs +0 -0
  707. {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/agent.rs +0 -0
  708. {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/event.rs +0 -0
  709. {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/mod.rs +0 -0
  710. {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/node.rs +0 -0
  711. {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/task.rs +0 -0
  712. {devsper-2.4.1 → devsper-2.6.0}/worker/src/worker_node.rs +0 -0
  713. {devsper-2.4.1 → devsper-2.6.0}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.6.0] — 2026-04-06
11
+
12
+ ### Added
13
+
14
+ - **TruLens observability integration** — Added first-class TruLens instrumentation for swarm runs and agent calls, with configurable runtime toggles in `[telemetry]` (`trulens_enabled`, `trulens_database_url`) and recorder/session exports in `devsper.telemetry`.
15
+ - **CLI observability dashboard command** — Added `devsper observe` to launch the TruLens dashboard locally with optional `--port` and `--db` overrides.
16
+ - **Optional `trulens` extra** — Added `devsper[trulens]` dependency group for straightforward TruLens installation.
17
+
18
+ ### Changed
19
+
20
+ - **Swarm execution path** — `Swarm.run` now records via a TruLens custom app wrapper when enabled, with safe fallback to the standard runtime path if TruLens initialization or recorder setup fails.
21
+ - **Agent call capture** — `Agent.run` is instrumented for per-call telemetry capture when TruLens is installed.
22
+ - **Telemetry defaults and examples** — Updated default config template to include TruLens options and local database guidance.
23
+
24
+ ## [2.5.0] — 2026-04-06
25
+
26
+ ### Added
27
+
28
+ - **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.
29
+
10
30
  ## [2.4.1] — 2026-03-31
11
31
 
12
32
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.4.1
3
+ Version: 2.6.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,9 @@ 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'
78
+ Provides-Extra: trulens
79
+ Requires-Dist: trulens-core>=1.0; extra == 'trulens'
75
80
  Provides-Extra: worker
76
81
  Description-Content-Type: text/markdown
77
82
 
@@ -206,6 +211,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
206
211
 
207
212
  ---
208
213
 
214
+ ## LangChain integration
215
+
216
+ 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.
217
+
218
+ | Module | Purpose |
219
+ |--------|---------|
220
+ | `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`. |
221
+ | `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`). |
222
+
223
+ **Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
224
+
225
+ **Examples (from the runtime repo root):**
226
+
227
+ ```bash
228
+ uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
229
+ uv run python examples/langgraph_swarm.py --workers 4
230
+ ```
231
+
232
+ Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
233
+
234
+ ---
235
+
209
236
  ## Credentials
210
237
 
211
238
  API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
@@ -363,6 +390,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
363
390
  | Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
364
391
  | Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
365
392
  | Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
393
+ | LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
394
+ | LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
366
395
 
367
396
  Outputs under `examples/output/`. Run from project root when using script paths.
368
397
 
@@ -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
 
@@ -15,6 +15,7 @@ from devsper.events import (
15
15
  ClarificationField,
16
16
  ClarificationRequest,
17
17
  )
18
+ from devsper.telemetry.trulens import instrument as _tru_instrument
18
19
 
19
20
  log = logging.getLogger(__name__)
20
21
 
@@ -765,6 +766,7 @@ class Agent:
765
766
  answers[f.question] = self._default_answer_for_field(f)
766
767
  return answers
767
768
 
769
+ @_tru_instrument
768
770
  def run(self, request: AgentRequest) -> AgentResponse:
769
771
  """Stateless run: all context in AgentRequest, all output in AgentResponse."""
770
772
  import time
@@ -2068,6 +2068,33 @@ def _run_analytics() -> int:
2068
2068
  return 0
2069
2069
 
2070
2070
 
2071
+ def _run_observe(port: int = 8501, db: str = "") -> int:
2072
+ """Launch the TruLens observability dashboard."""
2073
+ try:
2074
+ from devsper.telemetry.trulens import init_trulens, get_session
2075
+ except ImportError:
2076
+ print("TruLens is not installed. Run: uv pip install 'devsper[trulens]'")
2077
+ return 1
2078
+
2079
+ session = get_session() or init_trulens(database_url=db)
2080
+ if session is None:
2081
+ print(
2082
+ "TruLens is not installed or failed to initialize.\n"
2083
+ "Run: uv pip install 'devsper[trulens]'"
2084
+ )
2085
+ return 1
2086
+
2087
+ db_url = getattr(session, "connector", None)
2088
+ db_label = str(db or ".devsper/trulens.sqlite")
2089
+ print(f"Opening TruLens dashboard — db: {db_label} port: {port}")
2090
+ print("Press Ctrl-C to stop.")
2091
+ try:
2092
+ session.run_dashboard(port=port)
2093
+ except KeyboardInterrupt:
2094
+ pass
2095
+ return 0
2096
+
2097
+
2071
2098
  def _run_tools(args: object) -> int:
2072
2099
  """List tools with reliability scores, or reset score history."""
2073
2100
  from rich.console import Console
@@ -4032,6 +4059,29 @@ Examples:
4032
4059
  )
4033
4060
  version_parser.set_defaults(func=_run_version)
4034
4061
 
4062
+ observe_parser = subparsers.add_parser(
4063
+ "observe",
4064
+ help="Launch TruLens observability dashboard",
4065
+ description="Open the TruLens dashboard for browsing run records, traces, and feedback.",
4066
+ epilog="""
4067
+ Examples:
4068
+ devsper observe
4069
+ devsper observe --port 8502
4070
+ devsper observe --db sqlite:///custom.sqlite
4071
+ """,
4072
+ formatter_class=argparse.RawDescriptionHelpFormatter,
4073
+ )
4074
+ observe_parser.add_argument(
4075
+ "--port", type=int, default=8501, help="Dashboard port (default: 8501)"
4076
+ )
4077
+ observe_parser.add_argument(
4078
+ "--db",
4079
+ default="",
4080
+ metavar="URL",
4081
+ help="TruLens database URL (default: sqlite:///.devsper/trulens.sqlite)",
4082
+ )
4083
+ observe_parser.set_defaults(func=lambda a: _run_observe(a.port, a.db))
4084
+
4035
4085
  health_parser = subparsers.add_parser(
4036
4086
  "health",
4037
4087
  help="Health and readiness check",
@@ -109,6 +109,8 @@ class TelemetryConfig(BaseModel):
109
109
  otel_endpoint: str = ""
110
110
  otel_headers: dict[str, str] = Field(default_factory=dict)
111
111
  cost_tracking: bool = True
112
+ trulens_enabled: bool = True
113
+ trulens_database_url: str = "" # empty = SQLite default (~/.trulens/)
112
114
 
113
115
 
114
116
  class BudgetConfig(BaseModel):
@@ -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)