devsper 2.4.0__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.0 → devsper-2.5.0}/CHANGELOG.md +29 -11
  2. {devsper-2.4.0 → devsper-2.5.0}/PKG-INFO +28 -1
  3. {devsper-2.4.0 → devsper-2.5.0}/README.md +24 -0
  4. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/agent.py +238 -7
  5. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/main.py +60 -32
  6. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/run_view.py +28 -6
  7. {devsper-2.4.0 → devsper-2.5.0}/devsper/config/resolver.py +4 -0
  8. {devsper-2.4.0 → devsper-2.5.0}/devsper/config/schema.py +7 -0
  9. devsper-2.5.0/devsper/contracts/__init__.py +5 -0
  10. devsper-2.5.0/devsper/contracts/platform_event_type.py +68 -0
  11. devsper-2.5.0/devsper/debug_events.py +38 -0
  12. {devsper-2.4.0 → devsper-2.5.0}/devsper/docs/architecture/execution-model.md +5 -0
  13. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/collector.py +14 -0
  14. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/writers.py +51 -12
  15. devsper-2.5.0/devsper/integrations/__init__.py +34 -0
  16. devsper-2.5.0/devsper/integrations/langchain_adapter.py +80 -0
  17. devsper-2.5.0/devsper/integrations/langgraph_adapter.py +151 -0
  18. devsper-2.5.0/devsper/platform/__init__.py +1 -0
  19. {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/request_builder.py +22 -3
  20. devsper-2.5.0/devsper/platform/run_context.py +53 -0
  21. {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/runtime_events.py +46 -19
  22. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/agent_runner.py +19 -3
  23. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/execution_graph.py +58 -4
  24. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/executor.py +144 -10
  25. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/model_router.py +17 -8
  26. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/task_runner.py +53 -5
  27. devsper-2.5.0/devsper/server/memory_utils.py +475 -0
  28. devsper-2.5.0/devsper/server/swarmworker.py +786 -0
  29. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/swarm.py +31 -5
  30. {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/otel.py +6 -3
  31. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/client.py +47 -19
  32. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/discovery.py +12 -1
  33. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/selector.py +56 -2
  34. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/tool_runner.py +28 -2
  35. {devsper-2.4.0 → devsper-2.5.0}/devsper/types/event.py +9 -0
  36. {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/event_logger.py +10 -0
  37. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/loader.py +1 -1
  38. {devsper-2.4.0 → devsper-2.5.0}/devsper.toml +8 -3
  39. devsper-2.5.0/examples/langchain_agent.py +70 -0
  40. devsper-2.5.0/examples/langgraph_swarm.py +83 -0
  41. devsper-2.5.0/memory_utils.py +10 -0
  42. {devsper-2.4.0 → devsper-2.5.0}/pyproject.toml +4 -2
  43. devsper-2.5.0/scripts/qa_e2e_stabilization.sh +15 -0
  44. devsper-2.5.0/tests/test_execution_graph_meta.py +31 -0
  45. devsper-2.5.0/tests/test_langchain_adapter.py +24 -0
  46. devsper-2.5.0/tests/test_langgraph_adapter.py +63 -0
  47. devsper-2.5.0/tests/test_platform_runtime_events.py +66 -0
  48. {devsper-2.4.0 → devsper-2.5.0}/uv.lock +21 -2
  49. devsper-2.4.0/devsper/platform/__init__.py +0 -6
  50. devsper-2.4.0/devsper/server/swarmworker.py +0 -193
  51. devsper-2.4.0/requirements-docs.txt +0 -4
  52. devsper-2.4.0/tests/test_platform_runtime_events.py +0 -37
  53. {devsper-2.4.0 → devsper-2.5.0}/.env.example +0 -0
  54. {devsper-2.4.0 → devsper-2.5.0}/.github/FUNDING.yml +0 -0
  55. {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/pypi-publish.yml +0 -0
  56. {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/release-on-tag.yml +0 -0
  57. {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/worker-release.yml +0 -0
  58. {devsper-2.4.0 → devsper-2.5.0}/.gitignore +0 -0
  59. {devsper-2.4.0 → devsper-2.5.0}/.python-version +0 -0
  60. {devsper-2.4.0 → devsper-2.5.0}/CODE_OF_CONDUCT.md +0 -0
  61. {devsper-2.4.0 → devsper-2.5.0}/CONTRIBUTING.md +0 -0
  62. {devsper-2.4.0 → devsper-2.5.0}/Cargo.lock +0 -0
  63. {devsper-2.4.0 → devsper-2.5.0}/Cargo.toml +0 -0
  64. {devsper-2.4.0 → devsper-2.5.0}/Dockerfile.local-pool +0 -0
  65. {devsper-2.4.0 → devsper-2.5.0}/LICENSE +0 -0
  66. {devsper-2.4.0 → devsper-2.5.0}/SECURITY.md +0 -0
  67. {devsper-2.4.0 → devsper-2.5.0}/benchmarks/__init__.py +0 -0
  68. {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_dataset_analysis.py +0 -0
  69. {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_repository_analysis.py +0 -0
  70. {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_research_pipeline.py +0 -0
  71. {devsper-2.4.0 → devsper-2.5.0}/branding/logo.svg +0 -0
  72. {devsper-2.4.0 → devsper-2.5.0}/devsper/README.md +0 -0
  73. {devsper-2.4.0 → devsper-2.5.0}/devsper/__init__.py +0 -0
  74. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/__init__.py +0 -0
  75. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/client.py +0 -0
  76. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/discovery.py +0 -0
  77. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/server.py +0 -0
  78. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/tool_adapter.py +0 -0
  79. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/types.py +0 -0
  80. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/critic.py +0 -0
  81. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/identity.py +0 -0
  82. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/message_bus.py +0 -0
  83. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/registry.py +0 -0
  84. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/roles.py +0 -0
  85. {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/run_agent.py +0 -0
  86. {devsper-2.4.0 → devsper-2.5.0}/devsper/analytics/__init__.py +0 -0
  87. {devsper-2.4.0 → devsper-2.5.0}/devsper/analytics/tool_analytics.py +0 -0
  88. {devsper-2.4.0 → devsper-2.5.0}/devsper/audit/__init__.py +0 -0
  89. {devsper-2.4.0 → devsper-2.5.0}/devsper/audit/logger.py +0 -0
  90. {devsper-2.4.0 → devsper-2.5.0}/devsper/budget.py +0 -0
  91. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/__init__.py +0 -0
  92. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/__init__.py +0 -0
  93. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/base.py +0 -0
  94. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/memory.py +0 -0
  95. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/redis.py +0 -0
  96. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/message.py +0 -0
  97. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/schema_version.py +0 -0
  98. {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/topics.py +0 -0
  99. {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/__init__.py +0 -0
  100. {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/embedding_index.py +0 -0
  101. {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/hashing.py +0 -0
  102. {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/store.py +0 -0
  103. {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/task_cache.py +0 -0
  104. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/__init__.py +0 -0
  105. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/commands/cloud.py +0 -0
  106. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/export.py +0 -0
  107. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/github_oauth.py +0 -0
  108. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/init.py +0 -0
  109. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/run_progress.py +0 -0
  110. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/__init__.py +0 -0
  111. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/components.py +0 -0
  112. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/controller_run_view.py +0 -0
  113. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/errors.py +0 -0
  114. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/logging.py +0 -0
  115. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/onboarding.py +0 -0
  116. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/progress.py +0 -0
  117. {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/theme.py +0 -0
  118. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/__init__.py +0 -0
  119. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/election.py +0 -0
  120. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/local.py +0 -0
  121. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/node_info.py +0 -0
  122. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/registry.py +0 -0
  123. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/router.py +0 -0
  124. {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/state_backend.py +0 -0
  125. {devsper-2.4.0 → devsper-2.5.0}/devsper/compliance/__init__.py +0 -0
  126. {devsper-2.4.0 → devsper-2.5.0}/devsper/compliance/pii.py +0 -0
  127. {devsper-2.4.0 → devsper-2.5.0}/devsper/config/__init__.py +0 -0
  128. {devsper-2.4.0 → devsper-2.5.0}/devsper/config/config_loader.py +0 -0
  129. {devsper-2.4.0 → devsper-2.5.0}/devsper/config/defaults.py +0 -0
  130. {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/__init__.py +0 -0
  131. {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/base.py +0 -0
  132. {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/registry.py +0 -0
  133. {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/sample_connector.py +0 -0
  134. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/__init__.py +0 -0
  135. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/agent/__init__.py +0 -0
  136. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/agent/runner.py +0 -0
  137. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/hitl/__init__.py +0 -0
  138. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/hitl/state_machine.py +0 -0
  139. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/memory/__init__.py +0 -0
  140. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/memory/shared_memory.py +0 -0
  141. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/reporting/__init__.py +0 -0
  142. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/reporting/publisher.py +0 -0
  143. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/__init__.py +0 -0
  144. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/durability.py +0 -0
  145. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/orchestrator.py +0 -0
  146. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/__init__.py +0 -0
  147. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/base_tool.py +0 -0
  148. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/loader.py +0 -0
  149. {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/registry.py +0 -0
  150. {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/__init__.py +0 -0
  151. {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/cli.py +0 -0
  152. {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/migration.py +0 -0
  153. {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/store.py +0 -0
  154. {devsper-2.4.0 → devsper-2.5.0}/devsper/dashboard/__init__.py +0 -0
  155. {devsper-2.4.0 → devsper-2.5.0}/devsper/dashboard/dashboard.py +0 -0
  156. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/__init__.py +0 -0
  157. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/builder.py +0 -0
  158. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/debugger.py +0 -0
  159. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/repo_index.py +0 -0
  160. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/sandbox.py +0 -0
  161. {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/scaffold.py +0 -0
  162. {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/__init__.py +0 -0
  163. {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/controller.py +0 -0
  164. {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/worker_runtime.py +0 -0
  165. {devsper-2.4.0 → devsper-2.5.0}/devsper/embeddings/__init__.py +0 -0
  166. {devsper-2.4.0 → devsper-2.5.0}/devsper/embeddings/service.py +0 -0
  167. {devsper-2.4.0 → devsper-2.5.0}/devsper/events.py +0 -0
  168. {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/__init__.py +0 -0
  169. {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/decision_tree.py +0 -0
  170. {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/rationale.py +0 -0
  171. {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/simulation.py +0 -0
  172. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/__init__.py +0 -0
  173. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/branding.py +0 -0
  174. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/manifest.py +0 -0
  175. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/model.py +0 -0
  176. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/packager.py +0 -0
  177. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/pdf.py +0 -0
  178. {devsper-2.4.0 → devsper-2.5.0}/devsper/export/service.py +0 -0
  179. {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/__init__.py +0 -0
  180. {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/approval.py +0 -0
  181. {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/escalation.py +0 -0
  182. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/__init__.py +0 -0
  183. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/adaptation.py +0 -0
  184. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/__init__.py +0 -0
  185. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/analyzer.py +0 -0
  186. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  187. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/formatter.py +0 -0
  188. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/run_report.py +0 -0
  189. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/learning_engine.py +0 -0
  190. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/__init__.py +0 -0
  191. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/base.py +0 -0
  192. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  193. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  194. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  195. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  196. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
  197. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategy_selector.py +0 -0
  198. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/synthesis.py +0 -0
  199. {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/task_optimizer.py +0 -0
  200. {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/__init__.py +0 -0
  201. {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/extractor.py +0 -0
  202. {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/knowledge_graph.py +0 -0
  203. {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/query.py +0 -0
  204. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/__init__.py +0 -0
  205. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/consolidation.py +0 -0
  206. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/context.py +0 -0
  207. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/embeddings.py +0 -0
  208. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_index.py +0 -0
  209. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_router.py +0 -0
  210. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_store.py +0 -0
  211. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_types.py +0 -0
  212. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/namespaces.py +0 -0
  213. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/platform_memory.py +0 -0
  214. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/redis_memory.py +0 -0
  215. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/scoring.py +0 -0
  216. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/store.py +0 -0
  217. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/summarizer.py +0 -0
  218. {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
  219. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/__init__.py +0 -0
  220. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/base_agent.py +0 -0
  221. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/__init__.py +0 -0
  222. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/architect_agent.py +0 -0
  223. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/coder_agent.py +0 -0
  224. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/debugger_agent.py +0 -0
  225. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/docs_agent.py +0 -0
  226. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/tester_agent.py +0 -0
  227. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/iteration_loop.py +0 -0
  228. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_memory.py +0 -0
  229. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_planner.py +0 -0
  230. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_runner.py +0 -0
  231. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/models.py +0 -0
  232. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/__init__.py +0 -0
  233. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/editor_agent.py +0 -0
  234. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/researcher_agent.py +0 -0
  235. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/reviewer_agent.py +0 -0
  236. {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/writer_agent.py +0 -0
  237. {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/__init__.py +0 -0
  238. {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/controller.py +0 -0
  239. {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/rpc.py +0 -0
  240. {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/single.py +0 -0
  241. {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/worker.py +0 -0
  242. {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/__init__.py +0 -0
  243. {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/meta_planner.py +0 -0
  244. {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/priority_queue.py +0 -0
  245. {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/redis_results_sink.py +0 -0
  246. {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/reporter.py +0 -0
  247. {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/__init__.py +0 -0
  248. {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/marketplace/__init__.py +0 -0
  249. {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/plugin_loader.py +0 -0
  250. {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/plugin_registry.py +0 -0
  251. {devsper-2.4.0 → devsper-2.5.0}/devsper/policy/client.py +0 -0
  252. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/__init__.py +0 -0
  253. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/config.py +0 -0
  254. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/crypto.py +0 -0
  255. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/local_pool.py +0 -0
  256. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/manager.py +0 -0
  257. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/models.py +0 -0
  258. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/org_pool.py +0 -0
  259. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/dev.toml +0 -0
  260. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/local.toml +0 -0
  261. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/prod.toml +0 -0
  262. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/security.py +0 -0
  263. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/store.py +0 -0
  264. {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/worker_runner.py +0 -0
  265. {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/__init__.py +0 -0
  266. {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/client.py +0 -0
  267. {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/schema.py +0 -0
  268. {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/server.py +0 -0
  269. {devsper-2.4.0 → devsper-2.5.0}/devsper/protocols/__init__.py +0 -0
  270. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/__init__.py +0 -0
  271. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/anthropic.py +0 -0
  272. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/base.py +0 -0
  273. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/complexity_router.py +0 -0
  274. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/gemini.py +0 -0
  275. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/github.py +0 -0
  276. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/model_router.py +0 -0
  277. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/openai.py +0 -0
  278. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/__init__.py +0 -0
  279. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/__init__.py +0 -0
  280. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  281. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/custom_backend.py +0 -0
  282. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
  283. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/github_backend.py +0 -0
  284. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
  285. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/openai_backend.py +0 -0
  286. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
  287. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/base.py +0 -0
  288. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/factory.py +0 -0
  289. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/legacy.py +0 -0
  290. {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/router.py +0 -0
  291. {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/__init__.py +0 -0
  292. {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/graph.py +0 -0
  293. {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/nodes.py +0 -0
  294. {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/store.py +0 -0
  295. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/__init__.py +0 -0
  296. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/agent_pool.py +0 -0
  297. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/clarification_manager.py +0 -0
  298. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/event_stream.py +0 -0
  299. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/health.py +0 -0
  300. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/hitl.py +0 -0
  301. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/planner.py +0 -0
  302. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/replay.py +0 -0
  303. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/replay_engine.py +0 -0
  304. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/retry.py +0 -0
  305. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/run_history.py +0 -0
  306. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/speculative_planner.py +0 -0
  307. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/state_manager.py +0 -0
  308. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/task_state.py +0 -0
  309. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/telemetry.py +0 -0
  310. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/tool_runner.py +0 -0
  311. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/trace_tree.py +0 -0
  312. {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/visualize.py +0 -0
  313. {devsper-2.4.0 → devsper-2.5.0}/devsper/sandbox/__init__.py +0 -0
  314. {devsper-2.4.0 → devsper-2.5.0}/devsper/sandbox/sandbox.py +0 -0
  315. {devsper-2.4.0 → devsper-2.5.0}/devsper/server/__init__.py +0 -0
  316. {devsper-2.4.0 → devsper-2.5.0}/devsper/server/events.py +0 -0
  317. {devsper-2.4.0 → devsper-2.5.0}/devsper/server/topology.py +0 -0
  318. {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/__init__.py +0 -0
  319. {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/uploads/__init__.py +0 -0
  320. {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/uploads/store.py +0 -0
  321. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/checkpointer.py +0 -0
  322. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/executor.py +0 -0
  323. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/map_reduce.py +0 -0
  324. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/planner.py +0 -0
  325. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/prefetcher.py +0 -0
  326. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/scheduler.py +0 -0
  327. {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/speculation.py +0 -0
  328. {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/__init__.py +0 -0
  329. {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/pricing.py +0 -0
  330. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/__init__.py +0 -0
  331. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/base.py +0 -0
  332. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/__init__.py +0 -0
  333. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  334. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  335. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  336. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  337. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  338. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  339. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  340. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  341. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  342. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  343. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  344. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/__init__.py +0 -0
  345. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  346. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
  347. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/extract_functions.py +0 -0
  348. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/format_python.py +0 -0
  349. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/generate_docstrings.py +0 -0
  350. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
  351. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/lint_python.py +0 -0
  352. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/refactor_function.py +0 -0
  353. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/repo_structure_map.py +0 -0
  354. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/run_python.py +0 -0
  355. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/__init__.py +0 -0
  356. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/column_type_detection.py +0 -0
  357. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/csv_summary.py +0 -0
  358. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_filter.py +0 -0
  359. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_groupby.py +0 -0
  360. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_stats.py +0 -0
  361. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataset_sampling.py +0 -0
  362. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataset_schema.py +0 -0
  363. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/json_pretty_print.py +0 -0
  364. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/json_query.py +0 -0
  365. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/missing_value_report.py +0 -0
  366. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/__init__.py +0 -0
  367. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  368. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  369. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  370. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  371. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  372. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_profile.py +0 -0
  373. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  374. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  375. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  376. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/model_input_validator.py +0 -0
  377. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  378. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/__init__.py +0 -0
  379. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/fetch_url.py +0 -0
  380. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/python_exec.py +0 -0
  381. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/read_csv.py +0 -0
  382. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/upload_file.py +0 -0
  383. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/web_search.py +0 -0
  384. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/__init__.py +0 -0
  385. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/_docproc.py +0 -0
  386. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/document_to_markdown.py +0 -0
  387. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_document_images.py +0 -0
  388. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_document_text.py +0 -0
  389. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_equations.py +0 -0
  390. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_tables.py +0 -0
  391. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/summarize_document.py +0 -0
  392. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_latex_document.py +0 -0
  393. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_markdown_document.py +0 -0
  394. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_word_document.py +0 -0
  395. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/__init__.py +0 -0
  396. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  397. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  398. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
  399. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
  400. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  401. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  402. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  403. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/result_comparator.py +0 -0
  404. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/simulation_runner.py +0 -0
  405. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  406. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  407. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/__init__.py +0 -0
  408. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/append_file.py +0 -0
  409. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_hash.py +0 -0
  410. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_line_count.py +0 -0
  411. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_metadata.py +0 -0
  412. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_preview.py +0 -0
  413. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/find_large_files.py +0 -0
  414. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/list_directory.py +0 -0
  415. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/read_file.py +0 -0
  416. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/search_files.py +0 -0
  417. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/write_file.py +0 -0
  418. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/__init__.py +0 -0
  419. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  420. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  421. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  422. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
  423. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  424. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/hitl_request.py +0 -0
  425. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/__init__.py +0 -0
  426. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  427. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  428. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
  429. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  430. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  431. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  432. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  433. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  434. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/__init__.py +0 -0
  435. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/calculate_expression.py +0 -0
  436. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/correlation.py +0 -0
  437. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/distribution_summary.py +0 -0
  438. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/histogram.py +0 -0
  439. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/linear_regression.py +0 -0
  440. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/matrix_multiply.py +0 -0
  441. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/mean_std.py +0 -0
  442. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  443. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/polynomial_fit.py +0 -0
  444. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/random_sample.py +0 -0
  445. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/__init__.py +0 -0
  446. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/adapter.py +0 -0
  447. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/__init__.py +0 -0
  448. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/delete_memory.py +0 -0
  449. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/list_memory.py +0 -0
  450. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/search_memory.py +0 -0
  451. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/store_memory.py +0 -0
  452. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/summarize_memory.py +0 -0
  453. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/tag_memory.py +0 -0
  454. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/pipelines.py +0 -0
  455. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/registry.py +0 -0
  456. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/__init__.py +0 -0
  457. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/arxiv_download.py +0 -0
  458. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/arxiv_search.py +0 -0
  459. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/citation_extractor.py +0 -0
  460. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/duckduckgo_search.py +0 -0
  461. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  462. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/paper_summarizer.py +0 -0
  463. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/research_question_generator.py +0 -0
  464. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/topic_cluster.py +0 -0
  465. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/web_search.py +0 -0
  466. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
  467. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/__init__.py +0 -0
  468. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  469. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  470. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  471. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  472. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  473. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  474. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  475. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  476. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  477. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  478. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  479. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  480. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/__init__.py +0 -0
  481. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/report.py +0 -0
  482. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/scorer.py +0 -0
  483. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/selector.py +0 -0
  484. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/store.py +0 -0
  485. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/__init__.py +0 -0
  486. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/cpu_usage.py +0 -0
  487. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/disk_usage.py +0 -0
  488. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/environment_variables.py +0 -0
  489. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/memory_usage.py +0 -0
  490. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/pip_install.py +0 -0
  491. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/pip_search.py +0 -0
  492. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/process_list.py +0 -0
  493. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/python_package_list.py +0 -0
  494. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/run_shell_command.py +0 -0
  495. {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/system_info.py +0 -0
  496. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/__init__.py +0 -0
  497. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/activity_feed_view.py +0 -0
  498. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/adaptive_tasks_view.py +0 -0
  499. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/agent_role_view.py +0 -0
  500. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/app.py +0 -0
  501. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/dashboard_screen.py +0 -0
  502. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/dev_view.py +0 -0
  503. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/inject_screen.py +0 -0
  504. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/knowledge_graph_view.py +0 -0
  505. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/layout.py +0 -0
  506. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/logs_view.py +0 -0
  507. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/memory_view.py +0 -0
  508. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/mission_view.py +0 -0
  509. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/performance_view.py +0 -0
  510. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/reasoning_graph_view.py +0 -0
  511. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/results_view.py +0 -0
  512. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/swarm_view.py +0 -0
  513. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/task_detail_screen.py +0 -0
  514. {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/task_view.py +0 -0
  515. {devsper-2.4.0 → devsper-2.5.0}/devsper/types/exceptions.py +0 -0
  516. {devsper-2.4.0 → devsper-2.5.0}/devsper/types/swarm.py +0 -0
  517. {devsper-2.4.0 → devsper-2.5.0}/devsper/types/task.py +0 -0
  518. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/__init__.py +0 -0
  519. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/changelog.py +0 -0
  520. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/cli.py +0 -0
  521. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/installer.py +0 -0
  522. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/notifier.py +0 -0
  523. {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/version_check.py +0 -0
  524. {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/http.py +0 -0
  525. {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/models.py +0 -0
  526. {devsper-2.4.0 → devsper-2.5.0}/devsper/visualization/__init__.py +0 -0
  527. {devsper-2.4.0 → devsper-2.5.0}/devsper/visualization/dag_export.py +0 -0
  528. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/__init__.py +0 -0
  529. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/conditions.py +0 -0
  530. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/context.py +0 -0
  531. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/resolver.py +0 -0
  532. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/runner.py +0 -0
  533. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/schema.py +0 -0
  534. {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/validator.py +0 -0
  535. {devsper-2.4.0 → devsper-2.5.0}/docker-compose.yml +0 -0
  536. {devsper-2.4.0 → devsper-2.5.0}/examples/__init__.py +0 -0
  537. {devsper-2.4.0 → devsper-2.5.0}/examples/_common.py +0 -0
  538. {devsper-2.4.0 → devsper-2.5.0}/examples/_config.py +0 -0
  539. {devsper-2.4.0 → devsper-2.5.0}/examples/coding/__init__.py +0 -0
  540. {devsper-2.4.0 → devsper-2.5.0}/examples/coding/analyze_repository.py +0 -0
  541. {devsper-2.4.0 → devsper-2.5.0}/examples/coding/generate_docs.py +0 -0
  542. {devsper-2.4.0 → devsper-2.5.0}/examples/coding/refactor_candidates.py +0 -0
  543. {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/__init__.py +0 -0
  544. {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/dataset_analysis.py +0 -0
  545. {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/run_experiments.py +0 -0
  546. {devsper-2.4.0 → devsper-2.5.0}/examples/demo_swarm.py +0 -0
  547. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/README.md +0 -0
  548. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/controller.toml +0 -0
  549. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/parallel_survey.py +0 -0
  550. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_controller.py +0 -0
  551. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_demo.sh +0 -0
  552. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_worker.py +0 -0
  553. {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/worker.toml +0 -0
  554. {devsper-2.4.0 → devsper-2.5.0}/examples/documents/__init__.py +0 -0
  555. {devsper-2.4.0 → devsper-2.5.0}/examples/documents/analyze_documents.py +0 -0
  556. {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/__init__.py +0 -0
  557. {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/monte_carlo_demo.py +0 -0
  558. {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/parameter_sweep.py +0 -0
  559. {devsper-2.4.0 → devsper-2.5.0}/examples/research/__init__.py +0 -0
  560. {devsper-2.4.0 → devsper-2.5.0}/examples/research/literature_review.py +0 -0
  561. {devsper-2.4.0 → devsper-2.5.0}/examples/research/research_gap_analysis.py +0 -0
  562. {devsper-2.4.0 → devsper-2.5.0}/examples/research/research_graph.py +0 -0
  563. {devsper-2.4.0 → devsper-2.5.0}/scripts/README.md +0 -0
  564. {devsper-2.4.0 → devsper-2.5.0}/scripts/seed_tool_scores.py +0 -0
  565. {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_cli.sh +0 -0
  566. {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_full.sh +0 -0
  567. {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_smoke.py +0 -0
  568. {devsper-2.4.0 → devsper-2.5.0}/scripts/test_v2_router.py +0 -0
  569. {devsper-2.4.0 → devsper-2.5.0}/supermemory-core/Cargo.toml +0 -0
  570. {devsper-2.4.0 → devsper-2.5.0}/supermemory-core/src/main.rs +0 -0
  571. {devsper-2.4.0 → devsper-2.5.0}/tests/agents/__init__.py +0 -0
  572. {devsper-2.4.0 → devsper-2.5.0}/tests/agents/test_roles.py +0 -0
  573. {devsper-2.4.0 → devsper-2.5.0}/tests/benchmarks/test_v16_perf.py +0 -0
  574. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_controller_restart_hitl.py +0 -0
  575. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
  576. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_event_idempotency.py +0 -0
  577. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_event_retry.py +0 -0
  578. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_hitl_pause_resume.py +0 -0
  579. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_sse_reconnect.py +0 -0
  580. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_sse_stream.py +0 -0
  581. {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_worker_crash_recovery.py +0 -0
  582. {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/__init__.py +0 -0
  583. {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_adaptation.py +0 -0
  584. {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_learning_engine.py +0 -0
  585. {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_strategy_selector.py +0 -0
  586. {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_task_optimizer.py +0 -0
  587. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/__init__.py +0 -0
  588. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_agent_memory_integration.py +0 -0
  589. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_context_run_scope.py +0 -0
  590. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_index.py +0 -0
  591. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_router.py +0 -0
  592. {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_store.py +0 -0
  593. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/__init__.py +0 -0
  594. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/fixtures.py +0 -0
  595. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_crypto.py +0 -0
  596. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_e2e_redis_loop.py +0 -0
  597. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_heartbeat_eviction.py +0 -0
  598. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_local_pool.py +0 -0
  599. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_org_pool.py +0 -0
  600. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_priority_chain.py +0 -0
  601. {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_rate_limiting.py +0 -0
  602. {devsper-2.4.0 → devsper-2.5.0}/tests/reasoning/__init__.py +0 -0
  603. {devsper-2.4.0 → devsper-2.5.0}/tests/reasoning/test_reasoning_graph.py +0 -0
  604. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/__init__.py +0 -0
  605. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_budget.py +0 -0
  606. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_otel_phase1.py +0 -0
  607. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_packager.py +0 -0
  608. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_protocol_schema.py +0 -0
  609. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_replay.py +0 -0
  610. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_replay_engine.py +0 -0
  611. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_telemetry.py +0 -0
  612. {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_visualize.py +0 -0
  613. {devsper-2.4.0 → devsper-2.5.0}/tests/test_agent.py +0 -0
  614. {devsper-2.4.0 → devsper-2.5.0}/tests/test_analysis.py +0 -0
  615. {devsper-2.4.0 → devsper-2.5.0}/tests/test_analytics.py +0 -0
  616. {devsper-2.4.0 → devsper-2.5.0}/tests/test_auto_model.py +0 -0
  617. {devsper-2.4.0 → devsper-2.5.0}/tests/test_clarification.py +0 -0
  618. {devsper-2.4.0 → devsper-2.5.0}/tests/test_clarification_multinode.py +0 -0
  619. {devsper-2.4.0 → devsper-2.5.0}/tests/test_config_loader.py +0 -0
  620. {devsper-2.4.0 → devsper-2.5.0}/tests/test_credentials.py +0 -0
  621. {devsper-2.4.0 → devsper-2.5.0}/tests/test_cross_boundary_serialization.py +0 -0
  622. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dag_export.py +0 -0
  623. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_agents.py +0 -0
  624. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_build_cmd.py +0 -0
  625. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_debugger.py +0 -0
  626. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_repo_index.py +0 -0
  627. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_sandbox.py +0 -0
  628. {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_scaffold.py +0 -0
  629. {devsper-2.4.0 → devsper-2.5.0}/tests/test_distributed_bugs.py +0 -0
  630. {devsper-2.4.0 → devsper-2.5.0}/tests/test_embeddings_service.py +0 -0
  631. {devsper-2.4.0 → devsper-2.5.0}/tests/test_event_logger.py +0 -0
  632. {devsper-2.4.0 → devsper-2.5.0}/tests/test_executor.py +0 -0
  633. {devsper-2.4.0 → devsper-2.5.0}/tests/test_export_runs.py +0 -0
  634. {devsper-2.4.0 → devsper-2.5.0}/tests/test_github_provider.py +0 -0
  635. {devsper-2.4.0 → devsper-2.5.0}/tests/test_init.py +0 -0
  636. {devsper-2.4.0 → devsper-2.5.0}/tests/test_knowledge_graph.py +0 -0
  637. {devsper-2.4.0 → devsper-2.5.0}/tests/test_knowledge_query.py +0 -0
  638. {devsper-2.4.0 → devsper-2.5.0}/tests/test_map_reduce.py +0 -0
  639. {devsper-2.4.0 → devsper-2.5.0}/tests/test_memory_evolution.py +0 -0
  640. {devsper-2.4.0 → devsper-2.5.0}/tests/test_memory_isolation.py +0 -0
  641. {devsper-2.4.0 → devsper-2.5.0}/tests/test_missions.py +0 -0
  642. {devsper-2.4.0 → devsper-2.5.0}/tests/test_model_router.py +0 -0
  643. {devsper-2.4.0 → devsper-2.5.0}/tests/test_planner.py +0 -0
  644. {devsper-2.4.0 → devsper-2.5.0}/tests/test_plugins.py +0 -0
  645. {devsper-2.4.0 → devsper-2.5.0}/tests/test_protocols.py +0 -0
  646. {devsper-2.4.0 → devsper-2.5.0}/tests/test_router.py +0 -0
  647. {devsper-2.4.0 → devsper-2.5.0}/tests/test_scheduler.py +0 -0
  648. {devsper-2.4.0 → devsper-2.5.0}/tests/test_speculation.py +0 -0
  649. {devsper-2.4.0 → devsper-2.5.0}/tests/test_strategies.py +0 -0
  650. {devsper-2.4.0 → devsper-2.5.0}/tests/test_swarm.py +0 -0
  651. {devsper-2.4.0 → devsper-2.5.0}/tests/test_task_cache.py +0 -0
  652. {devsper-2.4.0 → devsper-2.5.0}/tests/test_tool_scoring.py +0 -0
  653. {devsper-2.4.0 → devsper-2.5.0}/tests/test_tool_selector.py +0 -0
  654. {devsper-2.4.0 → devsper-2.5.0}/tests/test_upgrade.py +0 -0
  655. {devsper-2.4.0 → devsper-2.5.0}/tests/test_v110.py +0 -0
  656. {devsper-2.4.0 → devsper-2.5.0}/tests/test_v16.py +0 -0
  657. {devsper-2.4.0 → devsper-2.5.0}/tests/test_v17.py +0 -0
  658. {devsper-2.4.0 → devsper-2.5.0}/tests/test_v18.py +0 -0
  659. {devsper-2.4.0 → devsper-2.5.0}/tests/test_v19.py +0 -0
  660. {devsper-2.4.0 → devsper-2.5.0}/tests/test_workflow.py +0 -0
  661. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/__init__.py +0 -0
  662. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_code_intelligence_tools.py +0 -0
  663. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_coding_tools.py +0 -0
  664. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_core_tool_registry.py +0 -0
  665. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_data_science_tools.py +0 -0
  666. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_data_tools.py +0 -0
  667. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_document_tools.py +0 -0
  668. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_experiments_tools.py +0 -0
  669. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_filesystem_tools.py +0 -0
  670. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_flagship_tools.py +0 -0
  671. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_knowledge_tools.py +0 -0
  672. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_math_tools.py +0 -0
  673. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_memory_tools.py +0 -0
  674. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_pipelines.py +0 -0
  675. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_registry.py +0 -0
  676. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_research_advanced_tools.py +0 -0
  677. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_research_tools.py +0 -0
  678. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_system_tools.py +0 -0
  679. {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_tool_runner.py +0 -0
  680. {devsper-2.4.0 → devsper-2.5.0}/worker/.dockerignore +0 -0
  681. {devsper-2.4.0 → devsper-2.5.0}/worker/Cargo.lock +0 -0
  682. {devsper-2.4.0 → devsper-2.5.0}/worker/Cargo.toml +0 -0
  683. {devsper-2.4.0 → devsper-2.5.0}/worker/Dockerfile +0 -0
  684. {devsper-2.4.0 → devsper-2.5.0}/worker/README.md +0 -0
  685. {devsper-2.4.0 → devsper-2.5.0}/worker/src/budget.rs +0 -0
  686. {devsper-2.4.0 → devsper-2.5.0}/worker/src/bus.rs +0 -0
  687. {devsper-2.4.0 → devsper-2.5.0}/worker/src/claim.rs +0 -0
  688. {devsper-2.4.0 → devsper-2.5.0}/worker/src/clarification.rs +0 -0
  689. {devsper-2.4.0 → devsper-2.5.0}/worker/src/config.rs +0 -0
  690. {devsper-2.4.0 → devsper-2.5.0}/worker/src/controller.rs +0 -0
  691. {devsper-2.4.0 → devsper-2.5.0}/worker/src/election.rs +0 -0
  692. {devsper-2.4.0 → devsper-2.5.0}/worker/src/error.rs +0 -0
  693. {devsper-2.4.0 → devsper-2.5.0}/worker/src/executor.rs +0 -0
  694. {devsper-2.4.0 → devsper-2.5.0}/worker/src/health.rs +0 -0
  695. {devsper-2.4.0 → devsper-2.5.0}/worker/src/heartbeat.rs +0 -0
  696. {devsper-2.4.0 → devsper-2.5.0}/worker/src/lib.rs +0 -0
  697. {devsper-2.4.0 → devsper-2.5.0}/worker/src/main.rs +0 -0
  698. {devsper-2.4.0 → devsper-2.5.0}/worker/src/metrics.rs +0 -0
  699. {devsper-2.4.0 → devsper-2.5.0}/worker/src/reconnect.rs +0 -0
  700. {devsper-2.4.0 → devsper-2.5.0}/worker/src/registry.rs +0 -0
  701. {devsper-2.4.0 → devsper-2.5.0}/worker/src/router.rs +0 -0
  702. {devsper-2.4.0 → devsper-2.5.0}/worker/src/rpc.rs +0 -0
  703. {devsper-2.4.0 → devsper-2.5.0}/worker/src/scheduler.rs +0 -0
  704. {devsper-2.4.0 → devsper-2.5.0}/worker/src/snapshot.rs +0 -0
  705. {devsper-2.4.0 → devsper-2.5.0}/worker/src/telemetry.rs +0 -0
  706. {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/agent.rs +0 -0
  707. {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/event.rs +0 -0
  708. {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/mod.rs +0 -0
  709. {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/node.rs +0 -0
  710. {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/task.rs +0 -0
  711. {devsper-2.4.0 → devsper-2.5.0}/worker/src/worker_node.rs +0 -0
  712. {devsper-2.4.0 → devsper-2.5.0}/worker/tests/integration.rs +0 -0
@@ -7,24 +7,42 @@ 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
+
16
+ ## [2.4.1] — 2026-03-31
17
+
18
+ ### Fixed
19
+
20
+ - **HITL prompt loop + context handoff** — Clarification responses are now reused across subtasks, repeated clarification prompts are deduplicated/capped, and follow-up tasks inherit prior user decisions instead of re-asking equivalent questions.
21
+ - **Run view prompt stability** — Local clarification prompts now pause/resume live rendering cleanly, reducing TUI corruption and preventing hidden/stuck prompts during interactive runs.
22
+ - **Silent-failure propagation** — Agent failures now surface as explicit task failures (instead of empty-success paths), with clearer errors for missing model configuration.
23
+ - **Executor compatibility regression** — Restored `budget_manager` compatibility on the runtime executor path to avoid end-of-run `AttributeError` crashes.
24
+
25
+ ### Changed
26
+
27
+ - **Research tool routing defaults** — Tool selection now biases web-first for research/business discovery tasks when no local dataset path is provided.
28
+ - **Export readability + content coverage** — Run export now backfills task outputs from tool traces when direct task result payloads are missing, and includes richer run details in markdown/html/latex/docx outputs.
29
+ - **Duration formatting** — CLI run summary and export outputs now prefer `HH:MM:SS` format.
30
+ - **Telemetry noise control** — Console span export is now opt-in (`DEVSPER_OTEL_CONSOLE=1`) to keep interactive TUI output clean by default.
31
+ - **Auto-export workflow** — Added config-driven post-run export option (`[export] auto_export_on_run`) with selectable output format.
32
+
10
33
  ## [2.4.0] — 2026-03-31
11
34
 
12
35
  ### Added
13
36
 
14
- - **Distributed runtime extension layer** — Added `devsper.distributed` package with controller and worker-runtime wrappers for clean orchestration composition.
15
- - **Agent pool** — Added `runtime/agent_pool.py` with reusable, worker-aware concurrent agent leasing (`acquire_agent`, `release_agent`, `run_agent`, `run_parallel`).
16
- - **Model router (runtime layer)** — Added `runtime/model_router.py` for planning/reasoning/validation model routing with fallback chains.
17
- - **Speculative planner (runtime layer)** — Added `runtime/speculative_planner.py` to predict and stage speculative successor tasks.
18
- - **Runtime HITL manager** — Added `runtime/hitl.py` for pause/resume and explicit human-input request lifecycle handling.
19
- - **Execution graph upgrades** — Extended runtime execution graph with worker assignment metadata and distributed lineage tracking.
37
+ - **Distributed runtime extensions** — Added modular runtime components for distributed orchestration: `AgentPool`, `ModelRouter`, `SpeculativePlanner`, `HITLManager`, `ExecutionGraph` worker assignment tracking, plus distributed wrappers (`distributed/controller.py`, `distributed/worker_runtime.py`).
38
+ - **Runtime architecture documentation** — Expanded runtime docs with distributed architecture, worker/controller lifecycle, speculative execution flow, and HITL lifecycle details.
39
+ - **Tool execution hardening** — Upgraded runtime tool runner with bounded parallelism, dependency-aware batching, per-call timeout isolation, and cancellation support.
20
40
 
21
41
  ### Changed
22
42
 
23
- - **Executor composition** — Runtime executor now integrates AgentPool, ModelRouter, speculative planning hooks, and distributed assignment tracking while preserving default behavior.
24
- - **Task runner routing** — Task execution now supports pool-backed agent execution, scoped model routing, and fallback chain handling.
25
- - **Tool execution control** — Runtime ToolRunner now supports bounded concurrency, dependency-aware batching, per-call timeout, cancellation, and structured results.
26
- - **Event backpressure handling** — Runtime event stream now uses bounded queues with controlled overflow behavior.
27
- - **Runtime docs** — Updated runtime architecture docs in `devsper/README.md` with distributed flow, worker/controller lifecycle, and HITL/speculative execution details.
43
+ - **Executor orchestration** — Runtime executor now supports agent-pool-backed execution, model routing integration, speculative follow-up scheduling hooks, and improved cancellation/backpressure behavior.
44
+ - **Prompt/token efficiency** — Tool schema injection in agent prompts was compressed to reduce runtime token overhead in tool-enabled turns.
45
+ - **Homepage and release communication** — Updated README homepage with v2.4.0 release CTA and an architecture upgrade blog entry for this release.
28
46
 
29
47
  ## [2.3.0] — 2026-03-30
30
48
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.4.0
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
 
@@ -594,6 +594,176 @@ class Agent:
594
594
  self.audit_logger = audit_logger
595
595
  self.audit_run_id = audit_run_id or ""
596
596
  self.clarification_requester = None # set by executor for human-in-the-loop
597
+ self._hitl_response_cache: dict[str, dict] = {}
598
+ self._hitl_prompt_counts: dict[str, int] = {}
599
+ self._hitl_shared_answers: dict[str, str] = {}
600
+ self._hitl_shared_facts: list[str] = []
601
+ try:
602
+ self._hitl_max_prompts_per_task = int(
603
+ str(os.environ.get("DEVSPER_HITL_MAX_PROMPTS_PER_TASK", "1")).strip()
604
+ or "1"
605
+ )
606
+ except Exception:
607
+ self._hitl_max_prompts_per_task = 1
608
+ self._hitl_max_prompts_per_task = max(0, self._hitl_max_prompts_per_task)
609
+
610
+ def _default_answer_for_field(self, field: ClarificationField) -> object:
611
+ prior = self._find_prior_hitl_answer(field.question)
612
+ if prior:
613
+ return prior
614
+ if field.default is not None and str(field.default).strip() != "":
615
+ return field.default
616
+ ftype = str(field.type or "text")
617
+ options = field.options or []
618
+ if ftype == "confirm":
619
+ return True
620
+ if ftype == "multi_select":
621
+ return [options[0]] if options else []
622
+ if ftype == "rank":
623
+ return options
624
+ if ftype == "mcq":
625
+ return options[0] if options else "Proceed with best-effort defaults"
626
+ return "Proceed with best-effort defaults"
627
+
628
+ @staticmethod
629
+ def _normalize_question(text: str) -> str:
630
+ t = re.sub(r"[^a-z0-9\s]+", " ", (text or "").lower())
631
+ return re.sub(r"\s+", " ", t).strip()
632
+
633
+ def _find_prior_hitl_answer(self, question: str) -> str | None:
634
+ qn = self._normalize_question(question)
635
+ if not qn:
636
+ return None
637
+ if qn in self._hitl_shared_answers:
638
+ return self._hitl_shared_answers[qn]
639
+ q_tokens = {t for t in qn.split() if len(t) > 2}
640
+ if not q_tokens:
641
+ return None
642
+ best_overlap = 0
643
+ best_answer: str | None = None
644
+ for prev_qn, prev_answer in self._hitl_shared_answers.items():
645
+ p_tokens = {t for t in prev_qn.split() if len(t) > 2}
646
+ overlap = len(q_tokens.intersection(p_tokens))
647
+ if overlap >= 3 and overlap > best_overlap:
648
+ best_overlap = overlap
649
+ best_answer = prev_answer
650
+ return best_answer
651
+
652
+ def _record_hitl_answers(self, answers: dict[str, object]) -> None:
653
+ for question, answer in (answers or {}).items():
654
+ qn = self._normalize_question(str(question))
655
+ if not qn:
656
+ continue
657
+ answer_text = str(answer)
658
+ self._hitl_shared_answers[qn] = answer_text
659
+ fact = f"- {str(question).strip()}: {answer_text}"
660
+ if fact not in self._hitl_shared_facts:
661
+ self._hitl_shared_facts.append(fact)
662
+
663
+ def _should_auto_web_collection(
664
+ self,
665
+ request: AgentRequest,
666
+ tool_args: dict,
667
+ fields: list[ClarificationField],
668
+ ) -> bool:
669
+ prior_answers_text = " ".join(self._hitl_shared_answers.values()).lower()
670
+ prior_facts_text = " ".join(self._hitl_shared_facts).lower()
671
+ topic = " ".join(
672
+ [
673
+ str(self.user_task or ""),
674
+ str(getattr(request.task, "description", "") or ""),
675
+ str(tool_args.get("context") or ""),
676
+ " ".join(f.question for f in fields),
677
+ prior_answers_text,
678
+ prior_facts_text,
679
+ ]
680
+ ).lower()
681
+ # If this is clearly a research/data-collection workflow asking for local datasets,
682
+ # default to web/public-source collection to avoid blocking the run.
683
+ needs_dataset_input = any(
684
+ token in topic
685
+ for token in (
686
+ "dataset",
687
+ "csv",
688
+ "upload",
689
+ "file",
690
+ "local path",
691
+ "paste",
692
+ "provide the data",
693
+ "provide the dataset",
694
+ )
695
+ )
696
+ research_like = any(
697
+ token in topic
698
+ for token in (
699
+ "research",
700
+ "public source",
701
+ "web",
702
+ "openai business",
703
+ "data collection",
704
+ "comprehensive search",
705
+ "business aspect",
706
+ )
707
+ )
708
+ prior_prefers_web = any(
709
+ token in topic
710
+ for token in (
711
+ "public urls",
712
+ "public url",
713
+ "public-source",
714
+ "public source",
715
+ "web collection",
716
+ "curated list",
717
+ "crawl",
718
+ "fetch",
719
+ "url",
720
+ )
721
+ )
722
+ return needs_dataset_input and (research_like or prior_prefers_web)
723
+
724
+ def _auto_web_collection_answers(
725
+ self,
726
+ fields: list[ClarificationField],
727
+ ) -> dict[str, object]:
728
+ answers: dict[str, object] = {}
729
+ for f in fields:
730
+ q = (f.question or "").lower()
731
+ opts = [str(o) for o in (f.options or [])]
732
+ # Prefer choices indicating web/public/source fetching.
733
+ preferred = None
734
+ for opt in opts:
735
+ ol = opt.lower()
736
+ if any(
737
+ t in ol
738
+ for t in (
739
+ "web",
740
+ "public",
741
+ "url",
742
+ "crawl",
743
+ "fetch",
744
+ "curated list",
745
+ "propose",
746
+ )
747
+ ):
748
+ preferred = opt
749
+ break
750
+ if preferred is not None:
751
+ answers[f.question] = preferred
752
+ continue
753
+ # If there is no explicit web/public option, avoid blocking on local file uploads.
754
+ if any(t in q for t in ("dataset", "profile", "csv", "file", "path")):
755
+ template_opt = next(
756
+ (o for o in opts if any(k in o.lower() for k in ("template", "generic", "sample", "synthetic"))),
757
+ None,
758
+ )
759
+ if template_opt is not None:
760
+ answers[f.question] = template_opt
761
+ continue
762
+ if "how many" in q or "count" in q or "limit" in q:
763
+ answers[f.question] = "Up to 50 public URLs"
764
+ continue
765
+ answers[f.question] = self._default_answer_for_field(f)
766
+ return answers
597
767
 
598
768
  def run(self, request: AgentRequest) -> AgentResponse:
599
769
  """Stateless run: all context in AgentRequest, all output in AgentResponse."""
@@ -770,6 +940,12 @@ class Agent:
770
940
  message_bus_section = self.message_bus.get_context_sync(task.id) or ""
771
941
  if message_bus_section:
772
942
  memory_section = (memory_section + "\n\n" + message_bus_section).strip()
943
+ if self._hitl_shared_facts:
944
+ memory_section = (
945
+ memory_section
946
+ + "\n\nUSER CLARIFICATIONS (APPLY THESE PREFERENCES ACROSS SUBTASKS)\n"
947
+ + "\n".join(self._hitl_shared_facts[-20:])
948
+ ).strip()
773
949
  from devsper.agents.roles import get_role_config
774
950
 
775
951
  role_config = get_role_config(getattr(task, "role", None))
@@ -857,6 +1033,8 @@ class Agent:
857
1033
  success=True,
858
1034
  )
859
1035
  self.apply_response(task, response)
1036
+ if not response.success:
1037
+ raise RuntimeError(response.error or "Agent run failed")
860
1038
  return response.result
861
1039
 
862
1040
  def _enrich_task(self, task: Task, answers: dict) -> Task:
@@ -1223,6 +1401,57 @@ class Agent:
1223
1401
  if not fields:
1224
1402
  return json.dumps({"error": "hitl.request has no valid fields"})
1225
1403
 
1404
+ if self._should_auto_web_collection(request, tool_args, fields):
1405
+ auto_answers = self._auto_web_collection_answers(fields)
1406
+ self._record_hitl_answers(auto_answers)
1407
+ payload = {
1408
+ "request_id": f"auto-web-{request.task.id}",
1409
+ "skipped": False,
1410
+ "answers": auto_answers,
1411
+ "auto_assumed": True,
1412
+ }
1413
+ return json.dumps(payload)
1414
+
1415
+ task_id = request.task.id
1416
+ used_prompts = int(self._hitl_prompt_counts.get(task_id, 0))
1417
+ if used_prompts >= max(0, self._hitl_max_prompts_per_task):
1418
+ # Fast-path: avoid repeated user interruption after first clarification.
1419
+ auto_answers: dict[str, object] = {}
1420
+ for f in fields:
1421
+ auto_answers[f.question] = self._default_answer_for_field(f)
1422
+ self._record_hitl_answers(auto_answers)
1423
+ payload = {
1424
+ "request_id": f"auto-{task_id}-{used_prompts + 1}",
1425
+ "skipped": False,
1426
+ "answers": auto_answers,
1427
+ "auto_assumed": True,
1428
+ }
1429
+ return json.dumps(payload)
1430
+
1431
+ # Prevent repeated identical prompts in the same task/tool loop.
1432
+ signature_payload = {
1433
+ "task_id": request.task.id,
1434
+ "context": str(tool_args.get("context") or "Need user input"),
1435
+ "fields": [
1436
+ {
1437
+ "type": f.type,
1438
+ "question": f.question,
1439
+ "options": f.options or [],
1440
+ "default": f.default,
1441
+ "required": bool(f.required),
1442
+ }
1443
+ for f in fields
1444
+ ],
1445
+ }
1446
+ cache_key = json.dumps(signature_payload, sort_keys=True)
1447
+ cached = self._hitl_response_cache.get(cache_key)
1448
+ if cached is not None:
1449
+ try:
1450
+ self._record_hitl_answers(cached.get("answers") or {})
1451
+ except Exception:
1452
+ pass
1453
+ return json.dumps(cached)
1454
+
1226
1455
  req = ClarificationRequest(
1227
1456
  request_id=str(uuid.uuid4()),
1228
1457
  task_id=request.task.id,
@@ -1233,13 +1462,15 @@ class Agent:
1233
1462
  timeout_seconds=int(tool_args.get("timeout_seconds", 120)),
1234
1463
  )
1235
1464
  resp = requester.request_clarification(req)
1236
- return json.dumps(
1237
- {
1238
- "request_id": req.request_id,
1239
- "skipped": bool(resp.skipped),
1240
- "answers": resp.answers or {},
1241
- }
1242
- )
1465
+ self._hitl_prompt_counts[task_id] = used_prompts + 1
1466
+ self._record_hitl_answers(resp.answers or {})
1467
+ payload = {
1468
+ "request_id": req.request_id,
1469
+ "skipped": bool(resp.skipped),
1470
+ "answers": resp.answers or {},
1471
+ }
1472
+ self._hitl_response_cache[cache_key] = payload
1473
+ return json.dumps(payload)
1243
1474
 
1244
1475
  def _emit_tool_called_audit(
1245
1476
  self, task_id: str, tool_name: str, result: str
@@ -130,23 +130,6 @@ def _platform_api_builder():
130
130
  return PlatformAPIRequestBuilder(base_url=base_url, org_slug=org, token=token)
131
131
 
132
132
 
133
- def _is_platform_default_enabled(args: object) -> bool:
134
- if getattr(args, "local_runtime", False):
135
- return False
136
- # Shadow mode explicitly compares both paths; do not default-route.
137
- if getattr(args, "shadow", False):
138
- return False
139
- if os.environ.get("DEVSPER_PROFILE", "").strip().lower() == "local":
140
- return False
141
- if str(os.environ.get("DEVSPER_RUN_DEFAULT", "platform")).strip().lower() in {
142
- "runtime",
143
- "local",
144
- }:
145
- return False
146
- api = _platform_api_builder()
147
- return api.enabled()
148
-
149
-
150
133
  def _extract_platform_run_fields(payload: dict) -> tuple[str, str, int, int, int]:
151
134
  status = str(payload.get("status", ""))
152
135
  run_id = str(payload.get("run_id", ""))
@@ -181,8 +164,24 @@ def _run_platform_once(task: str, args: object) -> tuple[int, dict, float]:
181
164
  task=task, project_id=project_id or "", manifest=manifest
182
165
  )
183
166
  run_id = str(created.get("run_id", "") or "")
167
+ poll_interval = float(getattr(args, "platform_poll_interval", 2.0) or 2.0)
168
+ if poll_interval <= 0:
169
+ poll_interval = 2.0
170
+ last_print_status = {"status": ""}
171
+
172
+ def _on_update(payload: dict, elapsed: float, changed: bool) -> None:
173
+ if getattr(args, "quiet", False):
174
+ return
175
+ status = str(payload.get("status") or "").strip().lower() or "unknown"
176
+ if changed or status != last_print_status["status"]:
177
+ last_print_status["status"] = status
178
+ print(f"[platform] run_id={run_id} status={status} elapsed={elapsed:.1f}s")
179
+
184
180
  final = api.poll_run(
185
- run_id, timeout_seconds=float(getattr(args, "platform_timeout", 180.0))
181
+ run_id,
182
+ interval_seconds=poll_interval,
183
+ timeout_seconds=float(getattr(args, "platform_timeout", 180.0)),
184
+ on_update=_on_update,
186
185
  )
187
186
  elapsed = time.time() - started
188
187
  return 0, final or {}, elapsed
@@ -251,7 +250,6 @@ def _run_shadow_mode(args: object) -> int:
251
250
  task,
252
251
  "--quiet",
253
252
  "--json",
254
- "--local-runtime",
255
253
  ]
256
254
  local_started = time.time()
257
255
  local_proc = subprocess.run(local_cmd, capture_output=True, text=True)
@@ -383,7 +381,7 @@ def _run_platform_connect(args: object) -> int:
383
381
 
384
382
  print(f"Connected platform: api={api_url} org={org_slug}")
385
383
  print(
386
- "`devsper run` will now default to platform. Use `--local-runtime` to bypass."
384
+ "Use `devsper cloud run` to route runs to platform."
387
385
  )
388
386
  _track_conversion_event("platform_connect_succeeded", {"org": org_slug})
389
387
  return 0
@@ -417,13 +415,7 @@ def _run_swarm(args: object) -> int:
417
415
  _track_conversion_event("runtime_user_detected", {"command": "run"})
418
416
  if getattr(args, "shadow", False):
419
417
  return _run_shadow_mode(args)
420
- if _is_platform_default_enabled(args):
421
- return _run_platform_only(args)
422
- if not getattr(args, "local_runtime", False):
423
- # Contextual nudge when users are still runtime-only.
424
- print(
425
- "Tip: run `devsper platform connect` to unlock retries, audit history, billing controls, and team workflows."
426
- )
418
+ print("Running locally...")
427
419
  # Local profile fast-path: route through platform pool + local workers.
428
420
  if os.environ.get("DEVSPER_PROFILE", "").strip().lower() == "local":
429
421
  try:
@@ -436,10 +428,14 @@ def _run_swarm(args: object) -> int:
436
428
  from devsper.config import get_config
437
429
  from devsper.utils.event_logger import EventLog
438
430
  from devsper.swarm.swarm import Swarm
431
+ from devsper.runtime.executor import Executor
432
+ from devsper.runtime.agent_runner import AgentRunner
439
433
  from devsper.memory.memory_router import MemoryRouter
440
434
  from devsper.memory.memory_store import get_default_store
441
435
  from devsper.memory.memory_index import MemoryIndex
442
436
 
437
+ _ = (Executor, AgentRunner)
438
+
443
439
  task = getattr(args, "task", "Summarize swarm intelligence in one paragraph.")
444
440
  quiet = getattr(args, "quiet", False)
445
441
  summary_only = getattr(args, "summary", False)
@@ -625,6 +621,37 @@ def _run_swarm(args: object) -> int:
625
621
  console.print((result or "")[:2000])
626
622
  if (result or "") and len(result) > 2000:
627
623
  console.print("...")
624
+ try:
625
+ if getattr(cfg, "export", None) and getattr(cfg.export, "auto_export_on_run", False):
626
+ from devsper.export.service import ExportOptions, export_all_runs
627
+
628
+ ts = int(time.time())
629
+ out_dir = f".devsper/exports/runs_{ts}"
630
+ fmt = str(getattr(cfg.export, "format", "docx") or "docx").lower()
631
+ if fmt == "pdf":
632
+ pdf_pipeline = "both"
633
+ else:
634
+ # docx/html/all still benefit from HTML PDF where available.
635
+ pdf_pipeline = "html"
636
+ manifest = export_all_runs(
637
+ ExportOptions(
638
+ output_dir=out_dir,
639
+ limit=int(getattr(cfg.export, "limit", 1) or 1),
640
+ pdf_pipeline=pdf_pipeline,
641
+ )
642
+ )
643
+ files = manifest.get("files", {}) if isinstance(manifest, dict) else {}
644
+ print(f"Auto-export complete: {out_dir}")
645
+ if fmt in {"docx", "all"} and files.get("all_runs_docx"):
646
+ print(f"DOCX: {files.get('all_runs_docx')}")
647
+ if fmt in {"html", "all"} and files.get("all_runs_html"):
648
+ print(f"HTML: {files.get('all_runs_html')}")
649
+ if fmt in {"pdf", "all"}:
650
+ pdf_out = (manifest.get("pdf_outputs", {}) or {}).get("html_pdf")
651
+ if pdf_out:
652
+ print(f"PDF: {pdf_out}")
653
+ except Exception as e:
654
+ print(f"Auto-export failed: {e}", file=sys.stderr)
628
655
  return 0
629
656
 
630
657
 
@@ -2891,11 +2918,6 @@ Examples:
2891
2918
  action="store_true",
2892
2919
  help="Only print run summary, not task results",
2893
2920
  )
2894
- run_parser.add_argument(
2895
- "--local-runtime",
2896
- action="store_true",
2897
- help="Force local runtime path even when platform is connected.",
2898
- )
2899
2921
  run_parser.add_argument(
2900
2922
  "--shadow",
2901
2923
  action="store_true",
@@ -2917,6 +2939,12 @@ Examples:
2917
2939
  default=180.0,
2918
2940
  help="Platform run polling timeout seconds.",
2919
2941
  )
2942
+ run_parser.add_argument(
2943
+ "--platform-poll-interval",
2944
+ type=float,
2945
+ default=2.0,
2946
+ help="Platform polling interval seconds.",
2947
+ )
2920
2948
  run_parser.add_argument(
2921
2949
  "--reporter",
2922
2950
  action="store_true",
@@ -48,8 +48,11 @@ from devsper.cli.ui.components import devsperHeader, TaskRow, RoleTag, CostDispl
48
48
 
49
49
 
50
50
  def is_interactive() -> bool:
51
- """True if we can show interactive prompts (TTY and not CI)."""
52
- return sys.stdout.isatty() and not os.environ.get("CI")
51
+ """True if we can show interactive prompts (requires a real terminal)."""
52
+ try:
53
+ return bool(sys.stdin.isatty() and sys.stdout.isatty())
54
+ except Exception:
55
+ return False
53
56
 
54
57
 
55
58
  def _field_get(field: Any, key: str, default: Any = None) -> Any:
@@ -106,6 +109,9 @@ class ClarificationWidget:
106
109
  from devsper.events import ClarificationResponse
107
110
 
108
111
  if not is_interactive():
112
+ console.print(
113
+ "[hive.warning]HITL prompt auto-skipped: non-interactive terminal detected.[/]"
114
+ )
109
115
  answers = {}
110
116
  for field in self.req.fields:
111
117
  q = _field_get(field, "question")
@@ -589,9 +595,21 @@ def run_live_view(
589
595
  except queue.Empty:
590
596
  pass
591
597
  else:
592
- widget = ClarificationWidget(req, theme_style)
593
- response = widget.render()
594
- executor.receive_clarification(response)
598
+ # Pause Live while prompting to avoid TUI corruption and hidden input.
599
+ try:
600
+ live.stop()
601
+ except Exception:
602
+ pass
603
+ try:
604
+ widget = ClarificationWidget(req, theme_style)
605
+ response = widget.render()
606
+ executor.receive_clarification(response)
607
+ finally:
608
+ try:
609
+ live.start()
610
+ live.update(get_renderable())
611
+ except Exception:
612
+ pass
595
613
  if cloud_hitl_submit is not None:
596
614
  payload = _first_pending_cloud_clarification(log_path, handled_cloud_hitl)
597
615
  if payload:
@@ -813,10 +831,14 @@ def print_run_summary(state: RunViewState, results: dict[str, str], summary_only
813
831
  if duration_s < 0:
814
832
  duration_s = 0.0
815
833
  cost_str = f"${state.total_cost_usd:.4f}" if (state.total_cost_usd is not None and state.total_cost_usd > 0) else "—"
834
+ hh = int(duration_s // 3600)
835
+ mm = int((duration_s % 3600) // 60)
836
+ ss = int(duration_s % 60)
837
+ duration_hms = f"{hh:02d}:{mm:02d}:{ss:02d}"
816
838
  cache_hits = sum(1 for t in state.tasks if t.status == "cached")
817
839
  lines = [
818
840
  f"{total} tasks · {done} completed · {failed_n} failed · {skipped} skipped",
819
- f"Duration: {duration_s:.1f}s · Cost: {cost_str} · Cache hits: {cache_hits}",
841
+ f"Duration: {duration_hms} · Cost: {cost_str} · Cache hits: {cache_hits}",
820
842
  f"run id: {state.run_id_short}",
821
843
  ]
822
844
  console.print(Panel("\n".join(lines), title="Run complete", border_style="hive.success"))