devsper 2.4.1__tar.gz → 2.5.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.5.0}/CHANGELOG.md +6 -0
- {devsper-2.4.1 → devsper-2.5.0}/PKG-INFO +28 -1
- {devsper-2.4.1 → devsper-2.5.0}/README.md +24 -0
- devsper-2.5.0/devsper/contracts/__init__.py +5 -0
- devsper-2.5.0/devsper/contracts/platform_event_type.py +68 -0
- devsper-2.5.0/devsper/debug_events.py +38 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/docs/architecture/execution-model.md +1 -1
- devsper-2.5.0/devsper/integrations/__init__.py +34 -0
- devsper-2.5.0/devsper/integrations/langchain_adapter.py +80 -0
- devsper-2.5.0/devsper/integrations/langgraph_adapter.py +151 -0
- devsper-2.5.0/devsper/platform/__init__.py +1 -0
- devsper-2.5.0/devsper/platform/run_context.py +53 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/runtime_events.py +46 -19
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/execution_graph.py +58 -4
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/executor.py +77 -10
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/task_runner.py +31 -2
- devsper-2.5.0/devsper/server/memory_utils.py +475 -0
- devsper-2.5.0/devsper/server/swarmworker.py +786 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/swarm.py +26 -5
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/client.py +47 -19
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/discovery.py +12 -1
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/tool_runner.py +28 -2
- {devsper-2.4.1 → devsper-2.5.0}/devsper/types/event.py +9 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/event_logger.py +10 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/loader.py +1 -1
- {devsper-2.4.1 → devsper-2.5.0}/devsper.toml +8 -3
- devsper-2.5.0/examples/langchain_agent.py +70 -0
- devsper-2.5.0/examples/langgraph_swarm.py +83 -0
- devsper-2.5.0/memory_utils.py +10 -0
- {devsper-2.4.1 → devsper-2.5.0}/pyproject.toml +4 -2
- devsper-2.5.0/scripts/qa_e2e_stabilization.sh +15 -0
- devsper-2.5.0/tests/test_execution_graph_meta.py +31 -0
- devsper-2.5.0/tests/test_langchain_adapter.py +24 -0
- devsper-2.5.0/tests/test_langgraph_adapter.py +63 -0
- devsper-2.5.0/tests/test_platform_runtime_events.py +66 -0
- {devsper-2.4.1 → devsper-2.5.0}/uv.lock +21 -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.5.0}/.env.example +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.github/FUNDING.yml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.gitignore +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/.python-version +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/CONTRIBUTING.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/Cargo.lock +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/Dockerfile.local-pool +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/LICENSE +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/SECURITY.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/benchmarks/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/branding/logo.svg +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/README.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/critic.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/identity.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/roles.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/audit/logger.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/budget.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/message.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/bus/topics.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/export.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/init.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/main.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/election.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/local.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/config/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/config/defaults.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/config/resolver.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/config/schema.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/cli.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/credentials/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/controller.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/events.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/branding.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/collector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/manifest.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/model.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/packager.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/pdf.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/service.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/export/writers.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/context.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/models.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/single.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/platform/request_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/policy/client.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/config.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/manager.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/models.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/security.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/client.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/protocol/server.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/github.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/openai.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/agent_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/health.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/hitl.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/retry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/server/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/server/events.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/server/topology.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/otel.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/base.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/selector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/app.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/layout.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/types/swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/types/task.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/http.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/utils/models.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/context.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/docker-compose.yml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/_common.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/_config.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/coding/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/demo_swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/README.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/documents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/research/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/research/literature_review.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/examples/research/research_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/README.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/agents/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_agent.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_analysis.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_analytics.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_auto_model.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_clarification.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_config_loader.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_credentials.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dag_export.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_event_logger.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_executor.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_export_runs.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_github_provider.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_init.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_missions.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_model_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_planner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_plugins.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_protocols.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_router.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_scheduler.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_speculation.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_strategies.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_swarm.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_task_cache.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_upgrade.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_v110.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_v16.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_v17.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_v18.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_v19.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/test_workflow.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/__init__.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/.dockerignore +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/Cargo.lock +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/Cargo.toml +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/Dockerfile +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/README.md +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/budget.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/bus.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/claim.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/clarification.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/config.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/controller.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/election.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/error.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/executor.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/health.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/lib.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/main.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/metrics.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/registry.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/router.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/rpc.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/event.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/node.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/types/task.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.4.1 → devsper-2.5.0}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.5.0] — 2026-04-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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.
|
|
15
|
+
|
|
10
16
|
## [2.4.1] — 2026-03-31
|
|
11
17
|
|
|
12
18
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.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,7 @@ 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'
|
|
75
78
|
Provides-Extra: worker
|
|
76
79
|
Description-Content-Type: text/markdown
|
|
77
80
|
|
|
@@ -206,6 +209,28 @@ Credentials are injected from the keyring (or env) when config is resolved—no
|
|
|
206
209
|
|
|
207
210
|
---
|
|
208
211
|
|
|
212
|
+
## LangChain integration
|
|
213
|
+
|
|
214
|
+
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.
|
|
215
|
+
|
|
216
|
+
| Module | Purpose |
|
|
217
|
+
|--------|---------|
|
|
218
|
+
| `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`. |
|
|
219
|
+
| `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`). |
|
|
220
|
+
|
|
221
|
+
**Install:** `langchain` is a core dependency of the `devsper` package; **LangGraph** is pulled in transitively. To pin it explicitly: `pip install 'devsper[langgraph]'`.
|
|
222
|
+
|
|
223
|
+
**Examples (from the runtime repo root):**
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
uv run python examples/langchain_agent.py --prompt "Say hi in one sentence."
|
|
227
|
+
uv run python examples/langgraph_swarm.py --workers 4
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Docs: [LangChain integration](https://docs.devsper.com/docs/langchain-integration) (source: `docs/docs/langchain-integration.md` in the docs tree).
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
209
234
|
## Credentials
|
|
210
235
|
|
|
211
236
|
API keys are **not** stored in config files. Use the **credential store** (OS keychain) or environment variables.
|
|
@@ -363,6 +388,8 @@ Rust workers: set `DEVSPER_WORKER_MODEL=github:gpt-4o` (or your model), `DEVSPER
|
|
|
363
388
|
| Dataset analysis | `uv run python examples/data_science/dataset_analysis.py [path-to.csv]` |
|
|
364
389
|
| Document intelligence | `uv run python examples/documents/analyze_documents.py [dir]` |
|
|
365
390
|
| Parameter sweep | `uv run python examples/experiments/parameter_sweep.py --params '{"lr":[0.01,0.1]}'` |
|
|
391
|
+
| LangChain agent (adapter) | `uv run python examples/langchain_agent.py [--live] [--prompt "..."]` |
|
|
392
|
+
| LangGraph DAG (as Devsper tasks) | `uv run python examples/langgraph_swarm.py [--workers N]` |
|
|
366
393
|
|
|
367
394
|
Outputs under `examples/output/`. Run from project root when using script paths.
|
|
368
395
|
|
|
@@ -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
|
|
|
@@ -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)
|