devsper 2.3.0__tar.gz → 2.4.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.3.0 → devsper-2.4.0}/CHANGELOG.md +19 -0
- {devsper-2.3.0 → devsper-2.4.0}/PKG-INFO +1 -1
- devsper-2.4.0/devsper/README.md +148 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/agent.py +14 -1
- devsper-2.4.0/devsper/distributed/__init__.py +7 -0
- devsper-2.4.0/devsper/distributed/controller.py +70 -0
- devsper-2.4.0/devsper/distributed/worker_runtime.py +43 -0
- devsper-2.4.0/devsper/runtime/__init__.py +34 -0
- devsper-2.4.0/devsper/runtime/agent_pool.py +85 -0
- devsper-2.4.0/devsper/runtime/agent_runner.py +79 -0
- devsper-2.4.0/devsper/runtime/event_stream.py +58 -0
- devsper-2.4.0/devsper/runtime/execution_graph.py +101 -0
- devsper-2.4.0/devsper/runtime/executor.py +210 -0
- devsper-2.4.0/devsper/runtime/hitl.py +71 -0
- devsper-2.4.0/devsper/runtime/model_router.py +44 -0
- devsper-2.4.0/devsper/runtime/planner.py +28 -0
- devsper-2.4.0/devsper/runtime/retry.py +61 -0
- devsper-2.4.0/devsper/runtime/speculative_planner.py +51 -0
- devsper-2.4.0/devsper/runtime/state_manager.py +52 -0
- devsper-2.4.0/devsper/runtime/task_runner.py +87 -0
- devsper-2.4.0/devsper/runtime/tool_runner.py +169 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/swarm.py +1 -1
- {devsper-2.3.0 → devsper-2.4.0}/pyproject.toml +1 -1
- devsper-2.3.0/devsper/runtime/__init__.py +0 -12
- devsper-2.3.0/devsper/runtime/executor.py +0 -5
- {devsper-2.3.0 → devsper-2.4.0}/.env.example +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.github/FUNDING.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.gitignore +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/.python-version +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/CONTRIBUTING.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/Cargo.lock +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/Dockerfile.local-pool +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/LICENSE +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/SECURITY.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/benchmarks/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/branding/logo.svg +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/critic.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/identity.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/roles.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/audit/logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/budget.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/message.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/bus/topics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/init.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/main.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/run_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/election.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/local.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/config/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/config/defaults.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/config/resolver.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/config/schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/cli.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/credentials/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/docs/architecture/execution-model.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/branding.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/collector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/manifest.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/model.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/packager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/pdf.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/export/writers.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/context.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/single.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/request_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/policy/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/config.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/manager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/security.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/protocol/server.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/github.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/openai.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/health.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/server/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/server/events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/server/swarmworker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/server/topology.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/otel.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/app.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/layout.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/types/event.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/types/swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/types/task.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/event_logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/http.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/utils/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/context.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/devsper.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/docker-compose.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/_common.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/_config.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/demo_swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/documents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/research/literature_review.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/examples/research/research_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/requirements-docs.txt +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/agents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_analytics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_auto_model.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_clarification.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_config_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_credentials.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dag_export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_event_logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_executor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_export_runs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_github_provider.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_init.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_missions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_model_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_plugins.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_protocols.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_scheduler.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_speculation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_strategies.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_task_cache.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_upgrade.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_v110.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_v16.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_v17.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_v18.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_v19.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/test_workflow.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/uv.lock +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/.dockerignore +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/Cargo.lock +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/Dockerfile +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/budget.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/bus.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/claim.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/clarification.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/config.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/controller.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/election.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/error.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/executor.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/health.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/lib.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/main.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/metrics.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/registry.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/router.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/rpc.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/event.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/node.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/types/task.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.0}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.4.0] — 2026-03-31
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Distributed runtime extension layer** — Added `devsper.distributed` package with controller and worker-runtime wrappers for clean orchestration composition.
|
|
15
|
+
- **Agent pool** — Added `runtime/agent_pool.py` with reusable, worker-aware concurrent agent leasing (`acquire_agent`, `release_agent`, `run_agent`, `run_parallel`).
|
|
16
|
+
- **Model router (runtime layer)** — Added `runtime/model_router.py` for planning/reasoning/validation model routing with fallback chains.
|
|
17
|
+
- **Speculative planner (runtime layer)** — Added `runtime/speculative_planner.py` to predict and stage speculative successor tasks.
|
|
18
|
+
- **Runtime HITL manager** — Added `runtime/hitl.py` for pause/resume and explicit human-input request lifecycle handling.
|
|
19
|
+
- **Execution graph upgrades** — Extended runtime execution graph with worker assignment metadata and distributed lineage tracking.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **Executor composition** — Runtime executor now integrates AgentPool, ModelRouter, speculative planning hooks, and distributed assignment tracking while preserving default behavior.
|
|
24
|
+
- **Task runner routing** — Task execution now supports pool-backed agent execution, scoped model routing, and fallback chain handling.
|
|
25
|
+
- **Tool execution control** — Runtime ToolRunner now supports bounded concurrency, dependency-aware batching, per-call timeout, cancellation, and structured results.
|
|
26
|
+
- **Event backpressure handling** — Runtime event stream now uses bounded queues with controlled overflow behavior.
|
|
27
|
+
- **Runtime docs** — Updated runtime architecture docs in `devsper/README.md` with distributed flow, worker/controller lifecycle, and HITL/speculative execution details.
|
|
28
|
+
|
|
10
29
|
## [2.3.0] — 2026-03-30
|
|
11
30
|
|
|
12
31
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.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
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Devsper Runtime Core
|
|
2
|
+
|
|
3
|
+
Devsper runtime is built as a modular orchestration core with bounded concurrency, dynamic DAG mutation, and event-stream-driven observability.
|
|
4
|
+
|
|
5
|
+
## Runtime Architecture Diagram
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
User Task
|
|
9
|
+
|
|
|
10
|
+
v
|
|
11
|
+
Swarm.run()
|
|
12
|
+
|
|
|
13
|
+
v
|
|
14
|
+
Planner -> Scheduler (DAG)
|
|
15
|
+
|
|
|
16
|
+
v
|
|
17
|
+
Runtime Executor ------------------------------+
|
|
18
|
+
| |
|
|
19
|
+
+-> RuntimeStateManager |
|
|
20
|
+
+-> ExecutionGraph |
|
|
21
|
+
+-> RuntimeEventStream -> EventLog -> SSE |
|
|
22
|
+
+-> TaskRunner |
|
|
23
|
+
+-> AgentRunner (optional stream-tool loop)
|
|
24
|
+
+-> Agent
|
|
25
|
+
+-> ToolRunner / tools.tool_runner
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Core Components
|
|
29
|
+
|
|
30
|
+
- `swarm/swarm.py`
|
|
31
|
+
- Public entrypoint (`Swarm`), config/wiring, planning and execution bootstrap.
|
|
32
|
+
- `runtime/executor.py`
|
|
33
|
+
- Event-driven scheduler loop, bounded parallel execution, cancellation propagation, dynamic task injection.
|
|
34
|
+
- `runtime/state_manager.py`
|
|
35
|
+
- Concurrency-safe task state transitions and runtime DAG mutation entrypoint.
|
|
36
|
+
- `runtime/execution_graph.py`
|
|
37
|
+
- Execution graph with lineage, edges, attempts, and status transitions.
|
|
38
|
+
- `runtime/planner.py`
|
|
39
|
+
- Runtime wrapper for dynamic planner expansion and parent-child lineage.
|
|
40
|
+
- `runtime/task_runner.py`
|
|
41
|
+
- Task lifecycle orchestration with scoped retries and fallback model handling.
|
|
42
|
+
- `runtime/agent_runner.py`
|
|
43
|
+
- Async agent wrapper with optional streaming tool invocation loop.
|
|
44
|
+
- `runtime/tool_runner.py`
|
|
45
|
+
- Parallel tool scheduler with bounded concurrency, dependency-aware batching, timeout, and cancellation.
|
|
46
|
+
- `runtime/event_stream.py`
|
|
47
|
+
- In-process stream with queue backpressure policy (drop-oldest on overflow).
|
|
48
|
+
- `runtime/retry.py`
|
|
49
|
+
- Retry scopes (`tool`, `agent`, `task`, `model_fallback`) and backoff policies.
|
|
50
|
+
|
|
51
|
+
## Execution Lifecycle
|
|
52
|
+
|
|
53
|
+
1. `Swarm.run()` creates root task, plans subtasks, and builds scheduler DAG.
|
|
54
|
+
2. Executor emits `EXECUTOR_STARTED` and begins bounded task dispatch.
|
|
55
|
+
3. Ready tasks transition to running through `RuntimeStateManager`.
|
|
56
|
+
4. `TaskRunner` executes with scoped retries.
|
|
57
|
+
5. `AgentRunner` may invoke tools (normal or streaming tool loop).
|
|
58
|
+
6. Task completion/failure updates scheduler + execution graph.
|
|
59
|
+
7. Adaptive mode can inject follow-up tasks at runtime.
|
|
60
|
+
8. Executor emits `EXECUTOR_FINISHED` and `RUN_COMPLETED`.
|
|
61
|
+
|
|
62
|
+
## Tool Calling Flow
|
|
63
|
+
|
|
64
|
+
1. Agent determines tool intent from model output.
|
|
65
|
+
2. Tool calls are parsed and scheduled.
|
|
66
|
+
3. `ToolRunner.run_many(...)` executes calls in parallel with:
|
|
67
|
+
- `max_concurrency` semaphore
|
|
68
|
+
- dependency constraints (`depends_on`)
|
|
69
|
+
- per-call timeouts
|
|
70
|
+
- cancellation checks
|
|
71
|
+
4. Results are isolated per call and fed back into agent loop.
|
|
72
|
+
|
|
73
|
+
## Planner Flow
|
|
74
|
+
|
|
75
|
+
1. Initial decomposition by `swarm/planner.py`.
|
|
76
|
+
2. Runtime execution completes a task.
|
|
77
|
+
3. `RuntimePlanner.expand(...)` optionally creates follow-up tasks.
|
|
78
|
+
4. `RuntimeStateManager.add_tasks(...)` mutates DAG safely.
|
|
79
|
+
5. `ExecutionGraph` records lineage from parent task.
|
|
80
|
+
|
|
81
|
+
## Concurrency Model
|
|
82
|
+
|
|
83
|
+
- Bounded executor workers (`worker_count`).
|
|
84
|
+
- Bounded tool concurrency (`ToolRunner` semaphore).
|
|
85
|
+
- Queue backpressure in event streaming (`max_queue_size` with controlled dropping).
|
|
86
|
+
- Cooperative pause/resume and cancellation propagation across runtime loops.
|
|
87
|
+
- Lock-guarded scheduler mutations via `RuntimeStateManager`.
|
|
88
|
+
|
|
89
|
+
## Distributed Runtime Architecture
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
Controller
|
|
93
|
+
|
|
|
94
|
+
v
|
|
95
|
+
Worker Pool
|
|
96
|
+
|
|
|
97
|
+
v
|
|
98
|
+
Worker Runtime
|
|
99
|
+
|
|
|
100
|
+
v
|
|
101
|
+
Runtime Executor
|
|
102
|
+
|
|
|
103
|
+
v
|
|
104
|
+
Agent Pool
|
|
105
|
+
|
|
|
106
|
+
v
|
|
107
|
+
Tool Runner
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- `distributed/controller.py`
|
|
111
|
+
- Worker registry, health state, load-aware assignment, reassignment hooks.
|
|
112
|
+
- `distributed/worker_runtime.py`
|
|
113
|
+
- Worker-local runtime composition: `Executor`, `AgentPool`, `ModelRouter`, `ToolRunner`.
|
|
114
|
+
- Existing multi-node transport/control remains in `nodes/controller.py` and `nodes/worker.py`.
|
|
115
|
+
|
|
116
|
+
## Worker Lifecycle
|
|
117
|
+
|
|
118
|
+
1. Worker registers with controller.
|
|
119
|
+
2. Controller assigns tasks based on health and load.
|
|
120
|
+
3. Worker executes task locally through runtime executor stack.
|
|
121
|
+
4. Worker returns completion/failure.
|
|
122
|
+
5. Controller updates worker/task state and reassigns on failure.
|
|
123
|
+
|
|
124
|
+
## Controller Lifecycle
|
|
125
|
+
|
|
126
|
+
1. Track worker registration and health.
|
|
127
|
+
2. Assign ready tasks using load-aware strategy.
|
|
128
|
+
3. Handle failures and perform retry/reassignment.
|
|
129
|
+
4. Maintain global execution progress via event/log channels.
|
|
130
|
+
|
|
131
|
+
## Agent Pool
|
|
132
|
+
|
|
133
|
+
- `AgentPool` manages reusable agent instances per worker.
|
|
134
|
+
- Supports `acquire_agent`, `release_agent`, `run_agent`, and `run_parallel`.
|
|
135
|
+
- Enables worker-local, concurrent, reuse-based execution.
|
|
136
|
+
|
|
137
|
+
## Speculative Execution
|
|
138
|
+
|
|
139
|
+
- `SpeculativePlanner` predicts likely successor tasks.
|
|
140
|
+
- Executor marks/schedules speculative tasks early.
|
|
141
|
+
- Unused speculative branches can be cancelled on dependency failure.
|
|
142
|
+
|
|
143
|
+
## HITL Flow
|
|
144
|
+
|
|
145
|
+
1. Agent indicates human input is required.
|
|
146
|
+
2. Runtime emits HITL/clarification event.
|
|
147
|
+
3. Task pauses until response or timeout.
|
|
148
|
+
4. Execution resumes or fails based on response policy.
|
|
@@ -454,11 +454,24 @@ def _format_tools_section(tools: list | None = None) -> str:
|
|
|
454
454
|
from devsper.tools.registry import list_tools
|
|
455
455
|
|
|
456
456
|
tools = list_tools()
|
|
457
|
+
max_props = 8
|
|
457
458
|
lines = []
|
|
458
459
|
for t in tools:
|
|
459
460
|
schema = getattr(t, "input_schema", None) or getattr(t, "schema", {}) or {}
|
|
461
|
+
schema_type = schema.get("type", "object")
|
|
462
|
+
required = schema.get("required", []) or []
|
|
463
|
+
props = schema.get("properties", {}) if isinstance(schema.get("properties", {}), dict) else {}
|
|
464
|
+
compact_props: dict[str, dict] = {}
|
|
465
|
+
for key in list(props.keys())[:max_props]:
|
|
466
|
+
p = props.get(key, {}) or {}
|
|
467
|
+
compact_props[key] = {"type": p.get("type", "string")}
|
|
468
|
+
compact_schema = {
|
|
469
|
+
"type": schema_type,
|
|
470
|
+
"required": required[:max_props],
|
|
471
|
+
"properties": compact_props,
|
|
472
|
+
}
|
|
460
473
|
lines.append(f"- {t.name}: {t.description}")
|
|
461
|
-
lines.append(f" input_schema: {json.dumps(
|
|
474
|
+
lines.append(f" input_schema: {json.dumps(compact_schema, separators=(',', ':'))}")
|
|
462
475
|
return "\n".join(lines)
|
|
463
476
|
|
|
464
477
|
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
from devsper.cluster.router import TaskRouter
|
|
7
|
+
from devsper.types.task import Task
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class WorkerState:
|
|
12
|
+
worker_id: str
|
|
13
|
+
healthy: bool = True
|
|
14
|
+
active_tasks: int = 0
|
|
15
|
+
max_workers: int = 1
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DistributedController:
|
|
19
|
+
"""Controller-side worker orchestration and task assignment."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, router: TaskRouter | None = None) -> None:
|
|
22
|
+
self._router = router or TaskRouter()
|
|
23
|
+
self._workers: dict[str, WorkerState] = {}
|
|
24
|
+
self._task_assignments: dict[str, str] = {}
|
|
25
|
+
self._lock = asyncio.Lock()
|
|
26
|
+
|
|
27
|
+
async def register_worker(self, worker_id: str, max_workers: int = 1) -> None:
|
|
28
|
+
async with self._lock:
|
|
29
|
+
self._workers[worker_id] = WorkerState(
|
|
30
|
+
worker_id=worker_id,
|
|
31
|
+
healthy=True,
|
|
32
|
+
active_tasks=0,
|
|
33
|
+
max_workers=max(1, int(max_workers)),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
async def mark_worker_unhealthy(self, worker_id: str) -> None:
|
|
37
|
+
async with self._lock:
|
|
38
|
+
if worker_id in self._workers:
|
|
39
|
+
self._workers[worker_id].healthy = False
|
|
40
|
+
|
|
41
|
+
async def health_check(self) -> dict[str, bool]:
|
|
42
|
+
async with self._lock:
|
|
43
|
+
return {wid: ws.healthy for wid, ws in self._workers.items()}
|
|
44
|
+
|
|
45
|
+
async def assign_task(self, task: Task) -> str | None:
|
|
46
|
+
async with self._lock:
|
|
47
|
+
candidates = [
|
|
48
|
+
ws
|
|
49
|
+
for ws in self._workers.values()
|
|
50
|
+
if ws.healthy and ws.active_tasks < ws.max_workers
|
|
51
|
+
]
|
|
52
|
+
if not candidates:
|
|
53
|
+
return None
|
|
54
|
+
# Lightweight balancing by active load.
|
|
55
|
+
candidates.sort(key=lambda ws: (ws.active_tasks / max(1, ws.max_workers), ws.worker_id))
|
|
56
|
+
chosen = candidates[0]
|
|
57
|
+
chosen.active_tasks += 1
|
|
58
|
+
self._task_assignments[task.id] = chosen.worker_id
|
|
59
|
+
return chosen.worker_id
|
|
60
|
+
|
|
61
|
+
async def complete_task(self, task_id: str) -> None:
|
|
62
|
+
async with self._lock:
|
|
63
|
+
wid = self._task_assignments.pop(task_id, None)
|
|
64
|
+
if wid and wid in self._workers:
|
|
65
|
+
self._workers[wid].active_tasks = max(0, self._workers[wid].active_tasks - 1)
|
|
66
|
+
|
|
67
|
+
async def reassign_on_failure(self, task: Task, failed_worker_id: str) -> str | None:
|
|
68
|
+
await self.mark_worker_unhealthy(failed_worker_id)
|
|
69
|
+
return await self.assign_task(task)
|
|
70
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from devsper.agents.agent import Agent
|
|
6
|
+
from devsper.runtime.agent_pool import AgentPool
|
|
7
|
+
from devsper.runtime.executor import Executor
|
|
8
|
+
from devsper.runtime.model_router import ModelRouter
|
|
9
|
+
from devsper.runtime.tool_runner import ToolRunner
|
|
10
|
+
from devsper.swarm.scheduler import Scheduler
|
|
11
|
+
from devsper.utils.event_logger import EventLog
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class WorkerRuntime:
|
|
16
|
+
"""Worker-local runtime for agent/tool execution."""
|
|
17
|
+
|
|
18
|
+
scheduler: Scheduler
|
|
19
|
+
agent: Agent
|
|
20
|
+
event_log: EventLog
|
|
21
|
+
worker_id: str = "worker-local"
|
|
22
|
+
max_agents: int = 4
|
|
23
|
+
tool_concurrency: int = 4
|
|
24
|
+
|
|
25
|
+
def __post_init__(self) -> None:
|
|
26
|
+
self.agent_pool = AgentPool(lambda: self.agent, max_agents=self.max_agents)
|
|
27
|
+
self.model_router = ModelRouter(
|
|
28
|
+
planning_model=getattr(self.agent, "model_name", "mock"),
|
|
29
|
+
reasoning_model=getattr(self.agent, "model_name", "mock"),
|
|
30
|
+
validation_model=getattr(self.agent, "model_name", "mock"),
|
|
31
|
+
)
|
|
32
|
+
self.tool_runner = ToolRunner(parallelism=self.tool_concurrency)
|
|
33
|
+
self.executor = Executor(
|
|
34
|
+
scheduler=self.scheduler,
|
|
35
|
+
agent=self.agent,
|
|
36
|
+
event_log=self.event_log,
|
|
37
|
+
worker_count=self.max_agents,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
async def run_task_queue(self) -> dict[str, str]:
|
|
41
|
+
await self.executor.run()
|
|
42
|
+
return self.scheduler.get_results()
|
|
43
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""Runtime utilities: replay, telemetry, visualization."""
|
|
2
|
+
|
|
3
|
+
from devsper.runtime.replay import replay_execution
|
|
4
|
+
from devsper.runtime.telemetry import collect_telemetry, print_telemetry_summary
|
|
5
|
+
from devsper.runtime.visualize import visualize_scheduler_dag
|
|
6
|
+
from devsper.runtime.executor import Executor
|
|
7
|
+
from devsper.runtime.state_manager import RuntimeStateManager
|
|
8
|
+
from devsper.runtime.task_runner import TaskRunner
|
|
9
|
+
from devsper.runtime.agent_runner import AgentRunner
|
|
10
|
+
from devsper.runtime.tool_runner import ToolRunner
|
|
11
|
+
from devsper.runtime.execution_graph import ExecutionGraph
|
|
12
|
+
from devsper.runtime.planner import RuntimePlanner
|
|
13
|
+
from devsper.runtime.agent_pool import AgentPool
|
|
14
|
+
from devsper.runtime.model_router import ModelRouter
|
|
15
|
+
from devsper.runtime.speculative_planner import SpeculativePlanner
|
|
16
|
+
from devsper.runtime.hitl import HITLManager
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"Executor",
|
|
20
|
+
"RuntimeStateManager",
|
|
21
|
+
"TaskRunner",
|
|
22
|
+
"AgentRunner",
|
|
23
|
+
"ToolRunner",
|
|
24
|
+
"ExecutionGraph",
|
|
25
|
+
"RuntimePlanner",
|
|
26
|
+
"AgentPool",
|
|
27
|
+
"ModelRouter",
|
|
28
|
+
"SpeculativePlanner",
|
|
29
|
+
"HITLManager",
|
|
30
|
+
"replay_execution",
|
|
31
|
+
"collect_telemetry",
|
|
32
|
+
"print_telemetry_summary",
|
|
33
|
+
"visualize_scheduler_dag",
|
|
34
|
+
]
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from collections import defaultdict
|
|
5
|
+
from contextlib import asynccontextmanager
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Callable
|
|
8
|
+
|
|
9
|
+
from devsper.agents.agent import Agent
|
|
10
|
+
from devsper.runtime.agent_runner import AgentRunner
|
|
11
|
+
from devsper.types.task import Task
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class AgentLease:
|
|
16
|
+
worker_id: str
|
|
17
|
+
agent: Agent
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AgentPool:
|
|
21
|
+
"""Reusable async pool for worker-local agent execution."""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
agent_factory: Callable[[], Agent],
|
|
26
|
+
max_agents: int = 8,
|
|
27
|
+
streaming_tools: bool = False,
|
|
28
|
+
) -> None:
|
|
29
|
+
self._factory = agent_factory
|
|
30
|
+
self._max_agents = max(1, int(max_agents))
|
|
31
|
+
self._streaming_tools = bool(streaming_tools)
|
|
32
|
+
self._queues: dict[str, asyncio.Queue[Agent]] = defaultdict(asyncio.Queue)
|
|
33
|
+
self._created: dict[str, int] = defaultdict(int)
|
|
34
|
+
self._lock = asyncio.Lock()
|
|
35
|
+
|
|
36
|
+
async def acquire_agent(self, worker_id: str = "default") -> AgentLease:
|
|
37
|
+
queue = self._queues[worker_id]
|
|
38
|
+
try:
|
|
39
|
+
agent = queue.get_nowait()
|
|
40
|
+
return AgentLease(worker_id=worker_id, agent=agent)
|
|
41
|
+
except asyncio.QueueEmpty:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
async with self._lock:
|
|
45
|
+
if self._created[worker_id] < self._max_agents:
|
|
46
|
+
self._created[worker_id] += 1
|
|
47
|
+
return AgentLease(worker_id=worker_id, agent=self._factory())
|
|
48
|
+
|
|
49
|
+
agent = await queue.get()
|
|
50
|
+
return AgentLease(worker_id=worker_id, agent=agent)
|
|
51
|
+
|
|
52
|
+
async def release_agent(self, lease: AgentLease) -> None:
|
|
53
|
+
await self._queues[lease.worker_id].put(lease.agent)
|
|
54
|
+
|
|
55
|
+
async def run_agent(
|
|
56
|
+
self,
|
|
57
|
+
task: Task,
|
|
58
|
+
worker_id: str = "default",
|
|
59
|
+
model_override: str | None = None,
|
|
60
|
+
) -> str:
|
|
61
|
+
lease = await self.acquire_agent(worker_id=worker_id)
|
|
62
|
+
try:
|
|
63
|
+
runner = AgentRunner(lease.agent, streaming_tools=self._streaming_tools)
|
|
64
|
+
return await runner.run_task(task, model_override=model_override)
|
|
65
|
+
finally:
|
|
66
|
+
await self.release_agent(lease)
|
|
67
|
+
|
|
68
|
+
async def run_parallel(
|
|
69
|
+
self,
|
|
70
|
+
tasks: list[Task],
|
|
71
|
+
worker_id: str = "default",
|
|
72
|
+
model_override: str | None = None,
|
|
73
|
+
) -> list[str]:
|
|
74
|
+
return await asyncio.gather(
|
|
75
|
+
*(self.run_agent(t, worker_id=worker_id, model_override=model_override) for t in tasks)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
@asynccontextmanager
|
|
79
|
+
async def lease(self, worker_id: str = "default"):
|
|
80
|
+
lease = await self.acquire_agent(worker_id=worker_id)
|
|
81
|
+
try:
|
|
82
|
+
yield lease.agent
|
|
83
|
+
finally:
|
|
84
|
+
await self.release_agent(lease)
|
|
85
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
|
|
5
|
+
from devsper.agents.agent import Agent
|
|
6
|
+
from devsper.types.task import Task
|
|
7
|
+
from devsper.utils.models import generate
|
|
8
|
+
from devsper.tools.tool_runner import run_tool
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _extract_tool_calls(text: str) -> list[tuple[str, dict]]:
|
|
12
|
+
try:
|
|
13
|
+
from devsper.agents.agent import _parse_all_tool_calls # type: ignore
|
|
14
|
+
|
|
15
|
+
return _parse_all_tool_calls(text)
|
|
16
|
+
except Exception:
|
|
17
|
+
return []
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AgentRunner:
|
|
21
|
+
"""Async wrapper for agent execution with optional streaming tool handling."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, agent: Agent, streaming_tools: bool = False) -> None:
|
|
24
|
+
self._agent = agent
|
|
25
|
+
self._streaming_tools = bool(streaming_tools)
|
|
26
|
+
|
|
27
|
+
async def run_task(self, task: Task, model_override: str | None = None) -> str:
|
|
28
|
+
if self._streaming_tools:
|
|
29
|
+
try:
|
|
30
|
+
return await asyncio.to_thread(
|
|
31
|
+
self._run_task_streaming_tools_sync,
|
|
32
|
+
task,
|
|
33
|
+
model_override,
|
|
34
|
+
)
|
|
35
|
+
except Exception:
|
|
36
|
+
pass
|
|
37
|
+
return await asyncio.to_thread(
|
|
38
|
+
self._agent.run_task,
|
|
39
|
+
task,
|
|
40
|
+
model_override,
|
|
41
|
+
None,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def _run_task_streaming_tools_sync(
|
|
45
|
+
self,
|
|
46
|
+
task: Task,
|
|
47
|
+
model_override: str | None = None,
|
|
48
|
+
) -> str:
|
|
49
|
+
request = self._agent.build_request(task, model_override=model_override)
|
|
50
|
+
if not getattr(self._agent, "use_tools", False) or not request.tools:
|
|
51
|
+
return self._agent.run_task(task, model_override=model_override, prefetch_result=None)
|
|
52
|
+
|
|
53
|
+
from devsper.agents.agent import PROMPT_TEMPLATE_WITH_TOOLS, _format_tools_section, _get_tools_by_names
|
|
54
|
+
|
|
55
|
+
tools = _get_tools_by_names(request.tools)
|
|
56
|
+
prompt = PROMPT_TEMPLATE_WITH_TOOLS.format(
|
|
57
|
+
role_prefix=request.system_prompt,
|
|
58
|
+
task_description=request.task.description,
|
|
59
|
+
memory_section=request.memory_context or "",
|
|
60
|
+
message_bus_section="",
|
|
61
|
+
tools_section=_format_tools_section(tools),
|
|
62
|
+
)
|
|
63
|
+
conversation = [prompt]
|
|
64
|
+
task_type = getattr(task, "role", None) or "general"
|
|
65
|
+
|
|
66
|
+
for _ in range(max(1, int(getattr(self._agent, "max_tool_iterations", 5)))):
|
|
67
|
+
streamed = generate(request.model, "\n\n".join(conversation), stream=True)
|
|
68
|
+
text = "".join(streamed) if hasattr(streamed, "__iter__") else str(streamed)
|
|
69
|
+
calls = _extract_tool_calls(text)
|
|
70
|
+
if not calls:
|
|
71
|
+
return (text or "").strip()
|
|
72
|
+
|
|
73
|
+
conversation.append(f"Response:\n{text}")
|
|
74
|
+
for name, args in calls:
|
|
75
|
+
result = run_tool(name, args, task_type=task_type)
|
|
76
|
+
conversation.append(f"Tool result ({name}):\n{result or ''}")
|
|
77
|
+
|
|
78
|
+
return "Max tool iterations reached."
|
|
79
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from datetime import datetime, timezone
|
|
6
|
+
from typing import Any, AsyncIterator
|
|
7
|
+
|
|
8
|
+
from devsper.types.event import Event, events
|
|
9
|
+
from devsper.utils.event_logger import EventLog
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class RuntimeEvent:
|
|
14
|
+
type: events
|
|
15
|
+
payload: dict[str, Any]
|
|
16
|
+
at: datetime
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RuntimeEventStream:
|
|
20
|
+
"""In-process async event stream backed by EventLog."""
|
|
21
|
+
|
|
22
|
+
def __init__(self, event_log: EventLog, max_queue_size: int = 2048) -> None:
|
|
23
|
+
self._event_log = event_log
|
|
24
|
+
self._queue: asyncio.Queue[RuntimeEvent] = asyncio.Queue(maxsize=max(1, int(max_queue_size)))
|
|
25
|
+
self._closed = False
|
|
26
|
+
self._dropped = 0
|
|
27
|
+
|
|
28
|
+
async def publish(self, event_type: events, payload: dict[str, Any]) -> None:
|
|
29
|
+
if self._closed:
|
|
30
|
+
return
|
|
31
|
+
now = datetime.now(timezone.utc)
|
|
32
|
+
self._event_log.append_event(Event(timestamp=now, type=event_type, payload=payload))
|
|
33
|
+
evt = RuntimeEvent(type=event_type, payload=payload, at=now)
|
|
34
|
+
try:
|
|
35
|
+
self._queue.put_nowait(evt)
|
|
36
|
+
except asyncio.QueueFull:
|
|
37
|
+
# Backpressure policy: drop oldest event and keep newest.
|
|
38
|
+
try:
|
|
39
|
+
_ = self._queue.get_nowait()
|
|
40
|
+
self._dropped += 1
|
|
41
|
+
except asyncio.QueueEmpty:
|
|
42
|
+
pass
|
|
43
|
+
try:
|
|
44
|
+
self._queue.put_nowait(evt)
|
|
45
|
+
except asyncio.QueueFull:
|
|
46
|
+
self._dropped += 1
|
|
47
|
+
|
|
48
|
+
async def subscribe(self) -> AsyncIterator[RuntimeEvent]:
|
|
49
|
+
while not self._closed:
|
|
50
|
+
yield await self._queue.get()
|
|
51
|
+
|
|
52
|
+
def close(self) -> None:
|
|
53
|
+
self._closed = True
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def dropped_events(self) -> int:
|
|
57
|
+
return self._dropped
|
|
58
|
+
|