devsper 2.3.0__tar.gz → 2.4.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 (696) hide show
  1. {devsper-2.3.0 → devsper-2.4.0}/CHANGELOG.md +19 -0
  2. {devsper-2.3.0 → devsper-2.4.0}/PKG-INFO +1 -1
  3. devsper-2.4.0/devsper/README.md +148 -0
  4. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/agent.py +14 -1
  5. devsper-2.4.0/devsper/distributed/__init__.py +7 -0
  6. devsper-2.4.0/devsper/distributed/controller.py +70 -0
  7. devsper-2.4.0/devsper/distributed/worker_runtime.py +43 -0
  8. devsper-2.4.0/devsper/runtime/__init__.py +34 -0
  9. devsper-2.4.0/devsper/runtime/agent_pool.py +85 -0
  10. devsper-2.4.0/devsper/runtime/agent_runner.py +79 -0
  11. devsper-2.4.0/devsper/runtime/event_stream.py +58 -0
  12. devsper-2.4.0/devsper/runtime/execution_graph.py +101 -0
  13. devsper-2.4.0/devsper/runtime/executor.py +210 -0
  14. devsper-2.4.0/devsper/runtime/hitl.py +71 -0
  15. devsper-2.4.0/devsper/runtime/model_router.py +44 -0
  16. devsper-2.4.0/devsper/runtime/planner.py +28 -0
  17. devsper-2.4.0/devsper/runtime/retry.py +61 -0
  18. devsper-2.4.0/devsper/runtime/speculative_planner.py +51 -0
  19. devsper-2.4.0/devsper/runtime/state_manager.py +52 -0
  20. devsper-2.4.0/devsper/runtime/task_runner.py +87 -0
  21. devsper-2.4.0/devsper/runtime/tool_runner.py +169 -0
  22. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/swarm.py +1 -1
  23. {devsper-2.3.0 → devsper-2.4.0}/pyproject.toml +1 -1
  24. devsper-2.3.0/devsper/runtime/__init__.py +0 -12
  25. devsper-2.3.0/devsper/runtime/executor.py +0 -5
  26. {devsper-2.3.0 → devsper-2.4.0}/.env.example +0 -0
  27. {devsper-2.3.0 → devsper-2.4.0}/.github/FUNDING.yml +0 -0
  28. {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/pypi-publish.yml +0 -0
  29. {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/release-on-tag.yml +0 -0
  30. {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/worker-release.yml +0 -0
  31. {devsper-2.3.0 → devsper-2.4.0}/.gitignore +0 -0
  32. {devsper-2.3.0 → devsper-2.4.0}/.python-version +0 -0
  33. {devsper-2.3.0 → devsper-2.4.0}/CODE_OF_CONDUCT.md +0 -0
  34. {devsper-2.3.0 → devsper-2.4.0}/CONTRIBUTING.md +0 -0
  35. {devsper-2.3.0 → devsper-2.4.0}/Cargo.lock +0 -0
  36. {devsper-2.3.0 → devsper-2.4.0}/Cargo.toml +0 -0
  37. {devsper-2.3.0 → devsper-2.4.0}/Dockerfile.local-pool +0 -0
  38. {devsper-2.3.0 → devsper-2.4.0}/LICENSE +0 -0
  39. {devsper-2.3.0 → devsper-2.4.0}/README.md +0 -0
  40. {devsper-2.3.0 → devsper-2.4.0}/SECURITY.md +0 -0
  41. {devsper-2.3.0 → devsper-2.4.0}/benchmarks/__init__.py +0 -0
  42. {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_dataset_analysis.py +0 -0
  43. {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_repository_analysis.py +0 -0
  44. {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_research_pipeline.py +0 -0
  45. {devsper-2.3.0 → devsper-2.4.0}/branding/logo.svg +0 -0
  46. {devsper-2.3.0 → devsper-2.4.0}/devsper/__init__.py +0 -0
  47. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/__init__.py +0 -0
  48. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/client.py +0 -0
  49. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/discovery.py +0 -0
  50. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/server.py +0 -0
  51. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/tool_adapter.py +0 -0
  52. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/types.py +0 -0
  53. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/critic.py +0 -0
  54. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/identity.py +0 -0
  55. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/message_bus.py +0 -0
  56. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/registry.py +0 -0
  57. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/roles.py +0 -0
  58. {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/run_agent.py +0 -0
  59. {devsper-2.3.0 → devsper-2.4.0}/devsper/analytics/__init__.py +0 -0
  60. {devsper-2.3.0 → devsper-2.4.0}/devsper/analytics/tool_analytics.py +0 -0
  61. {devsper-2.3.0 → devsper-2.4.0}/devsper/audit/__init__.py +0 -0
  62. {devsper-2.3.0 → devsper-2.4.0}/devsper/audit/logger.py +0 -0
  63. {devsper-2.3.0 → devsper-2.4.0}/devsper/budget.py +0 -0
  64. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/__init__.py +0 -0
  65. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/__init__.py +0 -0
  66. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/base.py +0 -0
  67. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/memory.py +0 -0
  68. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/redis.py +0 -0
  69. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/message.py +0 -0
  70. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/schema_version.py +0 -0
  71. {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/topics.py +0 -0
  72. {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/__init__.py +0 -0
  73. {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/embedding_index.py +0 -0
  74. {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/hashing.py +0 -0
  75. {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/store.py +0 -0
  76. {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/task_cache.py +0 -0
  77. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/__init__.py +0 -0
  78. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/commands/cloud.py +0 -0
  79. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/export.py +0 -0
  80. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/github_oauth.py +0 -0
  81. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/init.py +0 -0
  82. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/main.py +0 -0
  83. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/run_progress.py +0 -0
  84. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/__init__.py +0 -0
  85. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/components.py +0 -0
  86. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/controller_run_view.py +0 -0
  87. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/errors.py +0 -0
  88. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/logging.py +0 -0
  89. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/onboarding.py +0 -0
  90. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/progress.py +0 -0
  91. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/run_view.py +0 -0
  92. {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/theme.py +0 -0
  93. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/__init__.py +0 -0
  94. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/election.py +0 -0
  95. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/local.py +0 -0
  96. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/node_info.py +0 -0
  97. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/registry.py +0 -0
  98. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/router.py +0 -0
  99. {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/state_backend.py +0 -0
  100. {devsper-2.3.0 → devsper-2.4.0}/devsper/compliance/__init__.py +0 -0
  101. {devsper-2.3.0 → devsper-2.4.0}/devsper/compliance/pii.py +0 -0
  102. {devsper-2.3.0 → devsper-2.4.0}/devsper/config/__init__.py +0 -0
  103. {devsper-2.3.0 → devsper-2.4.0}/devsper/config/config_loader.py +0 -0
  104. {devsper-2.3.0 → devsper-2.4.0}/devsper/config/defaults.py +0 -0
  105. {devsper-2.3.0 → devsper-2.4.0}/devsper/config/resolver.py +0 -0
  106. {devsper-2.3.0 → devsper-2.4.0}/devsper/config/schema.py +0 -0
  107. {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/__init__.py +0 -0
  108. {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/base.py +0 -0
  109. {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/registry.py +0 -0
  110. {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/sample_connector.py +0 -0
  111. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/__init__.py +0 -0
  112. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/agent/__init__.py +0 -0
  113. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/agent/runner.py +0 -0
  114. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/hitl/__init__.py +0 -0
  115. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/hitl/state_machine.py +0 -0
  116. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/memory/__init__.py +0 -0
  117. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/memory/shared_memory.py +0 -0
  118. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/reporting/__init__.py +0 -0
  119. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/reporting/publisher.py +0 -0
  120. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/__init__.py +0 -0
  121. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/durability.py +0 -0
  122. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/orchestrator.py +0 -0
  123. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/__init__.py +0 -0
  124. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/base_tool.py +0 -0
  125. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/loader.py +0 -0
  126. {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/registry.py +0 -0
  127. {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/__init__.py +0 -0
  128. {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/cli.py +0 -0
  129. {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/migration.py +0 -0
  130. {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/store.py +0 -0
  131. {devsper-2.3.0 → devsper-2.4.0}/devsper/dashboard/__init__.py +0 -0
  132. {devsper-2.3.0 → devsper-2.4.0}/devsper/dashboard/dashboard.py +0 -0
  133. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/__init__.py +0 -0
  134. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/builder.py +0 -0
  135. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/debugger.py +0 -0
  136. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/repo_index.py +0 -0
  137. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/sandbox.py +0 -0
  138. {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/scaffold.py +0 -0
  139. {devsper-2.3.0 → devsper-2.4.0}/devsper/docs/architecture/execution-model.md +0 -0
  140. {devsper-2.3.0 → devsper-2.4.0}/devsper/embeddings/__init__.py +0 -0
  141. {devsper-2.3.0 → devsper-2.4.0}/devsper/embeddings/service.py +0 -0
  142. {devsper-2.3.0 → devsper-2.4.0}/devsper/events.py +0 -0
  143. {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/__init__.py +0 -0
  144. {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/decision_tree.py +0 -0
  145. {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/rationale.py +0 -0
  146. {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/simulation.py +0 -0
  147. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/__init__.py +0 -0
  148. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/branding.py +0 -0
  149. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/collector.py +0 -0
  150. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/manifest.py +0 -0
  151. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/model.py +0 -0
  152. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/packager.py +0 -0
  153. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/pdf.py +0 -0
  154. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/service.py +0 -0
  155. {devsper-2.3.0 → devsper-2.4.0}/devsper/export/writers.py +0 -0
  156. {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/__init__.py +0 -0
  157. {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/approval.py +0 -0
  158. {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/escalation.py +0 -0
  159. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/__init__.py +0 -0
  160. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/adaptation.py +0 -0
  161. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/__init__.py +0 -0
  162. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/analyzer.py +0 -0
  163. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
  164. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/formatter.py +0 -0
  165. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/run_report.py +0 -0
  166. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/learning_engine.py +0 -0
  167. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/__init__.py +0 -0
  168. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/base.py +0 -0
  169. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
  170. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
  171. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
  172. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
  173. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
  174. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategy_selector.py +0 -0
  175. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/synthesis.py +0 -0
  176. {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/task_optimizer.py +0 -0
  177. {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/__init__.py +0 -0
  178. {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/extractor.py +0 -0
  179. {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/knowledge_graph.py +0 -0
  180. {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/query.py +0 -0
  181. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/__init__.py +0 -0
  182. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/consolidation.py +0 -0
  183. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/context.py +0 -0
  184. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/embeddings.py +0 -0
  185. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_index.py +0 -0
  186. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_router.py +0 -0
  187. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_store.py +0 -0
  188. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_types.py +0 -0
  189. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/namespaces.py +0 -0
  190. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/platform_memory.py +0 -0
  191. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/redis_memory.py +0 -0
  192. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/scoring.py +0 -0
  193. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/store.py +0 -0
  194. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/summarizer.py +0 -0
  195. {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
  196. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/__init__.py +0 -0
  197. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/base_agent.py +0 -0
  198. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/__init__.py +0 -0
  199. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/architect_agent.py +0 -0
  200. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/coder_agent.py +0 -0
  201. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/debugger_agent.py +0 -0
  202. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/docs_agent.py +0 -0
  203. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/tester_agent.py +0 -0
  204. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/iteration_loop.py +0 -0
  205. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_memory.py +0 -0
  206. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_planner.py +0 -0
  207. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_runner.py +0 -0
  208. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/models.py +0 -0
  209. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/__init__.py +0 -0
  210. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/editor_agent.py +0 -0
  211. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/researcher_agent.py +0 -0
  212. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/reviewer_agent.py +0 -0
  213. {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/writer_agent.py +0 -0
  214. {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/__init__.py +0 -0
  215. {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/controller.py +0 -0
  216. {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/rpc.py +0 -0
  217. {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/single.py +0 -0
  218. {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/worker.py +0 -0
  219. {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/__init__.py +0 -0
  220. {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/meta_planner.py +0 -0
  221. {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/priority_queue.py +0 -0
  222. {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/__init__.py +0 -0
  223. {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/redis_results_sink.py +0 -0
  224. {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/reporter.py +0 -0
  225. {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/request_builder.py +0 -0
  226. {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/runtime_events.py +0 -0
  227. {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/__init__.py +0 -0
  228. {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/marketplace/__init__.py +0 -0
  229. {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/plugin_loader.py +0 -0
  230. {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/plugin_registry.py +0 -0
  231. {devsper-2.3.0 → devsper-2.4.0}/devsper/policy/client.py +0 -0
  232. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/__init__.py +0 -0
  233. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/config.py +0 -0
  234. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/crypto.py +0 -0
  235. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/local_pool.py +0 -0
  236. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/manager.py +0 -0
  237. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/models.py +0 -0
  238. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/org_pool.py +0 -0
  239. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/dev.toml +0 -0
  240. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/local.toml +0 -0
  241. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/prod.toml +0 -0
  242. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/security.py +0 -0
  243. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/store.py +0 -0
  244. {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/worker_runner.py +0 -0
  245. {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/__init__.py +0 -0
  246. {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/client.py +0 -0
  247. {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/schema.py +0 -0
  248. {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/server.py +0 -0
  249. {devsper-2.3.0 → devsper-2.4.0}/devsper/protocols/__init__.py +0 -0
  250. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/__init__.py +0 -0
  251. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/anthropic.py +0 -0
  252. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/base.py +0 -0
  253. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/complexity_router.py +0 -0
  254. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/gemini.py +0 -0
  255. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/github.py +0 -0
  256. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/model_router.py +0 -0
  257. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/openai.py +0 -0
  258. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/__init__.py +0 -0
  259. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/__init__.py +0 -0
  260. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
  261. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/custom_backend.py +0 -0
  262. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
  263. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/github_backend.py +0 -0
  264. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
  265. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/openai_backend.py +0 -0
  266. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
  267. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/base.py +0 -0
  268. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/factory.py +0 -0
  269. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/legacy.py +0 -0
  270. {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/router.py +0 -0
  271. {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/__init__.py +0 -0
  272. {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/graph.py +0 -0
  273. {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/nodes.py +0 -0
  274. {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/store.py +0 -0
  275. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/clarification_manager.py +0 -0
  276. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/health.py +0 -0
  277. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/replay.py +0 -0
  278. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/replay_engine.py +0 -0
  279. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/run_history.py +0 -0
  280. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/task_state.py +0 -0
  281. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/telemetry.py +0 -0
  282. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/trace_tree.py +0 -0
  283. {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/visualize.py +0 -0
  284. {devsper-2.3.0 → devsper-2.4.0}/devsper/sandbox/__init__.py +0 -0
  285. {devsper-2.3.0 → devsper-2.4.0}/devsper/sandbox/sandbox.py +0 -0
  286. {devsper-2.3.0 → devsper-2.4.0}/devsper/server/__init__.py +0 -0
  287. {devsper-2.3.0 → devsper-2.4.0}/devsper/server/events.py +0 -0
  288. {devsper-2.3.0 → devsper-2.4.0}/devsper/server/swarmworker.py +0 -0
  289. {devsper-2.3.0 → devsper-2.4.0}/devsper/server/topology.py +0 -0
  290. {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/__init__.py +0 -0
  291. {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/uploads/__init__.py +0 -0
  292. {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/uploads/store.py +0 -0
  293. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/checkpointer.py +0 -0
  294. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/executor.py +0 -0
  295. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/map_reduce.py +0 -0
  296. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/planner.py +0 -0
  297. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/prefetcher.py +0 -0
  298. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/scheduler.py +0 -0
  299. {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/speculation.py +0 -0
  300. {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/__init__.py +0 -0
  301. {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/otel.py +0 -0
  302. {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/pricing.py +0 -0
  303. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/__init__.py +0 -0
  304. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/base.py +0 -0
  305. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/__init__.py +0 -0
  306. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
  307. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
  308. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
  309. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
  310. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
  311. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
  312. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
  313. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
  314. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
  315. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
  316. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
  317. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/__init__.py +0 -0
  318. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
  319. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
  320. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/extract_functions.py +0 -0
  321. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/format_python.py +0 -0
  322. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/generate_docstrings.py +0 -0
  323. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
  324. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/lint_python.py +0 -0
  325. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/refactor_function.py +0 -0
  326. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/repo_structure_map.py +0 -0
  327. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/run_python.py +0 -0
  328. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/__init__.py +0 -0
  329. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/column_type_detection.py +0 -0
  330. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/csv_summary.py +0 -0
  331. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_filter.py +0 -0
  332. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_groupby.py +0 -0
  333. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_stats.py +0 -0
  334. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataset_sampling.py +0 -0
  335. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataset_schema.py +0 -0
  336. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/json_pretty_print.py +0 -0
  337. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/json_query.py +0 -0
  338. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/missing_value_report.py +0 -0
  339. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/__init__.py +0 -0
  340. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
  341. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
  342. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
  343. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
  344. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
  345. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_profile.py +0 -0
  346. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
  347. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
  348. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
  349. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/model_input_validator.py +0 -0
  350. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
  351. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/__init__.py +0 -0
  352. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/fetch_url.py +0 -0
  353. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/python_exec.py +0 -0
  354. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/read_csv.py +0 -0
  355. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/upload_file.py +0 -0
  356. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/web_search.py +0 -0
  357. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/__init__.py +0 -0
  358. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/_docproc.py +0 -0
  359. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/document_to_markdown.py +0 -0
  360. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_document_images.py +0 -0
  361. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_document_text.py +0 -0
  362. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_equations.py +0 -0
  363. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_tables.py +0 -0
  364. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/summarize_document.py +0 -0
  365. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_latex_document.py +0 -0
  366. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_markdown_document.py +0 -0
  367. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_word_document.py +0 -0
  368. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/__init__.py +0 -0
  369. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
  370. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
  371. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
  372. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
  373. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
  374. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
  375. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
  376. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/result_comparator.py +0 -0
  377. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/simulation_runner.py +0 -0
  378. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
  379. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
  380. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/__init__.py +0 -0
  381. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/append_file.py +0 -0
  382. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_hash.py +0 -0
  383. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_line_count.py +0 -0
  384. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_metadata.py +0 -0
  385. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_preview.py +0 -0
  386. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/find_large_files.py +0 -0
  387. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/list_directory.py +0 -0
  388. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/read_file.py +0 -0
  389. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/search_files.py +0 -0
  390. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/write_file.py +0 -0
  391. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/__init__.py +0 -0
  392. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
  393. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
  394. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
  395. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
  396. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
  397. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/hitl_request.py +0 -0
  398. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/__init__.py +0 -0
  399. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
  400. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
  401. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
  402. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
  403. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
  404. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
  405. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
  406. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
  407. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/__init__.py +0 -0
  408. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/calculate_expression.py +0 -0
  409. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/correlation.py +0 -0
  410. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/distribution_summary.py +0 -0
  411. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/histogram.py +0 -0
  412. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/linear_regression.py +0 -0
  413. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/matrix_multiply.py +0 -0
  414. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/mean_std.py +0 -0
  415. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
  416. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/polynomial_fit.py +0 -0
  417. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/random_sample.py +0 -0
  418. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/__init__.py +0 -0
  419. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/adapter.py +0 -0
  420. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/client.py +0 -0
  421. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/discovery.py +0 -0
  422. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/__init__.py +0 -0
  423. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/delete_memory.py +0 -0
  424. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/list_memory.py +0 -0
  425. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/search_memory.py +0 -0
  426. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/store_memory.py +0 -0
  427. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/summarize_memory.py +0 -0
  428. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/tag_memory.py +0 -0
  429. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/pipelines.py +0 -0
  430. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/registry.py +0 -0
  431. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/__init__.py +0 -0
  432. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/arxiv_download.py +0 -0
  433. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/arxiv_search.py +0 -0
  434. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/citation_extractor.py +0 -0
  435. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/duckduckgo_search.py +0 -0
  436. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
  437. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/paper_summarizer.py +0 -0
  438. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/research_question_generator.py +0 -0
  439. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/topic_cluster.py +0 -0
  440. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/web_search.py +0 -0
  441. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
  442. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/__init__.py +0 -0
  443. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
  444. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
  445. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
  446. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
  447. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
  448. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
  449. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
  450. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
  451. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
  452. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
  453. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
  454. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
  455. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/__init__.py +0 -0
  456. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/report.py +0 -0
  457. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/scorer.py +0 -0
  458. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/selector.py +0 -0
  459. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/store.py +0 -0
  460. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/selector.py +0 -0
  461. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/__init__.py +0 -0
  462. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/cpu_usage.py +0 -0
  463. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/disk_usage.py +0 -0
  464. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/environment_variables.py +0 -0
  465. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/memory_usage.py +0 -0
  466. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/pip_install.py +0 -0
  467. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/pip_search.py +0 -0
  468. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/process_list.py +0 -0
  469. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/python_package_list.py +0 -0
  470. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/run_shell_command.py +0 -0
  471. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/system_info.py +0 -0
  472. {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/tool_runner.py +0 -0
  473. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/__init__.py +0 -0
  474. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/activity_feed_view.py +0 -0
  475. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/adaptive_tasks_view.py +0 -0
  476. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/agent_role_view.py +0 -0
  477. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/app.py +0 -0
  478. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/dashboard_screen.py +0 -0
  479. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/dev_view.py +0 -0
  480. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/inject_screen.py +0 -0
  481. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/knowledge_graph_view.py +0 -0
  482. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/layout.py +0 -0
  483. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/logs_view.py +0 -0
  484. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/memory_view.py +0 -0
  485. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/mission_view.py +0 -0
  486. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/performance_view.py +0 -0
  487. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/reasoning_graph_view.py +0 -0
  488. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/results_view.py +0 -0
  489. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/swarm_view.py +0 -0
  490. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/task_detail_screen.py +0 -0
  491. {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/task_view.py +0 -0
  492. {devsper-2.3.0 → devsper-2.4.0}/devsper/types/event.py +0 -0
  493. {devsper-2.3.0 → devsper-2.4.0}/devsper/types/exceptions.py +0 -0
  494. {devsper-2.3.0 → devsper-2.4.0}/devsper/types/swarm.py +0 -0
  495. {devsper-2.3.0 → devsper-2.4.0}/devsper/types/task.py +0 -0
  496. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/__init__.py +0 -0
  497. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/changelog.py +0 -0
  498. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/cli.py +0 -0
  499. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/installer.py +0 -0
  500. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/notifier.py +0 -0
  501. {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/version_check.py +0 -0
  502. {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/event_logger.py +0 -0
  503. {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/http.py +0 -0
  504. {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/models.py +0 -0
  505. {devsper-2.3.0 → devsper-2.4.0}/devsper/visualization/__init__.py +0 -0
  506. {devsper-2.3.0 → devsper-2.4.0}/devsper/visualization/dag_export.py +0 -0
  507. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/__init__.py +0 -0
  508. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/conditions.py +0 -0
  509. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/context.py +0 -0
  510. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/loader.py +0 -0
  511. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/resolver.py +0 -0
  512. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/runner.py +0 -0
  513. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/schema.py +0 -0
  514. {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/validator.py +0 -0
  515. {devsper-2.3.0 → devsper-2.4.0}/devsper.toml +0 -0
  516. {devsper-2.3.0 → devsper-2.4.0}/docker-compose.yml +0 -0
  517. {devsper-2.3.0 → devsper-2.4.0}/examples/__init__.py +0 -0
  518. {devsper-2.3.0 → devsper-2.4.0}/examples/_common.py +0 -0
  519. {devsper-2.3.0 → devsper-2.4.0}/examples/_config.py +0 -0
  520. {devsper-2.3.0 → devsper-2.4.0}/examples/coding/__init__.py +0 -0
  521. {devsper-2.3.0 → devsper-2.4.0}/examples/coding/analyze_repository.py +0 -0
  522. {devsper-2.3.0 → devsper-2.4.0}/examples/coding/generate_docs.py +0 -0
  523. {devsper-2.3.0 → devsper-2.4.0}/examples/coding/refactor_candidates.py +0 -0
  524. {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/__init__.py +0 -0
  525. {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/dataset_analysis.py +0 -0
  526. {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/run_experiments.py +0 -0
  527. {devsper-2.3.0 → devsper-2.4.0}/examples/demo_swarm.py +0 -0
  528. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/README.md +0 -0
  529. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/controller.toml +0 -0
  530. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/parallel_survey.py +0 -0
  531. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_controller.py +0 -0
  532. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_demo.sh +0 -0
  533. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_worker.py +0 -0
  534. {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/worker.toml +0 -0
  535. {devsper-2.3.0 → devsper-2.4.0}/examples/documents/__init__.py +0 -0
  536. {devsper-2.3.0 → devsper-2.4.0}/examples/documents/analyze_documents.py +0 -0
  537. {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/__init__.py +0 -0
  538. {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/monte_carlo_demo.py +0 -0
  539. {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/parameter_sweep.py +0 -0
  540. {devsper-2.3.0 → devsper-2.4.0}/examples/research/__init__.py +0 -0
  541. {devsper-2.3.0 → devsper-2.4.0}/examples/research/literature_review.py +0 -0
  542. {devsper-2.3.0 → devsper-2.4.0}/examples/research/research_gap_analysis.py +0 -0
  543. {devsper-2.3.0 → devsper-2.4.0}/examples/research/research_graph.py +0 -0
  544. {devsper-2.3.0 → devsper-2.4.0}/requirements-docs.txt +0 -0
  545. {devsper-2.3.0 → devsper-2.4.0}/scripts/README.md +0 -0
  546. {devsper-2.3.0 → devsper-2.4.0}/scripts/seed_tool_scores.py +0 -0
  547. {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_cli.sh +0 -0
  548. {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_full.sh +0 -0
  549. {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_smoke.py +0 -0
  550. {devsper-2.3.0 → devsper-2.4.0}/scripts/test_v2_router.py +0 -0
  551. {devsper-2.3.0 → devsper-2.4.0}/supermemory-core/Cargo.toml +0 -0
  552. {devsper-2.3.0 → devsper-2.4.0}/supermemory-core/src/main.rs +0 -0
  553. {devsper-2.3.0 → devsper-2.4.0}/tests/agents/__init__.py +0 -0
  554. {devsper-2.3.0 → devsper-2.4.0}/tests/agents/test_roles.py +0 -0
  555. {devsper-2.3.0 → devsper-2.4.0}/tests/benchmarks/test_v16_perf.py +0 -0
  556. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_controller_restart_hitl.py +0 -0
  557. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
  558. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_event_idempotency.py +0 -0
  559. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_event_retry.py +0 -0
  560. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_hitl_pause_resume.py +0 -0
  561. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_sse_reconnect.py +0 -0
  562. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_sse_stream.py +0 -0
  563. {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_worker_crash_recovery.py +0 -0
  564. {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/__init__.py +0 -0
  565. {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_adaptation.py +0 -0
  566. {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_learning_engine.py +0 -0
  567. {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_strategy_selector.py +0 -0
  568. {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_task_optimizer.py +0 -0
  569. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/__init__.py +0 -0
  570. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_agent_memory_integration.py +0 -0
  571. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_context_run_scope.py +0 -0
  572. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_index.py +0 -0
  573. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_router.py +0 -0
  574. {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_store.py +0 -0
  575. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/__init__.py +0 -0
  576. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/fixtures.py +0 -0
  577. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_crypto.py +0 -0
  578. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_e2e_redis_loop.py +0 -0
  579. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_heartbeat_eviction.py +0 -0
  580. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_local_pool.py +0 -0
  581. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_org_pool.py +0 -0
  582. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_priority_chain.py +0 -0
  583. {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_rate_limiting.py +0 -0
  584. {devsper-2.3.0 → devsper-2.4.0}/tests/reasoning/__init__.py +0 -0
  585. {devsper-2.3.0 → devsper-2.4.0}/tests/reasoning/test_reasoning_graph.py +0 -0
  586. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/__init__.py +0 -0
  587. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_budget.py +0 -0
  588. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_otel_phase1.py +0 -0
  589. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_packager.py +0 -0
  590. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_protocol_schema.py +0 -0
  591. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_replay.py +0 -0
  592. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_replay_engine.py +0 -0
  593. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_telemetry.py +0 -0
  594. {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_visualize.py +0 -0
  595. {devsper-2.3.0 → devsper-2.4.0}/tests/test_agent.py +0 -0
  596. {devsper-2.3.0 → devsper-2.4.0}/tests/test_analysis.py +0 -0
  597. {devsper-2.3.0 → devsper-2.4.0}/tests/test_analytics.py +0 -0
  598. {devsper-2.3.0 → devsper-2.4.0}/tests/test_auto_model.py +0 -0
  599. {devsper-2.3.0 → devsper-2.4.0}/tests/test_clarification.py +0 -0
  600. {devsper-2.3.0 → devsper-2.4.0}/tests/test_clarification_multinode.py +0 -0
  601. {devsper-2.3.0 → devsper-2.4.0}/tests/test_config_loader.py +0 -0
  602. {devsper-2.3.0 → devsper-2.4.0}/tests/test_credentials.py +0 -0
  603. {devsper-2.3.0 → devsper-2.4.0}/tests/test_cross_boundary_serialization.py +0 -0
  604. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dag_export.py +0 -0
  605. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_agents.py +0 -0
  606. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_build_cmd.py +0 -0
  607. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_debugger.py +0 -0
  608. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_repo_index.py +0 -0
  609. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_sandbox.py +0 -0
  610. {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_scaffold.py +0 -0
  611. {devsper-2.3.0 → devsper-2.4.0}/tests/test_distributed_bugs.py +0 -0
  612. {devsper-2.3.0 → devsper-2.4.0}/tests/test_embeddings_service.py +0 -0
  613. {devsper-2.3.0 → devsper-2.4.0}/tests/test_event_logger.py +0 -0
  614. {devsper-2.3.0 → devsper-2.4.0}/tests/test_executor.py +0 -0
  615. {devsper-2.3.0 → devsper-2.4.0}/tests/test_export_runs.py +0 -0
  616. {devsper-2.3.0 → devsper-2.4.0}/tests/test_github_provider.py +0 -0
  617. {devsper-2.3.0 → devsper-2.4.0}/tests/test_init.py +0 -0
  618. {devsper-2.3.0 → devsper-2.4.0}/tests/test_knowledge_graph.py +0 -0
  619. {devsper-2.3.0 → devsper-2.4.0}/tests/test_knowledge_query.py +0 -0
  620. {devsper-2.3.0 → devsper-2.4.0}/tests/test_map_reduce.py +0 -0
  621. {devsper-2.3.0 → devsper-2.4.0}/tests/test_memory_evolution.py +0 -0
  622. {devsper-2.3.0 → devsper-2.4.0}/tests/test_memory_isolation.py +0 -0
  623. {devsper-2.3.0 → devsper-2.4.0}/tests/test_missions.py +0 -0
  624. {devsper-2.3.0 → devsper-2.4.0}/tests/test_model_router.py +0 -0
  625. {devsper-2.3.0 → devsper-2.4.0}/tests/test_planner.py +0 -0
  626. {devsper-2.3.0 → devsper-2.4.0}/tests/test_platform_runtime_events.py +0 -0
  627. {devsper-2.3.0 → devsper-2.4.0}/tests/test_plugins.py +0 -0
  628. {devsper-2.3.0 → devsper-2.4.0}/tests/test_protocols.py +0 -0
  629. {devsper-2.3.0 → devsper-2.4.0}/tests/test_router.py +0 -0
  630. {devsper-2.3.0 → devsper-2.4.0}/tests/test_scheduler.py +0 -0
  631. {devsper-2.3.0 → devsper-2.4.0}/tests/test_speculation.py +0 -0
  632. {devsper-2.3.0 → devsper-2.4.0}/tests/test_strategies.py +0 -0
  633. {devsper-2.3.0 → devsper-2.4.0}/tests/test_swarm.py +0 -0
  634. {devsper-2.3.0 → devsper-2.4.0}/tests/test_task_cache.py +0 -0
  635. {devsper-2.3.0 → devsper-2.4.0}/tests/test_tool_scoring.py +0 -0
  636. {devsper-2.3.0 → devsper-2.4.0}/tests/test_tool_selector.py +0 -0
  637. {devsper-2.3.0 → devsper-2.4.0}/tests/test_upgrade.py +0 -0
  638. {devsper-2.3.0 → devsper-2.4.0}/tests/test_v110.py +0 -0
  639. {devsper-2.3.0 → devsper-2.4.0}/tests/test_v16.py +0 -0
  640. {devsper-2.3.0 → devsper-2.4.0}/tests/test_v17.py +0 -0
  641. {devsper-2.3.0 → devsper-2.4.0}/tests/test_v18.py +0 -0
  642. {devsper-2.3.0 → devsper-2.4.0}/tests/test_v19.py +0 -0
  643. {devsper-2.3.0 → devsper-2.4.0}/tests/test_workflow.py +0 -0
  644. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/__init__.py +0 -0
  645. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_code_intelligence_tools.py +0 -0
  646. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_coding_tools.py +0 -0
  647. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_core_tool_registry.py +0 -0
  648. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_data_science_tools.py +0 -0
  649. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_data_tools.py +0 -0
  650. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_document_tools.py +0 -0
  651. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_experiments_tools.py +0 -0
  652. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_filesystem_tools.py +0 -0
  653. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_flagship_tools.py +0 -0
  654. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_knowledge_tools.py +0 -0
  655. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_math_tools.py +0 -0
  656. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_memory_tools.py +0 -0
  657. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_pipelines.py +0 -0
  658. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_registry.py +0 -0
  659. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_research_advanced_tools.py +0 -0
  660. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_research_tools.py +0 -0
  661. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_system_tools.py +0 -0
  662. {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_tool_runner.py +0 -0
  663. {devsper-2.3.0 → devsper-2.4.0}/uv.lock +0 -0
  664. {devsper-2.3.0 → devsper-2.4.0}/worker/.dockerignore +0 -0
  665. {devsper-2.3.0 → devsper-2.4.0}/worker/Cargo.lock +0 -0
  666. {devsper-2.3.0 → devsper-2.4.0}/worker/Cargo.toml +0 -0
  667. {devsper-2.3.0 → devsper-2.4.0}/worker/Dockerfile +0 -0
  668. {devsper-2.3.0 → devsper-2.4.0}/worker/README.md +0 -0
  669. {devsper-2.3.0 → devsper-2.4.0}/worker/src/budget.rs +0 -0
  670. {devsper-2.3.0 → devsper-2.4.0}/worker/src/bus.rs +0 -0
  671. {devsper-2.3.0 → devsper-2.4.0}/worker/src/claim.rs +0 -0
  672. {devsper-2.3.0 → devsper-2.4.0}/worker/src/clarification.rs +0 -0
  673. {devsper-2.3.0 → devsper-2.4.0}/worker/src/config.rs +0 -0
  674. {devsper-2.3.0 → devsper-2.4.0}/worker/src/controller.rs +0 -0
  675. {devsper-2.3.0 → devsper-2.4.0}/worker/src/election.rs +0 -0
  676. {devsper-2.3.0 → devsper-2.4.0}/worker/src/error.rs +0 -0
  677. {devsper-2.3.0 → devsper-2.4.0}/worker/src/executor.rs +0 -0
  678. {devsper-2.3.0 → devsper-2.4.0}/worker/src/health.rs +0 -0
  679. {devsper-2.3.0 → devsper-2.4.0}/worker/src/heartbeat.rs +0 -0
  680. {devsper-2.3.0 → devsper-2.4.0}/worker/src/lib.rs +0 -0
  681. {devsper-2.3.0 → devsper-2.4.0}/worker/src/main.rs +0 -0
  682. {devsper-2.3.0 → devsper-2.4.0}/worker/src/metrics.rs +0 -0
  683. {devsper-2.3.0 → devsper-2.4.0}/worker/src/reconnect.rs +0 -0
  684. {devsper-2.3.0 → devsper-2.4.0}/worker/src/registry.rs +0 -0
  685. {devsper-2.3.0 → devsper-2.4.0}/worker/src/router.rs +0 -0
  686. {devsper-2.3.0 → devsper-2.4.0}/worker/src/rpc.rs +0 -0
  687. {devsper-2.3.0 → devsper-2.4.0}/worker/src/scheduler.rs +0 -0
  688. {devsper-2.3.0 → devsper-2.4.0}/worker/src/snapshot.rs +0 -0
  689. {devsper-2.3.0 → devsper-2.4.0}/worker/src/telemetry.rs +0 -0
  690. {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/agent.rs +0 -0
  691. {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/event.rs +0 -0
  692. {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/mod.rs +0 -0
  693. {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/node.rs +0 -0
  694. {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/task.rs +0 -0
  695. {devsper-2.3.0 → devsper-2.4.0}/worker/src/worker_node.rs +0 -0
  696. {devsper-2.3.0 → devsper-2.4.0}/worker/tests/integration.rs +0 -0
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.0] — 2026-03-31
11
+
12
+ ### Added
13
+
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.
20
+
21
+ ### Changed
22
+
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.
28
+
10
29
  ## [2.3.0] — 2026-03-30
11
30
 
12
31
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsper
3
- Version: 2.3.0
3
+ Version: 2.4.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
@@ -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
 
@@ -0,0 +1,7 @@
1
+ """Distributed runtime wrappers for controller/worker orchestration."""
2
+
3
+ from devsper.distributed.controller import DistributedController
4
+ from devsper.distributed.worker_runtime import WorkerRuntime
5
+
6
+ __all__ = ["DistributedController", "WorkerRuntime"]
7
+
@@ -0,0 +1,70 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from dataclasses import dataclass
5
+
6
+ from devsper.cluster.router import TaskRouter
7
+ from devsper.types.task import Task
8
+
9
+
10
+ @dataclass
11
+ class WorkerState:
12
+ worker_id: str
13
+ healthy: bool = True
14
+ active_tasks: int = 0
15
+ max_workers: int = 1
16
+
17
+
18
+ class DistributedController:
19
+ """Controller-side worker orchestration and task assignment."""
20
+
21
+ def __init__(self, router: TaskRouter | None = None) -> None:
22
+ self._router = router or TaskRouter()
23
+ self._workers: dict[str, WorkerState] = {}
24
+ self._task_assignments: dict[str, str] = {}
25
+ self._lock = asyncio.Lock()
26
+
27
+ async def register_worker(self, worker_id: str, max_workers: int = 1) -> None:
28
+ async with self._lock:
29
+ self._workers[worker_id] = WorkerState(
30
+ worker_id=worker_id,
31
+ healthy=True,
32
+ active_tasks=0,
33
+ max_workers=max(1, int(max_workers)),
34
+ )
35
+
36
+ async def mark_worker_unhealthy(self, worker_id: str) -> None:
37
+ async with self._lock:
38
+ if worker_id in self._workers:
39
+ self._workers[worker_id].healthy = False
40
+
41
+ async def health_check(self) -> dict[str, bool]:
42
+ async with self._lock:
43
+ return {wid: ws.healthy for wid, ws in self._workers.items()}
44
+
45
+ async def assign_task(self, task: Task) -> str | None:
46
+ async with self._lock:
47
+ candidates = [
48
+ ws
49
+ for ws in self._workers.values()
50
+ if ws.healthy and ws.active_tasks < ws.max_workers
51
+ ]
52
+ if not candidates:
53
+ return None
54
+ # Lightweight balancing by active load.
55
+ candidates.sort(key=lambda ws: (ws.active_tasks / max(1, ws.max_workers), ws.worker_id))
56
+ chosen = candidates[0]
57
+ chosen.active_tasks += 1
58
+ self._task_assignments[task.id] = chosen.worker_id
59
+ return chosen.worker_id
60
+
61
+ async def complete_task(self, task_id: str) -> None:
62
+ async with self._lock:
63
+ wid = self._task_assignments.pop(task_id, None)
64
+ if wid and wid in self._workers:
65
+ self._workers[wid].active_tasks = max(0, self._workers[wid].active_tasks - 1)
66
+
67
+ async def reassign_on_failure(self, task: Task, failed_worker_id: str) -> str | None:
68
+ await self.mark_worker_unhealthy(failed_worker_id)
69
+ return await self.assign_task(task)
70
+
@@ -0,0 +1,43 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+
5
+ from devsper.agents.agent import Agent
6
+ from devsper.runtime.agent_pool import AgentPool
7
+ from devsper.runtime.executor import Executor
8
+ from devsper.runtime.model_router import ModelRouter
9
+ from devsper.runtime.tool_runner import ToolRunner
10
+ from devsper.swarm.scheduler import Scheduler
11
+ from devsper.utils.event_logger import EventLog
12
+
13
+
14
+ @dataclass
15
+ class WorkerRuntime:
16
+ """Worker-local runtime for agent/tool execution."""
17
+
18
+ scheduler: Scheduler
19
+ agent: Agent
20
+ event_log: EventLog
21
+ worker_id: str = "worker-local"
22
+ max_agents: int = 4
23
+ tool_concurrency: int = 4
24
+
25
+ def __post_init__(self) -> None:
26
+ self.agent_pool = AgentPool(lambda: self.agent, max_agents=self.max_agents)
27
+ self.model_router = ModelRouter(
28
+ planning_model=getattr(self.agent, "model_name", "mock"),
29
+ reasoning_model=getattr(self.agent, "model_name", "mock"),
30
+ validation_model=getattr(self.agent, "model_name", "mock"),
31
+ )
32
+ self.tool_runner = ToolRunner(parallelism=self.tool_concurrency)
33
+ self.executor = Executor(
34
+ scheduler=self.scheduler,
35
+ agent=self.agent,
36
+ event_log=self.event_log,
37
+ worker_count=self.max_agents,
38
+ )
39
+
40
+ async def run_task_queue(self) -> dict[str, str]:
41
+ await self.executor.run()
42
+ return self.scheduler.get_results()
43
+
@@ -0,0 +1,34 @@
1
+ """Runtime utilities: replay, telemetry, visualization."""
2
+
3
+ from devsper.runtime.replay import replay_execution
4
+ from devsper.runtime.telemetry import collect_telemetry, print_telemetry_summary
5
+ from devsper.runtime.visualize import visualize_scheduler_dag
6
+ from devsper.runtime.executor import Executor
7
+ from devsper.runtime.state_manager import RuntimeStateManager
8
+ from devsper.runtime.task_runner import TaskRunner
9
+ from devsper.runtime.agent_runner import AgentRunner
10
+ from devsper.runtime.tool_runner import ToolRunner
11
+ from devsper.runtime.execution_graph import ExecutionGraph
12
+ from devsper.runtime.planner import RuntimePlanner
13
+ from devsper.runtime.agent_pool import AgentPool
14
+ from devsper.runtime.model_router import ModelRouter
15
+ from devsper.runtime.speculative_planner import SpeculativePlanner
16
+ from devsper.runtime.hitl import HITLManager
17
+
18
+ __all__ = [
19
+ "Executor",
20
+ "RuntimeStateManager",
21
+ "TaskRunner",
22
+ "AgentRunner",
23
+ "ToolRunner",
24
+ "ExecutionGraph",
25
+ "RuntimePlanner",
26
+ "AgentPool",
27
+ "ModelRouter",
28
+ "SpeculativePlanner",
29
+ "HITLManager",
30
+ "replay_execution",
31
+ "collect_telemetry",
32
+ "print_telemetry_summary",
33
+ "visualize_scheduler_dag",
34
+ ]
@@ -0,0 +1,85 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from collections import defaultdict
5
+ from contextlib import asynccontextmanager
6
+ from dataclasses import dataclass
7
+ from typing import Callable
8
+
9
+ from devsper.agents.agent import Agent
10
+ from devsper.runtime.agent_runner import AgentRunner
11
+ from devsper.types.task import Task
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class AgentLease:
16
+ worker_id: str
17
+ agent: Agent
18
+
19
+
20
+ class AgentPool:
21
+ """Reusable async pool for worker-local agent execution."""
22
+
23
+ def __init__(
24
+ self,
25
+ agent_factory: Callable[[], Agent],
26
+ max_agents: int = 8,
27
+ streaming_tools: bool = False,
28
+ ) -> None:
29
+ self._factory = agent_factory
30
+ self._max_agents = max(1, int(max_agents))
31
+ self._streaming_tools = bool(streaming_tools)
32
+ self._queues: dict[str, asyncio.Queue[Agent]] = defaultdict(asyncio.Queue)
33
+ self._created: dict[str, int] = defaultdict(int)
34
+ self._lock = asyncio.Lock()
35
+
36
+ async def acquire_agent(self, worker_id: str = "default") -> AgentLease:
37
+ queue = self._queues[worker_id]
38
+ try:
39
+ agent = queue.get_nowait()
40
+ return AgentLease(worker_id=worker_id, agent=agent)
41
+ except asyncio.QueueEmpty:
42
+ pass
43
+
44
+ async with self._lock:
45
+ if self._created[worker_id] < self._max_agents:
46
+ self._created[worker_id] += 1
47
+ return AgentLease(worker_id=worker_id, agent=self._factory())
48
+
49
+ agent = await queue.get()
50
+ return AgentLease(worker_id=worker_id, agent=agent)
51
+
52
+ async def release_agent(self, lease: AgentLease) -> None:
53
+ await self._queues[lease.worker_id].put(lease.agent)
54
+
55
+ async def run_agent(
56
+ self,
57
+ task: Task,
58
+ worker_id: str = "default",
59
+ model_override: str | None = None,
60
+ ) -> str:
61
+ lease = await self.acquire_agent(worker_id=worker_id)
62
+ try:
63
+ runner = AgentRunner(lease.agent, streaming_tools=self._streaming_tools)
64
+ return await runner.run_task(task, model_override=model_override)
65
+ finally:
66
+ await self.release_agent(lease)
67
+
68
+ async def run_parallel(
69
+ self,
70
+ tasks: list[Task],
71
+ worker_id: str = "default",
72
+ model_override: str | None = None,
73
+ ) -> list[str]:
74
+ return await asyncio.gather(
75
+ *(self.run_agent(t, worker_id=worker_id, model_override=model_override) for t in tasks)
76
+ )
77
+
78
+ @asynccontextmanager
79
+ async def lease(self, worker_id: str = "default"):
80
+ lease = await self.acquire_agent(worker_id=worker_id)
81
+ try:
82
+ yield lease.agent
83
+ finally:
84
+ await self.release_agent(lease)
85
+
@@ -0,0 +1,79 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+
5
+ from devsper.agents.agent import Agent
6
+ from devsper.types.task import Task
7
+ from devsper.utils.models import generate
8
+ from devsper.tools.tool_runner import run_tool
9
+
10
+
11
+ def _extract_tool_calls(text: str) -> list[tuple[str, dict]]:
12
+ try:
13
+ from devsper.agents.agent import _parse_all_tool_calls # type: ignore
14
+
15
+ return _parse_all_tool_calls(text)
16
+ except Exception:
17
+ return []
18
+
19
+
20
+ class AgentRunner:
21
+ """Async wrapper for agent execution with optional streaming tool handling."""
22
+
23
+ def __init__(self, agent: Agent, streaming_tools: bool = False) -> None:
24
+ self._agent = agent
25
+ self._streaming_tools = bool(streaming_tools)
26
+
27
+ async def run_task(self, task: Task, model_override: str | None = None) -> str:
28
+ if self._streaming_tools:
29
+ try:
30
+ return await asyncio.to_thread(
31
+ self._run_task_streaming_tools_sync,
32
+ task,
33
+ model_override,
34
+ )
35
+ except Exception:
36
+ pass
37
+ return await asyncio.to_thread(
38
+ self._agent.run_task,
39
+ task,
40
+ model_override,
41
+ None,
42
+ )
43
+
44
+ def _run_task_streaming_tools_sync(
45
+ self,
46
+ task: Task,
47
+ model_override: str | None = None,
48
+ ) -> str:
49
+ request = self._agent.build_request(task, model_override=model_override)
50
+ if not getattr(self._agent, "use_tools", False) or not request.tools:
51
+ return self._agent.run_task(task, model_override=model_override, prefetch_result=None)
52
+
53
+ from devsper.agents.agent import PROMPT_TEMPLATE_WITH_TOOLS, _format_tools_section, _get_tools_by_names
54
+
55
+ tools = _get_tools_by_names(request.tools)
56
+ prompt = PROMPT_TEMPLATE_WITH_TOOLS.format(
57
+ role_prefix=request.system_prompt,
58
+ task_description=request.task.description,
59
+ memory_section=request.memory_context or "",
60
+ message_bus_section="",
61
+ tools_section=_format_tools_section(tools),
62
+ )
63
+ conversation = [prompt]
64
+ task_type = getattr(task, "role", None) or "general"
65
+
66
+ for _ in range(max(1, int(getattr(self._agent, "max_tool_iterations", 5)))):
67
+ streamed = generate(request.model, "\n\n".join(conversation), stream=True)
68
+ text = "".join(streamed) if hasattr(streamed, "__iter__") else str(streamed)
69
+ calls = _extract_tool_calls(text)
70
+ if not calls:
71
+ return (text or "").strip()
72
+
73
+ conversation.append(f"Response:\n{text}")
74
+ for name, args in calls:
75
+ result = run_tool(name, args, task_type=task_type)
76
+ conversation.append(f"Tool result ({name}):\n{result or ''}")
77
+
78
+ return "Max tool iterations reached."
79
+
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from dataclasses import dataclass
5
+ from datetime import datetime, timezone
6
+ from typing import Any, AsyncIterator
7
+
8
+ from devsper.types.event import Event, events
9
+ from devsper.utils.event_logger import EventLog
10
+
11
+
12
+ @dataclass
13
+ class RuntimeEvent:
14
+ type: events
15
+ payload: dict[str, Any]
16
+ at: datetime
17
+
18
+
19
+ class RuntimeEventStream:
20
+ """In-process async event stream backed by EventLog."""
21
+
22
+ def __init__(self, event_log: EventLog, max_queue_size: int = 2048) -> None:
23
+ self._event_log = event_log
24
+ self._queue: asyncio.Queue[RuntimeEvent] = asyncio.Queue(maxsize=max(1, int(max_queue_size)))
25
+ self._closed = False
26
+ self._dropped = 0
27
+
28
+ async def publish(self, event_type: events, payload: dict[str, Any]) -> None:
29
+ if self._closed:
30
+ return
31
+ now = datetime.now(timezone.utc)
32
+ self._event_log.append_event(Event(timestamp=now, type=event_type, payload=payload))
33
+ evt = RuntimeEvent(type=event_type, payload=payload, at=now)
34
+ try:
35
+ self._queue.put_nowait(evt)
36
+ except asyncio.QueueFull:
37
+ # Backpressure policy: drop oldest event and keep newest.
38
+ try:
39
+ _ = self._queue.get_nowait()
40
+ self._dropped += 1
41
+ except asyncio.QueueEmpty:
42
+ pass
43
+ try:
44
+ self._queue.put_nowait(evt)
45
+ except asyncio.QueueFull:
46
+ self._dropped += 1
47
+
48
+ async def subscribe(self) -> AsyncIterator[RuntimeEvent]:
49
+ while not self._closed:
50
+ yield await self._queue.get()
51
+
52
+ def close(self) -> None:
53
+ self._closed = True
54
+
55
+ @property
56
+ def dropped_events(self) -> int:
57
+ return self._dropped
58
+