devsper 2.4.1__tar.gz → 2.6.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.4.1 → devsper-2.6.0}/CHANGELOG.md +20 -0
- {devsper-2.4.1 → devsper-2.6.0}/PKG-INFO +30 -1
- {devsper-2.4.1 → devsper-2.6.0}/README.md +24 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/agent.py +2 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/main.py +50 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/config/schema.py +2 -0
- devsper-2.6.0/devsper/contracts/__init__.py +5 -0
- devsper-2.6.0/devsper/contracts/platform_event_type.py +68 -0
- devsper-2.6.0/devsper/debug_events.py +38 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/docs/architecture/execution-model.md +1 -1
- devsper-2.6.0/devsper/integrations/__init__.py +34 -0
- devsper-2.6.0/devsper/integrations/langchain_adapter.py +80 -0
- devsper-2.6.0/devsper/integrations/langgraph_adapter.py +151 -0
- devsper-2.6.0/devsper/platform/__init__.py +1 -0
- devsper-2.6.0/devsper/platform/run_context.py +53 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/runtime_events.py +46 -19
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/execution_graph.py +58 -4
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/executor.py +77 -10
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/task_runner.py +31 -2
- devsper-2.6.0/devsper/server/memory_utils.py +475 -0
- devsper-2.6.0/devsper/server/swarmworker.py +786 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/swarm.py +87 -5
- {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/__init__.py +8 -0
- devsper-2.6.0/devsper/telemetry/trulens.py +119 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/client.py +47 -19
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/discovery.py +12 -1
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/tool_runner.py +28 -2
- {devsper-2.4.1 → devsper-2.6.0}/devsper/types/event.py +9 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/event_logger.py +10 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/loader.py +1 -1
- {devsper-2.4.1 → devsper-2.6.0}/devsper.toml +10 -3
- devsper-2.6.0/examples/langchain_agent.py +70 -0
- devsper-2.6.0/examples/langgraph_swarm.py +83 -0
- devsper-2.6.0/memory_utils.py +10 -0
- {devsper-2.4.1 → devsper-2.6.0}/pyproject.toml +13 -2
- devsper-2.6.0/scripts/qa_e2e_stabilization.sh +15 -0
- devsper-2.6.0/tests/test_execution_graph_meta.py +31 -0
- devsper-2.6.0/tests/test_langchain_adapter.py +24 -0
- devsper-2.6.0/tests/test_langgraph_adapter.py +63 -0
- devsper-2.6.0/tests/test_platform_runtime_events.py +66 -0
- {devsper-2.4.1 → devsper-2.6.0}/uv.lock +217 -2
- devsper-2.4.1/devsper/platform/__init__.py +0 -6
- devsper-2.4.1/devsper/server/swarmworker.py +0 -215
- devsper-2.4.1/requirements-docs.txt +0 -4
- devsper-2.4.1/tests/test_platform_runtime_events.py +0 -37
- {devsper-2.4.1 → devsper-2.6.0}/.env.example +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.github/FUNDING.yml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.gitignore +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/.python-version +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/CONTRIBUTING.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/Cargo.lock +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/Dockerfile.local-pool +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/LICENSE +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/SECURITY.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/benchmarks/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/branding/logo.svg +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/README.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/critic.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/identity.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/roles.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/audit/logger.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/budget.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/message.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/bus/topics.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/export.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/init.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/election.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/local.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/config/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/config/defaults.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/config/resolver.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/cli.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/credentials/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/controller.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/events.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/branding.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/collector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/manifest.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/model.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/packager.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/pdf.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/service.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/export/writers.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/context.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/models.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/single.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/platform/request_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/policy/client.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/config.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/manager.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/models.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/security.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/client.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/protocol/server.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/github.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/openai.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/health.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/hitl.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/retry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/server/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/server/events.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/server/topology.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/otel.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/base.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/selector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/app.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/layout.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/types/swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/types/task.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/http.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/utils/models.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/context.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/docker-compose.yml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/_common.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/_config.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/demo_swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/README.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/documents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/research/literature_review.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/examples/research/research_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/README.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/agents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_analytics.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_auto_model.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_clarification.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_config_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_credentials.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dag_export.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_event_logger.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_executor.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_export_runs.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_github_provider.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_init.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_missions.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_plugins.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_protocols.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_router.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_scheduler.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_speculation.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_strategies.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_task_cache.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_upgrade.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_v110.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_v16.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_v17.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_v18.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_v19.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/test_workflow.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/.dockerignore +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/Cargo.lock +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/Dockerfile +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/README.md +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/budget.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/bus.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/claim.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/clarification.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/config.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/controller.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/election.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/error.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/executor.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/health.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/lib.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/main.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/metrics.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/registry.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/router.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/rpc.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/event.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/node.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/types/task.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.4.1 → devsper-2.6.0}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.6.0] — 2026-04-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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`.
|
|
15
|
+
- **CLI observability dashboard command** — Added `devsper observe` to launch the TruLens dashboard locally with optional `--port` and `--db` overrides.
|
|
16
|
+
- **Optional `trulens` extra** — Added `devsper[trulens]` dependency group for straightforward TruLens installation.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **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.
|
|
21
|
+
- **Agent call capture** — `Agent.run` is instrumented for per-call telemetry capture when TruLens is installed.
|
|
22
|
+
- **Telemetry defaults and examples** — Updated default config template to include TruLens options and local database guidance.
|
|
23
|
+
|
|
24
|
+
## [2.5.0] — 2026-04-06
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **LangChain / LangGraph integrations** — `devsper.integrations.langchain_adapter` and `langgraph_adapter` for wrapping LangChain runnables as Devsper tasks and running compiled LangGraph nodes with Devsper DAG scheduling; CLI-friendly examples under `examples/langchain_agent.py` and `examples/langgraph_swarm.py`; optional extra `pip install 'devsper[langgraph]'` to pin LangGraph.
|
|
29
|
+
|
|
10
30
|
## [2.4.1] — 2026-03-31
|
|
11
31
|
|
|
12
32
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.6.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
|
|
@@ -62,6 +62,8 @@ Requires-Dist: sentence-transformers>=3.0.0; extra == 'embeddings'
|
|
|
62
62
|
Provides-Extra: explainability
|
|
63
63
|
Provides-Extra: hitl
|
|
64
64
|
Requires-Dist: httpx>=0.27; extra == 'hitl'
|
|
65
|
+
Provides-Extra: langgraph
|
|
66
|
+
Requires-Dist: langgraph<2,>=1.0.0; extra == 'langgraph'
|
|
65
67
|
Provides-Extra: mcp
|
|
66
68
|
Requires-Dist: anyio>=4.0; extra == 'mcp'
|
|
67
69
|
Requires-Dist: httpx>=0.27; extra == 'mcp'
|
|
@@ -72,6 +74,9 @@ Provides-Extra: server
|
|
|
72
74
|
Requires-Dist: fastapi>=0.110; extra == 'server'
|
|
73
75
|
Requires-Dist: sse-starlette>=2.0; extra == 'server'
|
|
74
76
|
Requires-Dist: uvicorn>=0.29; extra == 'server'
|
|
77
|
+
Requires-Dist: vektori>=0.1.1; extra == 'server'
|
|
78
|
+
Provides-Extra: trulens
|
|
79
|
+
Requires-Dist: trulens-core>=1.0; extra == 'trulens'
|
|
75
80
|
Provides-Extra: worker
|
|
76
81
|
Description-Content-Type: text/markdown
|
|
77
82
|
|
|
@@ -206,6 +211,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
|
|
|
206
211
|
|
|
207
212
|
---
|
|
208
213
|
|
|
214
|
+
## LangChain integration
|
|
215
|
+
|
|
216
|
+
Devsper ships a **small adapter layer** (not a parallel orchestration stack) so you can keep building in **LangChain** and **LangGraph** while aligning execution with Devsper’s **task / DAG** mental model.
|
|
217
|
+
|
|
218
|
+
| Module | Purpose |
|
|
219
|
+
|--------|---------|
|
|
220
|
+
| `devsper.integrations.langchain_adapter` | Wrap LangChain runnables and agents as tagged `Task`s; `run_langchain_runnable()` runs `ainvoke` / `invoke` and normalizes output for `Task.result`. |
|
|
221
|
+
| `devsper.integrations.langgraph_adapter` | Derive a Devsper task graph from a compiled LangGraph graph (`compiled_graph_to_tasks`); `run_compiled_graph_as_devsper_tasks()` runs each node with bounded concurrency and pluggable state merge (default: concatenate list fields—good for `MessagesState`). |
|
|
222
|
+
|
|
223
|
+
**Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
|
|
224
|
+
|
|
225
|
+
**Examples (from the runtime repo root):**
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
|
|
229
|
+
uv run python examples/langgraph_swarm.py --workers 4
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
209
236
|
## Credentials
|
|
210
237
|
|
|
211
238
|
API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
|
|
@@ -363,6 +390,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
|
|
|
363
390
|
| Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
|
|
364
391
|
| Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
|
|
365
392
|
| Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
|
|
393
|
+
| LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
|
|
394
|
+
| LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
|
|
366
395
|
|
|
367
396
|
Outputs under `examples/output/`. Run from project root when using script paths.
|
|
368
397
|
|
|
@@ -129,6 +129,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
|
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
132
|
+
## LangChain integration
|
|
133
|
+
|
|
134
|
+
Devsper ships a **small adapter layer** (not a parallel orchestration stack) so you can keep building in **LangChain** and **LangGraph** while aligning execution with Devsper’s **task / DAG** mental model.
|
|
135
|
+
|
|
136
|
+
| Module | Purpose |
|
|
137
|
+
|--------|---------|
|
|
138
|
+
| `devsper.integrations.langchain_adapter` | Wrap LangChain runnables and agents as tagged `Task`s; `run_langchain_runnable()` runs `ainvoke` / `invoke` and normalizes output for `Task.result`. |
|
|
139
|
+
| `devsper.integrations.langgraph_adapter` | Derive a Devsper task graph from a compiled LangGraph graph (`compiled_graph_to_tasks`); `run_compiled_graph_as_devsper_tasks()` runs each node with bounded concurrency and pluggable state merge (default: concatenate list fields—good for `MessagesState`). |
|
|
140
|
+
|
|
141
|
+
**Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
|
|
142
|
+
|
|
143
|
+
**Examples (from the runtime repo root):**
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
|
|
147
|
+
uv run python examples/langgraph_swarm.py --workers 4
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
132
154
|
## Credentials
|
|
133
155
|
|
|
134
156
|
API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
|
|
@@ -286,6 +308,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
|
|
|
286
308
|
| Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
|
|
287
309
|
| Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
|
|
288
310
|
| Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
|
|
311
|
+
| LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
|
|
312
|
+
| LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
|
|
289
313
|
|
|
290
314
|
Outputs under `examples/output/`. Run from project root when using script paths.
|
|
291
315
|
|
|
@@ -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
|
|
@@ -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",
|
|
@@ -109,6 +109,8 @@ class TelemetryConfig(BaseModel):
|
|
|
109
109
|
otel_endpoint: str = ""
|
|
110
110
|
otel_headers: dict[str, str] = Field(default_factory=dict)
|
|
111
111
|
cost_tracking: bool = True
|
|
112
|
+
trulens_enabled: bool = True
|
|
113
|
+
trulens_database_url: str = "" # empty = SQLite default (~/.trulens/)
|
|
112
114
|
|
|
113
115
|
|
|
114
116
|
class BudgetConfig(BaseModel):
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Canonical `event_type` strings accepted by the platform runtime ingest API and
|
|
3
|
+
emitted by the runtime forwarder.
|
|
4
|
+
|
|
5
|
+
**Single source of truth for Python.** Mirror:
|
|
6
|
+
`platform/services/api/internal/contracts/runtime_events.go`
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PlatformEventType:
|
|
13
|
+
"""Platform SSE / run_events.event_type values (string constants only)."""
|
|
14
|
+
|
|
15
|
+
RUN_STARTED = "run_started"
|
|
16
|
+
STEP_STARTED = "step_started"
|
|
17
|
+
STEP_COMPLETED = "step_completed"
|
|
18
|
+
AGENT_STARTED = "agent_started"
|
|
19
|
+
AGENT_FINISHED = "agent_finished"
|
|
20
|
+
RUN_PROGRESS = "run_progress"
|
|
21
|
+
TOOL_CALLED = "tool_called"
|
|
22
|
+
RUN_COMPLETED = "run_completed"
|
|
23
|
+
RUN_FAILED = "run_failed"
|
|
24
|
+
CLARIFICATION_REQUESTED = "clarification_requested"
|
|
25
|
+
CLARIFICATION_ANSWERED = "clarification_answered"
|
|
26
|
+
RUN_PAUSED = "run_paused"
|
|
27
|
+
RUN_RESUMED = "run_resumed"
|
|
28
|
+
LOG = "log"
|
|
29
|
+
EXECUTION_GRAPH_UPDATED = "EXECUTION_GRAPH_UPDATED"
|
|
30
|
+
SPECULATIVE_TASK_STARTED = "SPECULATIVE_TASK_STARTED"
|
|
31
|
+
SPECULATIVE_TASK_CANCELLED = "SPECULATIVE_TASK_CANCELLED"
|
|
32
|
+
HITL_REQUESTED = "HITL_REQUESTED"
|
|
33
|
+
HITL_RESOLVED = "HITL_RESOLVED"
|
|
34
|
+
WORKER_ASSIGNED = "WORKER_ASSIGNED"
|
|
35
|
+
AGENT_POOL_USED = "AGENT_POOL_USED"
|
|
36
|
+
EXECUTOR_FINISHED = "executor_finished"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# DevSper `events` enum value (as string) -> platform ingest type
|
|
40
|
+
DEVSPER_TO_PLATFORM: dict[str, str] = {
|
|
41
|
+
"swarm_started": PlatformEventType.RUN_STARTED,
|
|
42
|
+
"executor_started": PlatformEventType.RUN_STARTED,
|
|
43
|
+
"task_started": PlatformEventType.STEP_STARTED,
|
|
44
|
+
"task_completed": PlatformEventType.STEP_COMPLETED,
|
|
45
|
+
"agent_started": PlatformEventType.AGENT_STARTED,
|
|
46
|
+
"agent_finished": PlatformEventType.AGENT_FINISHED,
|
|
47
|
+
"run_completed": PlatformEventType.RUN_COMPLETED,
|
|
48
|
+
"task_failed": PlatformEventType.RUN_FAILED,
|
|
49
|
+
"run_failed": PlatformEventType.RUN_FAILED,
|
|
50
|
+
"tool_called": PlatformEventType.TOOL_CALLED,
|
|
51
|
+
"clarification_requested": PlatformEventType.CLARIFICATION_REQUESTED,
|
|
52
|
+
"clarification_needed": PlatformEventType.CLARIFICATION_REQUESTED,
|
|
53
|
+
"clarification_received": PlatformEventType.CLARIFICATION_ANSWERED,
|
|
54
|
+
"planner_started": PlatformEventType.RUN_PROGRESS,
|
|
55
|
+
"planner_finished": PlatformEventType.RUN_PROGRESS,
|
|
56
|
+
"reasoning_node_added": PlatformEventType.RUN_PROGRESS,
|
|
57
|
+
"budget_warning": PlatformEventType.RUN_PROGRESS,
|
|
58
|
+
"task_created": PlatformEventType.RUN_PROGRESS,
|
|
59
|
+
"task_model_selected": PlatformEventType.RUN_PROGRESS,
|
|
60
|
+
"agent_broadcast": PlatformEventType.RUN_PROGRESS,
|
|
61
|
+
"run_manifest_emitted": PlatformEventType.RUN_PROGRESS,
|
|
62
|
+
"worker_assigned": PlatformEventType.WORKER_ASSIGNED,
|
|
63
|
+
"speculative_started": PlatformEventType.SPECULATIVE_TASK_STARTED,
|
|
64
|
+
"speculative_cancelled": PlatformEventType.SPECULATIVE_TASK_CANCELLED,
|
|
65
|
+
"hitl_requested": PlatformEventType.HITL_REQUESTED,
|
|
66
|
+
"hitl_resolved": PlatformEventType.HITL_RESOLVED,
|
|
67
|
+
"executor_finished": PlatformEventType.EXECUTOR_FINISHED,
|
|
68
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""DEVSPER_DEBUG_EVENTS=1 — log runtime → platform → delivery trail (stderr / logging)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import logging
|
|
7
|
+
import os
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
_LOG = logging.getLogger("devsper.debug_events")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def debug_events_enabled() -> bool:
|
|
14
|
+
return os.environ.get("DEVSPER_DEBUG_EVENTS", "").strip().lower() in (
|
|
15
|
+
"1",
|
|
16
|
+
"true",
|
|
17
|
+
"yes",
|
|
18
|
+
"on",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def log_runtime_emit(stage: str, payload: dict[str, Any]) -> None:
|
|
23
|
+
if not debug_events_enabled():
|
|
24
|
+
return
|
|
25
|
+
try:
|
|
26
|
+
line = json.dumps({"debug_events": stage, **payload}, default=str)
|
|
27
|
+
except TypeError:
|
|
28
|
+
line = str(payload)
|
|
29
|
+
_LOG.info(line)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def log_platform_body(body: dict[str, Any]) -> None:
|
|
33
|
+
if not debug_events_enabled():
|
|
34
|
+
return
|
|
35
|
+
try:
|
|
36
|
+
_LOG.info("[platform_event] %s", json.dumps(body, default=str))
|
|
37
|
+
except TypeError:
|
|
38
|
+
_LOG.info("[platform_event] %s", body)
|
|
@@ -6,7 +6,7 @@ The canonical execution model document lives under **docs**:
|
|
|
6
6
|
|
|
7
7
|
That document is the source of truth for DAG execution, task state machine, HITL clarification (single-node and distributed, including Rust worker), bus topics, TUI lifecycle, and headless mode.
|
|
8
8
|
|
|
9
|
-
For the latest runtime release notes (including 2.
|
|
9
|
+
For the latest runtime release notes (including 2.5.0 LangChain/LangGraph adapters), see:
|
|
10
10
|
|
|
11
11
|
- `https://docs.devsper.com/docs/release_notes`
|
|
12
12
|
- `https://devsper.com/blog/distributed-runtime-upgrade-2-4-0`
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Optional bridges between Devsper and popular agent frameworks (LangChain, LangGraph)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"langchain_task",
|
|
7
|
+
"run_langchain_runnable",
|
|
8
|
+
"stringify_langchain_output",
|
|
9
|
+
"LANGCHAIN_TASK_PREFIX",
|
|
10
|
+
"compiled_graph_to_tasks",
|
|
11
|
+
"default_list_merge_state",
|
|
12
|
+
"run_compiled_graph_as_devsper_tasks",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __getattr__(name: str):
|
|
17
|
+
if name in (
|
|
18
|
+
"langchain_task",
|
|
19
|
+
"run_langchain_runnable",
|
|
20
|
+
"stringify_langchain_output",
|
|
21
|
+
"LANGCHAIN_TASK_PREFIX",
|
|
22
|
+
):
|
|
23
|
+
from devsper.integrations import langchain_adapter as m
|
|
24
|
+
|
|
25
|
+
return getattr(m, name)
|
|
26
|
+
if name in (
|
|
27
|
+
"compiled_graph_to_tasks",
|
|
28
|
+
"default_list_merge_state",
|
|
29
|
+
"run_compiled_graph_as_devsper_tasks",
|
|
30
|
+
):
|
|
31
|
+
from devsper.integrations import langgraph_adapter as m
|
|
32
|
+
|
|
33
|
+
return getattr(m, name)
|
|
34
|
+
raise AttributeError(name)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Wrap LangChain runnables and agent pipelines as Devsper tasks (minimal surface, no extra framework)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from devsper.types.task import Task, TaskStatus
|
|
10
|
+
|
|
11
|
+
LANGCHAIN_TASK_PREFIX = "[devsper:langchain]"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def langchain_task(
|
|
15
|
+
task_id: str,
|
|
16
|
+
*,
|
|
17
|
+
description: str = "",
|
|
18
|
+
dependencies: list[str] | None = None,
|
|
19
|
+
role: str | None = None,
|
|
20
|
+
) -> Task:
|
|
21
|
+
"""Return a Devsper `Task` tagged for LangChain execution (visible in logs and DAG exports)."""
|
|
22
|
+
desc = (description or "").strip() or f"LangChain runnable ({task_id})"
|
|
23
|
+
if LANGCHAIN_TASK_PREFIX not in desc:
|
|
24
|
+
desc = f"{LANGCHAIN_TASK_PREFIX} {desc}"
|
|
25
|
+
return Task(
|
|
26
|
+
id=task_id,
|
|
27
|
+
description=desc,
|
|
28
|
+
dependencies=list(dependencies or []),
|
|
29
|
+
status=TaskStatus.PENDING,
|
|
30
|
+
role=role,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def stringify_langchain_output(value: Any, *, max_len: int = 32000) -> str:
|
|
35
|
+
"""Normalize LangChain/LangGraph outputs to a string suitable for `Task.result`."""
|
|
36
|
+
if value is None:
|
|
37
|
+
return ""
|
|
38
|
+
if hasattr(value, "content"):
|
|
39
|
+
text = getattr(value, "content", value)
|
|
40
|
+
return str(text)[:max_len]
|
|
41
|
+
if isinstance(value, dict):
|
|
42
|
+
if "output" in value:
|
|
43
|
+
return stringify_langchain_output(value["output"], max_len=max_len)
|
|
44
|
+
if "messages" in value:
|
|
45
|
+
parts: list[str] = []
|
|
46
|
+
for m in value["messages"]:
|
|
47
|
+
if hasattr(m, "content"):
|
|
48
|
+
parts.append(str(getattr(m, "content", m)))
|
|
49
|
+
else:
|
|
50
|
+
parts.append(str(m))
|
|
51
|
+
return "\n".join(parts).strip()[:max_len]
|
|
52
|
+
try:
|
|
53
|
+
return json.dumps(value, default=str)[:max_len]
|
|
54
|
+
except TypeError:
|
|
55
|
+
return str(value)[:max_len]
|
|
56
|
+
if isinstance(value, str):
|
|
57
|
+
return value[:max_len]
|
|
58
|
+
return str(value)[:max_len]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
async def run_langchain_runnable(
|
|
62
|
+
task: Task,
|
|
63
|
+
runnable: Any,
|
|
64
|
+
input_data: dict[str, Any] | str | list[Any],
|
|
65
|
+
*,
|
|
66
|
+
config: Any | None = None,
|
|
67
|
+
) -> str:
|
|
68
|
+
"""
|
|
69
|
+
Run a LangChain `Runnable`, agent, or legacy executor with async `ainvoke` when available.
|
|
70
|
+
|
|
71
|
+
`input_data` may be a string (wrapped as `{"input": ...}`), a message list (chat models), or a dict.
|
|
72
|
+
"""
|
|
73
|
+
inp: Any = input_data
|
|
74
|
+
if isinstance(inp, str):
|
|
75
|
+
inp = {"input": inp}
|
|
76
|
+
if hasattr(runnable, "ainvoke"):
|
|
77
|
+
out = await runnable.ainvoke(inp, config=config)
|
|
78
|
+
else:
|
|
79
|
+
out = await asyncio.to_thread(runnable.invoke, inp, config)
|
|
80
|
+
return stringify_langchain_output(out)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Map LangGraph compiled graphs to Devsper task DAGs and run nodes with bounded concurrency."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
from collections.abc import Awaitable, Callable
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from devsper.swarm.scheduler import Scheduler
|
|
12
|
+
from devsper.types.task import Task, TaskStatus
|
|
13
|
+
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
_SKIP = frozenset({"__start__", "__end__"})
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def default_list_merge_state(state: dict[str, Any], patch: dict[str, Any]) -> dict[str, Any]:
|
|
20
|
+
"""
|
|
21
|
+
Merge a node patch into accumulated graph state.
|
|
22
|
+
|
|
23
|
+
For keys present in both sides with list values, lists are concatenated (typical for `MessagesState`).
|
|
24
|
+
Otherwise values from `patch` replace.
|
|
25
|
+
"""
|
|
26
|
+
out = dict(state)
|
|
27
|
+
for k, v in patch.items():
|
|
28
|
+
if k in out and isinstance(out[k], list) and isinstance(v, list):
|
|
29
|
+
out[k] = list(out[k]) + list(v)
|
|
30
|
+
else:
|
|
31
|
+
out[k] = v
|
|
32
|
+
return out
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _patch_summary(patch: dict[str, Any], *, max_len: int = 2000) -> str:
|
|
36
|
+
try:
|
|
37
|
+
return json.dumps(patch, default=str)[:max_len]
|
|
38
|
+
except TypeError:
|
|
39
|
+
return str(patch)[:max_len]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def compiled_graph_to_tasks(compiled: Any, *, description_fmt: str | None = None) -> list[Task]:
|
|
43
|
+
"""
|
|
44
|
+
Build a list of Devsper `Task` objects from a compiled LangGraph graph's static topology.
|
|
45
|
+
|
|
46
|
+
Task ids match LangGraph node names. Dependencies follow edges, ignoring `__start__` / `__end__`.
|
|
47
|
+
Raises if the topology is not a DAG (same validation as `Scheduler.add_tasks`).
|
|
48
|
+
"""
|
|
49
|
+
try:
|
|
50
|
+
G = compiled.get_graph()
|
|
51
|
+
except Exception as exc:
|
|
52
|
+
raise TypeError("object must be a compiled LangGraph graph with get_graph()") from exc
|
|
53
|
+
fmt = description_fmt or "LangGraph node `{name}`"
|
|
54
|
+
predecessors: dict[str, list[str]] = {}
|
|
55
|
+
for edge in G.edges:
|
|
56
|
+
predecessors.setdefault(edge.target, []).append(edge.source)
|
|
57
|
+
tasks: list[Task] = []
|
|
58
|
+
for name in G.nodes:
|
|
59
|
+
if name in _SKIP:
|
|
60
|
+
continue
|
|
61
|
+
preds = [p for p in predecessors.get(name, []) if p not in _SKIP]
|
|
62
|
+
desc = fmt.format(name=name)
|
|
63
|
+
tasks.append(
|
|
64
|
+
Task(
|
|
65
|
+
id=str(name),
|
|
66
|
+
description=desc,
|
|
67
|
+
dependencies=list(preds),
|
|
68
|
+
status=TaskStatus.PENDING,
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
if not tasks:
|
|
72
|
+
raise ValueError("no executable LangGraph nodes found (excluding __start__/__end__)")
|
|
73
|
+
probe = Scheduler()
|
|
74
|
+
probe.add_tasks(tasks)
|
|
75
|
+
return tasks
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
async def run_compiled_graph_as_devsper_tasks(
|
|
79
|
+
compiled: Any,
|
|
80
|
+
initial_state: dict[str, Any],
|
|
81
|
+
*,
|
|
82
|
+
worker_count: int = 4,
|
|
83
|
+
state_merge: Callable[[dict[str, Any], dict[str, Any]], dict[str, Any]] | None = None,
|
|
84
|
+
on_node_complete: Callable[[str, dict[str, Any]], Awaitable[None] | None] | None = None,
|
|
85
|
+
) -> dict[str, Any]:
|
|
86
|
+
"""
|
|
87
|
+
Execute a compiled LangGraph using Devsper's task DAG semantics: each node is one schedulable unit.
|
|
88
|
+
|
|
89
|
+
Ready nodes (dependencies satisfied) run concurrently up to `worker_count`. Shared graph state is
|
|
90
|
+
updated under a lock so parallel branches merge safely; use a custom `state_merge` if your
|
|
91
|
+
schema needs different rules than `default_list_merge_state`.
|
|
92
|
+
"""
|
|
93
|
+
merge = state_merge or default_list_merge_state
|
|
94
|
+
nodes_map = getattr(compiled, "nodes", None)
|
|
95
|
+
if not isinstance(nodes_map, dict):
|
|
96
|
+
raise TypeError("compiled graph has no nodes mapping")
|
|
97
|
+
|
|
98
|
+
tasks = compiled_graph_to_tasks(compiled)
|
|
99
|
+
scheduler = Scheduler()
|
|
100
|
+
scheduler.add_tasks(tasks)
|
|
101
|
+
|
|
102
|
+
state: dict[str, Any] = dict(initial_state)
|
|
103
|
+
lock = asyncio.Lock()
|
|
104
|
+
sem = asyncio.Semaphore(max(1, int(worker_count)))
|
|
105
|
+
failures: list[BaseException] = []
|
|
106
|
+
|
|
107
|
+
async def run_one(task: Task) -> None:
|
|
108
|
+
name = task.id
|
|
109
|
+
node = nodes_map.get(name)
|
|
110
|
+
if node is None:
|
|
111
|
+
async with lock:
|
|
112
|
+
scheduler.mark_failed(name, f"no Pregel node for {name!r}")
|
|
113
|
+
failures.append(KeyError(name))
|
|
114
|
+
return
|
|
115
|
+
try:
|
|
116
|
+
async with sem:
|
|
117
|
+
async with lock:
|
|
118
|
+
snapshot = dict(state)
|
|
119
|
+
patch = await node.ainvoke(snapshot)
|
|
120
|
+
if not isinstance(patch, dict):
|
|
121
|
+
patch = {"output": patch}
|
|
122
|
+
async with lock:
|
|
123
|
+
merged = merge(state, patch)
|
|
124
|
+
state.clear()
|
|
125
|
+
state.update(merged)
|
|
126
|
+
scheduler.mark_completed(name, _patch_summary(patch))
|
|
127
|
+
if on_node_complete is not None:
|
|
128
|
+
async with lock:
|
|
129
|
+
snap = dict(state)
|
|
130
|
+
await on_node_complete(name, snap)
|
|
131
|
+
except Exception as exc: # noqa: BLE001 — surface as task failure + aggregate
|
|
132
|
+
log.exception("langgraph node %s failed", name)
|
|
133
|
+
async with lock:
|
|
134
|
+
scheduler.mark_failed(name, f"{type(exc).__name__}: {exc}")
|
|
135
|
+
failures.append(exc)
|
|
136
|
+
|
|
137
|
+
while not scheduler.is_finished():
|
|
138
|
+
if any(t.status == TaskStatus.FAILED for t in scheduler.get_all_tasks()):
|
|
139
|
+
for t in scheduler.get_all_tasks():
|
|
140
|
+
if t.status == TaskStatus.PENDING:
|
|
141
|
+
scheduler.mark_failed(t.id, "aborted: upstream LangGraph node failure")
|
|
142
|
+
break
|
|
143
|
+
ready = scheduler.get_ready_tasks()
|
|
144
|
+
if not ready:
|
|
145
|
+
await asyncio.sleep(0.01)
|
|
146
|
+
continue
|
|
147
|
+
await asyncio.gather(*(run_one(t) for t in ready))
|
|
148
|
+
|
|
149
|
+
if failures:
|
|
150
|
+
raise failures[0]
|
|
151
|
+
return dict(state)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Platform integration helpers (swarmworker, metrics, run context)."""
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Per-request execution context for platform swarmworker (thread-local).
|
|
3
|
+
Used for org-scoped tool metrics in Redis.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
import threading
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
_tls = threading.local()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def set_execution_org(org_id: str) -> None:
|
|
18
|
+
_tls.org_id = (org_id or "").strip()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def clear_execution_org() -> None:
|
|
22
|
+
_tls.org_id = ""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_execution_org_id() -> str:
|
|
26
|
+
return getattr(_tls, "org_id", "") or ""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def record_tool_call(tool_name: str, ok: bool, latency_ms: int) -> None:
|
|
30
|
+
"""Best-effort Redis counters: devsper:tool_metrics:{org_id} hash fields {tool}:calls, :fail, :lat_ms."""
|
|
31
|
+
oid = get_execution_org_id()
|
|
32
|
+
if not oid or not tool_name:
|
|
33
|
+
return
|
|
34
|
+
url = (os.environ.get("REDIS_URL") or "").strip()
|
|
35
|
+
if not url:
|
|
36
|
+
return
|
|
37
|
+
try:
|
|
38
|
+
import redis # type: ignore[import-untyped]
|
|
39
|
+
except ImportError:
|
|
40
|
+
return
|
|
41
|
+
key = f"devsper:tool_metrics:{oid}"
|
|
42
|
+
prefix = f"{tool_name}:"
|
|
43
|
+
try:
|
|
44
|
+
r = redis.Redis.from_url(url, decode_responses=True)
|
|
45
|
+
p = r.pipeline()
|
|
46
|
+
p.hincrby(key, prefix + "calls", 1)
|
|
47
|
+
if not ok:
|
|
48
|
+
p.hincrby(key, prefix + "fail", 1)
|
|
49
|
+
p.hincrby(key, prefix + "lat_ms", max(0, int(latency_ms)))
|
|
50
|
+
p.expire(key, 86400 * 30) # 30d retention
|
|
51
|
+
p.execute()
|
|
52
|
+
except Exception as ex:
|
|
53
|
+
logger.debug("tool metrics redis skipped: %s", ex)
|