devsper 2.7.0__tar.gz → 2.7.2__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.0 → devsper-2.7.2}/CHANGELOG.md +27 -0
- {devsper-2.7.0 → devsper-2.7.2}/PKG-INFO +8 -1
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/roles.py +28 -4
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/main.py +218 -2
- {devsper-2.7.0 → devsper-2.7.2}/devsper/config/schema.py +28 -0
- devsper-2.7.2/devsper/evals/__init__.py +19 -0
- devsper-2.7.2/devsper/evals/dataset.py +107 -0
- devsper-2.7.2/devsper/evals/metrics.py +192 -0
- devsper-2.7.2/devsper/evals/runner.py +179 -0
- devsper-2.7.2/devsper/evals/types.py +114 -0
- devsper-2.7.2/devsper/prompt_optimizer/__init__.py +16 -0
- devsper-2.7.2/devsper/prompt_optimizer/backends/__init__.py +1 -0
- devsper-2.7.2/devsper/prompt_optimizer/backends/dspy_backend.py +205 -0
- devsper-2.7.2/devsper/prompt_optimizer/backends/gepa_backend.py +203 -0
- devsper-2.7.2/devsper/prompt_optimizer/backends/noop.py +25 -0
- devsper-2.7.2/devsper/prompt_optimizer/base.py +56 -0
- devsper-2.7.2/devsper/prompt_optimizer/factory.py +102 -0
- {devsper-2.7.0 → devsper-2.7.2}/pyproject.toml +12 -1
- devsper-2.7.2/tests/integration/test_evals_e2e.py +508 -0
- devsper-2.7.2/tests/test_evals.py +290 -0
- {devsper-2.7.0 → devsper-2.7.2}/uv.lock +325 -2
- {devsper-2.7.0 → devsper-2.7.2}/.env.example +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.github/FUNDING.yml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.gitignore +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/.python-version +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/CONTRIBUTING.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/Cargo.lock +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/Cargo.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/Dockerfile.local-pool +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/LICENSE +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/README.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/SECURITY.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/benchmarks/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/branding/logo.svg +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/README.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/critic.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/identity.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/message_bus.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/agents/run_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/analytics/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/audit/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/audit/logger.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/budget.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/message.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/schema_version.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/bus/topics.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/hashing.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cache/task_cache.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/export.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/init.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/run_progress.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/components.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/election.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/local.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/node_info.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/compliance/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/compliance/pii.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/config/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/config/config_loader.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/config/defaults.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/config/resolver.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/contracts/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/contracts/platform_event_type.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/agent/runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/loader.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/core/tools/registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/cli.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/migration.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/credentials/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/debug_events.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/debugger.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/repo_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/sandbox.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/dev/scaffold.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/controller.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/docs/architecture/execution-model.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/embeddings/service.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/events.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/rationale.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/explainability/simulation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/branding.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/collector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/manifest.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/model.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/packager.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/pdf.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/service.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/export/writers.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/approval.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/hitl/escalation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/langchain_adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/integrations/langgraph_adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/knowledge/query.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/consolidation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/context.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/embeddings.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/memory_types.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/namespaces.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/platform_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/redis_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/snowflake_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/sqlite_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/backends/vektori_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/providers/factory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/scoring.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/summarizer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/base_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/models.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/controller.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/rpc.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/single.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/nodes/worker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/reporter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/request_builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/run_context.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/policy/client.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/config.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/crypto.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/local_pool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/manager.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/models.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/org_pool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/security.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/client.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/schema.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/protocol/server.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/protocols/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/anthropic.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/gemini.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/github.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/model_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/openai.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/factory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/providers/router/router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/reasoning/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/execution_graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/executor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/health.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/hitl.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/model_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/replay.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/retry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/run_history.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/task_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/task_state.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/runtime/visualize.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/server/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/server/events.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/server/memory_utils.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/server/swarmworker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/server/topology.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/executor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/speculation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/swarm/swarm.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/otel.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/telemetry/trulens.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/base.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/pipelines.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/selector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/app.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/dev_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/layout.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/logs_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/memory_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/mission_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/performance_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/results_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/tui/task_view.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/types/event.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/types/exceptions.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/types/swarm.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/types/task.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/cli.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/installer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/event_logger.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/http.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/utils/models.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/visualization/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/conditions.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/context.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/loader.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/resolver.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/schema.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper/workflow/validator.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/devsper.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/docker-compose.yml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/_common.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/_config.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/coding/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/coding/generate_docs.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/demo_swarm.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/README.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/controller.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_controller.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/run_worker.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/distributed/worker.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/documents/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/langchain_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/langgraph_swarm.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/research/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/research/literature_review.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/examples/research/research_graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/memory_utils.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/README.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/qa_e2e_stabilization.sh +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/scripts/test_v2_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/supermemory-core/src/main.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/agents/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/agents/test_roles.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/fixtures.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_crypto.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/reasoning/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_budget.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_packager.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_replay.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_agent.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_analysis.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_analytics.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_auto_model.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_clarification.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_config_loader.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_credentials.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dag_export.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_agents.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_debugger.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_embeddings_service.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_event_logger.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_execution_graph_meta.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_executor.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_export_runs.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_github_provider.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_init.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_knowledge_query.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_langchain_adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_langgraph_adapter.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_map_reduce.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_memory_evolution.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_memory_isolation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_missions.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_model_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_planner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_plugins.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_protocols.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_router.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_scheduler.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_speculation.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_strategies.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_swarm.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_task_cache.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_tool_scoring.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_tool_selector.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_upgrade.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_v110.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_v16.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_v17.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_v18.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_v19.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/test_workflow.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/__init__.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_registry.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/.dockerignore +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/Cargo.lock +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/Cargo.toml +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/Dockerfile +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/README.md +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/budget.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/bus.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/claim.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/clarification.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/config.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/controller.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/election.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/error.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/executor.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/health.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/heartbeat.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/lib.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/main.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/metrics.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/reconnect.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/registry.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/router.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/rpc.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/scheduler.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/snapshot.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/telemetry.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/agent.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/event.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/mod.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/node.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/types/task.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/src/worker_node.rs +0 -0
- {devsper-2.7.0 → devsper-2.7.2}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.7.2] — 2026-04-07
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Prompt optimizer default** — Auto-detect replaces hard-coded `noop` default. Factory resolves to `dspy` if `dspy-ai` is importable, else `gepa` (built-in evolutionary loop, no extra install required). Set `provider = "noop"` explicitly to disable.
|
|
15
|
+
- **`PromptOptimizerConfig.provider`** — Default changed from `"noop"` to `""` (auto-detect).
|
|
16
|
+
|
|
17
|
+
## [2.7.1] — 2026-04-07
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- **Eval harness** — New `devsper/evals/` module: `EvalCase`, `EvalDataset` (JSONL-backed), `EvalRunner` (async, bounded concurrency), `EvalSummary`, and `MetricFn` protocol. Built-in metrics: `exact_match`, `contains`, `regex_match`, `word_overlap`, `non_empty`, `llm_judge(model=)`.
|
|
22
|
+
- **Prompt optimizer abstraction** — `PromptOptimizerBackend` ABC mirroring the `MemoryBackend` / `LLMBackend` hot-swap pattern. Active backend resolved from `DEVSPER_PROMPT_OPTIMIZER` env var → `[prompt_optimizer] provider` config → default `"noop"`.
|
|
23
|
+
- **DSPy backend** (`devsper[dspy]`) — `DSPyBackend` compiles few-shot examples into an optimized system prompt using `BootstrapFewShot`, `MIPROv2`, or `BootstrapFewShotWithRandomSearch`. Configured via `[prompt_optimizer] dspy_optimizer`, `max_demos`, `num_candidates`.
|
|
24
|
+
- **GEPA backend** (`devsper[gepa]`) — `GEPABackend` runs an evolutionary prompt optimization loop. Uses the `gepa` library when installed; falls back to a built-in LLM-driven mutation loop so it works without any extra dependencies.
|
|
25
|
+
- **OpenEvals metric adapter** (`devsper[openevals]`) — `openevals_metric(name)` wraps any OpenEvals LLM-as-judge evaluator as a `MetricFn`. Prebuilt names: `correctness`, `conciseness`, `groundedness`, `relevance`. Accessible via `get_metric("openevals:correctness")`. Falls back to built-in `llm_judge` when the package is absent.
|
|
26
|
+
- **`devsper eval` CLI** — Three subcommands: `eval stub` (generate JSONL stub datasets per role), `eval run` (score a dataset, optional `--optimize` flag, `--optimizer dspy|gepa`), `eval results` (list persisted result files).
|
|
27
|
+
- **Config sections** — `[prompt_optimizer]` and `[evals]` added to `devsperConfigModel`.
|
|
28
|
+
- **Optimized prompt persistence** — `EvalRunner` saves results to `.devsper/optimized_prompts/{role}.json`. `get_role_config()` auto-loads these on the next run.
|
|
29
|
+
- **`devsper[evals]`, `devsper[dspy]`, `devsper[gepa]`, `devsper[openevals]` extras.**
|
|
30
|
+
- **pytest `live` marker** — Gates tests that require real API keys.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **`get_metric(name)`** extended: now accepts `"openevals:<evaluator>"` in addition to built-in names.
|
|
35
|
+
- **`get_role_config()`** — Checks `.devsper/optimized_prompts/{role}.json` and uses the optimized prefix if present.
|
|
36
|
+
|
|
10
37
|
## [2.7.0] — 2026-04-07
|
|
11
38
|
|
|
12
39
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.2
|
|
4
4
|
Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
|
|
5
5
|
Project-URL: Homepage, https://github.com/devsper-com/runtime
|
|
6
6
|
Project-URL: Documentation, https://docs.devsper.com
|
|
@@ -57,9 +57,14 @@ Requires-Dist: mkdocs<2,>=1.6.0; extra == 'docs'
|
|
|
57
57
|
Provides-Extra: document
|
|
58
58
|
Requires-Dist: docproc>=2.0.0; extra == 'document'
|
|
59
59
|
Requires-Dist: python-docx>=1.0.0; extra == 'document'
|
|
60
|
+
Provides-Extra: dspy
|
|
61
|
+
Requires-Dist: dspy-ai>=2.4; extra == 'dspy'
|
|
60
62
|
Provides-Extra: embeddings
|
|
61
63
|
Requires-Dist: sentence-transformers>=3.0.0; extra == 'embeddings'
|
|
64
|
+
Provides-Extra: evals
|
|
62
65
|
Provides-Extra: explainability
|
|
66
|
+
Provides-Extra: gepa
|
|
67
|
+
Requires-Dist: gepa>=0.1; extra == 'gepa'
|
|
63
68
|
Provides-Extra: hitl
|
|
64
69
|
Requires-Dist: httpx>=0.27; extra == 'hitl'
|
|
65
70
|
Provides-Extra: langgraph
|
|
@@ -68,6 +73,8 @@ Provides-Extra: mcp
|
|
|
68
73
|
Requires-Dist: anyio>=4.0; extra == 'mcp'
|
|
69
74
|
Requires-Dist: httpx>=0.27; extra == 'mcp'
|
|
70
75
|
Provides-Extra: ollama
|
|
76
|
+
Provides-Extra: openevals
|
|
77
|
+
Requires-Dist: openevals>=0.0.6; extra == 'openevals'
|
|
71
78
|
Provides-Extra: redis-memory
|
|
72
79
|
Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
|
|
73
80
|
Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
|
|
@@ -105,10 +105,34 @@ ROLE_CONFIGS: dict[str, RoleConfig] = {
|
|
|
105
105
|
|
|
106
106
|
|
|
107
107
|
def get_role_config(role: str | None) -> RoleConfig:
|
|
108
|
-
"""Return config for the given role, or default if unknown/None.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
"""Return config for the given role, or default if unknown/None.
|
|
109
|
+
|
|
110
|
+
If an optimized prompt exists at .devsper/optimized_prompts/{role}.json
|
|
111
|
+
(written by EvalRunner after prompt optimization), it is used in place of
|
|
112
|
+
the hardcoded prompt_prefix.
|
|
113
|
+
"""
|
|
114
|
+
base = ROLE_CONFIGS.get(role or DEFAULT_ROLE, ROLE_CONFIGS[DEFAULT_ROLE]) if role else ROLE_CONFIGS[DEFAULT_ROLE]
|
|
115
|
+
optimized = _load_optimized_prompt(base.name)
|
|
116
|
+
if optimized:
|
|
117
|
+
from dataclasses import replace
|
|
118
|
+
return replace(base, prompt_prefix=optimized)
|
|
119
|
+
return base
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _load_optimized_prompt(role: str) -> str | None:
|
|
123
|
+
"""Load persisted optimized prompt for a role, if it exists."""
|
|
124
|
+
import json
|
|
125
|
+
from pathlib import Path
|
|
126
|
+
|
|
127
|
+
p = Path(".devsper/optimized_prompts") / f"{role}.json"
|
|
128
|
+
if not p.exists():
|
|
129
|
+
return None
|
|
130
|
+
try:
|
|
131
|
+
data = json.loads(p.read_text())
|
|
132
|
+
prompt = data.get("prompt_prefix", "")
|
|
133
|
+
return prompt if prompt else None
|
|
134
|
+
except Exception:
|
|
135
|
+
return None
|
|
112
136
|
|
|
113
137
|
|
|
114
138
|
# Keywords to infer role from task description
|
|
@@ -145,7 +145,7 @@ def _run_platform_once(task: str, args: object) -> tuple[int, dict, float]:
|
|
|
145
145
|
api = _platform_api_builder()
|
|
146
146
|
if not api.enabled():
|
|
147
147
|
print(
|
|
148
|
-
"
|
|
148
|
+
"Cloud routing is not configured. Run `devsper platform connect` first.",
|
|
149
149
|
file=sys.stderr,
|
|
150
150
|
)
|
|
151
151
|
return 2, {}, 0.0
|
|
@@ -2721,6 +2721,164 @@ def _run_version(args: object) -> int:
|
|
|
2721
2721
|
return 0
|
|
2722
2722
|
|
|
2723
2723
|
|
|
2724
|
+
def _run_eval(args: object) -> int:
|
|
2725
|
+
"""Eval harness: run dataset, score results, optionally optimize prompts."""
|
|
2726
|
+
import asyncio
|
|
2727
|
+
import json
|
|
2728
|
+
from pathlib import Path
|
|
2729
|
+
|
|
2730
|
+
eval_cmd = getattr(args, "eval_cmd", None)
|
|
2731
|
+
|
|
2732
|
+
if eval_cmd == "stub" or eval_cmd is None and not hasattr(args, "dataset"):
|
|
2733
|
+
# Generate stub dataset
|
|
2734
|
+
from devsper.evals.dataset import EvalDataset
|
|
2735
|
+
|
|
2736
|
+
role = getattr(args, "role", "general")
|
|
2737
|
+
n = getattr(args, "n", 5)
|
|
2738
|
+
out = getattr(args, "out", None)
|
|
2739
|
+
dataset = EvalDataset.stub(role=role, n=n)
|
|
2740
|
+
if out:
|
|
2741
|
+
dataset.save(out)
|
|
2742
|
+
print(f"Stub dataset ({len(dataset)} cases) written to {out}")
|
|
2743
|
+
else:
|
|
2744
|
+
for case in dataset:
|
|
2745
|
+
print(json.dumps(case.to_dict()))
|
|
2746
|
+
return 0
|
|
2747
|
+
|
|
2748
|
+
if eval_cmd == "results":
|
|
2749
|
+
from devsper.config import get_config
|
|
2750
|
+
|
|
2751
|
+
try:
|
|
2752
|
+
results_dir = Path(getattr(args, "dir", None) or get_config().evals.results_dir)
|
|
2753
|
+
except Exception:
|
|
2754
|
+
results_dir = Path(".devsper/eval_results")
|
|
2755
|
+
if not results_dir.exists():
|
|
2756
|
+
print(f"No results found in {results_dir}")
|
|
2757
|
+
return 0
|
|
2758
|
+
files = sorted(results_dir.glob("*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
|
|
2759
|
+
if not files:
|
|
2760
|
+
print("No eval result files found.")
|
|
2761
|
+
return 0
|
|
2762
|
+
for f in files[:20]:
|
|
2763
|
+
try:
|
|
2764
|
+
data = json.loads(f.read_text())
|
|
2765
|
+
print(
|
|
2766
|
+
f" {f.name} role={data.get('role', '?')} "
|
|
2767
|
+
f"pass_rate={data.get('pass_rate', '?')} "
|
|
2768
|
+
f"mean_score={data.get('mean_score', '?')}"
|
|
2769
|
+
)
|
|
2770
|
+
except Exception:
|
|
2771
|
+
print(f" {f.name}")
|
|
2772
|
+
return 0
|
|
2773
|
+
|
|
2774
|
+
# eval_cmd == "run"
|
|
2775
|
+
from devsper.evals.dataset import EvalDataset
|
|
2776
|
+
from devsper.evals.metrics import get_metric
|
|
2777
|
+
from devsper.evals.runner import EvalRunner
|
|
2778
|
+
from devsper.config import get_config
|
|
2779
|
+
|
|
2780
|
+
try:
|
|
2781
|
+
cfg = get_config()
|
|
2782
|
+
except Exception:
|
|
2783
|
+
from devsper.config.schema import devsperConfigModel
|
|
2784
|
+
cfg = devsperConfigModel()
|
|
2785
|
+
|
|
2786
|
+
dataset_path = getattr(args, "dataset", None)
|
|
2787
|
+
if not dataset_path:
|
|
2788
|
+
print("Error: --dataset is required for 'eval run'")
|
|
2789
|
+
return 1
|
|
2790
|
+
|
|
2791
|
+
dataset = EvalDataset.load(dataset_path)
|
|
2792
|
+
role = getattr(args, "role", None)
|
|
2793
|
+
metric_name = getattr(args, "metric", None) or cfg.evals.default_metric
|
|
2794
|
+
threshold = getattr(args, "threshold", None) or cfg.evals.pass_threshold
|
|
2795
|
+
concurrency = getattr(args, "concurrency", None) or cfg.evals.concurrency
|
|
2796
|
+
do_optimize = getattr(args, "optimize", False)
|
|
2797
|
+
optimizer_override = getattr(args, "optimizer", None)
|
|
2798
|
+
out_path = getattr(args, "out", None)
|
|
2799
|
+
|
|
2800
|
+
metric = get_metric(metric_name)
|
|
2801
|
+
|
|
2802
|
+
# Build optimizer if requested
|
|
2803
|
+
optimizer = None
|
|
2804
|
+
if do_optimize:
|
|
2805
|
+
from devsper.prompt_optimizer.factory import get_prompt_optimizer, reset_prompt_optimizer
|
|
2806
|
+
|
|
2807
|
+
if optimizer_override:
|
|
2808
|
+
import os
|
|
2809
|
+
os.environ["DEVSPER_PROMPT_OPTIMIZER"] = optimizer_override
|
|
2810
|
+
reset_prompt_optimizer()
|
|
2811
|
+
optimizer = get_prompt_optimizer(cfg)
|
|
2812
|
+
|
|
2813
|
+
# Build a minimal agent for evaluation
|
|
2814
|
+
from devsper.agents.agent import Agent
|
|
2815
|
+
|
|
2816
|
+
agent = Agent(model_name=cfg.models.worker, use_tools=False)
|
|
2817
|
+
|
|
2818
|
+
runner = EvalRunner(
|
|
2819
|
+
agent=agent,
|
|
2820
|
+
metric=metric,
|
|
2821
|
+
pass_threshold=threshold,
|
|
2822
|
+
concurrency=concurrency,
|
|
2823
|
+
optimize_after=do_optimize,
|
|
2824
|
+
optimizer=optimizer,
|
|
2825
|
+
)
|
|
2826
|
+
|
|
2827
|
+
try:
|
|
2828
|
+
summary = asyncio.run(runner.run_async(dataset, role=role))
|
|
2829
|
+
except RuntimeError:
|
|
2830
|
+
loop = asyncio.new_event_loop()
|
|
2831
|
+
summary = loop.run_until_complete(runner.run_async(dataset, role=role))
|
|
2832
|
+
|
|
2833
|
+
# Print summary
|
|
2834
|
+
try:
|
|
2835
|
+
from rich.console import Console
|
|
2836
|
+
from rich.table import Table
|
|
2837
|
+
|
|
2838
|
+
console = Console()
|
|
2839
|
+
console.print(
|
|
2840
|
+
f"\n[bold]Eval Results[/bold] role=[cyan]{summary.role}[/cyan] "
|
|
2841
|
+
f"metric=[cyan]{summary.metric_name}[/cyan] "
|
|
2842
|
+
f"optimizer=[cyan]{summary.optimizer_backend}[/cyan]"
|
|
2843
|
+
)
|
|
2844
|
+
console.print(
|
|
2845
|
+
f" Passed: [green]{summary.passed}[/green]/{summary.total} "
|
|
2846
|
+
f"Pass rate: [bold]{summary.pass_rate:.1%}[/bold] "
|
|
2847
|
+
f"Mean score: [bold]{summary.mean_score:.3f}[/bold]\n"
|
|
2848
|
+
)
|
|
2849
|
+
table = Table(show_header=True, header_style="bold")
|
|
2850
|
+
table.add_column("ID", style="dim")
|
|
2851
|
+
table.add_column("Task", max_width=40)
|
|
2852
|
+
table.add_column("Score")
|
|
2853
|
+
table.add_column("Pass")
|
|
2854
|
+
for r in summary.results:
|
|
2855
|
+
color = "green" if r.passed else "red"
|
|
2856
|
+
table.add_row(
|
|
2857
|
+
r.case.id,
|
|
2858
|
+
r.case.task[:40],
|
|
2859
|
+
f"{r.score:.2f}",
|
|
2860
|
+
f"[{color}]{'✓' if r.passed else '✗'}[/{color}]",
|
|
2861
|
+
)
|
|
2862
|
+
console.print(table)
|
|
2863
|
+
except ImportError:
|
|
2864
|
+
print(f"\nEval: role={summary.role} metric={summary.metric_name}")
|
|
2865
|
+
print(f" {summary.passed}/{summary.total} passed ({summary.pass_rate:.1%})")
|
|
2866
|
+
print(f" Mean score: {summary.mean_score:.3f}")
|
|
2867
|
+
|
|
2868
|
+
# Persist results
|
|
2869
|
+
results_dir = Path(cfg.evals.results_dir)
|
|
2870
|
+
results_dir.mkdir(parents=True, exist_ok=True)
|
|
2871
|
+
ts = __import__("datetime").datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
2872
|
+
result_file = results_dir / f"eval_{summary.role}_{ts}.json"
|
|
2873
|
+
result_file.write_text(summary.to_json())
|
|
2874
|
+
print(f"\nResults saved to {result_file}")
|
|
2875
|
+
|
|
2876
|
+
if out_path:
|
|
2877
|
+
Path(out_path).write_text(summary.to_json())
|
|
2878
|
+
|
|
2879
|
+
return 0 if summary.pass_rate >= threshold else 1
|
|
2880
|
+
|
|
2881
|
+
|
|
2724
2882
|
def _run_health(args: object) -> int:
|
|
2725
2883
|
"""Run health checks. Exit 0 if healthy, 1 otherwise. Print ✓/✗ per check."""
|
|
2726
2884
|
import asyncio
|
|
@@ -2811,7 +2969,7 @@ def _run_upgrade(args: object) -> int:
|
|
|
2811
2969
|
|
|
2812
2970
|
|
|
2813
2971
|
def _run_cloud_dispatch(args: object) -> int:
|
|
2814
|
-
"""Devsper
|
|
2972
|
+
"""Devsper Cloud: login, run, status, logs."""
|
|
2815
2973
|
cmd = getattr(args, "cloud_cmd", None)
|
|
2816
2974
|
if not cmd:
|
|
2817
2975
|
return 0
|
|
@@ -4082,6 +4240,64 @@ Examples:
|
|
|
4082
4240
|
)
|
|
4083
4241
|
observe_parser.set_defaults(func=lambda a: _run_observe(a.port, a.db))
|
|
4084
4242
|
|
|
4243
|
+
eval_parser = subparsers.add_parser(
|
|
4244
|
+
"eval",
|
|
4245
|
+
help="Eval harness and prompt optimization",
|
|
4246
|
+
description="Run evals against a JSONL dataset and optionally optimize prompts.",
|
|
4247
|
+
epilog="""
|
|
4248
|
+
Examples:
|
|
4249
|
+
devsper eval run --dataset evals.jsonl --metric contains
|
|
4250
|
+
devsper eval run --dataset evals.jsonl --role research --optimize --optimizer dspy
|
|
4251
|
+
devsper eval stub --role research --out evals.jsonl
|
|
4252
|
+
devsper eval results
|
|
4253
|
+
""",
|
|
4254
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
4255
|
+
)
|
|
4256
|
+
eval_sub = eval_parser.add_subparsers(dest="eval_cmd", help="Subcommand")
|
|
4257
|
+
|
|
4258
|
+
eval_run_p = eval_sub.add_parser("run", help="Run eval dataset")
|
|
4259
|
+
eval_run_p.add_argument("--dataset", required=True, help="Path to JSONL dataset")
|
|
4260
|
+
eval_run_p.add_argument("--role", default=None, help="Filter to this agent role")
|
|
4261
|
+
eval_run_p.add_argument(
|
|
4262
|
+
"--metric",
|
|
4263
|
+
default=None,
|
|
4264
|
+
help="Metric name: exact_match | contains | regex_match | word_overlap | llm_judge (default: config)",
|
|
4265
|
+
)
|
|
4266
|
+
eval_run_p.add_argument(
|
|
4267
|
+
"--threshold", type=float, default=None, help="Pass threshold (default: config)"
|
|
4268
|
+
)
|
|
4269
|
+
eval_run_p.add_argument(
|
|
4270
|
+
"--optimize",
|
|
4271
|
+
action="store_true",
|
|
4272
|
+
help="Run prompt optimization after eval using the configured optimizer",
|
|
4273
|
+
)
|
|
4274
|
+
eval_run_p.add_argument(
|
|
4275
|
+
"--optimizer",
|
|
4276
|
+
default=None,
|
|
4277
|
+
help="Override optimizer backend: noop | dspy | gepa",
|
|
4278
|
+
)
|
|
4279
|
+
eval_run_p.add_argument(
|
|
4280
|
+
"--concurrency", type=int, default=None, help="Parallel eval cases"
|
|
4281
|
+
)
|
|
4282
|
+
eval_run_p.add_argument("--out", default=None, help="Save JSON results to this path")
|
|
4283
|
+
eval_run_p.set_defaults(eval_cmd="run")
|
|
4284
|
+
|
|
4285
|
+
eval_stub_p = eval_sub.add_parser("stub", help="Generate a stub dataset")
|
|
4286
|
+
eval_stub_p.add_argument(
|
|
4287
|
+
"--role", default="general", help="Agent role (research/code/analysis/general)"
|
|
4288
|
+
)
|
|
4289
|
+
eval_stub_p.add_argument("-n", type=int, default=5, help="Number of examples")
|
|
4290
|
+
eval_stub_p.add_argument(
|
|
4291
|
+
"--out", default=None, help="Output JSONL path (default: prints to stdout)"
|
|
4292
|
+
)
|
|
4293
|
+
eval_stub_p.set_defaults(eval_cmd="stub")
|
|
4294
|
+
|
|
4295
|
+
eval_results_p = eval_sub.add_parser("results", help="List recent eval result files")
|
|
4296
|
+
eval_results_p.add_argument("--dir", default=None, help="Results directory")
|
|
4297
|
+
eval_results_p.set_defaults(eval_cmd="results")
|
|
4298
|
+
|
|
4299
|
+
eval_parser.set_defaults(func=_run_eval)
|
|
4300
|
+
|
|
4085
4301
|
health_parser = subparsers.add_parser(
|
|
4086
4302
|
"health",
|
|
4087
4303
|
help="Health and readiness check",
|
|
@@ -309,6 +309,32 @@ class HitlConfig(BaseModel):
|
|
|
309
309
|
policies: list[HitlPolicyConfig] = Field(default_factory=list)
|
|
310
310
|
|
|
311
311
|
|
|
312
|
+
class PromptOptimizerConfig(BaseModel):
|
|
313
|
+
"""v2.7: Prompt optimization backend config.
|
|
314
|
+
|
|
315
|
+
provider: "noop" | "dspy" | "gepa" (override with DEVSPER_PROMPT_OPTIMIZER env var)
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
provider: str = "" # "" = auto (dspy if installed, else gepa). "noop" disables.
|
|
319
|
+
# DSPy-specific
|
|
320
|
+
dspy_optimizer: str = "bootstrap" # "bootstrap" | "mipro" | "bootstrap_random"
|
|
321
|
+
max_demos: int = 4
|
|
322
|
+
num_candidates: int = 10 # MIPROv2 only
|
|
323
|
+
# GEPA-specific
|
|
324
|
+
population_size: int = 5
|
|
325
|
+
n_iterations: int = 10
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
class EvalConfig(BaseModel):
|
|
329
|
+
"""v2.7: Eval harness config."""
|
|
330
|
+
|
|
331
|
+
dataset_dir: str = ".devsper/evals" # default location for JSONL datasets
|
|
332
|
+
results_dir: str = ".devsper/eval_results"
|
|
333
|
+
pass_threshold: float = 0.5
|
|
334
|
+
concurrency: int = 4
|
|
335
|
+
default_metric: str = "contains" # metric name from devsper.evals.metrics
|
|
336
|
+
|
|
337
|
+
|
|
312
338
|
class devsperConfigModel(BaseModel):
|
|
313
339
|
"""Full resolved configuration with Pydantic validation."""
|
|
314
340
|
|
|
@@ -333,6 +359,8 @@ class devsperConfigModel(BaseModel):
|
|
|
333
359
|
sandbox: SandboxConfig = Field(default_factory=SandboxConfig)
|
|
334
360
|
compliance: ComplianceConfig = Field(default_factory=ComplianceConfig)
|
|
335
361
|
hitl: HitlConfig = Field(default_factory=HitlConfig)
|
|
362
|
+
prompt_optimizer: PromptOptimizerConfig = Field(default_factory=PromptOptimizerConfig)
|
|
363
|
+
evals: EvalConfig = Field(default_factory=EvalConfig)
|
|
336
364
|
|
|
337
365
|
# Backward-compat aliases (property-style access from old devsperConfig)
|
|
338
366
|
@property
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
devsper evals — eval harness and prompt optimization integration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from devsper.evals.types import EvalCase, EvalResult, EvalSummary, MetricFn
|
|
6
|
+
from devsper.evals.dataset import EvalDataset
|
|
7
|
+
from devsper.evals.metrics import get_metric, BUILTIN_METRICS
|
|
8
|
+
from devsper.evals.runner import EvalRunner
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"EvalCase",
|
|
12
|
+
"EvalResult",
|
|
13
|
+
"EvalSummary",
|
|
14
|
+
"EvalDataset",
|
|
15
|
+
"EvalRunner",
|
|
16
|
+
"MetricFn",
|
|
17
|
+
"get_metric",
|
|
18
|
+
"BUILTIN_METRICS",
|
|
19
|
+
]
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""
|
|
2
|
+
JSONL-backed eval dataset: load, save, and generate stub datasets.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import uuid
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from devsper.evals.types import EvalCase
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class EvalDataset:
|
|
15
|
+
"""Ordered collection of EvalCases backed by a JSONL file."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, cases: list[EvalCase] | None = None, name: str = "dataset"):
|
|
18
|
+
self.cases: list[EvalCase] = cases or []
|
|
19
|
+
self.name = name
|
|
20
|
+
|
|
21
|
+
def __len__(self) -> int:
|
|
22
|
+
return len(self.cases)
|
|
23
|
+
|
|
24
|
+
def __iter__(self):
|
|
25
|
+
return iter(self.cases)
|
|
26
|
+
|
|
27
|
+
def add(self, case: EvalCase) -> None:
|
|
28
|
+
self.cases.append(case)
|
|
29
|
+
|
|
30
|
+
def filter_by_role(self, role: str) -> "EvalDataset":
|
|
31
|
+
return EvalDataset(
|
|
32
|
+
[c for c in self.cases if c.role == role],
|
|
33
|
+
name=f"{self.name}[{role}]",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def load(cls, path: str | Path) -> "EvalDataset":
|
|
38
|
+
"""Load from a JSONL file. Each line is a JSON object (EvalCase dict)."""
|
|
39
|
+
p = Path(path)
|
|
40
|
+
if not p.exists():
|
|
41
|
+
raise FileNotFoundError(f"Dataset not found: {path}")
|
|
42
|
+
cases = []
|
|
43
|
+
with p.open() as f:
|
|
44
|
+
for i, line in enumerate(f):
|
|
45
|
+
line = line.strip()
|
|
46
|
+
if not line or line.startswith("#"):
|
|
47
|
+
continue
|
|
48
|
+
try:
|
|
49
|
+
d = json.loads(line)
|
|
50
|
+
if "id" not in d:
|
|
51
|
+
d["id"] = str(uuid.uuid4())[:8]
|
|
52
|
+
cases.append(EvalCase.from_dict(d))
|
|
53
|
+
except json.JSONDecodeError as e:
|
|
54
|
+
raise ValueError(f"Bad JSON on line {i + 1} of {path}: {e}") from e
|
|
55
|
+
return cls(cases, name=p.stem)
|
|
56
|
+
|
|
57
|
+
def save(self, path: str | Path) -> None:
|
|
58
|
+
"""Write to a JSONL file (overwrites)."""
|
|
59
|
+
p = Path(path)
|
|
60
|
+
p.parent.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
with p.open("w") as f:
|
|
62
|
+
for case in self.cases:
|
|
63
|
+
f.write(json.dumps(case.to_dict()) + "\n")
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def from_dicts(cls, records: list[dict], name: str = "dataset") -> "EvalDataset":
|
|
67
|
+
cases = []
|
|
68
|
+
for i, d in enumerate(records):
|
|
69
|
+
if "id" not in d:
|
|
70
|
+
d["id"] = str(i)
|
|
71
|
+
cases.append(EvalCase.from_dict(d))
|
|
72
|
+
return cls(cases, name=name)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def stub(cls, role: str = "general", n: int = 5) -> "EvalDataset":
|
|
76
|
+
"""Generate a minimal stub dataset for smoke-testing."""
|
|
77
|
+
stubs = {
|
|
78
|
+
"research": [
|
|
79
|
+
("What is transformer architecture?", "attention mechanism"),
|
|
80
|
+
("Summarize BERT vs GPT", "bidirectional"),
|
|
81
|
+
("What year was AlexNet published?", "2012"),
|
|
82
|
+
("Who invented backpropagation?", "Rumelhart"),
|
|
83
|
+
("What is RLHF?", "reinforcement learning from human feedback"),
|
|
84
|
+
],
|
|
85
|
+
"code": [
|
|
86
|
+
("Write a Python function to reverse a string", "def"),
|
|
87
|
+
("What is a decorator in Python?", "wraps"),
|
|
88
|
+
("Implement binary search", "mid"),
|
|
89
|
+
("What does __init__ do?", "constructor"),
|
|
90
|
+
("How do you open a file in Python?", "open("),
|
|
91
|
+
],
|
|
92
|
+
"analysis": [
|
|
93
|
+
("What is mean absolute error?", "absolute"),
|
|
94
|
+
("Explain p-value", "null hypothesis"),
|
|
95
|
+
("What is overfitting?", "training data"),
|
|
96
|
+
("Define precision and recall", "true positive"),
|
|
97
|
+
("What is cross-validation?", "fold"),
|
|
98
|
+
],
|
|
99
|
+
}
|
|
100
|
+
pairs = stubs.get(role, [
|
|
101
|
+
(f"Task {i}", f"expected {i}") for i in range(n)
|
|
102
|
+
])[:n]
|
|
103
|
+
cases = [
|
|
104
|
+
EvalCase(id=str(i), task=t, expected=e, role=role)
|
|
105
|
+
for i, (t, e) in enumerate(pairs)
|
|
106
|
+
]
|
|
107
|
+
return cls(cases, name=f"stub_{role}")
|