devsper 2.6.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.6.0 → devsper-2.7.0}/CHANGELOG.md +27 -1
- {devsper-2.6.0 → devsper-2.7.0}/PKG-INFO +6 -1
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/init.py +25 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/config/schema.py +33 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/cli.py +11 -1
- {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/store.py +11 -0
- devsper-2.7.0/devsper/memory/context.py +134 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_index.py +73 -2
- {devsper-2.6.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.6.0 → devsper-2.7.0}/devsper/tools/registry.py +7 -0
- {devsper-2.6.0 → devsper-2.7.0}/pyproject.toml +3 -1
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_e2e_redis_loop.py +4 -1
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_pipelines.py +4 -7
- {devsper-2.6.0 → devsper-2.7.0}/uv.lock +158 -2
- devsper-2.6.0/devsper/memory/context.py +0 -53
- {devsper-2.6.0 → devsper-2.7.0}/.env.example +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.github/FUNDING.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.gitignore +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/.python-version +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/CONTRIBUTING.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/Cargo.lock +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/Dockerfile.local-pool +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/LICENSE +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/SECURITY.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/benchmarks/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/branding/logo.svg +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/critic.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/identity.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/roles.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/audit/logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/budget.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/message.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/bus/topics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/main.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/election.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/local.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/config/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/config/defaults.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/config/resolver.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/contracts/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/contracts/platform_event_type.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/debug_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/docs/architecture/execution-model.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/branding.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/collector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/manifest.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/model.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/packager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/pdf.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/export/writers.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/langchain_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/integrations/langgraph_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/single.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/request_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/run_context.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/policy/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/config.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/security.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/protocol/server.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/github.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/openai.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/execution_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/health.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/hitl.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/retry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/task_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/server/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/server/events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/server/memory_utils.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/server/swarmworker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/server/topology.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/swarm/swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/otel.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/telemetry/trulens.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/base.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/app.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/layout.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/types/event.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/types/swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/types/task.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/event_logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/http.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/utils/models.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/context.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/devsper.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/docker-compose.yml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/_common.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/_config.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/coding/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/demo_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/documents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/langchain_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/langgraph_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/research/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/research/literature_review.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/examples/research/research_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/memory_utils.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/qa_e2e_stabilization.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/agents/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_agent.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_analysis.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_analytics.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_auto_model.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_clarification.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_config_loader.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_credentials.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dag_export.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_event_logger.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_execution_graph_meta.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_executor.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_export_runs.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_github_provider.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_init.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_langchain_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_langgraph_adapter.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_missions.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_model_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_planner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_plugins.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_protocols.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_router.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_scheduler.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_speculation.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_strategies.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_swarm.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_task_cache.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_upgrade.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_v110.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_v16.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_v17.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_v18.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_v19.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/test_workflow.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/__init__.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/.dockerignore +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/Cargo.lock +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/Cargo.toml +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/Dockerfile +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/README.md +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/budget.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/bus.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/claim.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/clarification.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/config.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/controller.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/election.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/error.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/executor.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/health.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/lib.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/main.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/metrics.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/registry.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/router.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/rpc.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/event.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/node.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/types/task.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.6.0 → devsper-2.7.0}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,32 @@ 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
|
+
|
|
10
36
|
## [2.6.0] — 2026-04-06
|
|
11
37
|
|
|
12
38
|
### Added
|
|
@@ -82,7 +108,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
82
108
|
|
|
83
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.
|
|
84
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.
|
|
85
|
-
- **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.
|
|
86
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.
|
|
87
113
|
- **Devsper Cloud CLI** — `devsper cloud login`, `logout`, `run`, `status`, and `logs` for JWT authentication (OS keychain) and runs against the platform API.
|
|
88
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,8 @@ 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'
|
|
78
83
|
Provides-Extra: trulens
|
|
79
84
|
Requires-Dist: trulens-core>=1.0; extra == 'trulens'
|
|
80
85
|
Provides-Extra: worker
|
|
@@ -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())
|
|
@@ -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):
|
|
@@ -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."""
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PlatformBackend: wraps PlatformMemoryStore for users with backend = "platform".
|
|
3
|
+
|
|
4
|
+
Preserves existing behavior for the platform API memory path.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from devsper.memory.providers.base import MemoryBackend, MemoryQuery
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from devsper.memory.platform_memory import PlatformMemoryStore
|
|
16
|
+
from devsper.memory.memory_types import MemoryRecord, MemoryType
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class PlatformBackend(MemoryBackend):
|
|
20
|
+
"""Remote platform API memory store. Preserves backend = 'platform' behavior."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, base_url: str = "", org_slug: str = "") -> None:
|
|
23
|
+
from devsper.memory.platform_memory import PlatformMemoryStore
|
|
24
|
+
|
|
25
|
+
self._store = PlatformMemoryStore(base_url=base_url, org_slug=org_slug)
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def name(self) -> str:
|
|
29
|
+
return "platform"
|
|
30
|
+
|
|
31
|
+
def get_sync_store(self) -> "PlatformMemoryStore":
|
|
32
|
+
return self._store
|
|
33
|
+
|
|
34
|
+
async def store(self, record: "MemoryRecord", namespace: str | None = None) -> str:
|
|
35
|
+
return await asyncio.to_thread(self._store.store, record, namespace)
|
|
36
|
+
|
|
37
|
+
async def retrieve(self, memory_id: str, namespace: str | None = None) -> "MemoryRecord | None":
|
|
38
|
+
return await asyncio.to_thread(self._store.retrieve, memory_id, namespace)
|
|
39
|
+
|
|
40
|
+
async def delete(self, memory_id: str, namespace: str | None = None) -> bool:
|
|
41
|
+
return await asyncio.to_thread(self._store.delete, memory_id, namespace)
|
|
42
|
+
|
|
43
|
+
async def list_memory(
|
|
44
|
+
self,
|
|
45
|
+
memory_type: "MemoryType | None" = None,
|
|
46
|
+
limit: int = 100,
|
|
47
|
+
offset: int = 0,
|
|
48
|
+
tag_contains: str | None = None,
|
|
49
|
+
include_archived: bool = False,
|
|
50
|
+
run_id_filter: str | None = None,
|
|
51
|
+
namespace: str | None = None,
|
|
52
|
+
) -> "list[MemoryRecord]":
|
|
53
|
+
return await asyncio.to_thread(
|
|
54
|
+
self._store.list_memory,
|
|
55
|
+
memory_type, limit, offset, tag_contains,
|
|
56
|
+
include_archived, run_id_filter, namespace,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
async def list_all_ids(
|
|
60
|
+
self,
|
|
61
|
+
memory_type: "MemoryType | None" = None,
|
|
62
|
+
namespace: str | None = None,
|
|
63
|
+
) -> list[str]:
|
|
64
|
+
return await asyncio.to_thread(self._store.list_all_ids, memory_type, namespace)
|
|
65
|
+
|
|
66
|
+
async def query_similar(self, query: MemoryQuery) -> "list[MemoryRecord]":
|
|
67
|
+
return []
|
|
68
|
+
|
|
69
|
+
async def health(self) -> bool:
|
|
70
|
+
try:
|
|
71
|
+
await asyncio.to_thread(self._store.list_memory, None, 1)
|
|
72
|
+
return True
|
|
73
|
+
except Exception:
|
|
74
|
+
return False
|