devsper 2.6.0__tar.gz → 2.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devsper-2.6.0 → devsper-2.7.1}/CHANGELOG.md +47 -1
- {devsper-2.6.0 → devsper-2.7.1}/PKG-INFO +13 -1
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/roles.py +28 -4
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/init.py +25 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/main.py +218 -2
- {devsper-2.6.0 → devsper-2.7.1}/devsper/config/schema.py +61 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/cli.py +11 -1
- {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/store.py +11 -0
- devsper-2.7.1/devsper/evals/__init__.py +19 -0
- devsper-2.7.1/devsper/evals/dataset.py +107 -0
- devsper-2.7.1/devsper/evals/metrics.py +192 -0
- devsper-2.7.1/devsper/evals/runner.py +179 -0
- devsper-2.7.1/devsper/evals/types.py +114 -0
- devsper-2.7.1/devsper/memory/context.py +134 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_index.py +73 -2
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_router.py +35 -13
- devsper-2.7.1/devsper/memory/providers/__init__.py +5 -0
- devsper-2.7.1/devsper/memory/providers/backends/__init__.py +1 -0
- devsper-2.7.1/devsper/memory/providers/backends/platform_backend.py +74 -0
- devsper-2.7.1/devsper/memory/providers/backends/redis_backend.py +90 -0
- devsper-2.7.1/devsper/memory/providers/backends/snowflake_backend.py +449 -0
- devsper-2.7.1/devsper/memory/providers/backends/sqlite_backend.py +83 -0
- devsper-2.7.1/devsper/memory/providers/backends/vektori_backend.py +140 -0
- devsper-2.7.1/devsper/memory/providers/base.py +125 -0
- devsper-2.7.1/devsper/memory/providers/factory.py +162 -0
- devsper-2.7.1/devsper/prompt_optimizer/__init__.py +16 -0
- devsper-2.7.1/devsper/prompt_optimizer/backends/__init__.py +1 -0
- devsper-2.7.1/devsper/prompt_optimizer/backends/dspy_backend.py +205 -0
- devsper-2.7.1/devsper/prompt_optimizer/backends/gepa_backend.py +203 -0
- devsper-2.7.1/devsper/prompt_optimizer/backends/noop.py +25 -0
- devsper-2.7.1/devsper/prompt_optimizer/base.py +56 -0
- devsper-2.7.1/devsper/prompt_optimizer/factory.py +89 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/registry.py +7 -0
- {devsper-2.6.0 → devsper-2.7.1}/pyproject.toml +14 -1
- devsper-2.7.1/tests/integration/test_evals_e2e.py +508 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_e2e_redis_loop.py +4 -1
- devsper-2.7.1/tests/test_evals.py +289 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_pipelines.py +4 -7
- {devsper-2.6.0 → devsper-2.7.1}/uv.lock +481 -2
- devsper-2.6.0/devsper/memory/context.py +0 -53
- {devsper-2.6.0 → devsper-2.7.1}/.env.example +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.github/FUNDING.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.gitignore +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/.python-version +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/CONTRIBUTING.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/Cargo.lock +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/Dockerfile.local-pool +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/LICENSE +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/SECURITY.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/benchmarks/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/branding/logo.svg +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/critic.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/identity.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/message_bus.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/agents/run_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/analytics/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/audit/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/audit/logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/budget.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/message.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/schema_version.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/bus/topics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/hashing.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cache/task_cache.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/run_progress.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/components.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/election.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/local.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/node_info.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/compliance/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/compliance/pii.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/config/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/config/config_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/config/defaults.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/config/resolver.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/contracts/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/contracts/platform_event_type.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/agent/runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/core/tools/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/credentials/migration.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/debug_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/debugger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/repo_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/dev/scaffold.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/docs/architecture/execution-model.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/embeddings/service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/rationale.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/explainability/simulation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/branding.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/collector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/manifest.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/model.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/packager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/pdf.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/export/writers.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/approval.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/hitl/escalation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/langchain_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/integrations/langgraph_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/knowledge/query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/consolidation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/embeddings.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/memory_types.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/namespaces.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/scoring.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/summarizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/base_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/rpc.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/single.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/nodes/worker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/reporter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/request_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/run_context.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/policy/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/config.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/crypto.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/local_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/org_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/security.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/protocol/server.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/protocols/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/anthropic.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/gemini.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/github.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/openai.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/factory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/providers/router/router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/reasoning/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/execution_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/health.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/hitl.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/replay.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/retry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/run_history.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/task_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/task_state.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/runtime/visualize.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/server/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/server/events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/server/memory_utils.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/server/swarmworker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/server/topology.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/speculation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/swarm/swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/otel.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/telemetry/trulens.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/pipelines.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/app.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/dev_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/layout.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/logs_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/memory_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/mission_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/performance_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/results_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/tui/task_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/types/event.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/types/exceptions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/types/swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/types/task.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/cli.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/installer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/event_logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/http.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/utils/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/visualization/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/conditions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/context.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/resolver.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper/workflow/validator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/devsper.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/docker-compose.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/_common.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/_config.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/coding/generate_docs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/demo_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/controller.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/run_worker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/distributed/worker.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/documents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/langchain_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/langgraph_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/research/literature_review.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/examples/research/research_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/memory_utils.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/qa_e2e_stabilization.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/scripts/test_v2_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/supermemory-core/src/main.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/agents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/agents/test_roles.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/fixtures.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_crypto.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/reasoning/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_budget.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_packager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_replay.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_analytics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_auto_model.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_clarification.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_config_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_credentials.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dag_export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_agents.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_debugger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_embeddings_service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_event_logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_execution_graph_meta.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_export_runs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_github_provider.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_init.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_knowledge_query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_langchain_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_langgraph_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_memory_evolution.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_memory_isolation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_missions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_plugins.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_protocols.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_scheduler.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_speculation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_strategies.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_task_cache.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_tool_scoring.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_tool_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_upgrade.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_v110.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_v16.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_v17.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_v18.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_v19.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/test_workflow.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/.dockerignore +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/Cargo.lock +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/Dockerfile +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/budget.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/bus.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/claim.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/clarification.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/config.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/controller.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/election.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/error.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/executor.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/health.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/heartbeat.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/lib.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/main.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/metrics.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/reconnect.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/registry.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/router.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/rpc.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/scheduler.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/snapshot.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/telemetry.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/agent.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/event.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/mod.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/node.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/types/task.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/src/worker_node.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.1}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.7.1] — 2026-04-07
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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=)`.
|
|
15
|
+
- **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"`.
|
|
16
|
+
- **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`.
|
|
17
|
+
- **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.
|
|
18
|
+
- **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.
|
|
19
|
+
- **`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).
|
|
20
|
+
- **Config sections** — `[prompt_optimizer]` and `[evals]` added to `devsperConfigModel`.
|
|
21
|
+
- **Optimized prompt persistence** — `EvalRunner` saves results to `.devsper/optimized_prompts/{role}.json`. `get_role_config()` auto-loads these on the next run.
|
|
22
|
+
- **`devsper[evals]`, `devsper[dspy]`, `devsper[gepa]`, `devsper[openevals]` extras.**
|
|
23
|
+
- **pytest `live` marker** — Gates tests that require real API keys.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`get_metric(name)`** extended: now accepts `"openevals:<evaluator>"` in addition to built-in names.
|
|
28
|
+
- **`get_role_config()`** — Checks `.devsper/optimized_prompts/{role}.json` and uses the optimized prefix if present.
|
|
29
|
+
|
|
30
|
+
## [2.7.0] — 2026-04-07
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **MemoryProvider abstraction** — Introduced `MemoryBackend` ABC (`devsper/memory/providers/base.py`) mirroring the `LLMBackend` pattern. All memory backends implement a unified async interface: `store`, `retrieve`, `delete`, `list_memory`, `list_all_ids`, `query_similar`, `health`.
|
|
35
|
+
- **MemoryProvider factory** — `get_memory_provider()` singleton factory resolves the active backend from config (`[memory] provider`), `DEVSPER_MEMORY_PROVIDER` env var, or legacy `backend` field. Defaults to Vektori (pgvector) with automatic SQLite fallback when `DATABASE_URL` is not set.
|
|
36
|
+
- **Snowflake memory backend** — New `SnowflakeBackend` using `VECTOR(FLOAT, 1536)` columns and `VECTOR_COSINE_SIMILARITY` for native semantic search. Credentials resolved exclusively via the devsper credential store or `SNOWFLAKE_*` env vars — never from config files.
|
|
37
|
+
- **SQLite, Redis, Vektori, Platform backends** — Existing stores wrapped as `MemoryBackend` implementations with `get_sync_store()` escape hatch for legacy sync callers.
|
|
38
|
+
- **Credential store: Snowflake + Redis** — Added `snowflake` and `redis_memory` providers to keyring mappings. `devsper credentials set snowflake password` stores the Snowflake password securely; `inject_into_env()` propagates all `SNOWFLAKE_*` vars automatically.
|
|
39
|
+
- **Config schema** — Added `RedisMemoryConfig` and `SnowflakeMemoryConfig` sub-models under `[memory]`. `SnowflakeMemoryConfig` has no `password` field — credentials are credential-store-only.
|
|
40
|
+
- **`devsper doctor` memory provider health check** — `run_doctor()` now calls `provider.health()` and reports the active backend name and status.
|
|
41
|
+
- **`devsper[snowflake]` and `devsper[redis-memory]` extras** — `snowflake-connector-python>=3.6.0` and `redis>=5.0.0` optional dependency groups.
|
|
42
|
+
- **`deregister(name)` in tool registry** — Public function to remove a single tool by name without clearing the whole registry.
|
|
43
|
+
- **`MemoryIndex` native search delegation** — When the active backend has `supports_native_vector_search=True`, `query_memory()` and `query_across_runs()` delegate directly to `backend.query_similar()`, bypassing in-process cosine ranking.
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- **`MemoryRouter` and `MemoryIndex`** accept an optional `backend: MemoryBackend` parameter. The `_build_memory_store()` fallback now calls the factory instead of constructing `MemoryStore()` directly.
|
|
48
|
+
- **`get_effective_memory_store()`** preserved as a backwards-compatible alias; new `get_effective_memory_backend()` returns the full `MemoryBackend`. Async-only backends (Vektori, Snowflake) are bridged via `_AsyncBridgeStore` for sync callers.
|
|
49
|
+
- **Legacy `backend` values** (`local`, `supermemory`, `hybrid`) now map to `"vektori"` as the default production store.
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- **`test_pipelines.py`** — Replaced `registry._tools.pop()` (broken module-level access) with new `deregister()` function.
|
|
54
|
+
- **`test_e2e_redis_loop.py`** — Import guard prevents `ModuleNotFoundError` when `redis` is not installed; test now correctly skips instead of failing.
|
|
55
|
+
|
|
10
56
|
## [2.6.0] — 2026-04-06
|
|
11
57
|
|
|
12
58
|
### Added
|
|
@@ -82,7 +128,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
82
128
|
|
|
83
129
|
- **Supermemory ranking backend** — `[memory] backend = "supermemory"` (default) uses the Rust `supermemory-core` ranker for hybrid lexical (+ optional embedding) memory retrieval, deduplication, and recency-aware context formatting.
|
|
84
130
|
- **Platform memory backends** — `[memory] backend` can be `platform` or `hybrid` with `platform_api_url` and `platform_org_slug`; config resolver honors `DEVSPER_PLATFORM_API_URL` and `DEVSPER_PLATFORM_ORG` when set.
|
|
85
|
-
- **Remote platform workflows** — `load_workflow("org/pkg@N")` fetches workflow specs from the Devsper
|
|
131
|
+
- **Remote platform workflows** — `load_workflow("org/pkg@N")` fetches workflow specs from the Devsper Cloud API when `DEVSPER_PLATFORM_API_URL`, `DEVSPER_PLATFORM_ORG`, and (when required) `DEVSPER_PLATFORM_TOKEN` are configured.
|
|
86
132
|
- **Local worker pool** — `devsper pool` subcommands to run the local worker pool manager (foreground spawner) alongside improved swarm execution when using pool-backed paths.
|
|
87
133
|
- **Devsper Cloud CLI** — `devsper cloud login`, `logout`, `run`, `status`, and `logs` for JWT authentication (OS keychain) and runs against the platform API.
|
|
88
134
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.1
|
|
4
4
|
Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
|
|
5
5
|
Project-URL: Homepage, https://github.com/devsper-com/runtime
|
|
6
6
|
Project-URL: Documentation, https://docs.devsper.com
|
|
@@ -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,11 @@ 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'
|
|
78
|
+
Provides-Extra: redis-memory
|
|
79
|
+
Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
|
|
80
|
+
Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
|
|
71
81
|
Provides-Extra: research
|
|
72
82
|
Requires-Dist: duckduckgo-search>=6.0.0; extra == 'research'
|
|
73
83
|
Provides-Extra: server
|
|
@@ -75,6 +85,8 @@ Requires-Dist: fastapi>=0.110; extra == 'server'
|
|
|
75
85
|
Requires-Dist: sse-starlette>=2.0; extra == 'server'
|
|
76
86
|
Requires-Dist: uvicorn>=0.29; extra == 'server'
|
|
77
87
|
Requires-Dist: vektori>=0.1.1; extra == 'server'
|
|
88
|
+
Provides-Extra: snowflake
|
|
89
|
+
Requires-Dist: snowflake-connector-python>=3.6.0; extra == 'snowflake'
|
|
78
90
|
Provides-Extra: trulens
|
|
79
91
|
Requires-Dist: trulens-core>=1.0; extra == 'trulens'
|
|
80
92
|
Provides-Extra: worker
|
|
@@ -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
|
|
@@ -534,6 +534,31 @@ def run_doctor() -> int:
|
|
|
534
534
|
except Exception as e:
|
|
535
535
|
warnings.append(f"Memory store: {e}")
|
|
536
536
|
|
|
537
|
+
# Memory provider health check
|
|
538
|
+
try:
|
|
539
|
+
import asyncio
|
|
540
|
+
from devsper.memory.providers.factory import get_memory_provider
|
|
541
|
+
provider = get_memory_provider()
|
|
542
|
+
try:
|
|
543
|
+
loop = asyncio.get_event_loop()
|
|
544
|
+
if loop.is_running():
|
|
545
|
+
import concurrent.futures
|
|
546
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
|
|
547
|
+
healthy = pool.submit(asyncio.run, provider.health()).result()
|
|
548
|
+
else:
|
|
549
|
+
healthy = loop.run_until_complete(provider.health())
|
|
550
|
+
except Exception:
|
|
551
|
+
healthy = False
|
|
552
|
+
if healthy:
|
|
553
|
+
ok.append(f"Memory provider: {provider.name} — healthy")
|
|
554
|
+
else:
|
|
555
|
+
warnings.append(
|
|
556
|
+
f"Memory provider: {provider.name} — health check failed. "
|
|
557
|
+
"Check credentials and connectivity."
|
|
558
|
+
)
|
|
559
|
+
except Exception as e:
|
|
560
|
+
warnings.append(f"Memory provider health check failed: {e}")
|
|
561
|
+
|
|
537
562
|
try:
|
|
538
563
|
from devsper.knowledge.knowledge_graph import KnowledgeGraph
|
|
539
564
|
kg = KnowledgeGraph(store=get_default_store())
|
|
@@ -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",
|
|
@@ -74,13 +74,46 @@ class ModelsConfig(BaseModel):
|
|
|
74
74
|
quality: str | None = None # v1.6: complex tier (defaults to planner)
|
|
75
75
|
|
|
76
76
|
|
|
77
|
+
class RedisMemoryConfig(BaseModel):
|
|
78
|
+
"""Connection config for Redis memory backend."""
|
|
79
|
+
|
|
80
|
+
redis_url: str = "redis://localhost:6379"
|
|
81
|
+
run_id: str = "" # empty = auto-generated from os.getpid()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class SnowflakeMemoryConfig(BaseModel):
|
|
85
|
+
"""Connection config for Snowflake memory backend.
|
|
86
|
+
|
|
87
|
+
Credentials (account, user, password, etc.) are resolved from:
|
|
88
|
+
1. devsper credential store (devsper credentials set snowflake <key>)
|
|
89
|
+
2. SNOWFLAKE_* environment variables
|
|
90
|
+
3. These TOML fields as a last fallback (non-secret fields only)
|
|
91
|
+
|
|
92
|
+
NEVER put passwords in config files — use the credential store.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
account: str = "" # or SNOWFLAKE_ACCOUNT env var
|
|
96
|
+
user: str = "" # or SNOWFLAKE_USER env var
|
|
97
|
+
database: str = "" # or SNOWFLAKE_DATABASE env var
|
|
98
|
+
schema_name: str = "" # "schema" is reserved by Pydantic; or SNOWFLAKE_SCHEMA
|
|
99
|
+
warehouse: str = "" # or SNOWFLAKE_WAREHOUSE env var
|
|
100
|
+
role: str = "" # or SNOWFLAKE_ROLE env var
|
|
101
|
+
table: str = "devsper_memory"
|
|
102
|
+
|
|
103
|
+
|
|
77
104
|
class MemoryConfig(BaseModel):
|
|
78
105
|
enabled: bool = True
|
|
79
106
|
store_results: bool = True
|
|
80
107
|
top_k: int = 5
|
|
108
|
+
# New explicit provider field. Takes precedence over legacy `backend`.
|
|
109
|
+
# Values: "sqlite" | "redis" | "snowflake" | "vektori"
|
|
110
|
+
# Empty string = auto-detect (vektori if DATABASE_URL set, else sqlite).
|
|
111
|
+
provider: str = ""
|
|
81
112
|
backend: Literal["local", "platform", "hybrid", "supermemory"] = "supermemory"
|
|
82
113
|
platform_api_url: str = ""
|
|
83
114
|
platform_org_slug: str = ""
|
|
115
|
+
redis: RedisMemoryConfig = Field(default_factory=RedisMemoryConfig)
|
|
116
|
+
snowflake: SnowflakeMemoryConfig = Field(default_factory=SnowflakeMemoryConfig)
|
|
84
117
|
|
|
85
118
|
|
|
86
119
|
class KnowledgeConfig(BaseModel):
|
|
@@ -276,6 +309,32 @@ class HitlConfig(BaseModel):
|
|
|
276
309
|
policies: list[HitlPolicyConfig] = Field(default_factory=list)
|
|
277
310
|
|
|
278
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 = "noop"
|
|
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
|
+
|
|
279
338
|
class devsperConfigModel(BaseModel):
|
|
280
339
|
"""Full resolved configuration with Pydantic validation."""
|
|
281
340
|
|
|
@@ -300,6 +359,8 @@ class devsperConfigModel(BaseModel):
|
|
|
300
359
|
sandbox: SandboxConfig = Field(default_factory=SandboxConfig)
|
|
301
360
|
compliance: ComplianceConfig = Field(default_factory=ComplianceConfig)
|
|
302
361
|
hitl: HitlConfig = Field(default_factory=HitlConfig)
|
|
362
|
+
prompt_optimizer: PromptOptimizerConfig = Field(default_factory=PromptOptimizerConfig)
|
|
363
|
+
evals: EvalConfig = Field(default_factory=EvalConfig)
|
|
303
364
|
|
|
304
365
|
# Backward-compat aliases (property-style access from old devsperConfig)
|
|
305
366
|
@property
|
|
@@ -22,10 +22,12 @@ KNOWN_CREDENTIALS = {
|
|
|
22
22
|
"gemini": ["api_key"],
|
|
23
23
|
"azure": ["endpoint", "api_key", "deployment", "api_version"],
|
|
24
24
|
"azure_anthropic": ["endpoint", "api_key", "deployment"],
|
|
25
|
+
"snowflake": ["account", "user", "password", "database", "schema", "warehouse", "role"],
|
|
26
|
+
"redis_memory": ["url"],
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
# Keys that must never be shown in list (only "(stored)"); all others can show value
|
|
28
|
-
SENSITIVE_KEYS = {"api_key", "token"}
|
|
30
|
+
SENSITIVE_KEYS = {"api_key", "token", "password"}
|
|
29
31
|
|
|
30
32
|
# (provider, key) -> env var name for export
|
|
31
33
|
PROVIDER_KEY_TO_ENV: dict[tuple[str, str], str] = {
|
|
@@ -40,6 +42,14 @@ PROVIDER_KEY_TO_ENV: dict[tuple[str, str], str] = {
|
|
|
40
42
|
("azure_anthropic", "endpoint"): "AZURE_ANTHROPIC_ENDPOINT",
|
|
41
43
|
("azure_anthropic", "api_key"): "AZURE_ANTHROPIC_API_KEY",
|
|
42
44
|
("azure_anthropic", "deployment"): "AZURE_ANTHROPIC_DEPLOYMENT_NAME",
|
|
45
|
+
("snowflake", "account"): "SNOWFLAKE_ACCOUNT",
|
|
46
|
+
("snowflake", "user"): "SNOWFLAKE_USER",
|
|
47
|
+
("snowflake", "password"): "SNOWFLAKE_PASSWORD",
|
|
48
|
+
("snowflake", "database"): "SNOWFLAKE_DATABASE",
|
|
49
|
+
("snowflake", "schema"): "SNOWFLAKE_SCHEMA",
|
|
50
|
+
("snowflake", "warehouse"): "SNOWFLAKE_WAREHOUSE",
|
|
51
|
+
("snowflake", "role"): "SNOWFLAKE_ROLE",
|
|
52
|
+
("redis_memory", "url"): "REDIS_URL",
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
|
|
@@ -19,6 +19,15 @@ _PROVIDER_KEY_TO_ENV: list[tuple[str, str, str]] = [
|
|
|
19
19
|
("azure_anthropic", "api_key", "AZURE_ANTHROPIC_API_KEY"),
|
|
20
20
|
("azure_anthropic", "endpoint", "AZURE_ANTHROPIC_ENDPOINT"),
|
|
21
21
|
("azure_anthropic", "deployment", "AZURE_ANTHROPIC_DEPLOYMENT_NAME"),
|
|
22
|
+
# Memory backends
|
|
23
|
+
("snowflake", "account", "SNOWFLAKE_ACCOUNT"),
|
|
24
|
+
("snowflake", "user", "SNOWFLAKE_USER"),
|
|
25
|
+
("snowflake", "password", "SNOWFLAKE_PASSWORD"),
|
|
26
|
+
("snowflake", "database", "SNOWFLAKE_DATABASE"),
|
|
27
|
+
("snowflake", "schema", "SNOWFLAKE_SCHEMA"),
|
|
28
|
+
("snowflake", "warehouse", "SNOWFLAKE_WAREHOUSE"),
|
|
29
|
+
("snowflake", "role", "SNOWFLAKE_ROLE"),
|
|
30
|
+
("redis_memory", "url", "REDIS_URL"),
|
|
22
31
|
]
|
|
23
32
|
|
|
24
33
|
SERVICE_NAME = "devsper"
|
|
@@ -31,6 +40,8 @@ KNOWN_CREDENTIALS = {
|
|
|
31
40
|
"gemini": ["api_key"],
|
|
32
41
|
"azure": ["endpoint", "api_key", "deployment", "api_version"],
|
|
33
42
|
"azure_anthropic": ["endpoint", "api_key", "deployment"],
|
|
43
|
+
"snowflake": ["account", "user", "password", "database", "schema", "warehouse", "role"],
|
|
44
|
+
"redis_memory": ["url"],
|
|
34
45
|
}
|
|
35
46
|
|
|
36
47
|
|
|
@@ -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
|
+
]
|