devsper 2.7.1__tar.gz → 3.0.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 (746) hide show
  1. {devsper-2.7.1 → devsper-3.0.0}/.gitignore +6 -1
  2. devsper-3.0.0/PKG-INFO +20 -0
  3. devsper-3.0.0/devsper/__init__.py +2 -0
  4. devsper-3.0.0/devsper/__main__.py +5 -0
  5. devsper-3.0.0/devsper/auth/github.py +100 -0
  6. devsper-3.0.0/devsper/cli.py +362 -0
  7. devsper-3.0.0/devsper/credentials/inject.py +19 -0
  8. devsper-3.0.0/devsper/credentials/providers.py +107 -0
  9. devsper-3.0.0/devsper/credentials/store.py +41 -0
  10. devsper-3.0.0/devsper/eval/runner.py +53 -0
  11. devsper-3.0.0/devsper/eval/scoring.py +96 -0
  12. devsper-3.0.0/devsper/tui/__init__.py +1 -0
  13. devsper-3.0.0/devsper/tui/app.py +149 -0
  14. devsper-3.0.0/pyproject.toml +38 -0
  15. devsper-3.0.0/uv.lock +3961 -0
  16. devsper-2.7.1/.env.example +0 -28
  17. devsper-2.7.1/.github/FUNDING.yml +0 -1
  18. devsper-2.7.1/.github/workflows/pypi-publish.yml +0 -36
  19. devsper-2.7.1/.github/workflows/release-on-tag.yml +0 -56
  20. devsper-2.7.1/.github/workflows/worker-release.yml +0 -106
  21. devsper-2.7.1/.python-version +0 -1
  22. devsper-2.7.1/CHANGELOG.md +0 -528
  23. devsper-2.7.1/CODE_OF_CONDUCT.md +0 -32
  24. devsper-2.7.1/CONTRIBUTING.md +0 -46
  25. devsper-2.7.1/Cargo.lock +0 -2896
  26. devsper-2.7.1/Cargo.toml +0 -3
  27. devsper-2.7.1/Dockerfile.local-pool +0 -22
  28. devsper-2.7.1/LICENSE +0 -639
  29. devsper-2.7.1/PKG-INFO +0 -455
  30. devsper-2.7.1/README.md +0 -361
  31. devsper-2.7.1/SECURITY.md +0 -20
  32. devsper-2.7.1/benchmarks/__init__.py +0 -1
  33. devsper-2.7.1/benchmarks/bench_dataset_analysis.py +0 -28
  34. devsper-2.7.1/benchmarks/bench_repository_analysis.py +0 -28
  35. devsper-2.7.1/benchmarks/bench_research_pipeline.py +0 -28
  36. devsper-2.7.1/branding/logo.svg +0 -3
  37. devsper-2.7.1/devsper/README.md +0 -148
  38. devsper-2.7.1/devsper/__init__.py +0 -36
  39. devsper-2.7.1/devsper/agents/a2a/__init__.py +0 -27
  40. devsper-2.7.1/devsper/agents/a2a/client.py +0 -126
  41. devsper-2.7.1/devsper/agents/a2a/discovery.py +0 -24
  42. devsper-2.7.1/devsper/agents/a2a/server.py +0 -128
  43. devsper-2.7.1/devsper/agents/a2a/tool_adapter.py +0 -68
  44. devsper-2.7.1/devsper/agents/a2a/types.py +0 -49
  45. devsper-2.7.1/devsper/agents/agent.py +0 -1503
  46. devsper-2.7.1/devsper/agents/critic.py +0 -80
  47. devsper-2.7.1/devsper/agents/identity.py +0 -38
  48. devsper-2.7.1/devsper/agents/message_bus.py +0 -124
  49. devsper-2.7.1/devsper/agents/registry.py +0 -46
  50. devsper-2.7.1/devsper/agents/roles.py +0 -205
  51. devsper-2.7.1/devsper/agents/run_agent.py +0 -78
  52. devsper-2.7.1/devsper/analytics/__init__.py +0 -5
  53. devsper-2.7.1/devsper/analytics/tool_analytics.py +0 -78
  54. devsper-2.7.1/devsper/audit/__init__.py +0 -5
  55. devsper-2.7.1/devsper/audit/logger.py +0 -214
  56. devsper-2.7.1/devsper/budget.py +0 -102
  57. devsper-2.7.1/devsper/bus/__init__.py +0 -29
  58. devsper-2.7.1/devsper/bus/backends/__init__.py +0 -5
  59. devsper-2.7.1/devsper/bus/backends/base.py +0 -146
  60. devsper-2.7.1/devsper/bus/backends/memory.py +0 -55
  61. devsper-2.7.1/devsper/bus/backends/redis.py +0 -146
  62. devsper-2.7.1/devsper/bus/message.py +0 -56
  63. devsper-2.7.1/devsper/bus/schema_version.py +0 -3
  64. devsper-2.7.1/devsper/bus/topics.py +0 -21
  65. devsper-2.7.1/devsper/cache/__init__.py +0 -6
  66. devsper-2.7.1/devsper/cache/embedding_index.py +0 -98
  67. devsper-2.7.1/devsper/cache/hashing.py +0 -24
  68. devsper-2.7.1/devsper/cache/store.py +0 -153
  69. devsper-2.7.1/devsper/cache/task_cache.py +0 -191
  70. devsper-2.7.1/devsper/cli/__init__.py +0 -6
  71. devsper-2.7.1/devsper/cli/commands/cloud.py +0 -718
  72. devsper-2.7.1/devsper/cli/export.py +0 -16
  73. devsper-2.7.1/devsper/cli/github_oauth.py +0 -157
  74. devsper-2.7.1/devsper/cli/init.py +0 -706
  75. devsper-2.7.1/devsper/cli/main.py +0 -4335
  76. devsper-2.7.1/devsper/cli/run_progress.py +0 -103
  77. devsper-2.7.1/devsper/cli/ui/__init__.py +0 -67
  78. devsper-2.7.1/devsper/cli/ui/components.py +0 -110
  79. devsper-2.7.1/devsper/cli/ui/controller_run_view.py +0 -129
  80. devsper-2.7.1/devsper/cli/ui/errors.py +0 -104
  81. devsper-2.7.1/devsper/cli/ui/logging.py +0 -120
  82. devsper-2.7.1/devsper/cli/ui/onboarding.py +0 -116
  83. devsper-2.7.1/devsper/cli/ui/progress.py +0 -43
  84. devsper-2.7.1/devsper/cli/ui/run_view.py +0 -854
  85. devsper-2.7.1/devsper/cli/ui/theme.py +0 -67
  86. devsper-2.7.1/devsper/cluster/__init__.py +0 -29
  87. devsper-2.7.1/devsper/cluster/election.py +0 -85
  88. devsper-2.7.1/devsper/cluster/local.py +0 -97
  89. devsper-2.7.1/devsper/cluster/node_info.py +0 -77
  90. devsper-2.7.1/devsper/cluster/registry.py +0 -71
  91. devsper-2.7.1/devsper/cluster/router.py +0 -117
  92. devsper-2.7.1/devsper/cluster/state_backend.py +0 -105
  93. devsper-2.7.1/devsper/compliance/__init__.py +0 -5
  94. devsper-2.7.1/devsper/compliance/pii.py +0 -147
  95. devsper-2.7.1/devsper/config/__init__.py +0 -56
  96. devsper-2.7.1/devsper/config/config_loader.py +0 -121
  97. devsper-2.7.1/devsper/config/defaults.py +0 -79
  98. devsper-2.7.1/devsper/config/resolver.py +0 -421
  99. devsper-2.7.1/devsper/config/schema.py +0 -372
  100. devsper-2.7.1/devsper/connectors/__init__.py +0 -18
  101. devsper-2.7.1/devsper/connectors/base.py +0 -59
  102. devsper-2.7.1/devsper/connectors/registry.py +0 -46
  103. devsper-2.7.1/devsper/connectors/sample_connector.py +0 -74
  104. devsper-2.7.1/devsper/contracts/__init__.py +0 -5
  105. devsper-2.7.1/devsper/contracts/platform_event_type.py +0 -68
  106. devsper-2.7.1/devsper/core/__init__.py +0 -2
  107. devsper-2.7.1/devsper/core/agent/__init__.py +0 -4
  108. devsper-2.7.1/devsper/core/agent/runner.py +0 -14
  109. devsper-2.7.1/devsper/core/hitl/__init__.py +0 -4
  110. devsper-2.7.1/devsper/core/hitl/state_machine.py +0 -53
  111. devsper-2.7.1/devsper/core/memory/__init__.py +0 -4
  112. devsper-2.7.1/devsper/core/memory/shared_memory.py +0 -45
  113. devsper-2.7.1/devsper/core/reporting/__init__.py +0 -4
  114. devsper-2.7.1/devsper/core/reporting/publisher.py +0 -53
  115. devsper-2.7.1/devsper/core/runtime/__init__.py +0 -5
  116. devsper-2.7.1/devsper/core/runtime/durability.py +0 -45
  117. devsper-2.7.1/devsper/core/runtime/orchestrator.py +0 -14
  118. devsper-2.7.1/devsper/core/tools/__init__.py +0 -12
  119. devsper-2.7.1/devsper/core/tools/base_tool.py +0 -17
  120. devsper-2.7.1/devsper/core/tools/loader.py +0 -35
  121. devsper-2.7.1/devsper/core/tools/registry.py +0 -49
  122. devsper-2.7.1/devsper/credentials/__init__.py +0 -19
  123. devsper-2.7.1/devsper/credentials/cli.py +0 -207
  124. devsper-2.7.1/devsper/credentials/migration.py +0 -124
  125. devsper-2.7.1/devsper/credentials/store.py +0 -153
  126. devsper-2.7.1/devsper/dashboard/__init__.py +0 -9
  127. devsper-2.7.1/devsper/dashboard/dashboard.py +0 -87
  128. devsper-2.7.1/devsper/debug_events.py +0 -38
  129. devsper-2.7.1/devsper/dev/__init__.py +0 -25
  130. devsper-2.7.1/devsper/dev/builder.py +0 -195
  131. devsper-2.7.1/devsper/dev/debugger.py +0 -95
  132. devsper-2.7.1/devsper/dev/repo_index.py +0 -138
  133. devsper-2.7.1/devsper/dev/sandbox.py +0 -203
  134. devsper-2.7.1/devsper/dev/scaffold.py +0 -122
  135. devsper-2.7.1/devsper/distributed/__init__.py +0 -7
  136. devsper-2.7.1/devsper/distributed/controller.py +0 -70
  137. devsper-2.7.1/devsper/distributed/worker_runtime.py +0 -43
  138. devsper-2.7.1/devsper/docs/architecture/execution-model.md +0 -12
  139. devsper-2.7.1/devsper/embeddings/__init__.py +0 -5
  140. devsper-2.7.1/devsper/embeddings/service.py +0 -36
  141. devsper-2.7.1/devsper/evals/__init__.py +0 -19
  142. devsper-2.7.1/devsper/evals/dataset.py +0 -107
  143. devsper-2.7.1/devsper/evals/metrics.py +0 -192
  144. devsper-2.7.1/devsper/evals/runner.py +0 -179
  145. devsper-2.7.1/devsper/evals/types.py +0 -114
  146. devsper-2.7.1/devsper/events.py +0 -73
  147. devsper-2.7.1/devsper/explainability/__init__.py +0 -14
  148. devsper-2.7.1/devsper/explainability/decision_tree.py +0 -104
  149. devsper-2.7.1/devsper/explainability/rationale.py +0 -38
  150. devsper-2.7.1/devsper/explainability/simulation.py +0 -56
  151. devsper-2.7.1/devsper/export/__init__.py +0 -5
  152. devsper-2.7.1/devsper/export/branding.py +0 -60
  153. devsper-2.7.1/devsper/export/collector.py +0 -269
  154. devsper-2.7.1/devsper/export/manifest.py +0 -30
  155. devsper-2.7.1/devsper/export/model.py +0 -61
  156. devsper-2.7.1/devsper/export/packager.py +0 -56
  157. devsper-2.7.1/devsper/export/pdf.py +0 -58
  158. devsper-2.7.1/devsper/export/service.py +0 -90
  159. devsper-2.7.1/devsper/export/writers.py +0 -351
  160. devsper-2.7.1/devsper/hitl/__init__.py +0 -13
  161. devsper-2.7.1/devsper/hitl/approval.py +0 -160
  162. devsper-2.7.1/devsper/hitl/escalation.py +0 -95
  163. devsper-2.7.1/devsper/integrations/__init__.py +0 -34
  164. devsper-2.7.1/devsper/integrations/langchain_adapter.py +0 -80
  165. devsper-2.7.1/devsper/integrations/langgraph_adapter.py +0 -151
  166. devsper-2.7.1/devsper/intelligence/__init__.py +0 -9
  167. devsper-2.7.1/devsper/intelligence/adaptation.py +0 -88
  168. devsper-2.7.1/devsper/intelligence/analysis/__init__.py +0 -19
  169. devsper-2.7.1/devsper/intelligence/analysis/analyzer.py +0 -71
  170. devsper-2.7.1/devsper/intelligence/analysis/cost_estimator.py +0 -66
  171. devsper-2.7.1/devsper/intelligence/analysis/formatter.py +0 -103
  172. devsper-2.7.1/devsper/intelligence/analysis/run_report.py +0 -402
  173. devsper-2.7.1/devsper/intelligence/learning_engine.py +0 -92
  174. devsper-2.7.1/devsper/intelligence/strategies/__init__.py +0 -23
  175. devsper-2.7.1/devsper/intelligence/strategies/base.py +0 -14
  176. devsper-2.7.1/devsper/intelligence/strategies/code_analysis_strategy.py +0 -33
  177. devsper-2.7.1/devsper/intelligence/strategies/data_science_strategy.py +0 -33
  178. devsper-2.7.1/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -33
  179. devsper-2.7.1/devsper/intelligence/strategies/experiment_strategy.py +0 -33
  180. devsper-2.7.1/devsper/intelligence/strategies/research_strategy.py +0 -34
  181. devsper-2.7.1/devsper/intelligence/strategy_selector.py +0 -84
  182. devsper-2.7.1/devsper/intelligence/synthesis.py +0 -132
  183. devsper-2.7.1/devsper/intelligence/task_optimizer.py +0 -92
  184. devsper-2.7.1/devsper/knowledge/__init__.py +0 -5
  185. devsper-2.7.1/devsper/knowledge/extractor.py +0 -204
  186. devsper-2.7.1/devsper/knowledge/knowledge_graph.py +0 -184
  187. devsper-2.7.1/devsper/knowledge/query.py +0 -285
  188. devsper-2.7.1/devsper/memory/__init__.py +0 -42
  189. devsper-2.7.1/devsper/memory/consolidation.py +0 -138
  190. devsper-2.7.1/devsper/memory/context.py +0 -134
  191. devsper-2.7.1/devsper/memory/embeddings.py +0 -60
  192. devsper-2.7.1/devsper/memory/memory_index.py +0 -244
  193. devsper-2.7.1/devsper/memory/memory_router.py +0 -142
  194. devsper-2.7.1/devsper/memory/memory_store.py +0 -286
  195. devsper-2.7.1/devsper/memory/memory_types.py +0 -54
  196. devsper-2.7.1/devsper/memory/namespaces.py +0 -45
  197. devsper-2.7.1/devsper/memory/platform_memory.py +0 -95
  198. devsper-2.7.1/devsper/memory/providers/__init__.py +0 -5
  199. devsper-2.7.1/devsper/memory/providers/backends/__init__.py +0 -1
  200. devsper-2.7.1/devsper/memory/providers/backends/platform_backend.py +0 -74
  201. devsper-2.7.1/devsper/memory/providers/backends/redis_backend.py +0 -90
  202. devsper-2.7.1/devsper/memory/providers/backends/snowflake_backend.py +0 -449
  203. devsper-2.7.1/devsper/memory/providers/backends/sqlite_backend.py +0 -83
  204. devsper-2.7.1/devsper/memory/providers/backends/vektori_backend.py +0 -140
  205. devsper-2.7.1/devsper/memory/providers/base.py +0 -125
  206. devsper-2.7.1/devsper/memory/providers/factory.py +0 -162
  207. devsper-2.7.1/devsper/memory/redis_memory.py +0 -167
  208. devsper-2.7.1/devsper/memory/scoring.py +0 -77
  209. devsper-2.7.1/devsper/memory/store.py +0 -10
  210. devsper-2.7.1/devsper/memory/summarizer.py +0 -52
  211. devsper-2.7.1/devsper/memory/supermemory_rust_ranker.py +0 -438
  212. devsper-2.7.1/devsper/missions/__init__.py +0 -16
  213. devsper-2.7.1/devsper/missions/base_agent.py +0 -22
  214. devsper-2.7.1/devsper/missions/coding/__init__.py +0 -13
  215. devsper-2.7.1/devsper/missions/coding/architect_agent.py +0 -10
  216. devsper-2.7.1/devsper/missions/coding/coder_agent.py +0 -10
  217. devsper-2.7.1/devsper/missions/coding/debugger_agent.py +0 -10
  218. devsper-2.7.1/devsper/missions/coding/docs_agent.py +0 -10
  219. devsper-2.7.1/devsper/missions/coding/tester_agent.py +0 -10
  220. devsper-2.7.1/devsper/missions/iteration_loop.py +0 -42
  221. devsper-2.7.1/devsper/missions/mission_memory.py +0 -70
  222. devsper-2.7.1/devsper/missions/mission_planner.py +0 -70
  223. devsper-2.7.1/devsper/missions/mission_runner.py +0 -232
  224. devsper-2.7.1/devsper/missions/models.py +0 -60
  225. devsper-2.7.1/devsper/missions/research/__init__.py +0 -6
  226. devsper-2.7.1/devsper/missions/research/editor_agent.py +0 -10
  227. devsper-2.7.1/devsper/missions/research/researcher_agent.py +0 -10
  228. devsper-2.7.1/devsper/missions/research/reviewer_agent.py +0 -10
  229. devsper-2.7.1/devsper/missions/research/writer_agent.py +0 -10
  230. devsper-2.7.1/devsper/nodes/__init__.py +0 -5
  231. devsper-2.7.1/devsper/nodes/controller.py +0 -1061
  232. devsper-2.7.1/devsper/nodes/rpc.py +0 -127
  233. devsper-2.7.1/devsper/nodes/single.py +0 -162
  234. devsper-2.7.1/devsper/nodes/worker.py +0 -595
  235. devsper-2.7.1/devsper/orchestration/__init__.py +0 -19
  236. devsper-2.7.1/devsper/orchestration/meta_planner.py +0 -239
  237. devsper-2.7.1/devsper/orchestration/priority_queue.py +0 -61
  238. devsper-2.7.1/devsper/platform/__init__.py +0 -1
  239. devsper-2.7.1/devsper/platform/redis_results_sink.py +0 -181
  240. devsper-2.7.1/devsper/platform/reporter.py +0 -104
  241. devsper-2.7.1/devsper/platform/request_builder.py +0 -246
  242. devsper-2.7.1/devsper/platform/run_context.py +0 -53
  243. devsper-2.7.1/devsper/platform/runtime_events.py +0 -304
  244. devsper-2.7.1/devsper/plugins/__init__.py +0 -19
  245. devsper-2.7.1/devsper/plugins/plugin_loader.py +0 -70
  246. devsper-2.7.1/devsper/plugins/plugin_registry.py +0 -34
  247. devsper-2.7.1/devsper/policy/client.py +0 -32
  248. devsper-2.7.1/devsper/pool/__init__.py +0 -2
  249. devsper-2.7.1/devsper/pool/config.py +0 -46
  250. devsper-2.7.1/devsper/pool/crypto.py +0 -75
  251. devsper-2.7.1/devsper/pool/local_pool.py +0 -126
  252. devsper-2.7.1/devsper/pool/manager.py +0 -159
  253. devsper-2.7.1/devsper/pool/models.py +0 -55
  254. devsper-2.7.1/devsper/pool/org_pool.py +0 -38
  255. devsper-2.7.1/devsper/pool/profiles/dev.toml +0 -22
  256. devsper-2.7.1/devsper/pool/profiles/local.toml +0 -24
  257. devsper-2.7.1/devsper/pool/profiles/prod.toml +0 -27
  258. devsper-2.7.1/devsper/pool/security.py +0 -41
  259. devsper-2.7.1/devsper/pool/store.py +0 -203
  260. devsper-2.7.1/devsper/pool/worker_runner.py +0 -95
  261. devsper-2.7.1/devsper/prompt_optimizer/__init__.py +0 -16
  262. devsper-2.7.1/devsper/prompt_optimizer/backends/__init__.py +0 -1
  263. devsper-2.7.1/devsper/prompt_optimizer/backends/dspy_backend.py +0 -205
  264. devsper-2.7.1/devsper/prompt_optimizer/backends/gepa_backend.py +0 -203
  265. devsper-2.7.1/devsper/prompt_optimizer/backends/noop.py +0 -25
  266. devsper-2.7.1/devsper/prompt_optimizer/base.py +0 -56
  267. devsper-2.7.1/devsper/prompt_optimizer/factory.py +0 -89
  268. devsper-2.7.1/devsper/protocol/__init__.py +0 -4
  269. devsper-2.7.1/devsper/protocol/client.py +0 -56
  270. devsper-2.7.1/devsper/protocol/schema.py +0 -47
  271. devsper-2.7.1/devsper/protocol/server.py +0 -74
  272. devsper-2.7.1/devsper/protocols/__init__.py +0 -6
  273. devsper-2.7.1/devsper/providers/__init__.py +0 -34
  274. devsper-2.7.1/devsper/providers/anthropic.py +0 -84
  275. devsper-2.7.1/devsper/providers/base.py +0 -81
  276. devsper-2.7.1/devsper/providers/complexity_router.py +0 -94
  277. devsper-2.7.1/devsper/providers/gemini.py +0 -36
  278. devsper-2.7.1/devsper/providers/github.py +0 -180
  279. devsper-2.7.1/devsper/providers/model_router.py +0 -40
  280. devsper-2.7.1/devsper/providers/openai.py +0 -108
  281. devsper-2.7.1/devsper/providers/router/__init__.py +0 -24
  282. devsper-2.7.1/devsper/providers/router/backends/__init__.py +0 -19
  283. devsper-2.7.1/devsper/providers/router/backends/anthropic_backend.py +0 -111
  284. devsper-2.7.1/devsper/providers/router/backends/custom_backend.py +0 -138
  285. devsper-2.7.1/devsper/providers/router/backends/gemini_backend.py +0 -89
  286. devsper-2.7.1/devsper/providers/router/backends/github_backend.py +0 -165
  287. devsper-2.7.1/devsper/providers/router/backends/ollama_backend.py +0 -104
  288. devsper-2.7.1/devsper/providers/router/backends/openai_backend.py +0 -145
  289. devsper-2.7.1/devsper/providers/router/backends/vllm_backend.py +0 -35
  290. devsper-2.7.1/devsper/providers/router/base.py +0 -60
  291. devsper-2.7.1/devsper/providers/router/factory.py +0 -97
  292. devsper-2.7.1/devsper/providers/router/legacy.py +0 -95
  293. devsper-2.7.1/devsper/providers/router/router.py +0 -135
  294. devsper-2.7.1/devsper/reasoning/__init__.py +0 -12
  295. devsper-2.7.1/devsper/reasoning/graph.py +0 -59
  296. devsper-2.7.1/devsper/reasoning/nodes.py +0 -20
  297. devsper-2.7.1/devsper/reasoning/store.py +0 -67
  298. devsper-2.7.1/devsper/runtime/__init__.py +0 -34
  299. devsper-2.7.1/devsper/runtime/agent_pool.py +0 -85
  300. devsper-2.7.1/devsper/runtime/agent_runner.py +0 -95
  301. devsper-2.7.1/devsper/runtime/clarification_manager.py +0 -294
  302. devsper-2.7.1/devsper/runtime/event_stream.py +0 -58
  303. devsper-2.7.1/devsper/runtime/execution_graph.py +0 -155
  304. devsper-2.7.1/devsper/runtime/executor.py +0 -344
  305. devsper-2.7.1/devsper/runtime/health.py +0 -88
  306. devsper-2.7.1/devsper/runtime/hitl.py +0 -71
  307. devsper-2.7.1/devsper/runtime/model_router.py +0 -53
  308. devsper-2.7.1/devsper/runtime/planner.py +0 -28
  309. devsper-2.7.1/devsper/runtime/replay.py +0 -53
  310. devsper-2.7.1/devsper/runtime/replay_engine.py +0 -142
  311. devsper-2.7.1/devsper/runtime/retry.py +0 -61
  312. devsper-2.7.1/devsper/runtime/run_history.py +0 -204
  313. devsper-2.7.1/devsper/runtime/speculative_planner.py +0 -51
  314. devsper-2.7.1/devsper/runtime/state_manager.py +0 -52
  315. devsper-2.7.1/devsper/runtime/task_runner.py +0 -135
  316. devsper-2.7.1/devsper/runtime/task_state.py +0 -244
  317. devsper-2.7.1/devsper/runtime/telemetry.py +0 -116
  318. devsper-2.7.1/devsper/runtime/tool_runner.py +0 -169
  319. devsper-2.7.1/devsper/runtime/trace_tree.py +0 -78
  320. devsper-2.7.1/devsper/runtime/visualize.py +0 -58
  321. devsper-2.7.1/devsper/sandbox/__init__.py +0 -13
  322. devsper-2.7.1/devsper/sandbox/sandbox.py +0 -161
  323. devsper-2.7.1/devsper/server/__init__.py +0 -3
  324. devsper-2.7.1/devsper/server/events.py +0 -84
  325. devsper-2.7.1/devsper/server/memory_utils.py +0 -475
  326. devsper-2.7.1/devsper/server/swarmworker.py +0 -786
  327. devsper-2.7.1/devsper/server/topology.py +0 -93
  328. devsper-2.7.1/devsper/storage/__init__.py +0 -1
  329. devsper-2.7.1/devsper/storage/uploads/__init__.py +0 -4
  330. devsper-2.7.1/devsper/storage/uploads/store.py +0 -42
  331. devsper-2.7.1/devsper/swarm/checkpointer.py +0 -65
  332. devsper-2.7.1/devsper/swarm/executor.py +0 -708
  333. devsper-2.7.1/devsper/swarm/map_reduce.py +0 -44
  334. devsper-2.7.1/devsper/swarm/planner.py +0 -246
  335. devsper-2.7.1/devsper/swarm/prefetcher.py +0 -91
  336. devsper-2.7.1/devsper/swarm/scheduler.py +0 -169
  337. devsper-2.7.1/devsper/swarm/speculation.py +0 -47
  338. devsper-2.7.1/devsper/swarm/swarm.py +0 -736
  339. devsper-2.7.1/devsper/telemetry/__init__.py +0 -34
  340. devsper-2.7.1/devsper/telemetry/otel.py +0 -175
  341. devsper-2.7.1/devsper/telemetry/pricing.py +0 -27
  342. devsper-2.7.1/devsper/telemetry/trulens.py +0 -119
  343. devsper-2.7.1/devsper/tools/__init__.py +0 -40
  344. devsper-2.7.1/devsper/tools/base.py +0 -52
  345. devsper-2.7.1/devsper/tools/code_intelligence/__init__.py +0 -13
  346. devsper-2.7.1/devsper/tools/code_intelligence/api_surface_extractor.py +0 -73
  347. devsper-2.7.1/devsper/tools/code_intelligence/architecture_analyzer.py +0 -65
  348. devsper-2.7.1/devsper/tools/code_intelligence/codebase_indexer.py +0 -71
  349. devsper-2.7.1/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -67
  350. devsper-2.7.1/devsper/tools/code_intelligence/design_pattern_detector.py +0 -62
  351. devsper-2.7.1/devsper/tools/code_intelligence/large_function_detector.py +0 -68
  352. devsper-2.7.1/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -56
  353. devsper-2.7.1/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -44
  354. devsper-2.7.1/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -81
  355. devsper-2.7.1/devsper/tools/code_intelligence/repository_semantic_index.py +0 -61
  356. devsper-2.7.1/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -62
  357. devsper-2.7.1/devsper/tools/coding/__init__.py +0 -12
  358. devsper-2.7.1/devsper/tools/coding/analyze_code_complexity.py +0 -48
  359. devsper-2.7.1/devsper/tools/coding/dependency_analyzer.py +0 -42
  360. devsper-2.7.1/devsper/tools/coding/extract_functions.py +0 -38
  361. devsper-2.7.1/devsper/tools/coding/format_python.py +0 -50
  362. devsper-2.7.1/devsper/tools/coding/generate_docstrings.py +0 -40
  363. devsper-2.7.1/devsper/tools/coding/generate_unit_tests.py +0 -42
  364. devsper-2.7.1/devsper/tools/coding/lint_python.py +0 -51
  365. devsper-2.7.1/devsper/tools/coding/refactor_function.py +0 -41
  366. devsper-2.7.1/devsper/tools/coding/repo_structure_map.py +0 -54
  367. devsper-2.7.1/devsper/tools/coding/run_python.py +0 -54
  368. devsper-2.7.1/devsper/tools/data/__init__.py +0 -12
  369. devsper-2.7.1/devsper/tools/data/column_type_detection.py +0 -64
  370. devsper-2.7.1/devsper/tools/data/csv_summary.py +0 -52
  371. devsper-2.7.1/devsper/tools/data/dataframe_filter.py +0 -51
  372. devsper-2.7.1/devsper/tools/data/dataframe_groupby.py +0 -47
  373. devsper-2.7.1/devsper/tools/data/dataframe_stats.py +0 -38
  374. devsper-2.7.1/devsper/tools/data/dataset_sampling.py +0 -55
  375. devsper-2.7.1/devsper/tools/data/dataset_schema.py +0 -45
  376. devsper-2.7.1/devsper/tools/data/json_pretty_print.py +0 -37
  377. devsper-2.7.1/devsper/tools/data/json_query.py +0 -46
  378. devsper-2.7.1/devsper/tools/data/missing_value_report.py +0 -47
  379. devsper-2.7.1/devsper/tools/data_science/__init__.py +0 -13
  380. devsper-2.7.1/devsper/tools/data_science/correlation_heatmap.py +0 -72
  381. devsper-2.7.1/devsper/tools/data_science/dataset_bias_detector.py +0 -49
  382. devsper-2.7.1/devsper/tools/data_science/dataset_distribution_report.py +0 -64
  383. devsper-2.7.1/devsper/tools/data_science/dataset_drift_detector.py +0 -64
  384. devsper-2.7.1/devsper/tools/data_science/dataset_outlier_detector.py +0 -65
  385. devsper-2.7.1/devsper/tools/data_science/dataset_profile.py +0 -76
  386. devsper-2.7.1/devsper/tools/data_science/distributed_dataset_processor.py +0 -54
  387. devsper-2.7.1/devsper/tools/data_science/feature_engineering_suggestions.py +0 -69
  388. devsper-2.7.1/devsper/tools/data_science/feature_importance_estimator.py +0 -82
  389. devsper-2.7.1/devsper/tools/data_science/model_input_validator.py +0 -59
  390. devsper-2.7.1/devsper/tools/data_science/time_series_analyzer.py +0 -57
  391. devsper-2.7.1/devsper/tools/default/__init__.py +0 -15
  392. devsper-2.7.1/devsper/tools/default/fetch_url.py +0 -46
  393. devsper-2.7.1/devsper/tools/default/python_exec.py +0 -37
  394. devsper-2.7.1/devsper/tools/default/read_csv.py +0 -80
  395. devsper-2.7.1/devsper/tools/default/upload_file.py +0 -36
  396. devsper-2.7.1/devsper/tools/default/web_search.py +0 -87
  397. devsper-2.7.1/devsper/tools/documents/__init__.py +0 -11
  398. devsper-2.7.1/devsper/tools/documents/_docproc.py +0 -56
  399. devsper-2.7.1/devsper/tools/documents/document_to_markdown.py +0 -29
  400. devsper-2.7.1/devsper/tools/documents/extract_document_images.py +0 -39
  401. devsper-2.7.1/devsper/tools/documents/extract_document_text.py +0 -29
  402. devsper-2.7.1/devsper/tools/documents/extract_equations.py +0 -36
  403. devsper-2.7.1/devsper/tools/documents/extract_tables.py +0 -47
  404. devsper-2.7.1/devsper/tools/documents/summarize_document.py +0 -42
  405. devsper-2.7.1/devsper/tools/documents/write_latex_document.py +0 -133
  406. devsper-2.7.1/devsper/tools/documents/write_markdown_document.py +0 -89
  407. devsper-2.7.1/devsper/tools/documents/write_word_document.py +0 -149
  408. devsper-2.7.1/devsper/tools/experiments/__init__.py +0 -13
  409. devsper-2.7.1/devsper/tools/experiments/bootstrap_estimator.py +0 -54
  410. devsper-2.7.1/devsper/tools/experiments/experiment_report_generator.py +0 -50
  411. devsper-2.7.1/devsper/tools/experiments/experiment_tracker.py +0 -36
  412. devsper-2.7.1/devsper/tools/experiments/grid_search_runner.py +0 -50
  413. devsper-2.7.1/devsper/tools/experiments/model_benchmark_runner.py +0 -45
  414. devsper-2.7.1/devsper/tools/experiments/monte_carlo_experiment.py +0 -38
  415. devsper-2.7.1/devsper/tools/experiments/parameter_sweep_runner.py +0 -51
  416. devsper-2.7.1/devsper/tools/experiments/result_comparator.py +0 -58
  417. devsper-2.7.1/devsper/tools/experiments/simulation_runner.py +0 -43
  418. devsper-2.7.1/devsper/tools/experiments/statistical_significance_test.py +0 -56
  419. devsper-2.7.1/devsper/tools/experiments/swarm_map_reduce.py +0 -42
  420. devsper-2.7.1/devsper/tools/filesystem/__init__.py +0 -12
  421. devsper-2.7.1/devsper/tools/filesystem/append_file.py +0 -42
  422. devsper-2.7.1/devsper/tools/filesystem/file_hash.py +0 -40
  423. devsper-2.7.1/devsper/tools/filesystem/file_line_count.py +0 -36
  424. devsper-2.7.1/devsper/tools/filesystem/file_metadata.py +0 -38
  425. devsper-2.7.1/devsper/tools/filesystem/file_preview.py +0 -55
  426. devsper-2.7.1/devsper/tools/filesystem/find_large_files.py +0 -50
  427. devsper-2.7.1/devsper/tools/filesystem/list_directory.py +0 -39
  428. devsper-2.7.1/devsper/tools/filesystem/read_file.py +0 -35
  429. devsper-2.7.1/devsper/tools/filesystem/search_files.py +0 -60
  430. devsper-2.7.1/devsper/tools/filesystem/write_file.py +0 -41
  431. devsper-2.7.1/devsper/tools/flagship/__init__.py +0 -15
  432. devsper-2.7.1/devsper/tools/flagship/distributed_document_analysis.py +0 -77
  433. devsper-2.7.1/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -91
  434. devsper-2.7.1/devsper/tools/flagship/repository_semantic_map.py +0 -99
  435. devsper-2.7.1/devsper/tools/flagship/research_graph_builder.py +0 -111
  436. devsper-2.7.1/devsper/tools/flagship/swarm_experiment_runner.py +0 -86
  437. devsper-2.7.1/devsper/tools/hitl_request.py +0 -53
  438. devsper-2.7.1/devsper/tools/knowledge/__init__.py +0 -10
  439. devsper-2.7.1/devsper/tools/knowledge/citation_graph_builder.py +0 -69
  440. devsper-2.7.1/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -74
  441. devsper-2.7.1/devsper/tools/knowledge/corpus_builder.py +0 -66
  442. devsper-2.7.1/devsper/tools/knowledge/cross_document_entity_linker.py +0 -71
  443. devsper-2.7.1/devsper/tools/knowledge/document_corpus_summary.py +0 -68
  444. devsper-2.7.1/devsper/tools/knowledge/document_topic_extractor.py +0 -58
  445. devsper-2.7.1/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -58
  446. devsper-2.7.1/devsper/tools/knowledge/timeline_extractor.py +0 -59
  447. devsper-2.7.1/devsper/tools/math/__init__.py +0 -12
  448. devsper-2.7.1/devsper/tools/math/calculate_expression.py +0 -52
  449. devsper-2.7.1/devsper/tools/math/correlation.py +0 -44
  450. devsper-2.7.1/devsper/tools/math/distribution_summary.py +0 -39
  451. devsper-2.7.1/devsper/tools/math/histogram.py +0 -53
  452. devsper-2.7.1/devsper/tools/math/linear_regression.py +0 -47
  453. devsper-2.7.1/devsper/tools/math/matrix_multiply.py +0 -38
  454. devsper-2.7.1/devsper/tools/math/mean_std.py +0 -35
  455. devsper-2.7.1/devsper/tools/math/monte_carlo_simulation.py +0 -43
  456. devsper-2.7.1/devsper/tools/math/polynomial_fit.py +0 -40
  457. devsper-2.7.1/devsper/tools/math/random_sample.py +0 -36
  458. devsper-2.7.1/devsper/tools/mcp/__init__.py +0 -23
  459. devsper-2.7.1/devsper/tools/mcp/adapter.py +0 -53
  460. devsper-2.7.1/devsper/tools/mcp/client.py +0 -263
  461. devsper-2.7.1/devsper/tools/mcp/discovery.py +0 -64
  462. devsper-2.7.1/devsper/tools/memory/__init__.py +0 -16
  463. devsper-2.7.1/devsper/tools/memory/delete_memory.py +0 -26
  464. devsper-2.7.1/devsper/tools/memory/list_memory.py +0 -35
  465. devsper-2.7.1/devsper/tools/memory/search_memory.py +0 -44
  466. devsper-2.7.1/devsper/tools/memory/store_memory.py +0 -54
  467. devsper-2.7.1/devsper/tools/memory/summarize_memory.py +0 -42
  468. devsper-2.7.1/devsper/tools/memory/tag_memory.py +0 -40
  469. devsper-2.7.1/devsper/tools/pipelines.py +0 -92
  470. devsper-2.7.1/devsper/tools/registry.py +0 -117
  471. devsper-2.7.1/devsper/tools/research/__init__.py +0 -12
  472. devsper-2.7.1/devsper/tools/research/arxiv_download.py +0 -55
  473. devsper-2.7.1/devsper/tools/research/arxiv_search.py +0 -58
  474. devsper-2.7.1/devsper/tools/research/citation_extractor.py +0 -35
  475. devsper-2.7.1/devsper/tools/research/duckduckgo_search.py +0 -42
  476. devsper-2.7.1/devsper/tools/research/paper_metadata_extractor.py +0 -45
  477. devsper-2.7.1/devsper/tools/research/paper_summarizer.py +0 -41
  478. devsper-2.7.1/devsper/tools/research/research_question_generator.py +0 -39
  479. devsper-2.7.1/devsper/tools/research/topic_cluster.py +0 -46
  480. devsper-2.7.1/devsper/tools/research/web_search.py +0 -47
  481. devsper-2.7.1/devsper/tools/research/wikipedia_lookup.py +0 -50
  482. devsper-2.7.1/devsper/tools/research_advanced/__init__.py +0 -14
  483. devsper-2.7.1/devsper/tools/research_advanced/citation_context_extractor.py +0 -60
  484. devsper-2.7.1/devsper/tools/research_advanced/literature_review_generator.py +0 -79
  485. devsper-2.7.1/devsper/tools/research_advanced/methodology_extractor.py +0 -58
  486. devsper-2.7.1/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -50
  487. devsper-2.7.1/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -49
  488. devsper-2.7.1/devsper/tools/research_advanced/paper_method_comparator.py +0 -62
  489. devsper-2.7.1/devsper/tools/research_advanced/paper_similarity_search.py +0 -69
  490. devsper-2.7.1/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -69
  491. devsper-2.7.1/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -56
  492. devsper-2.7.1/devsper/tools/research_advanced/research_gap_finder.py +0 -71
  493. devsper-2.7.1/devsper/tools/research_advanced/research_topic_mapper.py +0 -69
  494. devsper-2.7.1/devsper/tools/research_advanced/swarm_literature_review.py +0 -58
  495. devsper-2.7.1/devsper/tools/scoring/__init__.py +0 -52
  496. devsper-2.7.1/devsper/tools/scoring/report.py +0 -44
  497. devsper-2.7.1/devsper/tools/scoring/scorer.py +0 -39
  498. devsper-2.7.1/devsper/tools/scoring/selector.py +0 -61
  499. devsper-2.7.1/devsper/tools/scoring/store.py +0 -267
  500. devsper-2.7.1/devsper/tools/selector.py +0 -193
  501. devsper-2.7.1/devsper/tools/system/__init__.py +0 -12
  502. devsper-2.7.1/devsper/tools/system/cpu_usage.py +0 -22
  503. devsper-2.7.1/devsper/tools/system/disk_usage.py +0 -35
  504. devsper-2.7.1/devsper/tools/system/environment_variables.py +0 -29
  505. devsper-2.7.1/devsper/tools/system/memory_usage.py +0 -23
  506. devsper-2.7.1/devsper/tools/system/pip_install.py +0 -44
  507. devsper-2.7.1/devsper/tools/system/pip_search.py +0 -29
  508. devsper-2.7.1/devsper/tools/system/process_list.py +0 -34
  509. devsper-2.7.1/devsper/tools/system/python_package_list.py +0 -40
  510. devsper-2.7.1/devsper/tools/system/run_shell_command.py +0 -69
  511. devsper-2.7.1/devsper/tools/system/system_info.py +0 -26
  512. devsper-2.7.1/devsper/tools/tool_runner.py +0 -170
  513. devsper-2.7.1/devsper/tui/__init__.py +0 -5
  514. devsper-2.7.1/devsper/tui/activity_feed_view.py +0 -73
  515. devsper-2.7.1/devsper/tui/adaptive_tasks_view.py +0 -75
  516. devsper-2.7.1/devsper/tui/agent_role_view.py +0 -35
  517. devsper-2.7.1/devsper/tui/app.py +0 -438
  518. devsper-2.7.1/devsper/tui/dashboard_screen.py +0 -309
  519. devsper-2.7.1/devsper/tui/dev_view.py +0 -99
  520. devsper-2.7.1/devsper/tui/inject_screen.py +0 -73
  521. devsper-2.7.1/devsper/tui/knowledge_graph_view.py +0 -46
  522. devsper-2.7.1/devsper/tui/layout.py +0 -43
  523. devsper-2.7.1/devsper/tui/logs_view.py +0 -83
  524. devsper-2.7.1/devsper/tui/memory_view.py +0 -58
  525. devsper-2.7.1/devsper/tui/mission_view.py +0 -44
  526. devsper-2.7.1/devsper/tui/performance_view.py +0 -33
  527. devsper-2.7.1/devsper/tui/reasoning_graph_view.py +0 -39
  528. devsper-2.7.1/devsper/tui/results_view.py +0 -139
  529. devsper-2.7.1/devsper/tui/swarm_view.py +0 -37
  530. devsper-2.7.1/devsper/tui/task_detail_screen.py +0 -55
  531. devsper-2.7.1/devsper/tui/task_view.py +0 -103
  532. devsper-2.7.1/devsper/types/event.py +0 -134
  533. devsper-2.7.1/devsper/types/exceptions.py +0 -21
  534. devsper-2.7.1/devsper/types/swarm.py +0 -41
  535. devsper-2.7.1/devsper/types/task.py +0 -108
  536. devsper-2.7.1/devsper/upgrade/__init__.py +0 -21
  537. devsper-2.7.1/devsper/upgrade/changelog.py +0 -124
  538. devsper-2.7.1/devsper/upgrade/cli.py +0 -145
  539. devsper-2.7.1/devsper/upgrade/installer.py +0 -103
  540. devsper-2.7.1/devsper/upgrade/notifier.py +0 -52
  541. devsper-2.7.1/devsper/upgrade/version_check.py +0 -130
  542. devsper-2.7.1/devsper/utils/event_logger.py +0 -150
  543. devsper-2.7.1/devsper/utils/http.py +0 -43
  544. devsper-2.7.1/devsper/utils/models.py +0 -57
  545. devsper-2.7.1/devsper/visualization/__init__.py +0 -5
  546. devsper-2.7.1/devsper/visualization/dag_export.py +0 -67
  547. devsper-2.7.1/devsper/workflow/__init__.py +0 -18
  548. devsper-2.7.1/devsper/workflow/conditions.py +0 -157
  549. devsper-2.7.1/devsper/workflow/context.py +0 -108
  550. devsper-2.7.1/devsper/workflow/loader.py +0 -201
  551. devsper-2.7.1/devsper/workflow/resolver.py +0 -109
  552. devsper-2.7.1/devsper/workflow/runner.py +0 -562
  553. devsper-2.7.1/devsper/workflow/schema.py +0 -63
  554. devsper-2.7.1/devsper/workflow/validator.py +0 -128
  555. devsper-2.7.1/devsper.toml +0 -68
  556. devsper-2.7.1/docker-compose.yml +0 -11
  557. devsper-2.7.1/examples/_common.py +0 -119
  558. devsper-2.7.1/examples/_config.py +0 -50
  559. devsper-2.7.1/examples/coding/analyze_repository.py +0 -89
  560. devsper-2.7.1/examples/coding/generate_docs.py +0 -66
  561. devsper-2.7.1/examples/coding/refactor_candidates.py +0 -84
  562. devsper-2.7.1/examples/data_science/__init__.py +0 -0
  563. devsper-2.7.1/examples/data_science/dataset_analysis.py +0 -137
  564. devsper-2.7.1/examples/data_science/run_experiments.py +0 -91
  565. devsper-2.7.1/examples/demo_swarm.py +0 -94
  566. devsper-2.7.1/examples/distributed/README.md +0 -138
  567. devsper-2.7.1/examples/distributed/controller.toml +0 -31
  568. devsper-2.7.1/examples/distributed/parallel_survey.py +0 -146
  569. devsper-2.7.1/examples/distributed/run_controller.py +0 -217
  570. devsper-2.7.1/examples/distributed/run_demo.sh +0 -21
  571. devsper-2.7.1/examples/distributed/run_worker.py +0 -257
  572. devsper-2.7.1/examples/distributed/worker.toml +0 -20
  573. devsper-2.7.1/examples/documents/__init__.py +0 -0
  574. devsper-2.7.1/examples/documents/analyze_documents.py +0 -133
  575. devsper-2.7.1/examples/experiments/__init__.py +0 -0
  576. devsper-2.7.1/examples/experiments/monte_carlo_demo.py +0 -73
  577. devsper-2.7.1/examples/experiments/parameter_sweep.py +0 -86
  578. devsper-2.7.1/examples/langchain_agent.py +0 -70
  579. devsper-2.7.1/examples/langgraph_swarm.py +0 -83
  580. devsper-2.7.1/examples/research/__init__.py +0 -0
  581. devsper-2.7.1/examples/research/literature_review.py +0 -130
  582. devsper-2.7.1/examples/research/research_gap_analysis.py +0 -97
  583. devsper-2.7.1/examples/research/research_graph.py +0 -144
  584. devsper-2.7.1/memory_utils.py +0 -10
  585. devsper-2.7.1/pyproject.toml +0 -112
  586. devsper-2.7.1/scripts/README.md +0 -65
  587. devsper-2.7.1/scripts/qa_e2e_stabilization.sh +0 -15
  588. devsper-2.7.1/scripts/seed_tool_scores.py +0 -30
  589. devsper-2.7.1/scripts/test_tool_scoring_cli.sh +0 -27
  590. devsper-2.7.1/scripts/test_tool_scoring_full.sh +0 -31
  591. devsper-2.7.1/scripts/test_tool_scoring_smoke.py +0 -78
  592. devsper-2.7.1/scripts/test_v2_router.py +0 -64
  593. devsper-2.7.1/supermemory-core/Cargo.toml +0 -12
  594. devsper-2.7.1/supermemory-core/src/main.rs +0 -371
  595. devsper-2.7.1/tests/agents/__init__.py +0 -1
  596. devsper-2.7.1/tests/agents/test_roles.py +0 -56
  597. devsper-2.7.1/tests/benchmarks/test_v16_perf.py +0 -123
  598. devsper-2.7.1/tests/integration/test_controller_restart_hitl.py +0 -37
  599. devsper-2.7.1/tests/integration/test_duplicate_event_delivery.py +0 -45
  600. devsper-2.7.1/tests/integration/test_evals_e2e.py +0 -508
  601. devsper-2.7.1/tests/integration/test_event_idempotency.py +0 -34
  602. devsper-2.7.1/tests/integration/test_event_retry.py +0 -54
  603. devsper-2.7.1/tests/integration/test_hitl_pause_resume.py +0 -75
  604. devsper-2.7.1/tests/integration/test_sse_reconnect.py +0 -16
  605. devsper-2.7.1/tests/integration/test_sse_stream.py +0 -54
  606. devsper-2.7.1/tests/integration/test_worker_crash_recovery.py +0 -25
  607. devsper-2.7.1/tests/intelligence/__init__.py +0 -0
  608. devsper-2.7.1/tests/intelligence/test_adaptation.py +0 -60
  609. devsper-2.7.1/tests/intelligence/test_learning_engine.py +0 -55
  610. devsper-2.7.1/tests/intelligence/test_strategy_selector.py +0 -35
  611. devsper-2.7.1/tests/intelligence/test_task_optimizer.py +0 -41
  612. devsper-2.7.1/tests/memory/__init__.py +0 -0
  613. devsper-2.7.1/tests/memory/test_agent_memory_integration.py +0 -69
  614. devsper-2.7.1/tests/memory/test_memory_context_run_scope.py +0 -16
  615. devsper-2.7.1/tests/memory/test_memory_index.py +0 -291
  616. devsper-2.7.1/tests/memory/test_memory_router.py +0 -44
  617. devsper-2.7.1/tests/memory/test_memory_store.py +0 -81
  618. devsper-2.7.1/tests/pool/__init__.py +0 -1
  619. devsper-2.7.1/tests/pool/fixtures.py +0 -31
  620. devsper-2.7.1/tests/pool/test_crypto.py +0 -26
  621. devsper-2.7.1/tests/pool/test_e2e_redis_loop.py +0 -103
  622. devsper-2.7.1/tests/pool/test_heartbeat_eviction.py +0 -37
  623. devsper-2.7.1/tests/pool/test_local_pool.py +0 -30
  624. devsper-2.7.1/tests/pool/test_org_pool.py +0 -29
  625. devsper-2.7.1/tests/pool/test_priority_chain.py +0 -36
  626. devsper-2.7.1/tests/pool/test_rate_limiting.py +0 -20
  627. devsper-2.7.1/tests/reasoning/__init__.py +0 -1
  628. devsper-2.7.1/tests/reasoning/test_reasoning_graph.py +0 -58
  629. devsper-2.7.1/tests/runtime/__init__.py +0 -0
  630. devsper-2.7.1/tests/runtime/test_budget.py +0 -15
  631. devsper-2.7.1/tests/runtime/test_otel_phase1.py +0 -40
  632. devsper-2.7.1/tests/runtime/test_packager.py +0 -9
  633. devsper-2.7.1/tests/runtime/test_protocol_schema.py +0 -13
  634. devsper-2.7.1/tests/runtime/test_replay.py +0 -55
  635. devsper-2.7.1/tests/runtime/test_replay_engine.py +0 -71
  636. devsper-2.7.1/tests/runtime/test_telemetry.py +0 -58
  637. devsper-2.7.1/tests/runtime/test_visualize.py +0 -39
  638. devsper-2.7.1/tests/test_agent.py +0 -37
  639. devsper-2.7.1/tests/test_analysis.py +0 -253
  640. devsper-2.7.1/tests/test_analytics.py +0 -22
  641. devsper-2.7.1/tests/test_auto_model.py +0 -33
  642. devsper-2.7.1/tests/test_clarification.py +0 -318
  643. devsper-2.7.1/tests/test_clarification_multinode.py +0 -147
  644. devsper-2.7.1/tests/test_config_loader.py +0 -48
  645. devsper-2.7.1/tests/test_credentials.py +0 -126
  646. devsper-2.7.1/tests/test_cross_boundary_serialization.py +0 -51
  647. devsper-2.7.1/tests/test_dag_export.py +0 -60
  648. devsper-2.7.1/tests/test_dev_agents.py +0 -53
  649. devsper-2.7.1/tests/test_dev_build_cmd.py +0 -29
  650. devsper-2.7.1/tests/test_dev_debugger.py +0 -29
  651. devsper-2.7.1/tests/test_dev_repo_index.py +0 -27
  652. devsper-2.7.1/tests/test_dev_sandbox.py +0 -51
  653. devsper-2.7.1/tests/test_dev_scaffold.py +0 -56
  654. devsper-2.7.1/tests/test_distributed_bugs.py +0 -50
  655. devsper-2.7.1/tests/test_embeddings_service.py +0 -26
  656. devsper-2.7.1/tests/test_evals.py +0 -289
  657. devsper-2.7.1/tests/test_event_logger.py +0 -15
  658. devsper-2.7.1/tests/test_execution_graph_meta.py +0 -31
  659. devsper-2.7.1/tests/test_executor.py +0 -61
  660. devsper-2.7.1/tests/test_export_runs.py +0 -122
  661. devsper-2.7.1/tests/test_github_provider.py +0 -47
  662. devsper-2.7.1/tests/test_init.py +0 -52
  663. devsper-2.7.1/tests/test_knowledge_graph.py +0 -48
  664. devsper-2.7.1/tests/test_knowledge_query.py +0 -25
  665. devsper-2.7.1/tests/test_langchain_adapter.py +0 -24
  666. devsper-2.7.1/tests/test_langgraph_adapter.py +0 -63
  667. devsper-2.7.1/tests/test_map_reduce.py +0 -20
  668. devsper-2.7.1/tests/test_memory_evolution.py +0 -67
  669. devsper-2.7.1/tests/test_memory_isolation.py +0 -129
  670. devsper-2.7.1/tests/test_missions.py +0 -20
  671. devsper-2.7.1/tests/test_model_router.py +0 -40
  672. devsper-2.7.1/tests/test_planner.py +0 -75
  673. devsper-2.7.1/tests/test_platform_runtime_events.py +0 -66
  674. devsper-2.7.1/tests/test_plugins.py +0 -19
  675. devsper-2.7.1/tests/test_protocols.py +0 -183
  676. devsper-2.7.1/tests/test_router.py +0 -40
  677. devsper-2.7.1/tests/test_scheduler.py +0 -89
  678. devsper-2.7.1/tests/test_speculation.py +0 -60
  679. devsper-2.7.1/tests/test_strategies.py +0 -47
  680. devsper-2.7.1/tests/test_swarm.py +0 -53
  681. devsper-2.7.1/tests/test_task_cache.py +0 -39
  682. devsper-2.7.1/tests/test_tool_scoring.py +0 -204
  683. devsper-2.7.1/tests/test_tool_selector.py +0 -44
  684. devsper-2.7.1/tests/test_upgrade.py +0 -221
  685. devsper-2.7.1/tests/test_v110.py +0 -185
  686. devsper-2.7.1/tests/test_v16.py +0 -144
  687. devsper-2.7.1/tests/test_v17.py +0 -316
  688. devsper-2.7.1/tests/test_v18.py +0 -263
  689. devsper-2.7.1/tests/test_v19.py +0 -257
  690. devsper-2.7.1/tests/test_workflow.py +0 -306
  691. devsper-2.7.1/tests/tools/__init__.py +0 -1
  692. devsper-2.7.1/tests/tools/test_code_intelligence_tools.py +0 -108
  693. devsper-2.7.1/tests/tools/test_coding_tools.py +0 -39
  694. devsper-2.7.1/tests/tools/test_core_tool_registry.py +0 -25
  695. devsper-2.7.1/tests/tools/test_data_science_tools.py +0 -96
  696. devsper-2.7.1/tests/tools/test_data_tools.py +0 -79
  697. devsper-2.7.1/tests/tools/test_document_tools.py +0 -30
  698. devsper-2.7.1/tests/tools/test_experiments_tools.py +0 -99
  699. devsper-2.7.1/tests/tools/test_filesystem_tools.py +0 -116
  700. devsper-2.7.1/tests/tools/test_flagship_tools.py +0 -103
  701. devsper-2.7.1/tests/tools/test_knowledge_tools.py +0 -63
  702. devsper-2.7.1/tests/tools/test_math_tools.py +0 -40
  703. devsper-2.7.1/tests/tools/test_memory_tools.py +0 -65
  704. devsper-2.7.1/tests/tools/test_pipelines.py +0 -57
  705. devsper-2.7.1/tests/tools/test_registry.py +0 -29
  706. devsper-2.7.1/tests/tools/test_research_advanced_tools.py +0 -92
  707. devsper-2.7.1/tests/tools/test_research_tools.py +0 -44
  708. devsper-2.7.1/tests/tools/test_system_tools.py +0 -28
  709. devsper-2.7.1/tests/tools/test_tool_runner.py +0 -51
  710. devsper-2.7.1/uv.lock +0 -5404
  711. devsper-2.7.1/worker/.dockerignore +0 -4
  712. devsper-2.7.1/worker/Cargo.lock +0 -2598
  713. devsper-2.7.1/worker/Cargo.toml +0 -49
  714. devsper-2.7.1/worker/Dockerfile +0 -19
  715. devsper-2.7.1/worker/README.md +0 -51
  716. devsper-2.7.1/worker/src/budget.rs +0 -9
  717. devsper-2.7.1/worker/src/bus.rs +0 -173
  718. devsper-2.7.1/worker/src/claim.rs +0 -65
  719. devsper-2.7.1/worker/src/clarification.rs +0 -118
  720. devsper-2.7.1/worker/src/config.rs +0 -122
  721. devsper-2.7.1/worker/src/controller.rs +0 -383
  722. devsper-2.7.1/worker/src/election.rs +0 -98
  723. devsper-2.7.1/worker/src/error.rs +0 -32
  724. devsper-2.7.1/worker/src/executor.rs +0 -127
  725. devsper-2.7.1/worker/src/health.rs +0 -15
  726. devsper-2.7.1/worker/src/heartbeat.rs +0 -34
  727. devsper-2.7.1/worker/src/lib.rs +0 -27
  728. devsper-2.7.1/worker/src/main.rs +0 -181
  729. devsper-2.7.1/worker/src/metrics.rs +0 -31
  730. devsper-2.7.1/worker/src/reconnect.rs +0 -36
  731. devsper-2.7.1/worker/src/registry.rs +0 -106
  732. devsper-2.7.1/worker/src/router.rs +0 -145
  733. devsper-2.7.1/worker/src/rpc.rs +0 -137
  734. devsper-2.7.1/worker/src/scheduler.rs +0 -133
  735. devsper-2.7.1/worker/src/snapshot.rs +0 -43
  736. devsper-2.7.1/worker/src/telemetry.rs +0 -6
  737. devsper-2.7.1/worker/src/types/agent.rs +0 -54
  738. devsper-2.7.1/worker/src/types/event.rs +0 -70
  739. devsper-2.7.1/worker/src/types/mod.rs +0 -11
  740. devsper-2.7.1/worker/src/types/node.rs +0 -51
  741. devsper-2.7.1/worker/src/types/task.rs +0 -69
  742. devsper-2.7.1/worker/src/worker_node.rs +0 -470
  743. devsper-2.7.1/worker/tests/integration.rs +0 -26
  744. {devsper-2.7.1/devsper/plugins/marketplace → devsper-3.0.0/devsper/auth}/__init__.py +0 -0
  745. {devsper-2.7.1/examples → devsper-3.0.0/devsper/credentials}/__init__.py +0 -0
  746. {devsper-2.7.1/examples/coding → devsper-3.0.0/devsper/eval}/__init__.py +0 -0
@@ -43,6 +43,8 @@ Thumbs.db
43
43
  *.swp
44
44
  *.swo
45
45
  .cursor/
46
+ .claude/
47
+ .worktrees/
46
48
 
47
49
  tmp
48
50
  **/build-errors.log
@@ -51,4 +53,7 @@ node_modules
51
53
 
52
54
  # Rust (workspace and worker crate)
53
55
  target/
54
- worker/target/
56
+ worker/target/.worktrees/
57
+
58
+ # Local-only testing notes
59
+ TESTING.md
devsper-3.0.0/PKG-INFO ADDED
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.4
2
+ Name: devsper
3
+ Version: 3.0.0
4
+ Summary: Devsper runtime CLI — self-evolving AI workflow engine
5
+ License: Apache-2.0
6
+ Keywords: AI,agents,runtime,swarm,workflow
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Rust
10
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
11
+ Requires-Python: >=3.11
12
+ Requires-Dist: click>=8.0
13
+ Requires-Dist: keyring>=24
14
+ Requires-Dist: rich>=13
15
+ Provides-Extra: eval
16
+ Requires-Dist: openai>=1.0; extra == 'eval'
17
+ Requires-Dist: openevals>=0.1; extra == 'eval'
18
+ Requires-Dist: trulens>=1.0; extra == 'eval'
19
+ Provides-Extra: tui
20
+ Requires-Dist: textual>=0.80; extra == 'tui'
@@ -0,0 +1,2 @@
1
+ """Devsper runtime — Python CLI/TUI wrapper."""
2
+ __version__ = "2.9.0"
@@ -0,0 +1,5 @@
1
+ """Allow `python -m devsper` invocation."""
2
+ from devsper.cli import main
3
+
4
+ if __name__ == "__main__":
5
+ main()
@@ -0,0 +1,100 @@
1
+ """GitHub device flow authentication."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ import time
7
+ import urllib.parse
8
+ import urllib.request
9
+
10
+ import click
11
+ from rich.console import Console
12
+ from rich.panel import Panel
13
+
14
+ CLIENT_ID_ENV = "DEVSPER_GITHUB_CLIENT_ID"
15
+ DEVICE_CODE_URL = "https://github.com/login/device/code"
16
+ TOKEN_URL = "https://github.com/login/oauth/access_token"
17
+ SCOPE = "read:user"
18
+ TIMEOUT_SECONDS = 900 # 15 minutes
19
+
20
+ console = Console()
21
+
22
+
23
+ def _post_json(url: str, data: dict) -> dict:
24
+ """POST URL-encoded data, return JSON response."""
25
+ encoded = urllib.parse.urlencode(data).encode()
26
+ req = urllib.request.Request(
27
+ url,
28
+ data=encoded,
29
+ headers={"Accept": "application/json"},
30
+ method="POST",
31
+ )
32
+ with urllib.request.urlopen(req) as resp:
33
+ return json.loads(resp.read().decode())
34
+
35
+
36
+ def login() -> str:
37
+ """Run GitHub device flow, return access token.
38
+
39
+ Raises:
40
+ click.ClickException: if CLIENT_ID_ENV is not set or flow fails.
41
+ """
42
+ client_id = os.environ.get(CLIENT_ID_ENV)
43
+ if not client_id:
44
+ raise click.ClickException(
45
+ f"{CLIENT_ID_ENV} not set.\n"
46
+ "Register a GitHub OAuth App at https://github.com/settings/developers\n"
47
+ f"then set: export {CLIENT_ID_ENV}=<your-client-id>"
48
+ )
49
+
50
+ # Request device + user codes
51
+ device_data = _post_json(DEVICE_CODE_URL, {"client_id": client_id, "scope": SCOPE})
52
+
53
+ user_code: str = device_data["user_code"]
54
+ verification_uri: str = device_data["verification_uri"]
55
+ device_code: str = device_data["device_code"]
56
+ interval: int = int(device_data.get("interval", 5))
57
+ expires_in: int = int(device_data.get("expires_in", TIMEOUT_SECONDS))
58
+
59
+ console.print(
60
+ Panel(
61
+ f"[bold]Open this URL in your browser:[/bold]\n\n"
62
+ f" [cyan]{verification_uri}[/cyan]\n\n"
63
+ f"[bold]Enter this code:[/bold]\n\n"
64
+ f" [bold yellow]{user_code}[/bold yellow]",
65
+ title="GitHub Login",
66
+ expand=False,
67
+ )
68
+ )
69
+
70
+ deadline = time.monotonic() + expires_in
71
+ with console.status("[dim]Waiting for GitHub authorization...[/dim]"):
72
+ while time.monotonic() < deadline:
73
+ time.sleep(interval)
74
+ token_data = _post_json(
75
+ TOKEN_URL,
76
+ {
77
+ "client_id": client_id,
78
+ "device_code": device_code,
79
+ "grant_type": "urn:ietf:params:oauth:grant-type:device_code",
80
+ },
81
+ )
82
+
83
+ error = token_data.get("error")
84
+ if error == "authorization_pending":
85
+ continue
86
+ elif error == "slow_down":
87
+ interval += 5
88
+ continue
89
+ elif error == "expired_token":
90
+ raise click.ClickException("Device code expired. Run the command again.")
91
+ elif error == "access_denied":
92
+ raise click.ClickException("Authorization was denied.")
93
+ elif error:
94
+ raise click.ClickException(f"GitHub authorization error: {error}")
95
+
96
+ access_token = token_data.get("access_token")
97
+ if access_token:
98
+ return access_token
99
+
100
+ raise click.ClickException("Timed out waiting for GitHub authorization. Run the command again.")
@@ -0,0 +1,362 @@
1
+ """Thin CLI wrapper — finds and execs the Rust devsper binary."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import os
6
+ import sys
7
+ import shutil
8
+ import pathlib
9
+ from pathlib import Path
10
+
11
+ import click
12
+ from rich.console import Console
13
+ from rich.table import Table
14
+
15
+ from devsper.credentials.inject import inject_credentials
16
+ from devsper.credentials import providers as cred_providers
17
+ from devsper.credentials import store as cred_store
18
+ from devsper.auth import github as github_auth
19
+
20
+ console = Console()
21
+
22
+
23
+ def find_binary() -> str:
24
+ """Find the devsper Rust binary.
25
+
26
+ Search order:
27
+ 1. devsper-runtime on PATH (installed wheel)
28
+ 2. devsper on PATH
29
+ 3. Alongside this package (bundled wheel)
30
+ 4. Cargo build output (dev mode)
31
+ """
32
+ for name in ("devsper-runtime", "devsper"):
33
+ binary = shutil.which(name)
34
+ if binary and _is_rust_binary(binary):
35
+ return binary
36
+
37
+ pkg_dir = pathlib.Path(__file__).parent
38
+ repo_root = pkg_dir.parent.parent
39
+
40
+ candidates = [
41
+ pkg_dir / "bin" / "devsper",
42
+ pkg_dir / "bin" / "devsper.exe",
43
+ repo_root / "target" / "release" / "devsper",
44
+ repo_root / "target" / "debug" / "devsper",
45
+ ]
46
+ for c in candidates:
47
+ if c.exists() and os.access(c, os.X_OK):
48
+ return str(c)
49
+
50
+ click.echo(
51
+ "Error: devsper Rust binary not found.\n"
52
+ "\n"
53
+ "Build with: cargo build --release -p devsper-bin\n"
54
+ "Or install: pip install devsper[runtime]\n",
55
+ err=True,
56
+ )
57
+ sys.exit(1)
58
+
59
+
60
+ def _is_rust_binary(path: str) -> bool:
61
+ """Heuristic: not this Python script."""
62
+ return not path.endswith(".py")
63
+
64
+
65
+ @click.group(invoke_without_command=True, context_settings={"ignore_unknown_options": True})
66
+ @click.pass_context
67
+ @click.argument("args", nargs=-1, type=click.UNPROCESSED)
68
+ def main(ctx: click.Context, args: tuple) -> None:
69
+ """Devsper — self-evolving AI workflow engine.
70
+
71
+ \b
72
+ Commands are passed directly to the Rust runtime:
73
+ devsper run workflow.devsper
74
+ devsper compile workflow.devsper
75
+ devsper peer --listen 0.0.0.0:7000
76
+ devsper inspect <run-id>
77
+
78
+ \b
79
+ Interactive UI:
80
+ devsper tui
81
+ """
82
+ if ctx.invoked_subcommand is not None:
83
+ return
84
+
85
+ if args and args[0] == "tui":
86
+ _launch_tui(list(args[1:]))
87
+ return
88
+
89
+ # Pass-through to Rust binary
90
+ binary = find_binary()
91
+ inject_credentials()
92
+ os.execv(binary, [binary] + list(args))
93
+
94
+
95
+ @main.command(name="tui")
96
+ @click.argument("run_id", required=False, default=None)
97
+ def tui_command(run_id: str | None) -> None:
98
+ """Launch the interactive TUI (requires 'devsper[tui]' extras)."""
99
+ extra_args = ["--run-id", run_id] if run_id else []
100
+ _launch_tui(extra_args)
101
+
102
+
103
+ def _launch_tui(args: list[str]) -> None:
104
+ """Start the Textual TUI application."""
105
+ try:
106
+ from devsper.tui.app import DevSperApp # noqa: PLC0415
107
+ except ImportError:
108
+ click.echo(
109
+ "TUI requires optional dependencies:\n"
110
+ " pip install 'devsper[tui]'\n",
111
+ err=True,
112
+ )
113
+ sys.exit(1)
114
+
115
+ app = DevSperApp(extra_args=args)
116
+ app.run()
117
+
118
+
119
+ # ---------------------------------------------------------------------------
120
+ # credentials group
121
+ # ---------------------------------------------------------------------------
122
+
123
+
124
+ @main.group()
125
+ def credentials() -> None:
126
+ """Manage provider credentials stored in system keyring."""
127
+
128
+
129
+ @credentials.command("set")
130
+ @click.argument("provider", type=click.Choice(list(cred_providers.PROVIDERS.keys())))
131
+ def credentials_set(provider: str) -> None:
132
+ """Store credentials for a provider in the system keyring."""
133
+ p = cred_providers.PROVIDERS[provider]
134
+ console.print(f"\n[bold]Configure {p.display_name}[/bold]\n")
135
+
136
+ for f in p.fields:
137
+ label = f.display_name
138
+ if f.optional:
139
+ default_hint = f.default or ""
140
+ label = f"{label} (optional, default: {default_hint})" if default_hint else f"{label} (optional)"
141
+
142
+ if f.secret:
143
+ value = click.prompt(label, hide_input=True, default="", show_default=False).strip()
144
+ else:
145
+ value = click.prompt(label, default=f.default or "", show_default=bool(f.default)).strip()
146
+
147
+ if value:
148
+ cred_store.set(provider, f.name, value)
149
+ elif f.optional and f.default:
150
+ # Don't store the default — inject.py handles defaults at runtime
151
+ pass
152
+
153
+ console.print(f"\n[green]Credentials for [bold]{p.display_name}[/bold] saved.[/green]\n")
154
+
155
+
156
+ @credentials.command("list")
157
+ def credentials_list() -> None:
158
+ """Show configured providers."""
159
+ table = Table(title="Configured Providers", show_lines=True)
160
+ table.add_column("Provider", style="bold")
161
+ table.add_column("Status")
162
+ table.add_column("Fields configured")
163
+
164
+ for provider_name, provider in cred_providers.PROVIDERS.items():
165
+ field_statuses: list[str] = []
166
+ any_configured = False
167
+
168
+ for f in provider.fields:
169
+ env_val = os.environ.get(f.env_var) if f.env_var else None
170
+ keyring_val = cred_store.get(provider_name, f.name)
171
+
172
+ if env_val:
173
+ display = "[green]set[/green] (env)"
174
+ any_configured = True
175
+ elif keyring_val:
176
+ display = "[green]set[/green] (keyring)"
177
+ any_configured = True
178
+ elif f.default:
179
+ display = f"[dim]default ({f.default})[/dim]"
180
+ else:
181
+ display = "[dim]not set[/dim]"
182
+
183
+ field_statuses.append(f"{f.display_name}: {display}")
184
+
185
+ status = "[green]configured[/green]" if any_configured else "[dim]not configured[/dim]"
186
+ table.add_row(provider.display_name, status, "\n".join(field_statuses))
187
+
188
+ console.print(table)
189
+
190
+
191
+ @credentials.command("remove")
192
+ @click.argument("provider", type=click.Choice(list(cred_providers.PROVIDERS.keys())))
193
+ def credentials_remove(provider: str) -> None:
194
+ """Remove stored credentials for a provider."""
195
+ p = cred_providers.PROVIDERS[provider]
196
+ if not click.confirm(f"Remove all stored credentials for {p.display_name}?"):
197
+ console.print("[dim]Aborted.[/dim]")
198
+ return
199
+
200
+ for f in p.fields:
201
+ cred_store.delete(provider, f.name)
202
+
203
+ console.print(f"[green]Credentials for [bold]{p.display_name}[/bold] removed.[/green]")
204
+
205
+
206
+ # ---------------------------------------------------------------------------
207
+ # auth group
208
+ # ---------------------------------------------------------------------------
209
+
210
+
211
+ @main.group()
212
+ def auth() -> None:
213
+ """Authentication commands."""
214
+
215
+
216
+ @auth.command("github")
217
+ def auth_github() -> None:
218
+ """Login to GitHub via device flow to use GitHub Models."""
219
+ token = github_auth.login()
220
+ cred_store.set("github", "token", token)
221
+ console.print("\n[green]GitHub authentication successful. Token stored in keyring.[/green]\n")
222
+
223
+
224
+ @auth.command("status")
225
+ def auth_status() -> None:
226
+ """Show authentication status for all providers."""
227
+ table = Table(title="Authentication Status", show_lines=True)
228
+ table.add_column("Provider", style="bold")
229
+ table.add_column("Authenticated")
230
+ table.add_column("Source")
231
+
232
+ for provider_name, provider in cred_providers.PROVIDERS.items():
233
+ authenticated = False
234
+ source = ""
235
+
236
+ for f in provider.fields:
237
+ if f.env_var and os.environ.get(f.env_var):
238
+ authenticated = True
239
+ source = "env"
240
+ break
241
+ if cred_store.get(provider_name, f.name):
242
+ authenticated = True
243
+ source = "keyring"
244
+ break
245
+
246
+ auth_cell = "[green]yes[/green]" if authenticated else "[dim]no[/dim]"
247
+ source_cell = source if authenticated else ""
248
+ table.add_row(provider.display_name, auth_cell, source_cell)
249
+
250
+ console.print(table)
251
+
252
+
253
+ # ---------------------------------------------------------------------------
254
+ # eval group
255
+ # ---------------------------------------------------------------------------
256
+
257
+
258
+ @main.group()
259
+ def eval() -> None:
260
+ """Evaluate workflows against datasets."""
261
+
262
+
263
+ @eval.command("run")
264
+ @click.argument("workflow", type=click.Path(exists=True, path_type=Path))
265
+ @click.option(
266
+ "--dataset", "-d",
267
+ required=True,
268
+ type=click.Path(exists=True, path_type=Path),
269
+ help="JSONL dataset file",
270
+ )
271
+ @click.option(
272
+ "--metrics", "-m",
273
+ default="",
274
+ help="Comma-separated metrics: relevance,correctness,groundedness",
275
+ )
276
+ @click.option(
277
+ "--output", "-o",
278
+ default="eval_results.jsonl",
279
+ type=click.Path(),
280
+ help="Output JSONL path",
281
+ )
282
+ @click.option(
283
+ "--score/--no-score",
284
+ default=True,
285
+ help="Run LLM-as-judge scoring (requires devsper[eval])",
286
+ )
287
+ def eval_run(workflow: Path, dataset: Path, metrics: str, output: str, score: bool) -> None:
288
+ """Run a workflow against a dataset and score outputs."""
289
+ from devsper.eval.runner import load_dataset, run_case, save_results # noqa: PLC0415
290
+
291
+ binary = find_binary()
292
+ inject_credentials()
293
+ cases = load_dataset(dataset)
294
+
295
+ console.print(f"\n[bold]Running {len(cases)} eval cases...[/bold]\n")
296
+
297
+ results: list[dict] = []
298
+ with console.status("Running cases...") as status:
299
+ for i, case in enumerate(cases, 1):
300
+ status.update(f"Case {i}/{len(cases)}")
301
+ inputs = case.get("inputs", {"query": case.get("input", "")})
302
+ r = run_case(binary, workflow, inputs)
303
+ if "expected" in case:
304
+ r["expected"] = case["expected"]
305
+ results.append(r)
306
+ icon = "[green]✓[/green]" if r["success"] else "[red]✗[/red]"
307
+ console.print(f" {icon} Case {i}: {r['latency_ms']}ms")
308
+
309
+ if score and metrics:
310
+ metric_list = [m.strip() for m in metrics.split(",") if m.strip()]
311
+ console.print(f"\n[bold]Scoring with: {', '.join(metric_list)}[/bold]")
312
+ try:
313
+ from devsper.eval.scoring import score_results # noqa: PLC0415
314
+ results = score_results(results, metric_list)
315
+ except ImportError as e:
316
+ console.print(f"[yellow]Scoring skipped: {e}[/yellow]")
317
+
318
+ save_results(results, Path(output))
319
+
320
+ passed = sum(1 for r in results if r["success"])
321
+ console.print(f"\n[bold]Results:[/bold] {passed}/{len(results)} passed → {output}\n")
322
+
323
+
324
+ @eval.command("report")
325
+ @click.option(
326
+ "--input", "-i",
327
+ "input_file",
328
+ default="eval_results.jsonl",
329
+ type=click.Path(exists=True),
330
+ )
331
+ @click.option("--last", default=0, help="Show last N results only")
332
+ def eval_report(input_file: str, last: int) -> None:
333
+ """Show eval results as a table."""
334
+ results: list[dict] = []
335
+ with open(input_file) as f:
336
+ for line in f:
337
+ line = line.strip()
338
+ if line:
339
+ results.append(json.loads(line))
340
+
341
+ if last:
342
+ results = results[-last:]
343
+
344
+ table = Table(title=f"Eval Results: {input_file}", show_lines=True)
345
+ table.add_column("#", style="dim")
346
+ table.add_column("Status")
347
+ table.add_column("Input")
348
+ table.add_column("Latency")
349
+ table.add_column("Scores")
350
+
351
+ for i, r in enumerate(results, 1):
352
+ status = "[green]pass[/green]" if r.get("success") else "[red]fail[/red]"
353
+ inputs = r.get("inputs", {})
354
+ input_str = list(inputs.values())[0][:60] if inputs else ""
355
+ latency = f"{r.get('latency_ms', 0)}ms"
356
+ scores = r.get("scores", {})
357
+ score_str = (
358
+ ", ".join(f"{k}: {v:.2f}" for k, v in scores.items()) if scores else "-"
359
+ )
360
+ table.add_row(str(i), status, input_str, latency, score_str)
361
+
362
+ console.print(table)
@@ -0,0 +1,19 @@
1
+ """Inject stored credentials as environment variables before Rust exec."""
2
+ from __future__ import annotations
3
+
4
+ import os
5
+
6
+ from devsper.credentials.providers import PROVIDERS
7
+ from devsper.credentials import store
8
+
9
+
10
+ def inject_credentials() -> None:
11
+ """Read credentials from keyring, set missing env vars. Env vars take priority."""
12
+ for provider in PROVIDERS.values():
13
+ for field in provider.fields:
14
+ if field.env_var and field.env_var not in os.environ:
15
+ value = store.get(provider.name, field.name)
16
+ if value is None and field.default is not None:
17
+ value = field.default
18
+ if value:
19
+ os.environ[field.env_var] = value
@@ -0,0 +1,107 @@
1
+ """Provider definitions for credential management."""
2
+ from __future__ import annotations
3
+
4
+ from dataclasses import dataclass, field
5
+
6
+
7
+ @dataclass
8
+ class Field:
9
+ """A single credential field for a provider."""
10
+
11
+ name: str
12
+ display_name: str
13
+ env_var: str
14
+ secret: bool = True
15
+ optional: bool = False
16
+ default: str | None = None
17
+
18
+
19
+ @dataclass
20
+ class Provider:
21
+ """A credential provider definition."""
22
+
23
+ name: str
24
+ display_name: str
25
+ fields: list[Field] = field(default_factory=list)
26
+
27
+
28
+ PROVIDERS: dict[str, Provider] = {
29
+ "anthropic": Provider(
30
+ name="anthropic",
31
+ display_name="Anthropic",
32
+ fields=[Field("api_key", "API Key", env_var="ANTHROPIC_API_KEY", secret=True)],
33
+ ),
34
+ "openai": Provider(
35
+ name="openai",
36
+ display_name="OpenAI",
37
+ fields=[Field("api_key", "API Key", env_var="OPENAI_API_KEY", secret=True)],
38
+ ),
39
+ "github": Provider(
40
+ name="github",
41
+ display_name="GitHub Models",
42
+ fields=[Field("token", "Token", env_var="GITHUB_TOKEN", secret=True)],
43
+ ),
44
+ "zai": Provider(
45
+ name="zai",
46
+ display_name="ZAI (z.ai)",
47
+ fields=[
48
+ Field("api_key", "API Key", env_var="ZAI_API_KEY", secret=True),
49
+ Field(
50
+ "base_url",
51
+ "Base URL",
52
+ env_var="ZAI_BASE_URL",
53
+ secret=False,
54
+ optional=True,
55
+ default="https://api.z.ai/v1",
56
+ ),
57
+ ],
58
+ ),
59
+ "azure-openai": Provider(
60
+ name="azure-openai",
61
+ display_name="Azure OpenAI",
62
+ fields=[
63
+ Field("api_key", "API Key", env_var="AZURE_OPENAI_API_KEY", secret=True),
64
+ Field("endpoint", "Endpoint", env_var="AZURE_OPENAI_ENDPOINT", secret=False),
65
+ Field("deployment", "Deployment Name", env_var="AZURE_OPENAI_DEPLOYMENT", secret=False),
66
+ Field(
67
+ "api_version",
68
+ "API Version",
69
+ env_var="AZURE_OPENAI_API_VERSION",
70
+ secret=False,
71
+ optional=True,
72
+ default="2024-02-01",
73
+ ),
74
+ ],
75
+ ),
76
+ "azure-foundry": Provider(
77
+ name="azure-foundry",
78
+ display_name="Azure AI Foundry (Anthropic)",
79
+ fields=[
80
+ Field("api_key", "API Key", env_var="AZURE_FOUNDRY_API_KEY", secret=True),
81
+ Field("endpoint", "Endpoint", env_var="AZURE_FOUNDRY_ENDPOINT", secret=False),
82
+ Field("deployment", "Deployment Name", env_var="AZURE_FOUNDRY_DEPLOYMENT", secret=False),
83
+ ],
84
+ ),
85
+ "litellm": Provider(
86
+ name="litellm",
87
+ display_name="LiteLLM Proxy",
88
+ fields=[
89
+ Field("base_url", "Base URL", env_var="LITELLM_BASE_URL", secret=False),
90
+ Field("api_key", "API Key", env_var="LITELLM_API_KEY", secret=True, optional=True),
91
+ ],
92
+ ),
93
+ "ollama": Provider(
94
+ name="ollama",
95
+ display_name="Ollama",
96
+ fields=[
97
+ Field(
98
+ "base_url",
99
+ "Base URL",
100
+ env_var="OLLAMA_HOST",
101
+ secret=False,
102
+ optional=True,
103
+ default="http://localhost:11434",
104
+ ),
105
+ ],
106
+ ),
107
+ }
@@ -0,0 +1,41 @@
1
+ """Keyring-backed credential store for Devsper providers."""
2
+ from __future__ import annotations
3
+
4
+ import keyring
5
+
6
+ from devsper.credentials.providers import PROVIDERS
7
+
8
+ _SERVICE = "devsper"
9
+
10
+
11
+ def _key(provider: str, field: str) -> str:
12
+ return f"{provider}:{field}"
13
+
14
+
15
+ def set(provider: str, field: str, value: str) -> None:
16
+ """Store a credential value in the system keyring."""
17
+ keyring.set_password(_SERVICE, _key(provider, field), value)
18
+
19
+
20
+ def get(provider: str, field: str) -> str | None:
21
+ """Retrieve a credential value from the system keyring. Returns None if not found."""
22
+ return keyring.get_password(_SERVICE, _key(provider, field))
23
+
24
+
25
+ def delete(provider: str, field: str) -> None:
26
+ """Remove a credential value from the system keyring."""
27
+ try:
28
+ keyring.delete_password(_SERVICE, _key(provider, field))
29
+ except keyring.errors.PasswordDeleteError:
30
+ pass
31
+
32
+
33
+ def list_configured() -> list[str]:
34
+ """Return provider names that have at least one field stored in the keyring."""
35
+ configured = []
36
+ for provider_name, provider in PROVIDERS.items():
37
+ for f in provider.fields:
38
+ if keyring.get_password(_SERVICE, _key(provider_name, f.name)) is not None:
39
+ configured.append(provider_name)
40
+ break
41
+ return configured