devsper 2.5.0__tar.gz → 2.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devsper-2.5.0 → devsper-2.7.0}/CHANGELOG.md +41 -1
- {devsper-2.5.0 → devsper-2.7.0}/PKG-INFO +8 -1
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/agent.py +2 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/init.py +25 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/main.py +50 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/config/schema.py +35 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/credentials/cli.py +11 -1
- {devsper-2.5.0 → devsper-2.7.0}/devsper/credentials/store.py +11 -0
- devsper-2.7.0/devsper/memory/context.py +134 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/memory_index.py +73 -2
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/memory_router.py +35 -13
- devsper-2.7.0/devsper/memory/providers/__init__.py +5 -0
- devsper-2.7.0/devsper/memory/providers/backends/__init__.py +1 -0
- devsper-2.7.0/devsper/memory/providers/backends/platform_backend.py +74 -0
- devsper-2.7.0/devsper/memory/providers/backends/redis_backend.py +90 -0
- devsper-2.7.0/devsper/memory/providers/backends/snowflake_backend.py +449 -0
- devsper-2.7.0/devsper/memory/providers/backends/sqlite_backend.py +83 -0
- devsper-2.7.0/devsper/memory/providers/backends/vektori_backend.py +140 -0
- devsper-2.7.0/devsper/memory/providers/base.py +125 -0
- devsper-2.7.0/devsper/memory/providers/factory.py +162 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/swarm.py +61 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/telemetry/__init__.py +8 -0
- devsper-2.7.0/devsper/telemetry/trulens.py +119 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/registry.py +7 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper.toml +2 -0
- {devsper-2.5.0 → devsper-2.7.0}/pyproject.toml +12 -1
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_e2e_redis_loop.py +4 -1
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_pipelines.py +4 -7
- {devsper-2.5.0 → devsper-2.7.0}/uv.lock +354 -2
- devsper-2.5.0/devsper/memory/context.py +0 -53
- {devsper-2.5.0 → devsper-2.7.0}/.env.example +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.github/FUNDING.yml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.gitignore +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/.python-version +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/CONTRIBUTING.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/Cargo.lock +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/Cargo.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/Dockerfile.local-pool +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/LICENSE +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/README.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/SECURITY.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/benchmarks/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/branding/logo.svg +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/README.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/critic.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/identity.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/roles.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/audit/logger.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/budget.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/message.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/bus/topics.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cache/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/export.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/election.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/local.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/config/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/config/defaults.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/config/resolver.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/connectors/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/contracts/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/contracts/platform_event_type.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/debug_events.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/distributed/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/distributed/controller.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/docs/architecture/execution-model.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/events.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/branding.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/collector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/manifest.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/model.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/packager.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/pdf.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/service.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/export/writers.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/integrations/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/integrations/langchain_adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/integrations/langgraph_adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/models.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/nodes/single.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/request_builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/run_context.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/policy/client.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/config.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/manager.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/models.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/security.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/protocol/client.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/protocol/server.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/github.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/openai.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/execution_graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/executor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/health.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/hitl.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/model_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/retry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/task_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/server/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/server/events.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/server/memory_utils.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/server/swarmworker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/server/topology.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/telemetry/otel.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/base.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/selector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/app.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/layout.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/types/event.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/types/swarm.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/types/task.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/utils/event_logger.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/utils/http.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/utils/models.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/context.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/loader.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/docker-compose.yml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/_common.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/_config.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/coding/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/demo_swarm.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/README.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/documents/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/langchain_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/langgraph_swarm.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/research/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/research/literature_review.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/examples/research/research_graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/memory_utils.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/README.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/qa_e2e_stabilization.sh +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/agents/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_agent.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_analysis.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_analytics.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_auto_model.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_clarification.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_config_loader.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_credentials.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dag_export.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_event_logger.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_execution_graph_meta.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_executor.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_export_runs.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_github_provider.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_init.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_langchain_adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_langgraph_adapter.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_missions.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_model_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_planner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_plugins.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_protocols.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_router.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_scheduler.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_speculation.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_strategies.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_swarm.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_task_cache.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_upgrade.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_v110.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_v16.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_v17.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_v18.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_v19.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/test_workflow.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/__init__.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/.dockerignore +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/Cargo.lock +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/Cargo.toml +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/Dockerfile +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/README.md +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/budget.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/bus.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/claim.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/clarification.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/config.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/controller.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/election.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/error.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/executor.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/health.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/lib.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/main.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/metrics.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/registry.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/router.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/rpc.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/types/event.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/types/node.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/types/task.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.5.0 → devsper-2.7.0}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.7.0] — 2026-04-07
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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`.
|
|
15
|
+
- **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.
|
|
16
|
+
- **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.
|
|
17
|
+
- **SQLite, Redis, Vektori, Platform backends** — Existing stores wrapped as `MemoryBackend` implementations with `get_sync_store()` escape hatch for legacy sync callers.
|
|
18
|
+
- **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.
|
|
19
|
+
- **Config schema** — Added `RedisMemoryConfig` and `SnowflakeMemoryConfig` sub-models under `[memory]`. `SnowflakeMemoryConfig` has no `password` field — credentials are credential-store-only.
|
|
20
|
+
- **`devsper doctor` memory provider health check** — `run_doctor()` now calls `provider.health()` and reports the active backend name and status.
|
|
21
|
+
- **`devsper[snowflake]` and `devsper[redis-memory]` extras** — `snowflake-connector-python>=3.6.0` and `redis>=5.0.0` optional dependency groups.
|
|
22
|
+
- **`deregister(name)` in tool registry** — Public function to remove a single tool by name without clearing the whole registry.
|
|
23
|
+
- **`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.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`MemoryRouter` and `MemoryIndex`** accept an optional `backend: MemoryBackend` parameter. The `_build_memory_store()` fallback now calls the factory instead of constructing `MemoryStore()` directly.
|
|
28
|
+
- **`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.
|
|
29
|
+
- **Legacy `backend` values** (`local`, `supermemory`, `hybrid`) now map to `"vektori"` as the default production store.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **`test_pipelines.py`** — Replaced `registry._tools.pop()` (broken module-level access) with new `deregister()` function.
|
|
34
|
+
- **`test_e2e_redis_loop.py`** — Import guard prevents `ModuleNotFoundError` when `redis` is not installed; test now correctly skips instead of failing.
|
|
35
|
+
|
|
36
|
+
## [2.6.0] — 2026-04-06
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **TruLens observability integration** — Added first-class TruLens instrumentation for swarm runs and agent calls, with configurable runtime toggles in `[telemetry]` (`trulens_enabled`, `trulens_database_url`) and recorder/session exports in `devsper.telemetry`.
|
|
41
|
+
- **CLI observability dashboard command** — Added `devsper observe` to launch the TruLens dashboard locally with optional `--port` and `--db` overrides.
|
|
42
|
+
- **Optional `trulens` extra** — Added `devsper[trulens]` dependency group for straightforward TruLens installation.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- **Swarm execution path** — `Swarm.run` now records via a TruLens custom app wrapper when enabled, with safe fallback to the standard runtime path if TruLens initialization or recorder setup fails.
|
|
47
|
+
- **Agent call capture** — `Agent.run` is instrumented for per-call telemetry capture when TruLens is installed.
|
|
48
|
+
- **Telemetry defaults and examples** — Updated default config template to include TruLens options and local database guidance.
|
|
49
|
+
|
|
10
50
|
## [2.5.0] — 2026-04-06
|
|
11
51
|
|
|
12
52
|
### Added
|
|
@@ -68,7 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
68
108
|
|
|
69
109
|
- **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.
|
|
70
110
|
- **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.
|
|
71
|
-
- **Remote platform workflows** — `load_workflow("org/pkg@N")` fetches workflow specs from the Devsper
|
|
111
|
+
- **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.
|
|
72
112
|
- **Local worker pool** — `devsper pool` subcommands to run the local worker pool manager (foreground spawner) alongside improved swarm execution when using pool-backed paths.
|
|
73
113
|
- **Devsper Cloud CLI** — `devsper cloud login`, `logout`, `run`, `status`, and `logs` for JWT authentication (OS keychain) and runs against the platform API.
|
|
74
114
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Orchestrate distributed swarms of AI agents that collaboratively solve complex tasks.
|
|
5
5
|
Project-URL: Homepage, https://github.com/devsper-com/runtime
|
|
6
6
|
Project-URL: Documentation, https://docs.devsper.com
|
|
@@ -68,6 +68,9 @@ Provides-Extra: mcp
|
|
|
68
68
|
Requires-Dist: anyio>=4.0; extra == 'mcp'
|
|
69
69
|
Requires-Dist: httpx>=0.27; extra == 'mcp'
|
|
70
70
|
Provides-Extra: ollama
|
|
71
|
+
Provides-Extra: redis-memory
|
|
72
|
+
Requires-Dist: hiredis>=2.3.0; extra == 'redis-memory'
|
|
73
|
+
Requires-Dist: redis>=5.0.0; extra == 'redis-memory'
|
|
71
74
|
Provides-Extra: research
|
|
72
75
|
Requires-Dist: duckduckgo-search>=6.0.0; extra == 'research'
|
|
73
76
|
Provides-Extra: server
|
|
@@ -75,6 +78,10 @@ Requires-Dist: fastapi>=0.110; extra == 'server'
|
|
|
75
78
|
Requires-Dist: sse-starlette>=2.0; extra == 'server'
|
|
76
79
|
Requires-Dist: uvicorn>=0.29; extra == 'server'
|
|
77
80
|
Requires-Dist: vektori>=0.1.1; extra == 'server'
|
|
81
|
+
Provides-Extra: snowflake
|
|
82
|
+
Requires-Dist: snowflake-connector-python>=3.6.0; extra == 'snowflake'
|
|
83
|
+
Provides-Extra: trulens
|
|
84
|
+
Requires-Dist: trulens-core>=1.0; extra == 'trulens'
|
|
78
85
|
Provides-Extra: worker
|
|
79
86
|
Description-Content-Type: text/markdown
|
|
80
87
|
|
|
@@ -15,6 +15,7 @@ from devsper.events import (
|
|
|
15
15
|
ClarificationField,
|
|
16
16
|
ClarificationRequest,
|
|
17
17
|
)
|
|
18
|
+
from devsper.telemetry.trulens import instrument as _tru_instrument
|
|
18
19
|
|
|
19
20
|
log = logging.getLogger(__name__)
|
|
20
21
|
|
|
@@ -765,6 +766,7 @@ class Agent:
|
|
|
765
766
|
answers[f.question] = self._default_answer_for_field(f)
|
|
766
767
|
return answers
|
|
767
768
|
|
|
769
|
+
@_tru_instrument
|
|
768
770
|
def run(self, request: AgentRequest) -> AgentResponse:
|
|
769
771
|
"""Stateless run: all context in AgentRequest, all output in AgentResponse."""
|
|
770
772
|
import time
|
|
@@ -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())
|
|
@@ -2068,6 +2068,33 @@ def _run_analytics() -> int:
|
|
|
2068
2068
|
return 0
|
|
2069
2069
|
|
|
2070
2070
|
|
|
2071
|
+
def _run_observe(port: int = 8501, db: str = "") -> int:
|
|
2072
|
+
"""Launch the TruLens observability dashboard."""
|
|
2073
|
+
try:
|
|
2074
|
+
from devsper.telemetry.trulens import init_trulens, get_session
|
|
2075
|
+
except ImportError:
|
|
2076
|
+
print("TruLens is not installed. Run: uv pip install 'devsper[trulens]'")
|
|
2077
|
+
return 1
|
|
2078
|
+
|
|
2079
|
+
session = get_session() or init_trulens(database_url=db)
|
|
2080
|
+
if session is None:
|
|
2081
|
+
print(
|
|
2082
|
+
"TruLens is not installed or failed to initialize.\n"
|
|
2083
|
+
"Run: uv pip install 'devsper[trulens]'"
|
|
2084
|
+
)
|
|
2085
|
+
return 1
|
|
2086
|
+
|
|
2087
|
+
db_url = getattr(session, "connector", None)
|
|
2088
|
+
db_label = str(db or ".devsper/trulens.sqlite")
|
|
2089
|
+
print(f"Opening TruLens dashboard — db: {db_label} port: {port}")
|
|
2090
|
+
print("Press Ctrl-C to stop.")
|
|
2091
|
+
try:
|
|
2092
|
+
session.run_dashboard(port=port)
|
|
2093
|
+
except KeyboardInterrupt:
|
|
2094
|
+
pass
|
|
2095
|
+
return 0
|
|
2096
|
+
|
|
2097
|
+
|
|
2071
2098
|
def _run_tools(args: object) -> int:
|
|
2072
2099
|
"""List tools with reliability scores, or reset score history."""
|
|
2073
2100
|
from rich.console import Console
|
|
@@ -4032,6 +4059,29 @@ Examples:
|
|
|
4032
4059
|
)
|
|
4033
4060
|
version_parser.set_defaults(func=_run_version)
|
|
4034
4061
|
|
|
4062
|
+
observe_parser = subparsers.add_parser(
|
|
4063
|
+
"observe",
|
|
4064
|
+
help="Launch TruLens observability dashboard",
|
|
4065
|
+
description="Open the TruLens dashboard for browsing run records, traces, and feedback.",
|
|
4066
|
+
epilog="""
|
|
4067
|
+
Examples:
|
|
4068
|
+
devsper observe
|
|
4069
|
+
devsper observe --port 8502
|
|
4070
|
+
devsper observe --db sqlite:///custom.sqlite
|
|
4071
|
+
""",
|
|
4072
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
4073
|
+
)
|
|
4074
|
+
observe_parser.add_argument(
|
|
4075
|
+
"--port", type=int, default=8501, help="Dashboard port (default: 8501)"
|
|
4076
|
+
)
|
|
4077
|
+
observe_parser.add_argument(
|
|
4078
|
+
"--db",
|
|
4079
|
+
default="",
|
|
4080
|
+
metavar="URL",
|
|
4081
|
+
help="TruLens database URL (default: sqlite:///.devsper/trulens.sqlite)",
|
|
4082
|
+
)
|
|
4083
|
+
observe_parser.set_defaults(func=lambda a: _run_observe(a.port, a.db))
|
|
4084
|
+
|
|
4035
4085
|
health_parser = subparsers.add_parser(
|
|
4036
4086
|
"health",
|
|
4037
4087
|
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):
|
|
@@ -109,6 +142,8 @@ class TelemetryConfig(BaseModel):
|
|
|
109
142
|
otel_endpoint: str = ""
|
|
110
143
|
otel_headers: dict[str, str] = Field(default_factory=dict)
|
|
111
144
|
cost_tracking: bool = True
|
|
145
|
+
trulens_enabled: bool = True
|
|
146
|
+
trulens_database_url: str = "" # empty = SQLite default (~/.trulens/)
|
|
112
147
|
|
|
113
148
|
|
|
114
149
|
class BudgetConfig(BaseModel):
|
|
@@ -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,134 @@
|
|
|
1
|
+
"""Process/async context for memory store + namespace (tools + agent execution)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from contextvars import ContextVar, Token
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
_current_store: ContextVar[object | None] = ContextVar("devsper_memory_store", default=None)
|
|
12
|
+
_current_namespace: ContextVar[str | None] = ContextVar("devsper_memory_namespace", default=None)
|
|
13
|
+
_current_run_id: ContextVar[str | None] = ContextVar("devsper_memory_run_id", default=None)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def attach_memory_context(
|
|
17
|
+
store: object | None,
|
|
18
|
+
namespace: str | None,
|
|
19
|
+
run_id: str | None = None,
|
|
20
|
+
) -> tuple[Token[object | None], Token[str | None], Token[str | None]]:
|
|
21
|
+
return (
|
|
22
|
+
_current_store.set(store),
|
|
23
|
+
_current_namespace.set(namespace),
|
|
24
|
+
_current_run_id.set(run_id),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def detach_memory_context(
|
|
29
|
+
tokens: tuple[Token[object | None], Token[str | None], Token[str | None]]
|
|
30
|
+
) -> None:
|
|
31
|
+
_current_store.reset(tokens[0])
|
|
32
|
+
_current_namespace.reset(tokens[1])
|
|
33
|
+
_current_run_id.reset(tokens[2])
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_effective_memory_backend():
|
|
37
|
+
"""
|
|
38
|
+
Return the active MemoryBackend for the current context.
|
|
39
|
+
Prefers the context-var store (set by attach_memory_context) if it is a MemoryBackend,
|
|
40
|
+
otherwise returns the process-level singleton from the factory.
|
|
41
|
+
"""
|
|
42
|
+
s = _current_store.get()
|
|
43
|
+
if s is not None and hasattr(s, "health"):
|
|
44
|
+
return s # it is already a MemoryBackend
|
|
45
|
+
from devsper.memory.providers.factory import get_memory_provider
|
|
46
|
+
|
|
47
|
+
return get_memory_provider()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_effective_memory_store():
|
|
51
|
+
"""
|
|
52
|
+
Legacy: return a synchronous MemoryStore compatible object.
|
|
53
|
+
Backends that wrap a sync store (sqlite, redis, platform) expose get_sync_store().
|
|
54
|
+
Async-only backends (vektori, snowflake) return an _AsyncBridgeStore shim.
|
|
55
|
+
"""
|
|
56
|
+
s = _current_store.get()
|
|
57
|
+
if s is not None and not hasattr(s, "health"):
|
|
58
|
+
# Legacy MemoryStore object set directly via attach_memory_context
|
|
59
|
+
return s
|
|
60
|
+
backend = get_effective_memory_backend()
|
|
61
|
+
if hasattr(backend, "get_sync_store"):
|
|
62
|
+
return backend.get_sync_store()
|
|
63
|
+
# Async-only backend: return a sync bridge so legacy callers still work
|
|
64
|
+
return _AsyncBridgeStore(backend)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class _AsyncBridgeStore:
|
|
68
|
+
"""
|
|
69
|
+
Sync shim for async-only backends (VektoriBackend, SnowflakeBackend).
|
|
70
|
+
Runs coroutines via asyncio in a thread so sync callers don't need to be async.
|
|
71
|
+
This mirrors the _run_async() pattern already used in server/memory_utils.py.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
def __init__(self, backend) -> None:
|
|
75
|
+
self._backend = backend
|
|
76
|
+
|
|
77
|
+
def _run(self, coro):
|
|
78
|
+
import asyncio
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
loop = asyncio.get_running_loop()
|
|
82
|
+
except RuntimeError:
|
|
83
|
+
loop = None
|
|
84
|
+
if loop and loop.is_running():
|
|
85
|
+
import concurrent.futures
|
|
86
|
+
|
|
87
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
|
|
88
|
+
return pool.submit(asyncio.run, coro).result()
|
|
89
|
+
return asyncio.run(coro)
|
|
90
|
+
|
|
91
|
+
def store(self, record, namespace=None):
|
|
92
|
+
return self._run(self._backend.store(record, namespace))
|
|
93
|
+
|
|
94
|
+
def retrieve(self, memory_id, namespace=None):
|
|
95
|
+
try:
|
|
96
|
+
return self._run(self._backend.retrieve(memory_id, namespace))
|
|
97
|
+
except NotImplementedError:
|
|
98
|
+
return None
|
|
99
|
+
|
|
100
|
+
def delete(self, memory_id, namespace=None):
|
|
101
|
+
try:
|
|
102
|
+
return self._run(self._backend.delete(memory_id, namespace))
|
|
103
|
+
except NotImplementedError:
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
def list_memory(
|
|
107
|
+
self,
|
|
108
|
+
memory_type=None,
|
|
109
|
+
limit=100,
|
|
110
|
+
offset=0,
|
|
111
|
+
tag_contains=None,
|
|
112
|
+
include_archived=False,
|
|
113
|
+
run_id_filter=None,
|
|
114
|
+
namespace=None,
|
|
115
|
+
):
|
|
116
|
+
return self._run(
|
|
117
|
+
self._backend.list_memory(
|
|
118
|
+
memory_type, limit, offset, tag_contains,
|
|
119
|
+
include_archived, run_id_filter, namespace,
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
def list_all_ids(self, memory_type=None, namespace=None):
|
|
124
|
+
return self._run(self._backend.list_all_ids(memory_type, namespace))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def get_effective_memory_namespace() -> str | None:
|
|
128
|
+
"""Active namespace for tool memory ops (None = legacy global/run default)."""
|
|
129
|
+
return _current_namespace.get()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def get_effective_run_id() -> str | None:
|
|
133
|
+
"""Active run id for shared memory scope."""
|
|
134
|
+
return _current_run_id.get()
|
|
@@ -2,11 +2,18 @@
|
|
|
2
2
|
Semantic search across stored memory via embeddings and top_k retrieval.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
5
9
|
from devsper.memory.embeddings import embed_text
|
|
6
10
|
from devsper.memory.memory_store import MemoryStore
|
|
7
11
|
from devsper.memory.memory_types import MemoryRecord
|
|
8
12
|
from devsper.memory.supermemory_rust_ranker import rank_memories
|
|
9
13
|
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from devsper.memory.providers.base import MemoryBackend
|
|
16
|
+
|
|
10
17
|
|
|
11
18
|
def _cosine_sim(a: list[float], b: list[float]) -> float:
|
|
12
19
|
if not a or not b or len(a) != len(b):
|
|
@@ -19,14 +26,45 @@ def _cosine_sim(a: list[float], b: list[float]) -> float:
|
|
|
19
26
|
return dot / (na * nb)
|
|
20
27
|
|
|
21
28
|
|
|
29
|
+
def _run_async_in_thread(coro):
|
|
30
|
+
"""Run a coroutine synchronously, safely bridging from sync context."""
|
|
31
|
+
import asyncio
|
|
32
|
+
import concurrent.futures
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
loop = asyncio.get_running_loop()
|
|
36
|
+
except RuntimeError:
|
|
37
|
+
loop = None
|
|
38
|
+
if loop and loop.is_running():
|
|
39
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
|
|
40
|
+
return pool.submit(asyncio.run, coro).result()
|
|
41
|
+
return asyncio.run(coro)
|
|
42
|
+
|
|
43
|
+
|
|
22
44
|
class MemoryIndex:
|
|
23
45
|
"""
|
|
24
46
|
Vector search over memory. Uses store for persistence and optional
|
|
25
47
|
embeddings on records for query_memory(text, top_k).
|
|
48
|
+
|
|
49
|
+
When a MemoryBackend with supports_native_vector_search=True is provided,
|
|
50
|
+
query_memory() and query_across_runs() delegate to the backend's native
|
|
51
|
+
vector search (e.g. Snowflake VECTOR_COSINE_SIMILARITY, pgvector <=>),
|
|
52
|
+
bypassing in-process cosine ranking.
|
|
26
53
|
"""
|
|
27
54
|
|
|
28
|
-
def __init__(
|
|
29
|
-
self
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
store: MemoryStore | None = None,
|
|
58
|
+
ranking_backend: str = "local",
|
|
59
|
+
backend: "MemoryBackend | None" = None,
|
|
60
|
+
) -> None:
|
|
61
|
+
self._backend = backend
|
|
62
|
+
if store is not None:
|
|
63
|
+
self.store = store
|
|
64
|
+
elif backend is not None and hasattr(backend, "get_sync_store"):
|
|
65
|
+
self.store = backend.get_sync_store()
|
|
66
|
+
else:
|
|
67
|
+
self.store = store or MemoryStore()
|
|
30
68
|
self.ranking_backend = ranking_backend
|
|
31
69
|
|
|
32
70
|
def query_memory(
|
|
@@ -39,6 +77,7 @@ class MemoryIndex:
|
|
|
39
77
|
) -> list[MemoryRecord]:
|
|
40
78
|
"""
|
|
41
79
|
Semantic search via ranking strategy:
|
|
80
|
+
- native (vektori/snowflake): delegates to backend.query_similar() directly.
|
|
42
81
|
- local (default): embed query, cosine-rank records that have embeddings.
|
|
43
82
|
- supermemory: hybrid local ranking (lexical token overlap + optional embedding
|
|
44
83
|
cosine similarity) using `rank_memories()`; records without embeddings can
|
|
@@ -48,6 +87,22 @@ class MemoryIndex:
|
|
|
48
87
|
Use min_similarity > 0 (e.g. 0.45) to avoid injecting barely-related memory.
|
|
49
88
|
By default excludes archived records (consolidation).
|
|
50
89
|
"""
|
|
90
|
+
# Fast path: delegate to native vector search when supported
|
|
91
|
+
if self._backend is not None and self._backend.supports_native_vector_search:
|
|
92
|
+
try:
|
|
93
|
+
from devsper.memory.providers.base import MemoryQuery
|
|
94
|
+
|
|
95
|
+
query = MemoryQuery(
|
|
96
|
+
text=text,
|
|
97
|
+
top_k=top_k,
|
|
98
|
+
min_similarity=min_similarity,
|
|
99
|
+
namespace=namespace,
|
|
100
|
+
include_archived=include_archived,
|
|
101
|
+
)
|
|
102
|
+
return _run_async_in_thread(self._backend.query_similar(query))
|
|
103
|
+
except Exception:
|
|
104
|
+
pass # fall through to in-process ranking
|
|
105
|
+
|
|
51
106
|
records = self.store.list_memory(
|
|
52
107
|
limit=500, include_archived=include_archived, namespace=namespace
|
|
53
108
|
)
|
|
@@ -112,6 +167,22 @@ class MemoryIndex:
|
|
|
112
167
|
v1.8: Same as query_memory but over more records (all runs), optional run_id filter.
|
|
113
168
|
Used by CrossRunSynthesizer. Excludes archived by default.
|
|
114
169
|
"""
|
|
170
|
+
# Fast path: delegate to native vector search when supported
|
|
171
|
+
if self._backend is not None and self._backend.supports_native_vector_search:
|
|
172
|
+
try:
|
|
173
|
+
from devsper.memory.providers.base import MemoryQuery
|
|
174
|
+
|
|
175
|
+
query = MemoryQuery(
|
|
176
|
+
text=text,
|
|
177
|
+
top_k=top_k,
|
|
178
|
+
min_similarity=min_similarity,
|
|
179
|
+
namespace=namespace,
|
|
180
|
+
include_archived=include_archived,
|
|
181
|
+
)
|
|
182
|
+
return _run_async_in_thread(self._backend.query_similar(query))
|
|
183
|
+
except Exception:
|
|
184
|
+
pass # fall through to in-process ranking
|
|
185
|
+
|
|
115
186
|
records = self.store.list_memory(
|
|
116
187
|
limit=2000,
|
|
117
188
|
include_archived=include_archived,
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
Memory router: determine which memories are relevant to a task and return context for the agent.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
5
9
|
from devsper.memory.memory_index import MemoryIndex
|
|
6
10
|
from devsper.memory.memory_store import MemoryStore
|
|
7
11
|
from devsper.memory.memory_types import MemoryRecord
|
|
8
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from devsper.memory.providers.base import MemoryBackend
|
|
15
|
+
|
|
9
16
|
|
|
10
17
|
class MemoryRouter:
|
|
11
18
|
"""
|
|
@@ -22,8 +29,16 @@ class MemoryRouter:
|
|
|
22
29
|
min_similarity: float = 0.55,
|
|
23
30
|
default_namespace: str | None = None,
|
|
24
31
|
ranking_backend: str | None = None,
|
|
32
|
+
backend: "MemoryBackend | None" = None,
|
|
25
33
|
) -> None:
|
|
26
|
-
|
|
34
|
+
# Resolve the sync store from whichever source is provided
|
|
35
|
+
if backend is not None:
|
|
36
|
+
self.store = _sync_store_from_backend(backend)
|
|
37
|
+
elif store is not None:
|
|
38
|
+
self.store = store
|
|
39
|
+
else:
|
|
40
|
+
self.store = _build_memory_store()
|
|
41
|
+
|
|
27
42
|
# Ranking backend only affects retrieval/ranking; persistence remains store-backed.
|
|
28
43
|
try:
|
|
29
44
|
from devsper.config import get_config
|
|
@@ -101,20 +116,27 @@ class MemoryRouter:
|
|
|
101
116
|
return "\n".join(lines) if lines else ""
|
|
102
117
|
|
|
103
118
|
|
|
104
|
-
def
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
def _sync_store_from_backend(backend: "MemoryBackend"):
|
|
120
|
+
"""
|
|
121
|
+
Return a sync-compatible store from a MemoryBackend.
|
|
122
|
+
Backends with get_sync_store() (sqlite, redis, platform) return their underlying store.
|
|
123
|
+
Async-only backends (vektori, snowflake) return an _AsyncBridgeStore shim.
|
|
124
|
+
"""
|
|
125
|
+
if hasattr(backend, "get_sync_store"):
|
|
126
|
+
return backend.get_sync_store()
|
|
127
|
+
from devsper.memory.context import _AsyncBridgeStore
|
|
107
128
|
|
|
108
|
-
|
|
109
|
-
backend = getattr(cfg.memory, "backend", "local")
|
|
110
|
-
if backend == "platform":
|
|
111
|
-
# Lazy import so local-only memory backends don't require optional HTTP deps.
|
|
112
|
-
from devsper.memory.platform_memory import PlatformMemoryStore
|
|
129
|
+
return _AsyncBridgeStore(backend)
|
|
113
130
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
131
|
+
|
|
132
|
+
def _build_memory_store():
|
|
133
|
+
"""Build the default memory store via the provider factory."""
|
|
134
|
+
try:
|
|
135
|
+
from devsper.memory.providers.factory import get_memory_provider
|
|
136
|
+
|
|
137
|
+
backend = get_memory_provider()
|
|
138
|
+
return _sync_store_from_backend(backend)
|
|
118
139
|
except Exception:
|
|
119
140
|
pass
|
|
141
|
+
# Hard fallback: bare SQLite
|
|
120
142
|
return MemoryStore()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Concrete MemoryBackend implementations."""
|