devsper 2.7.2__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.
- {devsper-2.7.2 → devsper-3.0.0}/.gitignore +6 -1
- devsper-3.0.0/PKG-INFO +20 -0
- devsper-3.0.0/devsper/__init__.py +2 -0
- devsper-3.0.0/devsper/__main__.py +5 -0
- devsper-3.0.0/devsper/auth/github.py +100 -0
- devsper-3.0.0/devsper/cli.py +362 -0
- devsper-3.0.0/devsper/credentials/inject.py +19 -0
- devsper-3.0.0/devsper/credentials/providers.py +107 -0
- devsper-3.0.0/devsper/credentials/store.py +41 -0
- devsper-3.0.0/devsper/eval/runner.py +53 -0
- devsper-3.0.0/devsper/eval/scoring.py +96 -0
- devsper-3.0.0/devsper/tui/__init__.py +1 -0
- devsper-3.0.0/devsper/tui/app.py +149 -0
- devsper-3.0.0/pyproject.toml +38 -0
- devsper-3.0.0/uv.lock +3961 -0
- devsper-2.7.2/.env.example +0 -28
- devsper-2.7.2/.github/FUNDING.yml +0 -1
- devsper-2.7.2/.github/workflows/pypi-publish.yml +0 -36
- devsper-2.7.2/.github/workflows/release-on-tag.yml +0 -56
- devsper-2.7.2/.github/workflows/worker-release.yml +0 -106
- devsper-2.7.2/.python-version +0 -1
- devsper-2.7.2/CHANGELOG.md +0 -535
- devsper-2.7.2/CODE_OF_CONDUCT.md +0 -32
- devsper-2.7.2/CONTRIBUTING.md +0 -46
- devsper-2.7.2/Cargo.lock +0 -2896
- devsper-2.7.2/Cargo.toml +0 -3
- devsper-2.7.2/Dockerfile.local-pool +0 -22
- devsper-2.7.2/LICENSE +0 -639
- devsper-2.7.2/PKG-INFO +0 -455
- devsper-2.7.2/README.md +0 -361
- devsper-2.7.2/SECURITY.md +0 -20
- devsper-2.7.2/benchmarks/__init__.py +0 -1
- devsper-2.7.2/benchmarks/bench_dataset_analysis.py +0 -28
- devsper-2.7.2/benchmarks/bench_repository_analysis.py +0 -28
- devsper-2.7.2/benchmarks/bench_research_pipeline.py +0 -28
- devsper-2.7.2/branding/logo.svg +0 -3
- devsper-2.7.2/devsper/README.md +0 -148
- devsper-2.7.2/devsper/__init__.py +0 -36
- devsper-2.7.2/devsper/agents/a2a/__init__.py +0 -27
- devsper-2.7.2/devsper/agents/a2a/client.py +0 -126
- devsper-2.7.2/devsper/agents/a2a/discovery.py +0 -24
- devsper-2.7.2/devsper/agents/a2a/server.py +0 -128
- devsper-2.7.2/devsper/agents/a2a/tool_adapter.py +0 -68
- devsper-2.7.2/devsper/agents/a2a/types.py +0 -49
- devsper-2.7.2/devsper/agents/agent.py +0 -1503
- devsper-2.7.2/devsper/agents/critic.py +0 -80
- devsper-2.7.2/devsper/agents/identity.py +0 -38
- devsper-2.7.2/devsper/agents/message_bus.py +0 -124
- devsper-2.7.2/devsper/agents/registry.py +0 -46
- devsper-2.7.2/devsper/agents/roles.py +0 -205
- devsper-2.7.2/devsper/agents/run_agent.py +0 -78
- devsper-2.7.2/devsper/analytics/__init__.py +0 -5
- devsper-2.7.2/devsper/analytics/tool_analytics.py +0 -78
- devsper-2.7.2/devsper/audit/__init__.py +0 -5
- devsper-2.7.2/devsper/audit/logger.py +0 -214
- devsper-2.7.2/devsper/budget.py +0 -102
- devsper-2.7.2/devsper/bus/__init__.py +0 -29
- devsper-2.7.2/devsper/bus/backends/__init__.py +0 -5
- devsper-2.7.2/devsper/bus/backends/base.py +0 -146
- devsper-2.7.2/devsper/bus/backends/memory.py +0 -55
- devsper-2.7.2/devsper/bus/backends/redis.py +0 -146
- devsper-2.7.2/devsper/bus/message.py +0 -56
- devsper-2.7.2/devsper/bus/schema_version.py +0 -3
- devsper-2.7.2/devsper/bus/topics.py +0 -21
- devsper-2.7.2/devsper/cache/__init__.py +0 -6
- devsper-2.7.2/devsper/cache/embedding_index.py +0 -98
- devsper-2.7.2/devsper/cache/hashing.py +0 -24
- devsper-2.7.2/devsper/cache/store.py +0 -153
- devsper-2.7.2/devsper/cache/task_cache.py +0 -191
- devsper-2.7.2/devsper/cli/__init__.py +0 -6
- devsper-2.7.2/devsper/cli/commands/cloud.py +0 -718
- devsper-2.7.2/devsper/cli/export.py +0 -16
- devsper-2.7.2/devsper/cli/github_oauth.py +0 -157
- devsper-2.7.2/devsper/cli/init.py +0 -706
- devsper-2.7.2/devsper/cli/main.py +0 -4335
- devsper-2.7.2/devsper/cli/run_progress.py +0 -103
- devsper-2.7.2/devsper/cli/ui/__init__.py +0 -67
- devsper-2.7.2/devsper/cli/ui/components.py +0 -110
- devsper-2.7.2/devsper/cli/ui/controller_run_view.py +0 -129
- devsper-2.7.2/devsper/cli/ui/errors.py +0 -104
- devsper-2.7.2/devsper/cli/ui/logging.py +0 -120
- devsper-2.7.2/devsper/cli/ui/onboarding.py +0 -116
- devsper-2.7.2/devsper/cli/ui/progress.py +0 -43
- devsper-2.7.2/devsper/cli/ui/run_view.py +0 -854
- devsper-2.7.2/devsper/cli/ui/theme.py +0 -67
- devsper-2.7.2/devsper/cluster/__init__.py +0 -29
- devsper-2.7.2/devsper/cluster/election.py +0 -85
- devsper-2.7.2/devsper/cluster/local.py +0 -97
- devsper-2.7.2/devsper/cluster/node_info.py +0 -77
- devsper-2.7.2/devsper/cluster/registry.py +0 -71
- devsper-2.7.2/devsper/cluster/router.py +0 -117
- devsper-2.7.2/devsper/cluster/state_backend.py +0 -105
- devsper-2.7.2/devsper/compliance/__init__.py +0 -5
- devsper-2.7.2/devsper/compliance/pii.py +0 -147
- devsper-2.7.2/devsper/config/__init__.py +0 -56
- devsper-2.7.2/devsper/config/config_loader.py +0 -121
- devsper-2.7.2/devsper/config/defaults.py +0 -79
- devsper-2.7.2/devsper/config/resolver.py +0 -421
- devsper-2.7.2/devsper/config/schema.py +0 -372
- devsper-2.7.2/devsper/connectors/__init__.py +0 -18
- devsper-2.7.2/devsper/connectors/base.py +0 -59
- devsper-2.7.2/devsper/connectors/registry.py +0 -46
- devsper-2.7.2/devsper/connectors/sample_connector.py +0 -74
- devsper-2.7.2/devsper/contracts/__init__.py +0 -5
- devsper-2.7.2/devsper/contracts/platform_event_type.py +0 -68
- devsper-2.7.2/devsper/core/__init__.py +0 -2
- devsper-2.7.2/devsper/core/agent/__init__.py +0 -4
- devsper-2.7.2/devsper/core/agent/runner.py +0 -14
- devsper-2.7.2/devsper/core/hitl/__init__.py +0 -4
- devsper-2.7.2/devsper/core/hitl/state_machine.py +0 -53
- devsper-2.7.2/devsper/core/memory/__init__.py +0 -4
- devsper-2.7.2/devsper/core/memory/shared_memory.py +0 -45
- devsper-2.7.2/devsper/core/reporting/__init__.py +0 -4
- devsper-2.7.2/devsper/core/reporting/publisher.py +0 -53
- devsper-2.7.2/devsper/core/runtime/__init__.py +0 -5
- devsper-2.7.2/devsper/core/runtime/durability.py +0 -45
- devsper-2.7.2/devsper/core/runtime/orchestrator.py +0 -14
- devsper-2.7.2/devsper/core/tools/__init__.py +0 -12
- devsper-2.7.2/devsper/core/tools/base_tool.py +0 -17
- devsper-2.7.2/devsper/core/tools/loader.py +0 -35
- devsper-2.7.2/devsper/core/tools/registry.py +0 -49
- devsper-2.7.2/devsper/credentials/__init__.py +0 -19
- devsper-2.7.2/devsper/credentials/cli.py +0 -207
- devsper-2.7.2/devsper/credentials/migration.py +0 -124
- devsper-2.7.2/devsper/credentials/store.py +0 -153
- devsper-2.7.2/devsper/dashboard/__init__.py +0 -9
- devsper-2.7.2/devsper/dashboard/dashboard.py +0 -87
- devsper-2.7.2/devsper/debug_events.py +0 -38
- devsper-2.7.2/devsper/dev/__init__.py +0 -25
- devsper-2.7.2/devsper/dev/builder.py +0 -195
- devsper-2.7.2/devsper/dev/debugger.py +0 -95
- devsper-2.7.2/devsper/dev/repo_index.py +0 -138
- devsper-2.7.2/devsper/dev/sandbox.py +0 -203
- devsper-2.7.2/devsper/dev/scaffold.py +0 -122
- devsper-2.7.2/devsper/distributed/__init__.py +0 -7
- devsper-2.7.2/devsper/distributed/controller.py +0 -70
- devsper-2.7.2/devsper/distributed/worker_runtime.py +0 -43
- devsper-2.7.2/devsper/docs/architecture/execution-model.md +0 -12
- devsper-2.7.2/devsper/embeddings/__init__.py +0 -5
- devsper-2.7.2/devsper/embeddings/service.py +0 -36
- devsper-2.7.2/devsper/evals/__init__.py +0 -19
- devsper-2.7.2/devsper/evals/dataset.py +0 -107
- devsper-2.7.2/devsper/evals/metrics.py +0 -192
- devsper-2.7.2/devsper/evals/runner.py +0 -179
- devsper-2.7.2/devsper/evals/types.py +0 -114
- devsper-2.7.2/devsper/events.py +0 -73
- devsper-2.7.2/devsper/explainability/__init__.py +0 -14
- devsper-2.7.2/devsper/explainability/decision_tree.py +0 -104
- devsper-2.7.2/devsper/explainability/rationale.py +0 -38
- devsper-2.7.2/devsper/explainability/simulation.py +0 -56
- devsper-2.7.2/devsper/export/__init__.py +0 -5
- devsper-2.7.2/devsper/export/branding.py +0 -60
- devsper-2.7.2/devsper/export/collector.py +0 -269
- devsper-2.7.2/devsper/export/manifest.py +0 -30
- devsper-2.7.2/devsper/export/model.py +0 -61
- devsper-2.7.2/devsper/export/packager.py +0 -56
- devsper-2.7.2/devsper/export/pdf.py +0 -58
- devsper-2.7.2/devsper/export/service.py +0 -90
- devsper-2.7.2/devsper/export/writers.py +0 -351
- devsper-2.7.2/devsper/hitl/__init__.py +0 -13
- devsper-2.7.2/devsper/hitl/approval.py +0 -160
- devsper-2.7.2/devsper/hitl/escalation.py +0 -95
- devsper-2.7.2/devsper/integrations/__init__.py +0 -34
- devsper-2.7.2/devsper/integrations/langchain_adapter.py +0 -80
- devsper-2.7.2/devsper/integrations/langgraph_adapter.py +0 -151
- devsper-2.7.2/devsper/intelligence/__init__.py +0 -9
- devsper-2.7.2/devsper/intelligence/adaptation.py +0 -88
- devsper-2.7.2/devsper/intelligence/analysis/__init__.py +0 -19
- devsper-2.7.2/devsper/intelligence/analysis/analyzer.py +0 -71
- devsper-2.7.2/devsper/intelligence/analysis/cost_estimator.py +0 -66
- devsper-2.7.2/devsper/intelligence/analysis/formatter.py +0 -103
- devsper-2.7.2/devsper/intelligence/analysis/run_report.py +0 -402
- devsper-2.7.2/devsper/intelligence/learning_engine.py +0 -92
- devsper-2.7.2/devsper/intelligence/strategies/__init__.py +0 -23
- devsper-2.7.2/devsper/intelligence/strategies/base.py +0 -14
- devsper-2.7.2/devsper/intelligence/strategies/code_analysis_strategy.py +0 -33
- devsper-2.7.2/devsper/intelligence/strategies/data_science_strategy.py +0 -33
- devsper-2.7.2/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -33
- devsper-2.7.2/devsper/intelligence/strategies/experiment_strategy.py +0 -33
- devsper-2.7.2/devsper/intelligence/strategies/research_strategy.py +0 -34
- devsper-2.7.2/devsper/intelligence/strategy_selector.py +0 -84
- devsper-2.7.2/devsper/intelligence/synthesis.py +0 -132
- devsper-2.7.2/devsper/intelligence/task_optimizer.py +0 -92
- devsper-2.7.2/devsper/knowledge/__init__.py +0 -5
- devsper-2.7.2/devsper/knowledge/extractor.py +0 -204
- devsper-2.7.2/devsper/knowledge/knowledge_graph.py +0 -184
- devsper-2.7.2/devsper/knowledge/query.py +0 -285
- devsper-2.7.2/devsper/memory/__init__.py +0 -42
- devsper-2.7.2/devsper/memory/consolidation.py +0 -138
- devsper-2.7.2/devsper/memory/context.py +0 -134
- devsper-2.7.2/devsper/memory/embeddings.py +0 -60
- devsper-2.7.2/devsper/memory/memory_index.py +0 -244
- devsper-2.7.2/devsper/memory/memory_router.py +0 -142
- devsper-2.7.2/devsper/memory/memory_store.py +0 -286
- devsper-2.7.2/devsper/memory/memory_types.py +0 -54
- devsper-2.7.2/devsper/memory/namespaces.py +0 -45
- devsper-2.7.2/devsper/memory/platform_memory.py +0 -95
- devsper-2.7.2/devsper/memory/providers/__init__.py +0 -5
- devsper-2.7.2/devsper/memory/providers/backends/__init__.py +0 -1
- devsper-2.7.2/devsper/memory/providers/backends/platform_backend.py +0 -74
- devsper-2.7.2/devsper/memory/providers/backends/redis_backend.py +0 -90
- devsper-2.7.2/devsper/memory/providers/backends/snowflake_backend.py +0 -449
- devsper-2.7.2/devsper/memory/providers/backends/sqlite_backend.py +0 -83
- devsper-2.7.2/devsper/memory/providers/backends/vektori_backend.py +0 -140
- devsper-2.7.2/devsper/memory/providers/base.py +0 -125
- devsper-2.7.2/devsper/memory/providers/factory.py +0 -162
- devsper-2.7.2/devsper/memory/redis_memory.py +0 -167
- devsper-2.7.2/devsper/memory/scoring.py +0 -77
- devsper-2.7.2/devsper/memory/store.py +0 -10
- devsper-2.7.2/devsper/memory/summarizer.py +0 -52
- devsper-2.7.2/devsper/memory/supermemory_rust_ranker.py +0 -438
- devsper-2.7.2/devsper/missions/__init__.py +0 -16
- devsper-2.7.2/devsper/missions/base_agent.py +0 -22
- devsper-2.7.2/devsper/missions/coding/__init__.py +0 -13
- devsper-2.7.2/devsper/missions/coding/architect_agent.py +0 -10
- devsper-2.7.2/devsper/missions/coding/coder_agent.py +0 -10
- devsper-2.7.2/devsper/missions/coding/debugger_agent.py +0 -10
- devsper-2.7.2/devsper/missions/coding/docs_agent.py +0 -10
- devsper-2.7.2/devsper/missions/coding/tester_agent.py +0 -10
- devsper-2.7.2/devsper/missions/iteration_loop.py +0 -42
- devsper-2.7.2/devsper/missions/mission_memory.py +0 -70
- devsper-2.7.2/devsper/missions/mission_planner.py +0 -70
- devsper-2.7.2/devsper/missions/mission_runner.py +0 -232
- devsper-2.7.2/devsper/missions/models.py +0 -60
- devsper-2.7.2/devsper/missions/research/__init__.py +0 -6
- devsper-2.7.2/devsper/missions/research/editor_agent.py +0 -10
- devsper-2.7.2/devsper/missions/research/researcher_agent.py +0 -10
- devsper-2.7.2/devsper/missions/research/reviewer_agent.py +0 -10
- devsper-2.7.2/devsper/missions/research/writer_agent.py +0 -10
- devsper-2.7.2/devsper/nodes/__init__.py +0 -5
- devsper-2.7.2/devsper/nodes/controller.py +0 -1061
- devsper-2.7.2/devsper/nodes/rpc.py +0 -127
- devsper-2.7.2/devsper/nodes/single.py +0 -162
- devsper-2.7.2/devsper/nodes/worker.py +0 -595
- devsper-2.7.2/devsper/orchestration/__init__.py +0 -19
- devsper-2.7.2/devsper/orchestration/meta_planner.py +0 -239
- devsper-2.7.2/devsper/orchestration/priority_queue.py +0 -61
- devsper-2.7.2/devsper/platform/__init__.py +0 -1
- devsper-2.7.2/devsper/platform/redis_results_sink.py +0 -181
- devsper-2.7.2/devsper/platform/reporter.py +0 -104
- devsper-2.7.2/devsper/platform/request_builder.py +0 -246
- devsper-2.7.2/devsper/platform/run_context.py +0 -53
- devsper-2.7.2/devsper/platform/runtime_events.py +0 -304
- devsper-2.7.2/devsper/plugins/__init__.py +0 -19
- devsper-2.7.2/devsper/plugins/plugin_loader.py +0 -70
- devsper-2.7.2/devsper/plugins/plugin_registry.py +0 -34
- devsper-2.7.2/devsper/policy/client.py +0 -32
- devsper-2.7.2/devsper/pool/__init__.py +0 -2
- devsper-2.7.2/devsper/pool/config.py +0 -46
- devsper-2.7.2/devsper/pool/crypto.py +0 -75
- devsper-2.7.2/devsper/pool/local_pool.py +0 -126
- devsper-2.7.2/devsper/pool/manager.py +0 -159
- devsper-2.7.2/devsper/pool/models.py +0 -55
- devsper-2.7.2/devsper/pool/org_pool.py +0 -38
- devsper-2.7.2/devsper/pool/profiles/dev.toml +0 -22
- devsper-2.7.2/devsper/pool/profiles/local.toml +0 -24
- devsper-2.7.2/devsper/pool/profiles/prod.toml +0 -27
- devsper-2.7.2/devsper/pool/security.py +0 -41
- devsper-2.7.2/devsper/pool/store.py +0 -203
- devsper-2.7.2/devsper/pool/worker_runner.py +0 -95
- devsper-2.7.2/devsper/prompt_optimizer/__init__.py +0 -16
- devsper-2.7.2/devsper/prompt_optimizer/backends/__init__.py +0 -1
- devsper-2.7.2/devsper/prompt_optimizer/backends/dspy_backend.py +0 -205
- devsper-2.7.2/devsper/prompt_optimizer/backends/gepa_backend.py +0 -203
- devsper-2.7.2/devsper/prompt_optimizer/backends/noop.py +0 -25
- devsper-2.7.2/devsper/prompt_optimizer/base.py +0 -56
- devsper-2.7.2/devsper/prompt_optimizer/factory.py +0 -102
- devsper-2.7.2/devsper/protocol/__init__.py +0 -4
- devsper-2.7.2/devsper/protocol/client.py +0 -56
- devsper-2.7.2/devsper/protocol/schema.py +0 -47
- devsper-2.7.2/devsper/protocol/server.py +0 -74
- devsper-2.7.2/devsper/protocols/__init__.py +0 -6
- devsper-2.7.2/devsper/providers/__init__.py +0 -34
- devsper-2.7.2/devsper/providers/anthropic.py +0 -84
- devsper-2.7.2/devsper/providers/base.py +0 -81
- devsper-2.7.2/devsper/providers/complexity_router.py +0 -94
- devsper-2.7.2/devsper/providers/gemini.py +0 -36
- devsper-2.7.2/devsper/providers/github.py +0 -180
- devsper-2.7.2/devsper/providers/model_router.py +0 -40
- devsper-2.7.2/devsper/providers/openai.py +0 -108
- devsper-2.7.2/devsper/providers/router/__init__.py +0 -24
- devsper-2.7.2/devsper/providers/router/backends/__init__.py +0 -19
- devsper-2.7.2/devsper/providers/router/backends/anthropic_backend.py +0 -111
- devsper-2.7.2/devsper/providers/router/backends/custom_backend.py +0 -138
- devsper-2.7.2/devsper/providers/router/backends/gemini_backend.py +0 -89
- devsper-2.7.2/devsper/providers/router/backends/github_backend.py +0 -165
- devsper-2.7.2/devsper/providers/router/backends/ollama_backend.py +0 -104
- devsper-2.7.2/devsper/providers/router/backends/openai_backend.py +0 -145
- devsper-2.7.2/devsper/providers/router/backends/vllm_backend.py +0 -35
- devsper-2.7.2/devsper/providers/router/base.py +0 -60
- devsper-2.7.2/devsper/providers/router/factory.py +0 -97
- devsper-2.7.2/devsper/providers/router/legacy.py +0 -95
- devsper-2.7.2/devsper/providers/router/router.py +0 -135
- devsper-2.7.2/devsper/reasoning/__init__.py +0 -12
- devsper-2.7.2/devsper/reasoning/graph.py +0 -59
- devsper-2.7.2/devsper/reasoning/nodes.py +0 -20
- devsper-2.7.2/devsper/reasoning/store.py +0 -67
- devsper-2.7.2/devsper/runtime/__init__.py +0 -34
- devsper-2.7.2/devsper/runtime/agent_pool.py +0 -85
- devsper-2.7.2/devsper/runtime/agent_runner.py +0 -95
- devsper-2.7.2/devsper/runtime/clarification_manager.py +0 -294
- devsper-2.7.2/devsper/runtime/event_stream.py +0 -58
- devsper-2.7.2/devsper/runtime/execution_graph.py +0 -155
- devsper-2.7.2/devsper/runtime/executor.py +0 -344
- devsper-2.7.2/devsper/runtime/health.py +0 -88
- devsper-2.7.2/devsper/runtime/hitl.py +0 -71
- devsper-2.7.2/devsper/runtime/model_router.py +0 -53
- devsper-2.7.2/devsper/runtime/planner.py +0 -28
- devsper-2.7.2/devsper/runtime/replay.py +0 -53
- devsper-2.7.2/devsper/runtime/replay_engine.py +0 -142
- devsper-2.7.2/devsper/runtime/retry.py +0 -61
- devsper-2.7.2/devsper/runtime/run_history.py +0 -204
- devsper-2.7.2/devsper/runtime/speculative_planner.py +0 -51
- devsper-2.7.2/devsper/runtime/state_manager.py +0 -52
- devsper-2.7.2/devsper/runtime/task_runner.py +0 -135
- devsper-2.7.2/devsper/runtime/task_state.py +0 -244
- devsper-2.7.2/devsper/runtime/telemetry.py +0 -116
- devsper-2.7.2/devsper/runtime/tool_runner.py +0 -169
- devsper-2.7.2/devsper/runtime/trace_tree.py +0 -78
- devsper-2.7.2/devsper/runtime/visualize.py +0 -58
- devsper-2.7.2/devsper/sandbox/__init__.py +0 -13
- devsper-2.7.2/devsper/sandbox/sandbox.py +0 -161
- devsper-2.7.2/devsper/server/__init__.py +0 -3
- devsper-2.7.2/devsper/server/events.py +0 -84
- devsper-2.7.2/devsper/server/memory_utils.py +0 -475
- devsper-2.7.2/devsper/server/swarmworker.py +0 -786
- devsper-2.7.2/devsper/server/topology.py +0 -93
- devsper-2.7.2/devsper/storage/__init__.py +0 -1
- devsper-2.7.2/devsper/storage/uploads/__init__.py +0 -4
- devsper-2.7.2/devsper/storage/uploads/store.py +0 -42
- devsper-2.7.2/devsper/swarm/checkpointer.py +0 -65
- devsper-2.7.2/devsper/swarm/executor.py +0 -708
- devsper-2.7.2/devsper/swarm/map_reduce.py +0 -44
- devsper-2.7.2/devsper/swarm/planner.py +0 -246
- devsper-2.7.2/devsper/swarm/prefetcher.py +0 -91
- devsper-2.7.2/devsper/swarm/scheduler.py +0 -169
- devsper-2.7.2/devsper/swarm/speculation.py +0 -47
- devsper-2.7.2/devsper/swarm/swarm.py +0 -736
- devsper-2.7.2/devsper/telemetry/__init__.py +0 -34
- devsper-2.7.2/devsper/telemetry/otel.py +0 -175
- devsper-2.7.2/devsper/telemetry/pricing.py +0 -27
- devsper-2.7.2/devsper/telemetry/trulens.py +0 -119
- devsper-2.7.2/devsper/tools/__init__.py +0 -40
- devsper-2.7.2/devsper/tools/base.py +0 -52
- devsper-2.7.2/devsper/tools/code_intelligence/__init__.py +0 -13
- devsper-2.7.2/devsper/tools/code_intelligence/api_surface_extractor.py +0 -73
- devsper-2.7.2/devsper/tools/code_intelligence/architecture_analyzer.py +0 -65
- devsper-2.7.2/devsper/tools/code_intelligence/codebase_indexer.py +0 -71
- devsper-2.7.2/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -67
- devsper-2.7.2/devsper/tools/code_intelligence/design_pattern_detector.py +0 -62
- devsper-2.7.2/devsper/tools/code_intelligence/large_function_detector.py +0 -68
- devsper-2.7.2/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -56
- devsper-2.7.2/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -44
- devsper-2.7.2/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -81
- devsper-2.7.2/devsper/tools/code_intelligence/repository_semantic_index.py +0 -61
- devsper-2.7.2/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -62
- devsper-2.7.2/devsper/tools/coding/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/coding/analyze_code_complexity.py +0 -48
- devsper-2.7.2/devsper/tools/coding/dependency_analyzer.py +0 -42
- devsper-2.7.2/devsper/tools/coding/extract_functions.py +0 -38
- devsper-2.7.2/devsper/tools/coding/format_python.py +0 -50
- devsper-2.7.2/devsper/tools/coding/generate_docstrings.py +0 -40
- devsper-2.7.2/devsper/tools/coding/generate_unit_tests.py +0 -42
- devsper-2.7.2/devsper/tools/coding/lint_python.py +0 -51
- devsper-2.7.2/devsper/tools/coding/refactor_function.py +0 -41
- devsper-2.7.2/devsper/tools/coding/repo_structure_map.py +0 -54
- devsper-2.7.2/devsper/tools/coding/run_python.py +0 -54
- devsper-2.7.2/devsper/tools/data/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/data/column_type_detection.py +0 -64
- devsper-2.7.2/devsper/tools/data/csv_summary.py +0 -52
- devsper-2.7.2/devsper/tools/data/dataframe_filter.py +0 -51
- devsper-2.7.2/devsper/tools/data/dataframe_groupby.py +0 -47
- devsper-2.7.2/devsper/tools/data/dataframe_stats.py +0 -38
- devsper-2.7.2/devsper/tools/data/dataset_sampling.py +0 -55
- devsper-2.7.2/devsper/tools/data/dataset_schema.py +0 -45
- devsper-2.7.2/devsper/tools/data/json_pretty_print.py +0 -37
- devsper-2.7.2/devsper/tools/data/json_query.py +0 -46
- devsper-2.7.2/devsper/tools/data/missing_value_report.py +0 -47
- devsper-2.7.2/devsper/tools/data_science/__init__.py +0 -13
- devsper-2.7.2/devsper/tools/data_science/correlation_heatmap.py +0 -72
- devsper-2.7.2/devsper/tools/data_science/dataset_bias_detector.py +0 -49
- devsper-2.7.2/devsper/tools/data_science/dataset_distribution_report.py +0 -64
- devsper-2.7.2/devsper/tools/data_science/dataset_drift_detector.py +0 -64
- devsper-2.7.2/devsper/tools/data_science/dataset_outlier_detector.py +0 -65
- devsper-2.7.2/devsper/tools/data_science/dataset_profile.py +0 -76
- devsper-2.7.2/devsper/tools/data_science/distributed_dataset_processor.py +0 -54
- devsper-2.7.2/devsper/tools/data_science/feature_engineering_suggestions.py +0 -69
- devsper-2.7.2/devsper/tools/data_science/feature_importance_estimator.py +0 -82
- devsper-2.7.2/devsper/tools/data_science/model_input_validator.py +0 -59
- devsper-2.7.2/devsper/tools/data_science/time_series_analyzer.py +0 -57
- devsper-2.7.2/devsper/tools/default/__init__.py +0 -15
- devsper-2.7.2/devsper/tools/default/fetch_url.py +0 -46
- devsper-2.7.2/devsper/tools/default/python_exec.py +0 -37
- devsper-2.7.2/devsper/tools/default/read_csv.py +0 -80
- devsper-2.7.2/devsper/tools/default/upload_file.py +0 -36
- devsper-2.7.2/devsper/tools/default/web_search.py +0 -87
- devsper-2.7.2/devsper/tools/documents/__init__.py +0 -11
- devsper-2.7.2/devsper/tools/documents/_docproc.py +0 -56
- devsper-2.7.2/devsper/tools/documents/document_to_markdown.py +0 -29
- devsper-2.7.2/devsper/tools/documents/extract_document_images.py +0 -39
- devsper-2.7.2/devsper/tools/documents/extract_document_text.py +0 -29
- devsper-2.7.2/devsper/tools/documents/extract_equations.py +0 -36
- devsper-2.7.2/devsper/tools/documents/extract_tables.py +0 -47
- devsper-2.7.2/devsper/tools/documents/summarize_document.py +0 -42
- devsper-2.7.2/devsper/tools/documents/write_latex_document.py +0 -133
- devsper-2.7.2/devsper/tools/documents/write_markdown_document.py +0 -89
- devsper-2.7.2/devsper/tools/documents/write_word_document.py +0 -149
- devsper-2.7.2/devsper/tools/experiments/__init__.py +0 -13
- devsper-2.7.2/devsper/tools/experiments/bootstrap_estimator.py +0 -54
- devsper-2.7.2/devsper/tools/experiments/experiment_report_generator.py +0 -50
- devsper-2.7.2/devsper/tools/experiments/experiment_tracker.py +0 -36
- devsper-2.7.2/devsper/tools/experiments/grid_search_runner.py +0 -50
- devsper-2.7.2/devsper/tools/experiments/model_benchmark_runner.py +0 -45
- devsper-2.7.2/devsper/tools/experiments/monte_carlo_experiment.py +0 -38
- devsper-2.7.2/devsper/tools/experiments/parameter_sweep_runner.py +0 -51
- devsper-2.7.2/devsper/tools/experiments/result_comparator.py +0 -58
- devsper-2.7.2/devsper/tools/experiments/simulation_runner.py +0 -43
- devsper-2.7.2/devsper/tools/experiments/statistical_significance_test.py +0 -56
- devsper-2.7.2/devsper/tools/experiments/swarm_map_reduce.py +0 -42
- devsper-2.7.2/devsper/tools/filesystem/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/filesystem/append_file.py +0 -42
- devsper-2.7.2/devsper/tools/filesystem/file_hash.py +0 -40
- devsper-2.7.2/devsper/tools/filesystem/file_line_count.py +0 -36
- devsper-2.7.2/devsper/tools/filesystem/file_metadata.py +0 -38
- devsper-2.7.2/devsper/tools/filesystem/file_preview.py +0 -55
- devsper-2.7.2/devsper/tools/filesystem/find_large_files.py +0 -50
- devsper-2.7.2/devsper/tools/filesystem/list_directory.py +0 -39
- devsper-2.7.2/devsper/tools/filesystem/read_file.py +0 -35
- devsper-2.7.2/devsper/tools/filesystem/search_files.py +0 -60
- devsper-2.7.2/devsper/tools/filesystem/write_file.py +0 -41
- devsper-2.7.2/devsper/tools/flagship/__init__.py +0 -15
- devsper-2.7.2/devsper/tools/flagship/distributed_document_analysis.py +0 -77
- devsper-2.7.2/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -91
- devsper-2.7.2/devsper/tools/flagship/repository_semantic_map.py +0 -99
- devsper-2.7.2/devsper/tools/flagship/research_graph_builder.py +0 -111
- devsper-2.7.2/devsper/tools/flagship/swarm_experiment_runner.py +0 -86
- devsper-2.7.2/devsper/tools/hitl_request.py +0 -53
- devsper-2.7.2/devsper/tools/knowledge/__init__.py +0 -10
- devsper-2.7.2/devsper/tools/knowledge/citation_graph_builder.py +0 -69
- devsper-2.7.2/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -74
- devsper-2.7.2/devsper/tools/knowledge/corpus_builder.py +0 -66
- devsper-2.7.2/devsper/tools/knowledge/cross_document_entity_linker.py +0 -71
- devsper-2.7.2/devsper/tools/knowledge/document_corpus_summary.py +0 -68
- devsper-2.7.2/devsper/tools/knowledge/document_topic_extractor.py +0 -58
- devsper-2.7.2/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -58
- devsper-2.7.2/devsper/tools/knowledge/timeline_extractor.py +0 -59
- devsper-2.7.2/devsper/tools/math/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/math/calculate_expression.py +0 -52
- devsper-2.7.2/devsper/tools/math/correlation.py +0 -44
- devsper-2.7.2/devsper/tools/math/distribution_summary.py +0 -39
- devsper-2.7.2/devsper/tools/math/histogram.py +0 -53
- devsper-2.7.2/devsper/tools/math/linear_regression.py +0 -47
- devsper-2.7.2/devsper/tools/math/matrix_multiply.py +0 -38
- devsper-2.7.2/devsper/tools/math/mean_std.py +0 -35
- devsper-2.7.2/devsper/tools/math/monte_carlo_simulation.py +0 -43
- devsper-2.7.2/devsper/tools/math/polynomial_fit.py +0 -40
- devsper-2.7.2/devsper/tools/math/random_sample.py +0 -36
- devsper-2.7.2/devsper/tools/mcp/__init__.py +0 -23
- devsper-2.7.2/devsper/tools/mcp/adapter.py +0 -53
- devsper-2.7.2/devsper/tools/mcp/client.py +0 -263
- devsper-2.7.2/devsper/tools/mcp/discovery.py +0 -64
- devsper-2.7.2/devsper/tools/memory/__init__.py +0 -16
- devsper-2.7.2/devsper/tools/memory/delete_memory.py +0 -26
- devsper-2.7.2/devsper/tools/memory/list_memory.py +0 -35
- devsper-2.7.2/devsper/tools/memory/search_memory.py +0 -44
- devsper-2.7.2/devsper/tools/memory/store_memory.py +0 -54
- devsper-2.7.2/devsper/tools/memory/summarize_memory.py +0 -42
- devsper-2.7.2/devsper/tools/memory/tag_memory.py +0 -40
- devsper-2.7.2/devsper/tools/pipelines.py +0 -92
- devsper-2.7.2/devsper/tools/registry.py +0 -117
- devsper-2.7.2/devsper/tools/research/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/research/arxiv_download.py +0 -55
- devsper-2.7.2/devsper/tools/research/arxiv_search.py +0 -58
- devsper-2.7.2/devsper/tools/research/citation_extractor.py +0 -35
- devsper-2.7.2/devsper/tools/research/duckduckgo_search.py +0 -42
- devsper-2.7.2/devsper/tools/research/paper_metadata_extractor.py +0 -45
- devsper-2.7.2/devsper/tools/research/paper_summarizer.py +0 -41
- devsper-2.7.2/devsper/tools/research/research_question_generator.py +0 -39
- devsper-2.7.2/devsper/tools/research/topic_cluster.py +0 -46
- devsper-2.7.2/devsper/tools/research/web_search.py +0 -47
- devsper-2.7.2/devsper/tools/research/wikipedia_lookup.py +0 -50
- devsper-2.7.2/devsper/tools/research_advanced/__init__.py +0 -14
- devsper-2.7.2/devsper/tools/research_advanced/citation_context_extractor.py +0 -60
- devsper-2.7.2/devsper/tools/research_advanced/literature_review_generator.py +0 -79
- devsper-2.7.2/devsper/tools/research_advanced/methodology_extractor.py +0 -58
- devsper-2.7.2/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -50
- devsper-2.7.2/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -49
- devsper-2.7.2/devsper/tools/research_advanced/paper_method_comparator.py +0 -62
- devsper-2.7.2/devsper/tools/research_advanced/paper_similarity_search.py +0 -69
- devsper-2.7.2/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -69
- devsper-2.7.2/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -56
- devsper-2.7.2/devsper/tools/research_advanced/research_gap_finder.py +0 -71
- devsper-2.7.2/devsper/tools/research_advanced/research_topic_mapper.py +0 -69
- devsper-2.7.2/devsper/tools/research_advanced/swarm_literature_review.py +0 -58
- devsper-2.7.2/devsper/tools/scoring/__init__.py +0 -52
- devsper-2.7.2/devsper/tools/scoring/report.py +0 -44
- devsper-2.7.2/devsper/tools/scoring/scorer.py +0 -39
- devsper-2.7.2/devsper/tools/scoring/selector.py +0 -61
- devsper-2.7.2/devsper/tools/scoring/store.py +0 -267
- devsper-2.7.2/devsper/tools/selector.py +0 -193
- devsper-2.7.2/devsper/tools/system/__init__.py +0 -12
- devsper-2.7.2/devsper/tools/system/cpu_usage.py +0 -22
- devsper-2.7.2/devsper/tools/system/disk_usage.py +0 -35
- devsper-2.7.2/devsper/tools/system/environment_variables.py +0 -29
- devsper-2.7.2/devsper/tools/system/memory_usage.py +0 -23
- devsper-2.7.2/devsper/tools/system/pip_install.py +0 -44
- devsper-2.7.2/devsper/tools/system/pip_search.py +0 -29
- devsper-2.7.2/devsper/tools/system/process_list.py +0 -34
- devsper-2.7.2/devsper/tools/system/python_package_list.py +0 -40
- devsper-2.7.2/devsper/tools/system/run_shell_command.py +0 -69
- devsper-2.7.2/devsper/tools/system/system_info.py +0 -26
- devsper-2.7.2/devsper/tools/tool_runner.py +0 -170
- devsper-2.7.2/devsper/tui/__init__.py +0 -5
- devsper-2.7.2/devsper/tui/activity_feed_view.py +0 -73
- devsper-2.7.2/devsper/tui/adaptive_tasks_view.py +0 -75
- devsper-2.7.2/devsper/tui/agent_role_view.py +0 -35
- devsper-2.7.2/devsper/tui/app.py +0 -438
- devsper-2.7.2/devsper/tui/dashboard_screen.py +0 -309
- devsper-2.7.2/devsper/tui/dev_view.py +0 -99
- devsper-2.7.2/devsper/tui/inject_screen.py +0 -73
- devsper-2.7.2/devsper/tui/knowledge_graph_view.py +0 -46
- devsper-2.7.2/devsper/tui/layout.py +0 -43
- devsper-2.7.2/devsper/tui/logs_view.py +0 -83
- devsper-2.7.2/devsper/tui/memory_view.py +0 -58
- devsper-2.7.2/devsper/tui/mission_view.py +0 -44
- devsper-2.7.2/devsper/tui/performance_view.py +0 -33
- devsper-2.7.2/devsper/tui/reasoning_graph_view.py +0 -39
- devsper-2.7.2/devsper/tui/results_view.py +0 -139
- devsper-2.7.2/devsper/tui/swarm_view.py +0 -37
- devsper-2.7.2/devsper/tui/task_detail_screen.py +0 -55
- devsper-2.7.2/devsper/tui/task_view.py +0 -103
- devsper-2.7.2/devsper/types/event.py +0 -134
- devsper-2.7.2/devsper/types/exceptions.py +0 -21
- devsper-2.7.2/devsper/types/swarm.py +0 -41
- devsper-2.7.2/devsper/types/task.py +0 -108
- devsper-2.7.2/devsper/upgrade/__init__.py +0 -21
- devsper-2.7.2/devsper/upgrade/changelog.py +0 -124
- devsper-2.7.2/devsper/upgrade/cli.py +0 -145
- devsper-2.7.2/devsper/upgrade/installer.py +0 -103
- devsper-2.7.2/devsper/upgrade/notifier.py +0 -52
- devsper-2.7.2/devsper/upgrade/version_check.py +0 -130
- devsper-2.7.2/devsper/utils/event_logger.py +0 -150
- devsper-2.7.2/devsper/utils/http.py +0 -43
- devsper-2.7.2/devsper/utils/models.py +0 -57
- devsper-2.7.2/devsper/visualization/__init__.py +0 -5
- devsper-2.7.2/devsper/visualization/dag_export.py +0 -67
- devsper-2.7.2/devsper/workflow/__init__.py +0 -18
- devsper-2.7.2/devsper/workflow/conditions.py +0 -157
- devsper-2.7.2/devsper/workflow/context.py +0 -108
- devsper-2.7.2/devsper/workflow/loader.py +0 -201
- devsper-2.7.2/devsper/workflow/resolver.py +0 -109
- devsper-2.7.2/devsper/workflow/runner.py +0 -562
- devsper-2.7.2/devsper/workflow/schema.py +0 -63
- devsper-2.7.2/devsper/workflow/validator.py +0 -128
- devsper-2.7.2/devsper.toml +0 -68
- devsper-2.7.2/docker-compose.yml +0 -11
- devsper-2.7.2/examples/_common.py +0 -119
- devsper-2.7.2/examples/_config.py +0 -50
- devsper-2.7.2/examples/coding/analyze_repository.py +0 -89
- devsper-2.7.2/examples/coding/generate_docs.py +0 -66
- devsper-2.7.2/examples/coding/refactor_candidates.py +0 -84
- devsper-2.7.2/examples/data_science/__init__.py +0 -0
- devsper-2.7.2/examples/data_science/dataset_analysis.py +0 -137
- devsper-2.7.2/examples/data_science/run_experiments.py +0 -91
- devsper-2.7.2/examples/demo_swarm.py +0 -94
- devsper-2.7.2/examples/distributed/README.md +0 -138
- devsper-2.7.2/examples/distributed/controller.toml +0 -31
- devsper-2.7.2/examples/distributed/parallel_survey.py +0 -146
- devsper-2.7.2/examples/distributed/run_controller.py +0 -217
- devsper-2.7.2/examples/distributed/run_demo.sh +0 -21
- devsper-2.7.2/examples/distributed/run_worker.py +0 -257
- devsper-2.7.2/examples/distributed/worker.toml +0 -20
- devsper-2.7.2/examples/documents/__init__.py +0 -0
- devsper-2.7.2/examples/documents/analyze_documents.py +0 -133
- devsper-2.7.2/examples/experiments/__init__.py +0 -0
- devsper-2.7.2/examples/experiments/monte_carlo_demo.py +0 -73
- devsper-2.7.2/examples/experiments/parameter_sweep.py +0 -86
- devsper-2.7.2/examples/langchain_agent.py +0 -70
- devsper-2.7.2/examples/langgraph_swarm.py +0 -83
- devsper-2.7.2/examples/research/__init__.py +0 -0
- devsper-2.7.2/examples/research/literature_review.py +0 -130
- devsper-2.7.2/examples/research/research_gap_analysis.py +0 -97
- devsper-2.7.2/examples/research/research_graph.py +0 -144
- devsper-2.7.2/memory_utils.py +0 -10
- devsper-2.7.2/pyproject.toml +0 -112
- devsper-2.7.2/scripts/README.md +0 -65
- devsper-2.7.2/scripts/qa_e2e_stabilization.sh +0 -15
- devsper-2.7.2/scripts/seed_tool_scores.py +0 -30
- devsper-2.7.2/scripts/test_tool_scoring_cli.sh +0 -27
- devsper-2.7.2/scripts/test_tool_scoring_full.sh +0 -31
- devsper-2.7.2/scripts/test_tool_scoring_smoke.py +0 -78
- devsper-2.7.2/scripts/test_v2_router.py +0 -64
- devsper-2.7.2/supermemory-core/Cargo.toml +0 -12
- devsper-2.7.2/supermemory-core/src/main.rs +0 -371
- devsper-2.7.2/tests/agents/__init__.py +0 -1
- devsper-2.7.2/tests/agents/test_roles.py +0 -56
- devsper-2.7.2/tests/benchmarks/test_v16_perf.py +0 -123
- devsper-2.7.2/tests/integration/test_controller_restart_hitl.py +0 -37
- devsper-2.7.2/tests/integration/test_duplicate_event_delivery.py +0 -45
- devsper-2.7.2/tests/integration/test_evals_e2e.py +0 -508
- devsper-2.7.2/tests/integration/test_event_idempotency.py +0 -34
- devsper-2.7.2/tests/integration/test_event_retry.py +0 -54
- devsper-2.7.2/tests/integration/test_hitl_pause_resume.py +0 -75
- devsper-2.7.2/tests/integration/test_sse_reconnect.py +0 -16
- devsper-2.7.2/tests/integration/test_sse_stream.py +0 -54
- devsper-2.7.2/tests/integration/test_worker_crash_recovery.py +0 -25
- devsper-2.7.2/tests/intelligence/__init__.py +0 -0
- devsper-2.7.2/tests/intelligence/test_adaptation.py +0 -60
- devsper-2.7.2/tests/intelligence/test_learning_engine.py +0 -55
- devsper-2.7.2/tests/intelligence/test_strategy_selector.py +0 -35
- devsper-2.7.2/tests/intelligence/test_task_optimizer.py +0 -41
- devsper-2.7.2/tests/memory/__init__.py +0 -0
- devsper-2.7.2/tests/memory/test_agent_memory_integration.py +0 -69
- devsper-2.7.2/tests/memory/test_memory_context_run_scope.py +0 -16
- devsper-2.7.2/tests/memory/test_memory_index.py +0 -291
- devsper-2.7.2/tests/memory/test_memory_router.py +0 -44
- devsper-2.7.2/tests/memory/test_memory_store.py +0 -81
- devsper-2.7.2/tests/pool/__init__.py +0 -1
- devsper-2.7.2/tests/pool/fixtures.py +0 -31
- devsper-2.7.2/tests/pool/test_crypto.py +0 -26
- devsper-2.7.2/tests/pool/test_e2e_redis_loop.py +0 -103
- devsper-2.7.2/tests/pool/test_heartbeat_eviction.py +0 -37
- devsper-2.7.2/tests/pool/test_local_pool.py +0 -30
- devsper-2.7.2/tests/pool/test_org_pool.py +0 -29
- devsper-2.7.2/tests/pool/test_priority_chain.py +0 -36
- devsper-2.7.2/tests/pool/test_rate_limiting.py +0 -20
- devsper-2.7.2/tests/reasoning/__init__.py +0 -1
- devsper-2.7.2/tests/reasoning/test_reasoning_graph.py +0 -58
- devsper-2.7.2/tests/runtime/__init__.py +0 -0
- devsper-2.7.2/tests/runtime/test_budget.py +0 -15
- devsper-2.7.2/tests/runtime/test_otel_phase1.py +0 -40
- devsper-2.7.2/tests/runtime/test_packager.py +0 -9
- devsper-2.7.2/tests/runtime/test_protocol_schema.py +0 -13
- devsper-2.7.2/tests/runtime/test_replay.py +0 -55
- devsper-2.7.2/tests/runtime/test_replay_engine.py +0 -71
- devsper-2.7.2/tests/runtime/test_telemetry.py +0 -58
- devsper-2.7.2/tests/runtime/test_visualize.py +0 -39
- devsper-2.7.2/tests/test_agent.py +0 -37
- devsper-2.7.2/tests/test_analysis.py +0 -253
- devsper-2.7.2/tests/test_analytics.py +0 -22
- devsper-2.7.2/tests/test_auto_model.py +0 -33
- devsper-2.7.2/tests/test_clarification.py +0 -318
- devsper-2.7.2/tests/test_clarification_multinode.py +0 -147
- devsper-2.7.2/tests/test_config_loader.py +0 -48
- devsper-2.7.2/tests/test_credentials.py +0 -126
- devsper-2.7.2/tests/test_cross_boundary_serialization.py +0 -51
- devsper-2.7.2/tests/test_dag_export.py +0 -60
- devsper-2.7.2/tests/test_dev_agents.py +0 -53
- devsper-2.7.2/tests/test_dev_build_cmd.py +0 -29
- devsper-2.7.2/tests/test_dev_debugger.py +0 -29
- devsper-2.7.2/tests/test_dev_repo_index.py +0 -27
- devsper-2.7.2/tests/test_dev_sandbox.py +0 -51
- devsper-2.7.2/tests/test_dev_scaffold.py +0 -56
- devsper-2.7.2/tests/test_distributed_bugs.py +0 -50
- devsper-2.7.2/tests/test_embeddings_service.py +0 -26
- devsper-2.7.2/tests/test_evals.py +0 -290
- devsper-2.7.2/tests/test_event_logger.py +0 -15
- devsper-2.7.2/tests/test_execution_graph_meta.py +0 -31
- devsper-2.7.2/tests/test_executor.py +0 -61
- devsper-2.7.2/tests/test_export_runs.py +0 -122
- devsper-2.7.2/tests/test_github_provider.py +0 -47
- devsper-2.7.2/tests/test_init.py +0 -52
- devsper-2.7.2/tests/test_knowledge_graph.py +0 -48
- devsper-2.7.2/tests/test_knowledge_query.py +0 -25
- devsper-2.7.2/tests/test_langchain_adapter.py +0 -24
- devsper-2.7.2/tests/test_langgraph_adapter.py +0 -63
- devsper-2.7.2/tests/test_map_reduce.py +0 -20
- devsper-2.7.2/tests/test_memory_evolution.py +0 -67
- devsper-2.7.2/tests/test_memory_isolation.py +0 -129
- devsper-2.7.2/tests/test_missions.py +0 -20
- devsper-2.7.2/tests/test_model_router.py +0 -40
- devsper-2.7.2/tests/test_planner.py +0 -75
- devsper-2.7.2/tests/test_platform_runtime_events.py +0 -66
- devsper-2.7.2/tests/test_plugins.py +0 -19
- devsper-2.7.2/tests/test_protocols.py +0 -183
- devsper-2.7.2/tests/test_router.py +0 -40
- devsper-2.7.2/tests/test_scheduler.py +0 -89
- devsper-2.7.2/tests/test_speculation.py +0 -60
- devsper-2.7.2/tests/test_strategies.py +0 -47
- devsper-2.7.2/tests/test_swarm.py +0 -53
- devsper-2.7.2/tests/test_task_cache.py +0 -39
- devsper-2.7.2/tests/test_tool_scoring.py +0 -204
- devsper-2.7.2/tests/test_tool_selector.py +0 -44
- devsper-2.7.2/tests/test_upgrade.py +0 -221
- devsper-2.7.2/tests/test_v110.py +0 -185
- devsper-2.7.2/tests/test_v16.py +0 -144
- devsper-2.7.2/tests/test_v17.py +0 -316
- devsper-2.7.2/tests/test_v18.py +0 -263
- devsper-2.7.2/tests/test_v19.py +0 -257
- devsper-2.7.2/tests/test_workflow.py +0 -306
- devsper-2.7.2/tests/tools/__init__.py +0 -1
- devsper-2.7.2/tests/tools/test_code_intelligence_tools.py +0 -108
- devsper-2.7.2/tests/tools/test_coding_tools.py +0 -39
- devsper-2.7.2/tests/tools/test_core_tool_registry.py +0 -25
- devsper-2.7.2/tests/tools/test_data_science_tools.py +0 -96
- devsper-2.7.2/tests/tools/test_data_tools.py +0 -79
- devsper-2.7.2/tests/tools/test_document_tools.py +0 -30
- devsper-2.7.2/tests/tools/test_experiments_tools.py +0 -99
- devsper-2.7.2/tests/tools/test_filesystem_tools.py +0 -116
- devsper-2.7.2/tests/tools/test_flagship_tools.py +0 -103
- devsper-2.7.2/tests/tools/test_knowledge_tools.py +0 -63
- devsper-2.7.2/tests/tools/test_math_tools.py +0 -40
- devsper-2.7.2/tests/tools/test_memory_tools.py +0 -65
- devsper-2.7.2/tests/tools/test_pipelines.py +0 -57
- devsper-2.7.2/tests/tools/test_registry.py +0 -29
- devsper-2.7.2/tests/tools/test_research_advanced_tools.py +0 -92
- devsper-2.7.2/tests/tools/test_research_tools.py +0 -44
- devsper-2.7.2/tests/tools/test_system_tools.py +0 -28
- devsper-2.7.2/tests/tools/test_tool_runner.py +0 -51
- devsper-2.7.2/uv.lock +0 -5404
- devsper-2.7.2/worker/.dockerignore +0 -4
- devsper-2.7.2/worker/Cargo.lock +0 -2598
- devsper-2.7.2/worker/Cargo.toml +0 -49
- devsper-2.7.2/worker/Dockerfile +0 -19
- devsper-2.7.2/worker/README.md +0 -51
- devsper-2.7.2/worker/src/budget.rs +0 -9
- devsper-2.7.2/worker/src/bus.rs +0 -173
- devsper-2.7.2/worker/src/claim.rs +0 -65
- devsper-2.7.2/worker/src/clarification.rs +0 -118
- devsper-2.7.2/worker/src/config.rs +0 -122
- devsper-2.7.2/worker/src/controller.rs +0 -383
- devsper-2.7.2/worker/src/election.rs +0 -98
- devsper-2.7.2/worker/src/error.rs +0 -32
- devsper-2.7.2/worker/src/executor.rs +0 -127
- devsper-2.7.2/worker/src/health.rs +0 -15
- devsper-2.7.2/worker/src/heartbeat.rs +0 -34
- devsper-2.7.2/worker/src/lib.rs +0 -27
- devsper-2.7.2/worker/src/main.rs +0 -181
- devsper-2.7.2/worker/src/metrics.rs +0 -31
- devsper-2.7.2/worker/src/reconnect.rs +0 -36
- devsper-2.7.2/worker/src/registry.rs +0 -106
- devsper-2.7.2/worker/src/router.rs +0 -145
- devsper-2.7.2/worker/src/rpc.rs +0 -137
- devsper-2.7.2/worker/src/scheduler.rs +0 -133
- devsper-2.7.2/worker/src/snapshot.rs +0 -43
- devsper-2.7.2/worker/src/telemetry.rs +0 -6
- devsper-2.7.2/worker/src/types/agent.rs +0 -54
- devsper-2.7.2/worker/src/types/event.rs +0 -70
- devsper-2.7.2/worker/src/types/mod.rs +0 -11
- devsper-2.7.2/worker/src/types/node.rs +0 -51
- devsper-2.7.2/worker/src/types/task.rs +0 -69
- devsper-2.7.2/worker/src/worker_node.rs +0 -470
- devsper-2.7.2/worker/tests/integration.rs +0 -26
- {devsper-2.7.2/devsper/plugins/marketplace → devsper-3.0.0/devsper/auth}/__init__.py +0 -0
- {devsper-2.7.2/examples → devsper-3.0.0/devsper/credentials}/__init__.py +0 -0
- {devsper-2.7.2/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,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
|