devsper 2.3.0__tar.gz → 2.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (696) hide show
  1. {devsper-2.3.0 → devsper-2.4.1}/CHANGELOG.md +31 -0
  2. {devsper-2.3.0 → devsper-2.4.1}/PKG-INFO +1 -1
  3. devsper-2.4.1/devsper/README.md +148 -0
  4. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/agent.py +252 -8
  5. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/main.py +60 -32
  6. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/run_view.py +28 -6
  7. {devsper-2.3.0 → devsper-2.4.1}/devsper/config/resolver.py +4 -0
  8. {devsper-2.3.0 → devsper-2.4.1}/devsper/config/schema.py +7 -0
  9. devsper-2.4.1/devsper/distributed/__init__.py +7 -0
  10. devsper-2.4.1/devsper/distributed/controller.py +70 -0
  11. devsper-2.4.1/devsper/distributed/worker_runtime.py +43 -0
  12. {devsper-2.3.0 → devsper-2.4.1}/devsper/docs/architecture/execution-model.md +5 -0
  13. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/collector.py +14 -0
  14. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/writers.py +51 -12
  15. {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/request_builder.py +22 -3
  16. devsper-2.4.1/devsper/runtime/__init__.py +34 -0
  17. devsper-2.4.1/devsper/runtime/agent_pool.py +85 -0
  18. devsper-2.4.1/devsper/runtime/agent_runner.py +95 -0
  19. devsper-2.4.1/devsper/runtime/event_stream.py +58 -0
  20. devsper-2.4.1/devsper/runtime/execution_graph.py +101 -0
  21. devsper-2.4.1/devsper/runtime/executor.py +277 -0
  22. devsper-2.4.1/devsper/runtime/hitl.py +71 -0
  23. devsper-2.4.1/devsper/runtime/model_router.py +53 -0
  24. devsper-2.4.1/devsper/runtime/planner.py +28 -0
  25. devsper-2.4.1/devsper/runtime/retry.py +61 -0
  26. devsper-2.4.1/devsper/runtime/speculative_planner.py +51 -0
  27. devsper-2.4.1/devsper/runtime/state_manager.py +52 -0
  28. devsper-2.4.1/devsper/runtime/task_runner.py +106 -0
  29. devsper-2.4.1/devsper/runtime/tool_runner.py +169 -0
  30. {devsper-2.3.0 → devsper-2.4.1}/devsper/server/swarmworker.py +27 -5
  31. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/swarm.py +6 -1
  32. {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/otel.py +6 -3
  33. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/selector.py +56 -2
  34. {devsper-2.3.0 → devsper-2.4.1}/pyproject.toml +1 -1
  35. {devsper-2.3.0 → devsper-2.4.1}/uv.lock +1 -1
  36. devsper-2.3.0/devsper/runtime/__init__.py +0 -12
  37. devsper-2.3.0/devsper/runtime/executor.py +0 -5
  38. {devsper-2.3.0 → devsper-2.4.1}/.env.example +0 -0
  39. {devsper-2.3.0 → devsper-2.4.1}/.github/FUNDING.yml +0 -0
  40. {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/pypi-publish.yml +0 -0
  41. {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/release-on-tag.yml +0 -0
  42. {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/worker-release.yml +0 -0
  43. {devsper-2.3.0 → devsper-2.4.1}/.gitignore +0 -0
  44. {devsper-2.3.0 → devsper-2.4.1}/.python-version +0 -0
  45. {devsper-2.3.0 → devsper-2.4.1}/CODE_OF_CONDUCT.md +0 -0
  46. {devsper-2.3.0 → devsper-2.4.1}/CONTRIBUTING.md +0 -0
  47. {devsper-2.3.0 → devsper-2.4.1}/Cargo.lock +0 -0
  48. {devsper-2.3.0 → devsper-2.4.1}/Cargo.toml +0 -0
  49. {devsper-2.3.0 → devsper-2.4.1}/Dockerfile.local-pool +0 -0
  50. {devsper-2.3.0 → devsper-2.4.1}/LICENSE +0 -0
  51. {devsper-2.3.0 → devsper-2.4.1}/README.md +0 -0
  52. {devsper-2.3.0 → devsper-2.4.1}/SECURITY.md +0 -0
  53. {devsper-2.3.0 → devsper-2.4.1}/benchmarks/__init__.py +0 -0
  54. {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_dataset_analysis.py +0 -0
  55. {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_repository_analysis.py +0 -0
  56. {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_research_pipeline.py +0 -0
  57. {devsper-2.3.0 → devsper-2.4.1}/branding/logo.svg +0 -0
  58. {devsper-2.3.0 → devsper-2.4.1}/devsper/__init__.py +0 -0
  59. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/__init__.py +0 -0
  60. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/client.py +0 -0
  61. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/discovery.py +0 -0
  62. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/server.py +0 -0
  63. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/tool_adapter.py +0 -0
  64. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/types.py +0 -0
  65. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/critic.py +0 -0
  66. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/identity.py +0 -0
  67. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/message_bus.py +0 -0
  68. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/registry.py +0 -0
  69. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/roles.py +0 -0
  70. {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/run_agent.py +0 -0
  71. {devsper-2.3.0 → devsper-2.4.1}/devsper/analytics/__init__.py +0 -0
  72. {devsper-2.3.0 → devsper-2.4.1}/devsper/analytics/tool_analytics.py +0 -0
  73. {devsper-2.3.0 → devsper-2.4.1}/devsper/audit/__init__.py +0 -0
  74. {devsper-2.3.0 → devsper-2.4.1}/devsper/audit/logger.py +0 -0
  75. {devsper-2.3.0 → devsper-2.4.1}/devsper/budget.py +0 -0
  76. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/__init__.py +0 -0
  77. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/__init__.py +0 -0
  78. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/base.py +0 -0
  79. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/memory.py +0 -0
  80. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/redis.py +0 -0
  81. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/message.py +0 -0
  82. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/schema_version.py +0 -0
  83. {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/topics.py +0 -0
  84. {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/__init__.py +0 -0
  85. {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/embedding_index.py +0 -0
  86. {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/hashing.py +0 -0
  87. {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/store.py +0 -0
  88. {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/task_cache.py +0 -0
  89. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/__init__.py +0 -0
  90. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/commands/cloud.py +0 -0
  91. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/export.py +0 -0
  92. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/github_oauth.py +0 -0
  93. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/init.py +0 -0
  94. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/run_progress.py +0 -0
  95. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/__init__.py +0 -0
  96. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/components.py +0 -0
  97. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/controller_run_view.py +0 -0
  98. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/errors.py +0 -0
  99. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/logging.py +0 -0
  100. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/onboarding.py +0 -0
  101. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/progress.py +0 -0
  102. {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/theme.py +0 -0
  103. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/__init__.py +0 -0
  104. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/election.py +0 -0
  105. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/local.py +0 -0
  106. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/node_info.py +0 -0
  107. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/registry.py +0 -0
  108. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/router.py +0 -0
  109. {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/state_backend.py +0 -0
  110. {devsper-2.3.0 → devsper-2.4.1}/devsper/compliance/__init__.py +0 -0
  111. {devsper-2.3.0 → devsper-2.4.1}/devsper/compliance/pii.py +0 -0
  112. {devsper-2.3.0 → devsper-2.4.1}/devsper/config/__init__.py +0 -0
  113. {devsper-2.3.0 → devsper-2.4.1}/devsper/config/config_loader.py +0 -0
  114. {devsper-2.3.0 → devsper-2.4.1}/devsper/config/defaults.py +0 -0
  115. {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/__init__.py +0 -0
  116. {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/base.py +0 -0
  117. {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/registry.py +0 -0
  118. {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/sample_connector.py +0 -0
  119. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/__init__.py +0 -0
  120. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/agent/__init__.py +0 -0
  121. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/agent/runner.py +0 -0
  122. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/hitl/__init__.py +0 -0
  123. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/hitl/state_machine.py +0 -0
  124. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/memory/__init__.py +0 -0
  125. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/memory/shared_memory.py +0 -0
  126. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/reporting/__init__.py +0 -0
  127. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/reporting/publisher.py +0 -0
  128. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/__init__.py +0 -0
  129. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/durability.py +0 -0
  130. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/orchestrator.py +0 -0
  131. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/__init__.py +0 -0
  132. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/base_tool.py +0 -0
  133. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/loader.py +0 -0
  134. {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/registry.py +0 -0
  135. {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/__init__.py +0 -0
  136. {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/cli.py +0 -0
  137. {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/migration.py +0 -0
  138. {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/store.py +0 -0
  139. {devsper-2.3.0 → devsper-2.4.1}/devsper/dashboard/__init__.py +0 -0
  140. {devsper-2.3.0 → devsper-2.4.1}/devsper/dashboard/dashboard.py +0 -0
  141. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/__init__.py +0 -0
  142. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/builder.py +0 -0
  143. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/debugger.py +0 -0
  144. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/repo_index.py +0 -0
  145. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/sandbox.py +0 -0
  146. {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/scaffold.py +0 -0
  147. {devsper-2.3.0 → devsper-2.4.1}/devsper/embeddings/__init__.py +0 -0
  148. {devsper-2.3.0 → devsper-2.4.1}/devsper/embeddings/service.py +0 -0
  149. {devsper-2.3.0 → devsper-2.4.1}/devsper/events.py +0 -0
  150. {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/__init__.py +0 -0
  151. {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/decision_tree.py +0 -0
  152. {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/rationale.py +0 -0
  153. {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/simulation.py +0 -0
  154. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/__init__.py +0 -0
  155. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/branding.py +0 -0
  156. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/manifest.py +0 -0
  157. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/model.py +0 -0
  158. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/packager.py +0 -0
  159. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/pdf.py +0 -0
  160. {devsper-2.3.0 → devsper-2.4.1}/devsper/export/service.py +0 -0
  161. {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/__init__.py +0 -0
  162. {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/approval.py +0 -0
  163. {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/escalation.py +0 -0
  164. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/__init__.py +0 -0
  165. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/adaptation.py +0 -0
  166. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/__init__.py +0 -0
  167. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/analyzer.py +0 -0
  168. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  169. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/formatter.py +0 -0
  170. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/run_report.py +0 -0
  171. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/learning_engine.py +0 -0
  172. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/__init__.py +0 -0
  173. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/base.py +0 -0
  174. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  175. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  176. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  177. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  178. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/research_strategy.py +0 -0
  179. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategy_selector.py +0 -0
  180. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/synthesis.py +0 -0
  181. {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/task_optimizer.py +0 -0
  182. {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/__init__.py +0 -0
  183. {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/extractor.py +0 -0
  184. {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/knowledge_graph.py +0 -0
  185. {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/query.py +0 -0
  186. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/__init__.py +0 -0
  187. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/consolidation.py +0 -0
  188. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/context.py +0 -0
  189. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/embeddings.py +0 -0
  190. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_index.py +0 -0
  191. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_router.py +0 -0
  192. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_store.py +0 -0
  193. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_types.py +0 -0
  194. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/namespaces.py +0 -0
  195. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/platform_memory.py +0 -0
  196. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/redis_memory.py +0 -0
  197. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/scoring.py +0 -0
  198. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/store.py +0 -0
  199. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/summarizer.py +0 -0
  200. {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/supermemory_rust_ranker.py +0 -0
  201. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/__init__.py +0 -0
  202. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/base_agent.py +0 -0
  203. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/__init__.py +0 -0
  204. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/architect_agent.py +0 -0
  205. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/coder_agent.py +0 -0
  206. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/debugger_agent.py +0 -0
  207. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/docs_agent.py +0 -0
  208. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/tester_agent.py +0 -0
  209. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/iteration_loop.py +0 -0
  210. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_memory.py +0 -0
  211. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_planner.py +0 -0
  212. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_runner.py +0 -0
  213. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/models.py +0 -0
  214. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/__init__.py +0 -0
  215. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/editor_agent.py +0 -0
  216. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/researcher_agent.py +0 -0
  217. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/reviewer_agent.py +0 -0
  218. {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/writer_agent.py +0 -0
  219. {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/__init__.py +0 -0
  220. {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/controller.py +0 -0
  221. {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/rpc.py +0 -0
  222. {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/single.py +0 -0
  223. {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/worker.py +0 -0
  224. {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/__init__.py +0 -0
  225. {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/meta_planner.py +0 -0
  226. {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/priority_queue.py +0 -0
  227. {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/__init__.py +0 -0
  228. {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/redis_results_sink.py +0 -0
  229. {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/reporter.py +0 -0
  230. {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/runtime_events.py +0 -0
  231. {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/__init__.py +0 -0
  232. {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/marketplace/__init__.py +0 -0
  233. {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/plugin_loader.py +0 -0
  234. {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/plugin_registry.py +0 -0
  235. {devsper-2.3.0 → devsper-2.4.1}/devsper/policy/client.py +0 -0
  236. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/__init__.py +0 -0
  237. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/config.py +0 -0
  238. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/crypto.py +0 -0
  239. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/local_pool.py +0 -0
  240. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/manager.py +0 -0
  241. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/models.py +0 -0
  242. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/org_pool.py +0 -0
  243. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/dev.toml +0 -0
  244. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/local.toml +0 -0
  245. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/prod.toml +0 -0
  246. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/security.py +0 -0
  247. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/store.py +0 -0
  248. {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/worker_runner.py +0 -0
  249. {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/__init__.py +0 -0
  250. {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/client.py +0 -0
  251. {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/schema.py +0 -0
  252. {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/server.py +0 -0
  253. {devsper-2.3.0 → devsper-2.4.1}/devsper/protocols/__init__.py +0 -0
  254. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/__init__.py +0 -0
  255. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/anthropic.py +0 -0
  256. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/base.py +0 -0
  257. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/complexity_router.py +0 -0
  258. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/gemini.py +0 -0
  259. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/github.py +0 -0
  260. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/model_router.py +0 -0
  261. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/openai.py +0 -0
  262. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/__init__.py +0 -0
  263. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/__init__.py +0 -0
  264. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  265. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/custom_backend.py +0 -0
  266. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/gemini_backend.py +0 -0
  267. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/github_backend.py +0 -0
  268. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/ollama_backend.py +0 -0
  269. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/openai_backend.py +0 -0
  270. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/vllm_backend.py +0 -0
  271. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/base.py +0 -0
  272. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/factory.py +0 -0
  273. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/legacy.py +0 -0
  274. {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/router.py +0 -0
  275. {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/__init__.py +0 -0
  276. {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/graph.py +0 -0
  277. {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/nodes.py +0 -0
  278. {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/store.py +0 -0
  279. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/clarification_manager.py +0 -0
  280. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/health.py +0 -0
  281. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/replay.py +0 -0
  282. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/replay_engine.py +0 -0
  283. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/run_history.py +0 -0
  284. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/task_state.py +0 -0
  285. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/telemetry.py +0 -0
  286. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/trace_tree.py +0 -0
  287. {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/visualize.py +0 -0
  288. {devsper-2.3.0 → devsper-2.4.1}/devsper/sandbox/__init__.py +0 -0
  289. {devsper-2.3.0 → devsper-2.4.1}/devsper/sandbox/sandbox.py +0 -0
  290. {devsper-2.3.0 → devsper-2.4.1}/devsper/server/__init__.py +0 -0
  291. {devsper-2.3.0 → devsper-2.4.1}/devsper/server/events.py +0 -0
  292. {devsper-2.3.0 → devsper-2.4.1}/devsper/server/topology.py +0 -0
  293. {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/__init__.py +0 -0
  294. {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/uploads/__init__.py +0 -0
  295. {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/uploads/store.py +0 -0
  296. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/checkpointer.py +0 -0
  297. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/executor.py +0 -0
  298. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/map_reduce.py +0 -0
  299. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/planner.py +0 -0
  300. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/prefetcher.py +0 -0
  301. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/scheduler.py +0 -0
  302. {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/speculation.py +0 -0
  303. {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/__init__.py +0 -0
  304. {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/pricing.py +0 -0
  305. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/__init__.py +0 -0
  306. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/base.py +0 -0
  307. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/__init__.py +0 -0
  308. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  309. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  310. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  311. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  312. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  313. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  314. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  315. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  316. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  317. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  318. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  319. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/__init__.py +0 -0
  320. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  321. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/dependency_analyzer.py +0 -0
  322. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/extract_functions.py +0 -0
  323. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/format_python.py +0 -0
  324. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/generate_docstrings.py +0 -0
  325. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/generate_unit_tests.py +0 -0
  326. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/lint_python.py +0 -0
  327. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/refactor_function.py +0 -0
  328. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/repo_structure_map.py +0 -0
  329. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/run_python.py +0 -0
  330. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/__init__.py +0 -0
  331. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/column_type_detection.py +0 -0
  332. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/csv_summary.py +0 -0
  333. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_filter.py +0 -0
  334. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_groupby.py +0 -0
  335. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_stats.py +0 -0
  336. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataset_sampling.py +0 -0
  337. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataset_schema.py +0 -0
  338. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/json_pretty_print.py +0 -0
  339. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/json_query.py +0 -0
  340. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/missing_value_report.py +0 -0
  341. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/__init__.py +0 -0
  342. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  343. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  344. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  345. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  346. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  347. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_profile.py +0 -0
  348. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  349. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  350. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  351. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/model_input_validator.py +0 -0
  352. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  353. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/__init__.py +0 -0
  354. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/fetch_url.py +0 -0
  355. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/python_exec.py +0 -0
  356. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/read_csv.py +0 -0
  357. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/upload_file.py +0 -0
  358. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/web_search.py +0 -0
  359. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/__init__.py +0 -0
  360. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/_docproc.py +0 -0
  361. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/document_to_markdown.py +0 -0
  362. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_document_images.py +0 -0
  363. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_document_text.py +0 -0
  364. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_equations.py +0 -0
  365. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_tables.py +0 -0
  366. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/summarize_document.py +0 -0
  367. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_latex_document.py +0 -0
  368. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_markdown_document.py +0 -0
  369. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_word_document.py +0 -0
  370. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/__init__.py +0 -0
  371. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  372. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  373. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/experiment_tracker.py +0 -0
  374. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/grid_search_runner.py +0 -0
  375. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  376. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  377. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  378. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/result_comparator.py +0 -0
  379. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/simulation_runner.py +0 -0
  380. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  381. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  382. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/__init__.py +0 -0
  383. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/append_file.py +0 -0
  384. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_hash.py +0 -0
  385. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_line_count.py +0 -0
  386. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_metadata.py +0 -0
  387. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_preview.py +0 -0
  388. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/find_large_files.py +0 -0
  389. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/list_directory.py +0 -0
  390. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/read_file.py +0 -0
  391. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/search_files.py +0 -0
  392. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/write_file.py +0 -0
  393. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/__init__.py +0 -0
  394. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  395. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  396. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  397. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/research_graph_builder.py +0 -0
  398. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  399. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/hitl_request.py +0 -0
  400. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/__init__.py +0 -0
  401. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  402. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  403. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/corpus_builder.py +0 -0
  404. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  405. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  406. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  407. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  408. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  409. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/__init__.py +0 -0
  410. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/calculate_expression.py +0 -0
  411. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/correlation.py +0 -0
  412. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/distribution_summary.py +0 -0
  413. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/histogram.py +0 -0
  414. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/linear_regression.py +0 -0
  415. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/matrix_multiply.py +0 -0
  416. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/mean_std.py +0 -0
  417. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  418. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/polynomial_fit.py +0 -0
  419. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/random_sample.py +0 -0
  420. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/__init__.py +0 -0
  421. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/adapter.py +0 -0
  422. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/client.py +0 -0
  423. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/discovery.py +0 -0
  424. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/__init__.py +0 -0
  425. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/delete_memory.py +0 -0
  426. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/list_memory.py +0 -0
  427. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/search_memory.py +0 -0
  428. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/store_memory.py +0 -0
  429. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/summarize_memory.py +0 -0
  430. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/tag_memory.py +0 -0
  431. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/pipelines.py +0 -0
  432. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/registry.py +0 -0
  433. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/__init__.py +0 -0
  434. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/arxiv_download.py +0 -0
  435. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/arxiv_search.py +0 -0
  436. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/citation_extractor.py +0 -0
  437. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/duckduckgo_search.py +0 -0
  438. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  439. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/paper_summarizer.py +0 -0
  440. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/research_question_generator.py +0 -0
  441. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/topic_cluster.py +0 -0
  442. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/web_search.py +0 -0
  443. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/wikipedia_lookup.py +0 -0
  444. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/__init__.py +0 -0
  445. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  446. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  447. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  448. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  449. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  450. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  451. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  452. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  453. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  454. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  455. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  456. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  457. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/__init__.py +0 -0
  458. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/report.py +0 -0
  459. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/scorer.py +0 -0
  460. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/selector.py +0 -0
  461. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/store.py +0 -0
  462. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/__init__.py +0 -0
  463. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/cpu_usage.py +0 -0
  464. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/disk_usage.py +0 -0
  465. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/environment_variables.py +0 -0
  466. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/memory_usage.py +0 -0
  467. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/pip_install.py +0 -0
  468. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/pip_search.py +0 -0
  469. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/process_list.py +0 -0
  470. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/python_package_list.py +0 -0
  471. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/run_shell_command.py +0 -0
  472. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/system_info.py +0 -0
  473. {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/tool_runner.py +0 -0
  474. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/__init__.py +0 -0
  475. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/activity_feed_view.py +0 -0
  476. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/adaptive_tasks_view.py +0 -0
  477. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/agent_role_view.py +0 -0
  478. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/app.py +0 -0
  479. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/dashboard_screen.py +0 -0
  480. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/dev_view.py +0 -0
  481. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/inject_screen.py +0 -0
  482. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/knowledge_graph_view.py +0 -0
  483. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/layout.py +0 -0
  484. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/logs_view.py +0 -0
  485. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/memory_view.py +0 -0
  486. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/mission_view.py +0 -0
  487. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/performance_view.py +0 -0
  488. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/reasoning_graph_view.py +0 -0
  489. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/results_view.py +0 -0
  490. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/swarm_view.py +0 -0
  491. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/task_detail_screen.py +0 -0
  492. {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/task_view.py +0 -0
  493. {devsper-2.3.0 → devsper-2.4.1}/devsper/types/event.py +0 -0
  494. {devsper-2.3.0 → devsper-2.4.1}/devsper/types/exceptions.py +0 -0
  495. {devsper-2.3.0 → devsper-2.4.1}/devsper/types/swarm.py +0 -0
  496. {devsper-2.3.0 → devsper-2.4.1}/devsper/types/task.py +0 -0
  497. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/__init__.py +0 -0
  498. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/changelog.py +0 -0
  499. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/cli.py +0 -0
  500. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/installer.py +0 -0
  501. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/notifier.py +0 -0
  502. {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/version_check.py +0 -0
  503. {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/event_logger.py +0 -0
  504. {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/http.py +0 -0
  505. {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/models.py +0 -0
  506. {devsper-2.3.0 → devsper-2.4.1}/devsper/visualization/__init__.py +0 -0
  507. {devsper-2.3.0 → devsper-2.4.1}/devsper/visualization/dag_export.py +0 -0
  508. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/__init__.py +0 -0
  509. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/conditions.py +0 -0
  510. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/context.py +0 -0
  511. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/loader.py +0 -0
  512. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/resolver.py +0 -0
  513. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/runner.py +0 -0
  514. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/schema.py +0 -0
  515. {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/validator.py +0 -0
  516. {devsper-2.3.0 → devsper-2.4.1}/devsper.toml +0 -0
  517. {devsper-2.3.0 → devsper-2.4.1}/docker-compose.yml +0 -0
  518. {devsper-2.3.0 → devsper-2.4.1}/examples/__init__.py +0 -0
  519. {devsper-2.3.0 → devsper-2.4.1}/examples/_common.py +0 -0
  520. {devsper-2.3.0 → devsper-2.4.1}/examples/_config.py +0 -0
  521. {devsper-2.3.0 → devsper-2.4.1}/examples/coding/__init__.py +0 -0
  522. {devsper-2.3.0 → devsper-2.4.1}/examples/coding/analyze_repository.py +0 -0
  523. {devsper-2.3.0 → devsper-2.4.1}/examples/coding/generate_docs.py +0 -0
  524. {devsper-2.3.0 → devsper-2.4.1}/examples/coding/refactor_candidates.py +0 -0
  525. {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/__init__.py +0 -0
  526. {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/dataset_analysis.py +0 -0
  527. {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/run_experiments.py +0 -0
  528. {devsper-2.3.0 → devsper-2.4.1}/examples/demo_swarm.py +0 -0
  529. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/README.md +0 -0
  530. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/controller.toml +0 -0
  531. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/parallel_survey.py +0 -0
  532. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_controller.py +0 -0
  533. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_demo.sh +0 -0
  534. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_worker.py +0 -0
  535. {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/worker.toml +0 -0
  536. {devsper-2.3.0 → devsper-2.4.1}/examples/documents/__init__.py +0 -0
  537. {devsper-2.3.0 → devsper-2.4.1}/examples/documents/analyze_documents.py +0 -0
  538. {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/__init__.py +0 -0
  539. {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/monte_carlo_demo.py +0 -0
  540. {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/parameter_sweep.py +0 -0
  541. {devsper-2.3.0 → devsper-2.4.1}/examples/research/__init__.py +0 -0
  542. {devsper-2.3.0 → devsper-2.4.1}/examples/research/literature_review.py +0 -0
  543. {devsper-2.3.0 → devsper-2.4.1}/examples/research/research_gap_analysis.py +0 -0
  544. {devsper-2.3.0 → devsper-2.4.1}/examples/research/research_graph.py +0 -0
  545. {devsper-2.3.0 → devsper-2.4.1}/requirements-docs.txt +0 -0
  546. {devsper-2.3.0 → devsper-2.4.1}/scripts/README.md +0 -0
  547. {devsper-2.3.0 → devsper-2.4.1}/scripts/seed_tool_scores.py +0 -0
  548. {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_cli.sh +0 -0
  549. {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_full.sh +0 -0
  550. {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_smoke.py +0 -0
  551. {devsper-2.3.0 → devsper-2.4.1}/scripts/test_v2_router.py +0 -0
  552. {devsper-2.3.0 → devsper-2.4.1}/supermemory-core/Cargo.toml +0 -0
  553. {devsper-2.3.0 → devsper-2.4.1}/supermemory-core/src/main.rs +0 -0
  554. {devsper-2.3.0 → devsper-2.4.1}/tests/agents/__init__.py +0 -0
  555. {devsper-2.3.0 → devsper-2.4.1}/tests/agents/test_roles.py +0 -0
  556. {devsper-2.3.0 → devsper-2.4.1}/tests/benchmarks/test_v16_perf.py +0 -0
  557. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_controller_restart_hitl.py +0 -0
  558. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_duplicate_event_delivery.py +0 -0
  559. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_event_idempotency.py +0 -0
  560. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_event_retry.py +0 -0
  561. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_hitl_pause_resume.py +0 -0
  562. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_sse_reconnect.py +0 -0
  563. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_sse_stream.py +0 -0
  564. {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_worker_crash_recovery.py +0 -0
  565. {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/__init__.py +0 -0
  566. {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_adaptation.py +0 -0
  567. {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_learning_engine.py +0 -0
  568. {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_strategy_selector.py +0 -0
  569. {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_task_optimizer.py +0 -0
  570. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/__init__.py +0 -0
  571. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_agent_memory_integration.py +0 -0
  572. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_context_run_scope.py +0 -0
  573. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_index.py +0 -0
  574. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_router.py +0 -0
  575. {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_store.py +0 -0
  576. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/__init__.py +0 -0
  577. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/fixtures.py +0 -0
  578. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_crypto.py +0 -0
  579. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_e2e_redis_loop.py +0 -0
  580. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_heartbeat_eviction.py +0 -0
  581. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_local_pool.py +0 -0
  582. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_org_pool.py +0 -0
  583. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_priority_chain.py +0 -0
  584. {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_rate_limiting.py +0 -0
  585. {devsper-2.3.0 → devsper-2.4.1}/tests/reasoning/__init__.py +0 -0
  586. {devsper-2.3.0 → devsper-2.4.1}/tests/reasoning/test_reasoning_graph.py +0 -0
  587. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/__init__.py +0 -0
  588. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_budget.py +0 -0
  589. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_otel_phase1.py +0 -0
  590. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_packager.py +0 -0
  591. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_protocol_schema.py +0 -0
  592. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_replay.py +0 -0
  593. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_replay_engine.py +0 -0
  594. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_telemetry.py +0 -0
  595. {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_visualize.py +0 -0
  596. {devsper-2.3.0 → devsper-2.4.1}/tests/test_agent.py +0 -0
  597. {devsper-2.3.0 → devsper-2.4.1}/tests/test_analysis.py +0 -0
  598. {devsper-2.3.0 → devsper-2.4.1}/tests/test_analytics.py +0 -0
  599. {devsper-2.3.0 → devsper-2.4.1}/tests/test_auto_model.py +0 -0
  600. {devsper-2.3.0 → devsper-2.4.1}/tests/test_clarification.py +0 -0
  601. {devsper-2.3.0 → devsper-2.4.1}/tests/test_clarification_multinode.py +0 -0
  602. {devsper-2.3.0 → devsper-2.4.1}/tests/test_config_loader.py +0 -0
  603. {devsper-2.3.0 → devsper-2.4.1}/tests/test_credentials.py +0 -0
  604. {devsper-2.3.0 → devsper-2.4.1}/tests/test_cross_boundary_serialization.py +0 -0
  605. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dag_export.py +0 -0
  606. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_agents.py +0 -0
  607. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_build_cmd.py +0 -0
  608. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_debugger.py +0 -0
  609. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_repo_index.py +0 -0
  610. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_sandbox.py +0 -0
  611. {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_scaffold.py +0 -0
  612. {devsper-2.3.0 → devsper-2.4.1}/tests/test_distributed_bugs.py +0 -0
  613. {devsper-2.3.0 → devsper-2.4.1}/tests/test_embeddings_service.py +0 -0
  614. {devsper-2.3.0 → devsper-2.4.1}/tests/test_event_logger.py +0 -0
  615. {devsper-2.3.0 → devsper-2.4.1}/tests/test_executor.py +0 -0
  616. {devsper-2.3.0 → devsper-2.4.1}/tests/test_export_runs.py +0 -0
  617. {devsper-2.3.0 → devsper-2.4.1}/tests/test_github_provider.py +0 -0
  618. {devsper-2.3.0 → devsper-2.4.1}/tests/test_init.py +0 -0
  619. {devsper-2.3.0 → devsper-2.4.1}/tests/test_knowledge_graph.py +0 -0
  620. {devsper-2.3.0 → devsper-2.4.1}/tests/test_knowledge_query.py +0 -0
  621. {devsper-2.3.0 → devsper-2.4.1}/tests/test_map_reduce.py +0 -0
  622. {devsper-2.3.0 → devsper-2.4.1}/tests/test_memory_evolution.py +0 -0
  623. {devsper-2.3.0 → devsper-2.4.1}/tests/test_memory_isolation.py +0 -0
  624. {devsper-2.3.0 → devsper-2.4.1}/tests/test_missions.py +0 -0
  625. {devsper-2.3.0 → devsper-2.4.1}/tests/test_model_router.py +0 -0
  626. {devsper-2.3.0 → devsper-2.4.1}/tests/test_planner.py +0 -0
  627. {devsper-2.3.0 → devsper-2.4.1}/tests/test_platform_runtime_events.py +0 -0
  628. {devsper-2.3.0 → devsper-2.4.1}/tests/test_plugins.py +0 -0
  629. {devsper-2.3.0 → devsper-2.4.1}/tests/test_protocols.py +0 -0
  630. {devsper-2.3.0 → devsper-2.4.1}/tests/test_router.py +0 -0
  631. {devsper-2.3.0 → devsper-2.4.1}/tests/test_scheduler.py +0 -0
  632. {devsper-2.3.0 → devsper-2.4.1}/tests/test_speculation.py +0 -0
  633. {devsper-2.3.0 → devsper-2.4.1}/tests/test_strategies.py +0 -0
  634. {devsper-2.3.0 → devsper-2.4.1}/tests/test_swarm.py +0 -0
  635. {devsper-2.3.0 → devsper-2.4.1}/tests/test_task_cache.py +0 -0
  636. {devsper-2.3.0 → devsper-2.4.1}/tests/test_tool_scoring.py +0 -0
  637. {devsper-2.3.0 → devsper-2.4.1}/tests/test_tool_selector.py +0 -0
  638. {devsper-2.3.0 → devsper-2.4.1}/tests/test_upgrade.py +0 -0
  639. {devsper-2.3.0 → devsper-2.4.1}/tests/test_v110.py +0 -0
  640. {devsper-2.3.0 → devsper-2.4.1}/tests/test_v16.py +0 -0
  641. {devsper-2.3.0 → devsper-2.4.1}/tests/test_v17.py +0 -0
  642. {devsper-2.3.0 → devsper-2.4.1}/tests/test_v18.py +0 -0
  643. {devsper-2.3.0 → devsper-2.4.1}/tests/test_v19.py +0 -0
  644. {devsper-2.3.0 → devsper-2.4.1}/tests/test_workflow.py +0 -0
  645. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/__init__.py +0 -0
  646. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_code_intelligence_tools.py +0 -0
  647. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_coding_tools.py +0 -0
  648. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_core_tool_registry.py +0 -0
  649. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_data_science_tools.py +0 -0
  650. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_data_tools.py +0 -0
  651. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_document_tools.py +0 -0
  652. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_experiments_tools.py +0 -0
  653. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_filesystem_tools.py +0 -0
  654. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_flagship_tools.py +0 -0
  655. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_knowledge_tools.py +0 -0
  656. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_math_tools.py +0 -0
  657. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_memory_tools.py +0 -0
  658. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_pipelines.py +0 -0
  659. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_registry.py +0 -0
  660. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_research_advanced_tools.py +0 -0
  661. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_research_tools.py +0 -0
  662. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_system_tools.py +0 -0
  663. {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_tool_runner.py +0 -0
  664. {devsper-2.3.0 → devsper-2.4.1}/worker/.dockerignore +0 -0
  665. {devsper-2.3.0 → devsper-2.4.1}/worker/Cargo.lock +0 -0
  666. {devsper-2.3.0 → devsper-2.4.1}/worker/Cargo.toml +0 -0
  667. {devsper-2.3.0 → devsper-2.4.1}/worker/Dockerfile +0 -0
  668. {devsper-2.3.0 → devsper-2.4.1}/worker/README.md +0 -0
  669. {devsper-2.3.0 → devsper-2.4.1}/worker/src/budget.rs +0 -0
  670. {devsper-2.3.0 → devsper-2.4.1}/worker/src/bus.rs +0 -0
  671. {devsper-2.3.0 → devsper-2.4.1}/worker/src/claim.rs +0 -0
  672. {devsper-2.3.0 → devsper-2.4.1}/worker/src/clarification.rs +0 -0
  673. {devsper-2.3.0 → devsper-2.4.1}/worker/src/config.rs +0 -0
  674. {devsper-2.3.0 → devsper-2.4.1}/worker/src/controller.rs +0 -0
  675. {devsper-2.3.0 → devsper-2.4.1}/worker/src/election.rs +0 -0
  676. {devsper-2.3.0 → devsper-2.4.1}/worker/src/error.rs +0 -0
  677. {devsper-2.3.0 → devsper-2.4.1}/worker/src/executor.rs +0 -0
  678. {devsper-2.3.0 → devsper-2.4.1}/worker/src/health.rs +0 -0
  679. {devsper-2.3.0 → devsper-2.4.1}/worker/src/heartbeat.rs +0 -0
  680. {devsper-2.3.0 → devsper-2.4.1}/worker/src/lib.rs +0 -0
  681. {devsper-2.3.0 → devsper-2.4.1}/worker/src/main.rs +0 -0
  682. {devsper-2.3.0 → devsper-2.4.1}/worker/src/metrics.rs +0 -0
  683. {devsper-2.3.0 → devsper-2.4.1}/worker/src/reconnect.rs +0 -0
  684. {devsper-2.3.0 → devsper-2.4.1}/worker/src/registry.rs +0 -0
  685. {devsper-2.3.0 → devsper-2.4.1}/worker/src/router.rs +0 -0
  686. {devsper-2.3.0 → devsper-2.4.1}/worker/src/rpc.rs +0 -0
  687. {devsper-2.3.0 → devsper-2.4.1}/worker/src/scheduler.rs +0 -0
  688. {devsper-2.3.0 → devsper-2.4.1}/worker/src/snapshot.rs +0 -0
  689. {devsper-2.3.0 → devsper-2.4.1}/worker/src/telemetry.rs +0 -0
  690. {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/agent.rs +0 -0
  691. {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/event.rs +0 -0
  692. {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/mod.rs +0 -0
  693. {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/node.rs +0 -0
  694. {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/task.rs +0 -0
  695. {devsper-2.3.0 → devsper-2.4.1}/worker/src/worker_node.rs +0 -0
  696. {devsper-2.3.0 → devsper-2.4.1}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.1] — 2026-03-31
11
+
12
+ ### Fixed
13
+
14
+ - **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.
15
+ - **Run view prompt stability** — Local clarification prompts now pause/resume live rendering cleanly, reducing TUI corruption and preventing hidden/stuck prompts during interactive runs.
16
+ - **Silent-failure propagation** — Agent failures now surface as explicit task failures (instead of empty-success paths), with clearer errors for missing model configuration.
17
+ - **Executor compatibility regression** — Restored `budget_manager` compatibility on the runtime executor path to avoid end-of-run `AttributeError` crashes.
18
+
19
+ ### Changed
20
+
21
+ - **Research tool routing defaults** — Tool selection now biases web-first for research/business discovery tasks when no local dataset path is provided.
22
+ - **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.
23
+ - **Duration formatting** — CLI run summary and export outputs now prefer `HH:MM:SS` format.
24
+ - **Telemetry noise control** — Console span export is now opt-in (`DEVSPER_OTEL_CONSOLE=1`) to keep interactive TUI output clean by default.
25
+ - **Auto-export workflow** — Added config-driven post-run export option (`[export] auto_export_on_run`) with selectable output format.
26
+
27
+ ## [2.4.0] — 2026-03-31
28
+
29
+ ### Added
30
+
31
+ - **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`).
32
+ - **Runtime architecture documentation** — Expanded runtime docs with distributed architecture, worker/controller lifecycle, speculative execution flow, and HITL lifecycle details.
33
+ - **Tool execution hardening** — Upgraded runtime tool runner with bounded parallelism, dependency-aware batching, per-call timeout isolation, and cancellation support.
34
+
35
+ ### Changed
36
+
37
+ - **Executor orchestration** — Runtime executor now supports agent-pool-backed execution, model routing integration, speculative follow-up scheduling hooks, and improved cancellation/backpressure behavior.
38
+ - **Prompt/token efficiency** — Tool schema injection in agent prompts was compressed to reduce runtime token overhead in tool-enabled turns.
39
+ - **Homepage and release communication** — Updated README homepage with v2.4.0 release CTA and an architecture upgrade blog entry for this release.
40
+
10
41
  ## [2.3.0] — 2026-03-30
11
42
 
12
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
5
5
  Project-URL: Homepage, https://github.com/devsper-com/runtime
6
6
  Project-URL: Documentation, https://docs.devsper.com
@@ -0,0 +1,148 @@
1
+ # Devsper Runtime Core
2
+
3
+ Devsper runtime is built as a modular orchestration core with bounded concurrency, dynamic DAG mutation, and event-stream-driven observability.
4
+
5
+ ## Runtime Architecture Diagram
6
+
7
+ ```text
8
+ User Task
9
+ |
10
+ v
11
+ Swarm.run()
12
+ |
13
+ v
14
+ Planner -> Scheduler (DAG)
15
+ |
16
+ v
17
+ Runtime Executor ------------------------------+
18
+ | |
19
+ +-> RuntimeStateManager |
20
+ +-> ExecutionGraph |
21
+ +-> RuntimeEventStream -> EventLog -> SSE |
22
+ +-> TaskRunner |
23
+ +-> AgentRunner (optional stream-tool loop)
24
+ +-> Agent
25
+ +-> ToolRunner / tools.tool_runner
26
+ ```
27
+
28
+ ## Core Components
29
+
30
+ - `swarm/swarm.py`
31
+ - Public entrypoint (`Swarm`), config/wiring, planning and execution bootstrap.
32
+ - `runtime/executor.py`
33
+ - Event-driven scheduler loop, bounded parallel execution, cancellation propagation, dynamic task injection.
34
+ - `runtime/state_manager.py`
35
+ - Concurrency-safe task state transitions and runtime DAG mutation entrypoint.
36
+ - `runtime/execution_graph.py`
37
+ - Execution graph with lineage, edges, attempts, and status transitions.
38
+ - `runtime/planner.py`
39
+ - Runtime wrapper for dynamic planner expansion and parent-child lineage.
40
+ - `runtime/task_runner.py`
41
+ - Task lifecycle orchestration with scoped retries and fallback model handling.
42
+ - `runtime/agent_runner.py`
43
+ - Async agent wrapper with optional streaming tool invocation loop.
44
+ - `runtime/tool_runner.py`
45
+ - Parallel tool scheduler with bounded concurrency, dependency-aware batching, timeout, and cancellation.
46
+ - `runtime/event_stream.py`
47
+ - In-process stream with queue backpressure policy (drop-oldest on overflow).
48
+ - `runtime/retry.py`
49
+ - Retry scopes (`tool`, `agent`, `task`, `model_fallback`) and backoff policies.
50
+
51
+ ## Execution Lifecycle
52
+
53
+ 1. `Swarm.run()` creates root task, plans subtasks, and builds scheduler DAG.
54
+ 2. Executor emits `EXECUTOR_STARTED` and begins bounded task dispatch.
55
+ 3. Ready tasks transition to running through `RuntimeStateManager`.
56
+ 4. `TaskRunner` executes with scoped retries.
57
+ 5. `AgentRunner` may invoke tools (normal or streaming tool loop).
58
+ 6. Task completion/failure updates scheduler + execution graph.
59
+ 7. Adaptive mode can inject follow-up tasks at runtime.
60
+ 8. Executor emits `EXECUTOR_FINISHED` and `RUN_COMPLETED`.
61
+
62
+ ## Tool Calling Flow
63
+
64
+ 1. Agent determines tool intent from model output.
65
+ 2. Tool calls are parsed and scheduled.
66
+ 3. `ToolRunner.run_many(...)` executes calls in parallel with:
67
+ - `max_concurrency` semaphore
68
+ - dependency constraints (`depends_on`)
69
+ - per-call timeouts
70
+ - cancellation checks
71
+ 4. Results are isolated per call and fed back into agent loop.
72
+
73
+ ## Planner Flow
74
+
75
+ 1. Initial decomposition by `swarm/planner.py`.
76
+ 2. Runtime execution completes a task.
77
+ 3. `RuntimePlanner.expand(...)` optionally creates follow-up tasks.
78
+ 4. `RuntimeStateManager.add_tasks(...)` mutates DAG safely.
79
+ 5. `ExecutionGraph` records lineage from parent task.
80
+
81
+ ## Concurrency Model
82
+
83
+ - Bounded executor workers (`worker_count`).
84
+ - Bounded tool concurrency (`ToolRunner` semaphore).
85
+ - Queue backpressure in event streaming (`max_queue_size` with controlled dropping).
86
+ - Cooperative pause/resume and cancellation propagation across runtime loops.
87
+ - Lock-guarded scheduler mutations via `RuntimeStateManager`.
88
+
89
+ ## Distributed Runtime Architecture
90
+
91
+ ```text
92
+ Controller
93
+ |
94
+ v
95
+ Worker Pool
96
+ |
97
+ v
98
+ Worker Runtime
99
+ |
100
+ v
101
+ Runtime Executor
102
+ |
103
+ v
104
+ Agent Pool
105
+ |
106
+ v
107
+ Tool Runner
108
+ ```
109
+
110
+ - `distributed/controller.py`
111
+ - Worker registry, health state, load-aware assignment, reassignment hooks.
112
+ - `distributed/worker_runtime.py`
113
+ - Worker-local runtime composition: `Executor`, `AgentPool`, `ModelRouter`, `ToolRunner`.
114
+ - Existing multi-node transport/control remains in `nodes/controller.py` and `nodes/worker.py`.
115
+
116
+ ## Worker Lifecycle
117
+
118
+ 1. Worker registers with controller.
119
+ 2. Controller assigns tasks based on health and load.
120
+ 3. Worker executes task locally through runtime executor stack.
121
+ 4. Worker returns completion/failure.
122
+ 5. Controller updates worker/task state and reassigns on failure.
123
+
124
+ ## Controller Lifecycle
125
+
126
+ 1. Track worker registration and health.
127
+ 2. Assign ready tasks using load-aware strategy.
128
+ 3. Handle failures and perform retry/reassignment.
129
+ 4. Maintain global execution progress via event/log channels.
130
+
131
+ ## Agent Pool
132
+
133
+ - `AgentPool` manages reusable agent instances per worker.
134
+ - Supports `acquire_agent`, `release_agent`, `run_agent`, and `run_parallel`.
135
+ - Enables worker-local, concurrent, reuse-based execution.
136
+
137
+ ## Speculative Execution
138
+
139
+ - `SpeculativePlanner` predicts likely successor tasks.
140
+ - Executor marks/schedules speculative tasks early.
141
+ - Unused speculative branches can be cancelled on dependency failure.
142
+
143
+ ## HITL Flow
144
+
145
+ 1. Agent indicates human input is required.
146
+ 2. Runtime emits HITL/clarification event.
147
+ 3. Task pauses until response or timeout.
148
+ 4. Execution resumes or fails based on response policy.
@@ -454,11 +454,24 @@ def _format_tools_section(tools: list | None = None) -> str:
454
454
  from devsper.tools.registry import list_tools
455
455
 
456
456
  tools = list_tools()
457
+ max_props = 8
457
458
  lines = []
458
459
  for t in tools:
459
460
  schema = getattr(t, "input_schema", None) or getattr(t, "schema", {}) or {}
461
+ schema_type = schema.get("type", "object")
462
+ required = schema.get("required", []) or []
463
+ props = schema.get("properties", {}) if isinstance(schema.get("properties", {}), dict) else {}
464
+ compact_props: dict[str, dict] = {}
465
+ for key in list(props.keys())[:max_props]:
466
+ p = props.get(key, {}) or {}
467
+ compact_props[key] = {"type": p.get("type", "string")}
468
+ compact_schema = {
469
+ "type": schema_type,
470
+ "required": required[:max_props],
471
+ "properties": compact_props,
472
+ }
460
473
  lines.append(f"- {t.name}: {t.description}")
461
- lines.append(f" input_schema: {json.dumps(schema)}")
474
+ lines.append(f" input_schema: {json.dumps(compact_schema, separators=(',', ':'))}")
462
475
  return "\n".join(lines)
463
476
 
464
477
 
@@ -581,6 +594,176 @@ class Agent:
581
594
  self.audit_logger = audit_logger
582
595
  self.audit_run_id = audit_run_id or ""
583
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
584
767
 
585
768
  def run(self, request: AgentRequest) -> AgentResponse:
586
769
  """Stateless run: all context in AgentRequest, all output in AgentResponse."""
@@ -757,6 +940,12 @@ class Agent:
757
940
  message_bus_section = self.message_bus.get_context_sync(task.id) or ""
758
941
  if message_bus_section:
759
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()
760
949
  from devsper.agents.roles import get_role_config
761
950
 
762
951
  role_config = get_role_config(getattr(task, "role", None))
@@ -844,6 +1033,8 @@ class Agent:
844
1033
  success=True,
845
1034
  )
846
1035
  self.apply_response(task, response)
1036
+ if not response.success:
1037
+ raise RuntimeError(response.error or "Agent run failed")
847
1038
  return response.result
848
1039
 
849
1040
  def _enrich_task(self, task: Task, answers: dict) -> Task:
@@ -1210,6 +1401,57 @@ class Agent:
1210
1401
  if not fields:
1211
1402
  return json.dumps({"error": "hitl.request has no valid fields"})
1212
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
+
1213
1455
  req = ClarificationRequest(
1214
1456
  request_id=str(uuid.uuid4()),
1215
1457
  task_id=request.task.id,
@@ -1220,13 +1462,15 @@ class Agent:
1220
1462
  timeout_seconds=int(tool_args.get("timeout_seconds", 120)),
1221
1463
  )
1222
1464
  resp = requester.request_clarification(req)
1223
- return json.dumps(
1224
- {
1225
- "request_id": req.request_id,
1226
- "skipped": bool(resp.skipped),
1227
- "answers": resp.answers or {},
1228
- }
1229
- )
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)
1230
1474
 
1231
1475
  def _emit_tool_called_audit(
1232
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",