devsper 2.4.0__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.0 → devsper-2.5.0}/CHANGELOG.md +29 -11
- {devsper-2.4.0 → devsper-2.5.0}/PKG-INFO +28 -1
- {devsper-2.4.0 → devsper-2.5.0}/README.md +24 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/agent.py +238 -7
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/main.py +60 -32
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/run_view.py +28 -6
- {devsper-2.4.0 → devsper-2.5.0}/devsper/config/resolver.py +4 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/config/schema.py +7 -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.0 → devsper-2.5.0}/devsper/docs/architecture/execution-model.md +5 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/collector.py +14 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/writers.py +51 -12
- 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.4.0 → devsper-2.5.0}/devsper/platform/request_builder.py +22 -3
- devsper-2.5.0/devsper/platform/run_context.py +53 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/runtime_events.py +46 -19
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/agent_runner.py +19 -3
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/execution_graph.py +58 -4
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/executor.py +144 -10
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/model_router.py +17 -8
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/task_runner.py +53 -5
- devsper-2.5.0/devsper/server/memory_utils.py +475 -0
- devsper-2.5.0/devsper/server/swarmworker.py +786 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/swarm.py +31 -5
- {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/otel.py +6 -3
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/client.py +47 -19
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/discovery.py +12 -1
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/selector.py +56 -2
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/tool_runner.py +28 -2
- {devsper-2.4.0 → devsper-2.5.0}/devsper/types/event.py +9 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/event_logger.py +10 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/loader.py +1 -1
- {devsper-2.4.0 → 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.0 → 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.0 → devsper-2.5.0}/uv.lock +21 -2
- devsper-2.4.0/devsper/platform/__init__.py +0 -6
- devsper-2.4.0/devsper/server/swarmworker.py +0 -193
- devsper-2.4.0/requirements-docs.txt +0 -4
- devsper-2.4.0/tests/test_platform_runtime_events.py +0 -37
- {devsper-2.4.0 → devsper-2.5.0}/.env.example +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.github/FUNDING.yml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.gitignore +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/.python-version +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/CONTRIBUTING.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/Cargo.lock +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/Cargo.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/Dockerfile.local-pool +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/LICENSE +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/SECURITY.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/benchmarks/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/branding/logo.svg +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/README.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/critic.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/identity.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/message_bus.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/roles.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/agents/run_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/analytics/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/audit/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/audit/logger.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/budget.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/message.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/schema_version.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/bus/topics.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/hashing.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cache/task_cache.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/export.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/init.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/run_progress.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/components.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/election.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/local.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/node_info.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/compliance/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/compliance/pii.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/config/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/config/config_loader.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/config/defaults.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/agent/runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/loader.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/core/tools/registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/cli.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/migration.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/credentials/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/builder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/debugger.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/repo_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/sandbox.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/dev/scaffold.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/controller.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/distributed/worker_runtime.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/embeddings/service.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/events.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/rationale.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/explainability/simulation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/branding.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/manifest.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/model.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/packager.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/pdf.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/export/service.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/approval.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/hitl/escalation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/knowledge/query.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/consolidation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/context.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/embeddings.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/memory_types.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/namespaces.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/scoring.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/summarizer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/base_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/models.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/controller.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/rpc.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/single.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/nodes/worker.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/platform/reporter.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/policy/client.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/config.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/crypto.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/local_pool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/manager.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/models.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/org_pool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/security.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/client.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/schema.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/protocol/server.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/protocols/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/anthropic.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/gemini.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/github.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/model_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/openai.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/factory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/providers/router/router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/graph.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/reasoning/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/agent_pool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/event_stream.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/health.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/hitl.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/replay.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/retry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/run_history.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/speculative_planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/state_manager.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/task_state.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/tool_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/runtime/visualize.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/server/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/server/events.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/server/topology.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/executor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/swarm/speculation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/base.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/pipelines.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/app.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/dev_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/layout.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/logs_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/memory_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/mission_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/performance_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/results_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/tui/task_view.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/types/exceptions.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/types/swarm.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/types/task.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/cli.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/installer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/http.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/utils/models.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/visualization/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/conditions.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/context.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/resolver.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/schema.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/devsper/workflow/validator.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/docker-compose.yml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/_common.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/_config.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/coding/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/coding/generate_docs.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/demo_swarm.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/README.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/controller.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_controller.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/run_worker.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/distributed/worker.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/documents/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/research/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/research/literature_review.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/examples/research/research_graph.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/README.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/scripts/test_v2_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/supermemory-core/src/main.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/agents/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/agents/test_roles.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/fixtures.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_crypto.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/reasoning/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_budget.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_packager.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_replay.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_agent.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_analysis.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_analytics.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_auto_model.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_clarification.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_config_loader.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_credentials.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dag_export.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_agents.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_debugger.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_embeddings_service.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_event_logger.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_executor.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_export_runs.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_github_provider.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_init.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_knowledge_query.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_map_reduce.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_memory_evolution.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_memory_isolation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_missions.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_model_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_planner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_plugins.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_protocols.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_router.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_scheduler.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_speculation.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_strategies.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_swarm.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_task_cache.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_tool_scoring.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_tool_selector.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_upgrade.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_v110.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_v16.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_v17.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_v18.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_v19.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/test_workflow.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/__init__.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_registry.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/.dockerignore +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/Cargo.lock +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/Cargo.toml +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/Dockerfile +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/README.md +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/budget.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/bus.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/claim.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/clarification.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/config.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/controller.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/election.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/error.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/executor.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/health.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/heartbeat.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/lib.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/main.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/metrics.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/reconnect.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/registry.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/router.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/rpc.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/scheduler.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/snapshot.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/telemetry.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/agent.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/event.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/mod.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/node.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/types/task.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/src/worker_node.rs +0 -0
- {devsper-2.4.0 → devsper-2.5.0}/worker/tests/integration.rs +0 -0
|
@@ -7,24 +7,42 @@ 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
|
+
|
|
16
|
+
## [2.4.1] — 2026-03-31
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **HITL prompt loop + context handoff** — Clarification responses are now reused across subtasks, repeated clarification prompts are deduplicated/capped, and follow-up tasks inherit prior user decisions instead of re-asking equivalent questions.
|
|
21
|
+
- **Run view prompt stability** — Local clarification prompts now pause/resume live rendering cleanly, reducing TUI corruption and preventing hidden/stuck prompts during interactive runs.
|
|
22
|
+
- **Silent-failure propagation** — Agent failures now surface as explicit task failures (instead of empty-success paths), with clearer errors for missing model configuration.
|
|
23
|
+
- **Executor compatibility regression** — Restored `budget_manager` compatibility on the runtime executor path to avoid end-of-run `AttributeError` crashes.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **Research tool routing defaults** — Tool selection now biases web-first for research/business discovery tasks when no local dataset path is provided.
|
|
28
|
+
- **Export readability + content coverage** — Run export now backfills task outputs from tool traces when direct task result payloads are missing, and includes richer run details in markdown/html/latex/docx outputs.
|
|
29
|
+
- **Duration formatting** — CLI run summary and export outputs now prefer `HH:MM:SS` format.
|
|
30
|
+
- **Telemetry noise control** — Console span export is now opt-in (`DEVSPER_OTEL_CONSOLE=1`) to keep interactive TUI output clean by default.
|
|
31
|
+
- **Auto-export workflow** — Added config-driven post-run export option (`[export] auto_export_on_run`) with selectable output format.
|
|
32
|
+
|
|
10
33
|
## [2.4.0] — 2026-03-31
|
|
11
34
|
|
|
12
35
|
### Added
|
|
13
36
|
|
|
14
|
-
- **Distributed runtime
|
|
15
|
-
- **
|
|
16
|
-
- **
|
|
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.
|
|
37
|
+
- **Distributed runtime extensions** — Added modular runtime components for distributed orchestration: `AgentPool`, `ModelRouter`, `SpeculativePlanner`, `HITLManager`, `ExecutionGraph` worker assignment tracking, plus distributed wrappers (`distributed/controller.py`, `distributed/worker_runtime.py`).
|
|
38
|
+
- **Runtime architecture documentation** — Expanded runtime docs with distributed architecture, worker/controller lifecycle, speculative execution flow, and HITL lifecycle details.
|
|
39
|
+
- **Tool execution hardening** — Upgraded runtime tool runner with bounded parallelism, dependency-aware batching, per-call timeout isolation, and cancellation support.
|
|
20
40
|
|
|
21
41
|
### Changed
|
|
22
42
|
|
|
23
|
-
- **Executor
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
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.
|
|
43
|
+
- **Executor orchestration** — Runtime executor now supports agent-pool-backed execution, model routing integration, speculative follow-up scheduling hooks, and improved cancellation/backpressure behavior.
|
|
44
|
+
- **Prompt/token efficiency** — Tool schema injection in agent prompts was compressed to reduce runtime token overhead in tool-enabled turns.
|
|
45
|
+
- **Homepage and release communication** — Updated README homepage with v2.4.0 release CTA and an architecture upgrade blog entry for this release.
|
|
28
46
|
|
|
29
47
|
## [2.3.0] — 2026-03-30
|
|
30
48
|
|
|
@@ -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
|
|
|
@@ -594,6 +594,176 @@ class Agent:
|
|
|
594
594
|
self.audit_logger = audit_logger
|
|
595
595
|
self.audit_run_id = audit_run_id or ""
|
|
596
596
|
self.clarification_requester = None # set by executor for human-in-the-loop
|
|
597
|
+
self._hitl_response_cache: dict[str, dict] = {}
|
|
598
|
+
self._hitl_prompt_counts: dict[str, int] = {}
|
|
599
|
+
self._hitl_shared_answers: dict[str, str] = {}
|
|
600
|
+
self._hitl_shared_facts: list[str] = []
|
|
601
|
+
try:
|
|
602
|
+
self._hitl_max_prompts_per_task = int(
|
|
603
|
+
str(os.environ.get("DEVSPER_HITL_MAX_PROMPTS_PER_TASK", "1")).strip()
|
|
604
|
+
or "1"
|
|
605
|
+
)
|
|
606
|
+
except Exception:
|
|
607
|
+
self._hitl_max_prompts_per_task = 1
|
|
608
|
+
self._hitl_max_prompts_per_task = max(0, self._hitl_max_prompts_per_task)
|
|
609
|
+
|
|
610
|
+
def _default_answer_for_field(self, field: ClarificationField) -> object:
|
|
611
|
+
prior = self._find_prior_hitl_answer(field.question)
|
|
612
|
+
if prior:
|
|
613
|
+
return prior
|
|
614
|
+
if field.default is not None and str(field.default).strip() != "":
|
|
615
|
+
return field.default
|
|
616
|
+
ftype = str(field.type or "text")
|
|
617
|
+
options = field.options or []
|
|
618
|
+
if ftype == "confirm":
|
|
619
|
+
return True
|
|
620
|
+
if ftype == "multi_select":
|
|
621
|
+
return [options[0]] if options else []
|
|
622
|
+
if ftype == "rank":
|
|
623
|
+
return options
|
|
624
|
+
if ftype == "mcq":
|
|
625
|
+
return options[0] if options else "Proceed with best-effort defaults"
|
|
626
|
+
return "Proceed with best-effort defaults"
|
|
627
|
+
|
|
628
|
+
@staticmethod
|
|
629
|
+
def _normalize_question(text: str) -> str:
|
|
630
|
+
t = re.sub(r"[^a-z0-9\s]+", " ", (text or "").lower())
|
|
631
|
+
return re.sub(r"\s+", " ", t).strip()
|
|
632
|
+
|
|
633
|
+
def _find_prior_hitl_answer(self, question: str) -> str | None:
|
|
634
|
+
qn = self._normalize_question(question)
|
|
635
|
+
if not qn:
|
|
636
|
+
return None
|
|
637
|
+
if qn in self._hitl_shared_answers:
|
|
638
|
+
return self._hitl_shared_answers[qn]
|
|
639
|
+
q_tokens = {t for t in qn.split() if len(t) > 2}
|
|
640
|
+
if not q_tokens:
|
|
641
|
+
return None
|
|
642
|
+
best_overlap = 0
|
|
643
|
+
best_answer: str | None = None
|
|
644
|
+
for prev_qn, prev_answer in self._hitl_shared_answers.items():
|
|
645
|
+
p_tokens = {t for t in prev_qn.split() if len(t) > 2}
|
|
646
|
+
overlap = len(q_tokens.intersection(p_tokens))
|
|
647
|
+
if overlap >= 3 and overlap > best_overlap:
|
|
648
|
+
best_overlap = overlap
|
|
649
|
+
best_answer = prev_answer
|
|
650
|
+
return best_answer
|
|
651
|
+
|
|
652
|
+
def _record_hitl_answers(self, answers: dict[str, object]) -> None:
|
|
653
|
+
for question, answer in (answers or {}).items():
|
|
654
|
+
qn = self._normalize_question(str(question))
|
|
655
|
+
if not qn:
|
|
656
|
+
continue
|
|
657
|
+
answer_text = str(answer)
|
|
658
|
+
self._hitl_shared_answers[qn] = answer_text
|
|
659
|
+
fact = f"- {str(question).strip()}: {answer_text}"
|
|
660
|
+
if fact not in self._hitl_shared_facts:
|
|
661
|
+
self._hitl_shared_facts.append(fact)
|
|
662
|
+
|
|
663
|
+
def _should_auto_web_collection(
|
|
664
|
+
self,
|
|
665
|
+
request: AgentRequest,
|
|
666
|
+
tool_args: dict,
|
|
667
|
+
fields: list[ClarificationField],
|
|
668
|
+
) -> bool:
|
|
669
|
+
prior_answers_text = " ".join(self._hitl_shared_answers.values()).lower()
|
|
670
|
+
prior_facts_text = " ".join(self._hitl_shared_facts).lower()
|
|
671
|
+
topic = " ".join(
|
|
672
|
+
[
|
|
673
|
+
str(self.user_task or ""),
|
|
674
|
+
str(getattr(request.task, "description", "") or ""),
|
|
675
|
+
str(tool_args.get("context") or ""),
|
|
676
|
+
" ".join(f.question for f in fields),
|
|
677
|
+
prior_answers_text,
|
|
678
|
+
prior_facts_text,
|
|
679
|
+
]
|
|
680
|
+
).lower()
|
|
681
|
+
# If this is clearly a research/data-collection workflow asking for local datasets,
|
|
682
|
+
# default to web/public-source collection to avoid blocking the run.
|
|
683
|
+
needs_dataset_input = any(
|
|
684
|
+
token in topic
|
|
685
|
+
for token in (
|
|
686
|
+
"dataset",
|
|
687
|
+
"csv",
|
|
688
|
+
"upload",
|
|
689
|
+
"file",
|
|
690
|
+
"local path",
|
|
691
|
+
"paste",
|
|
692
|
+
"provide the data",
|
|
693
|
+
"provide the dataset",
|
|
694
|
+
)
|
|
695
|
+
)
|
|
696
|
+
research_like = any(
|
|
697
|
+
token in topic
|
|
698
|
+
for token in (
|
|
699
|
+
"research",
|
|
700
|
+
"public source",
|
|
701
|
+
"web",
|
|
702
|
+
"openai business",
|
|
703
|
+
"data collection",
|
|
704
|
+
"comprehensive search",
|
|
705
|
+
"business aspect",
|
|
706
|
+
)
|
|
707
|
+
)
|
|
708
|
+
prior_prefers_web = any(
|
|
709
|
+
token in topic
|
|
710
|
+
for token in (
|
|
711
|
+
"public urls",
|
|
712
|
+
"public url",
|
|
713
|
+
"public-source",
|
|
714
|
+
"public source",
|
|
715
|
+
"web collection",
|
|
716
|
+
"curated list",
|
|
717
|
+
"crawl",
|
|
718
|
+
"fetch",
|
|
719
|
+
"url",
|
|
720
|
+
)
|
|
721
|
+
)
|
|
722
|
+
return needs_dataset_input and (research_like or prior_prefers_web)
|
|
723
|
+
|
|
724
|
+
def _auto_web_collection_answers(
|
|
725
|
+
self,
|
|
726
|
+
fields: list[ClarificationField],
|
|
727
|
+
) -> dict[str, object]:
|
|
728
|
+
answers: dict[str, object] = {}
|
|
729
|
+
for f in fields:
|
|
730
|
+
q = (f.question or "").lower()
|
|
731
|
+
opts = [str(o) for o in (f.options or [])]
|
|
732
|
+
# Prefer choices indicating web/public/source fetching.
|
|
733
|
+
preferred = None
|
|
734
|
+
for opt in opts:
|
|
735
|
+
ol = opt.lower()
|
|
736
|
+
if any(
|
|
737
|
+
t in ol
|
|
738
|
+
for t in (
|
|
739
|
+
"web",
|
|
740
|
+
"public",
|
|
741
|
+
"url",
|
|
742
|
+
"crawl",
|
|
743
|
+
"fetch",
|
|
744
|
+
"curated list",
|
|
745
|
+
"propose",
|
|
746
|
+
)
|
|
747
|
+
):
|
|
748
|
+
preferred = opt
|
|
749
|
+
break
|
|
750
|
+
if preferred is not None:
|
|
751
|
+
answers[f.question] = preferred
|
|
752
|
+
continue
|
|
753
|
+
# If there is no explicit web/public option, avoid blocking on local file uploads.
|
|
754
|
+
if any(t in q for t in ("dataset", "profile", "csv", "file", "path")):
|
|
755
|
+
template_opt = next(
|
|
756
|
+
(o for o in opts if any(k in o.lower() for k in ("template", "generic", "sample", "synthetic"))),
|
|
757
|
+
None,
|
|
758
|
+
)
|
|
759
|
+
if template_opt is not None:
|
|
760
|
+
answers[f.question] = template_opt
|
|
761
|
+
continue
|
|
762
|
+
if "how many" in q or "count" in q or "limit" in q:
|
|
763
|
+
answers[f.question] = "Up to 50 public URLs"
|
|
764
|
+
continue
|
|
765
|
+
answers[f.question] = self._default_answer_for_field(f)
|
|
766
|
+
return answers
|
|
597
767
|
|
|
598
768
|
def run(self, request: AgentRequest) -> AgentResponse:
|
|
599
769
|
"""Stateless run: all context in AgentRequest, all output in AgentResponse."""
|
|
@@ -770,6 +940,12 @@ class Agent:
|
|
|
770
940
|
message_bus_section = self.message_bus.get_context_sync(task.id) or ""
|
|
771
941
|
if message_bus_section:
|
|
772
942
|
memory_section = (memory_section + "\n\n" + message_bus_section).strip()
|
|
943
|
+
if self._hitl_shared_facts:
|
|
944
|
+
memory_section = (
|
|
945
|
+
memory_section
|
|
946
|
+
+ "\n\nUSER CLARIFICATIONS (APPLY THESE PREFERENCES ACROSS SUBTASKS)\n"
|
|
947
|
+
+ "\n".join(self._hitl_shared_facts[-20:])
|
|
948
|
+
).strip()
|
|
773
949
|
from devsper.agents.roles import get_role_config
|
|
774
950
|
|
|
775
951
|
role_config = get_role_config(getattr(task, "role", None))
|
|
@@ -857,6 +1033,8 @@ class Agent:
|
|
|
857
1033
|
success=True,
|
|
858
1034
|
)
|
|
859
1035
|
self.apply_response(task, response)
|
|
1036
|
+
if not response.success:
|
|
1037
|
+
raise RuntimeError(response.error or "Agent run failed")
|
|
860
1038
|
return response.result
|
|
861
1039
|
|
|
862
1040
|
def _enrich_task(self, task: Task, answers: dict) -> Task:
|
|
@@ -1223,6 +1401,57 @@ class Agent:
|
|
|
1223
1401
|
if not fields:
|
|
1224
1402
|
return json.dumps({"error": "hitl.request has no valid fields"})
|
|
1225
1403
|
|
|
1404
|
+
if self._should_auto_web_collection(request, tool_args, fields):
|
|
1405
|
+
auto_answers = self._auto_web_collection_answers(fields)
|
|
1406
|
+
self._record_hitl_answers(auto_answers)
|
|
1407
|
+
payload = {
|
|
1408
|
+
"request_id": f"auto-web-{request.task.id}",
|
|
1409
|
+
"skipped": False,
|
|
1410
|
+
"answers": auto_answers,
|
|
1411
|
+
"auto_assumed": True,
|
|
1412
|
+
}
|
|
1413
|
+
return json.dumps(payload)
|
|
1414
|
+
|
|
1415
|
+
task_id = request.task.id
|
|
1416
|
+
used_prompts = int(self._hitl_prompt_counts.get(task_id, 0))
|
|
1417
|
+
if used_prompts >= max(0, self._hitl_max_prompts_per_task):
|
|
1418
|
+
# Fast-path: avoid repeated user interruption after first clarification.
|
|
1419
|
+
auto_answers: dict[str, object] = {}
|
|
1420
|
+
for f in fields:
|
|
1421
|
+
auto_answers[f.question] = self._default_answer_for_field(f)
|
|
1422
|
+
self._record_hitl_answers(auto_answers)
|
|
1423
|
+
payload = {
|
|
1424
|
+
"request_id": f"auto-{task_id}-{used_prompts + 1}",
|
|
1425
|
+
"skipped": False,
|
|
1426
|
+
"answers": auto_answers,
|
|
1427
|
+
"auto_assumed": True,
|
|
1428
|
+
}
|
|
1429
|
+
return json.dumps(payload)
|
|
1430
|
+
|
|
1431
|
+
# Prevent repeated identical prompts in the same task/tool loop.
|
|
1432
|
+
signature_payload = {
|
|
1433
|
+
"task_id": request.task.id,
|
|
1434
|
+
"context": str(tool_args.get("context") or "Need user input"),
|
|
1435
|
+
"fields": [
|
|
1436
|
+
{
|
|
1437
|
+
"type": f.type,
|
|
1438
|
+
"question": f.question,
|
|
1439
|
+
"options": f.options or [],
|
|
1440
|
+
"default": f.default,
|
|
1441
|
+
"required": bool(f.required),
|
|
1442
|
+
}
|
|
1443
|
+
for f in fields
|
|
1444
|
+
],
|
|
1445
|
+
}
|
|
1446
|
+
cache_key = json.dumps(signature_payload, sort_keys=True)
|
|
1447
|
+
cached = self._hitl_response_cache.get(cache_key)
|
|
1448
|
+
if cached is not None:
|
|
1449
|
+
try:
|
|
1450
|
+
self._record_hitl_answers(cached.get("answers") or {})
|
|
1451
|
+
except Exception:
|
|
1452
|
+
pass
|
|
1453
|
+
return json.dumps(cached)
|
|
1454
|
+
|
|
1226
1455
|
req = ClarificationRequest(
|
|
1227
1456
|
request_id=str(uuid.uuid4()),
|
|
1228
1457
|
task_id=request.task.id,
|
|
@@ -1233,13 +1462,15 @@ class Agent:
|
|
|
1233
1462
|
timeout_seconds=int(tool_args.get("timeout_seconds", 120)),
|
|
1234
1463
|
)
|
|
1235
1464
|
resp = requester.request_clarification(req)
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1465
|
+
self._hitl_prompt_counts[task_id] = used_prompts + 1
|
|
1466
|
+
self._record_hitl_answers(resp.answers or {})
|
|
1467
|
+
payload = {
|
|
1468
|
+
"request_id": req.request_id,
|
|
1469
|
+
"skipped": bool(resp.skipped),
|
|
1470
|
+
"answers": resp.answers or {},
|
|
1471
|
+
}
|
|
1472
|
+
self._hitl_response_cache[cache_key] = payload
|
|
1473
|
+
return json.dumps(payload)
|
|
1243
1474
|
|
|
1244
1475
|
def _emit_tool_called_audit(
|
|
1245
1476
|
self, task_id: str, tool_name: str, result: str
|
|
@@ -130,23 +130,6 @@ def _platform_api_builder():
|
|
|
130
130
|
return PlatformAPIRequestBuilder(base_url=base_url, org_slug=org, token=token)
|
|
131
131
|
|
|
132
132
|
|
|
133
|
-
def _is_platform_default_enabled(args: object) -> bool:
|
|
134
|
-
if getattr(args, "local_runtime", False):
|
|
135
|
-
return False
|
|
136
|
-
# Shadow mode explicitly compares both paths; do not default-route.
|
|
137
|
-
if getattr(args, "shadow", False):
|
|
138
|
-
return False
|
|
139
|
-
if os.environ.get("DEVSPER_PROFILE", "").strip().lower() == "local":
|
|
140
|
-
return False
|
|
141
|
-
if str(os.environ.get("DEVSPER_RUN_DEFAULT", "platform")).strip().lower() in {
|
|
142
|
-
"runtime",
|
|
143
|
-
"local",
|
|
144
|
-
}:
|
|
145
|
-
return False
|
|
146
|
-
api = _platform_api_builder()
|
|
147
|
-
return api.enabled()
|
|
148
|
-
|
|
149
|
-
|
|
150
133
|
def _extract_platform_run_fields(payload: dict) -> tuple[str, str, int, int, int]:
|
|
151
134
|
status = str(payload.get("status", ""))
|
|
152
135
|
run_id = str(payload.get("run_id", ""))
|
|
@@ -181,8 +164,24 @@ def _run_platform_once(task: str, args: object) -> tuple[int, dict, float]:
|
|
|
181
164
|
task=task, project_id=project_id or "", manifest=manifest
|
|
182
165
|
)
|
|
183
166
|
run_id = str(created.get("run_id", "") or "")
|
|
167
|
+
poll_interval = float(getattr(args, "platform_poll_interval", 2.0) or 2.0)
|
|
168
|
+
if poll_interval <= 0:
|
|
169
|
+
poll_interval = 2.0
|
|
170
|
+
last_print_status = {"status": ""}
|
|
171
|
+
|
|
172
|
+
def _on_update(payload: dict, elapsed: float, changed: bool) -> None:
|
|
173
|
+
if getattr(args, "quiet", False):
|
|
174
|
+
return
|
|
175
|
+
status = str(payload.get("status") or "").strip().lower() or "unknown"
|
|
176
|
+
if changed or status != last_print_status["status"]:
|
|
177
|
+
last_print_status["status"] = status
|
|
178
|
+
print(f"[platform] run_id={run_id} status={status} elapsed={elapsed:.1f}s")
|
|
179
|
+
|
|
184
180
|
final = api.poll_run(
|
|
185
|
-
run_id,
|
|
181
|
+
run_id,
|
|
182
|
+
interval_seconds=poll_interval,
|
|
183
|
+
timeout_seconds=float(getattr(args, "platform_timeout", 180.0)),
|
|
184
|
+
on_update=_on_update,
|
|
186
185
|
)
|
|
187
186
|
elapsed = time.time() - started
|
|
188
187
|
return 0, final or {}, elapsed
|
|
@@ -251,7 +250,6 @@ def _run_shadow_mode(args: object) -> int:
|
|
|
251
250
|
task,
|
|
252
251
|
"--quiet",
|
|
253
252
|
"--json",
|
|
254
|
-
"--local-runtime",
|
|
255
253
|
]
|
|
256
254
|
local_started = time.time()
|
|
257
255
|
local_proc = subprocess.run(local_cmd, capture_output=True, text=True)
|
|
@@ -383,7 +381,7 @@ def _run_platform_connect(args: object) -> int:
|
|
|
383
381
|
|
|
384
382
|
print(f"Connected platform: api={api_url} org={org_slug}")
|
|
385
383
|
print(
|
|
386
|
-
"`devsper run`
|
|
384
|
+
"Use `devsper cloud run` to route runs to platform."
|
|
387
385
|
)
|
|
388
386
|
_track_conversion_event("platform_connect_succeeded", {"org": org_slug})
|
|
389
387
|
return 0
|
|
@@ -417,13 +415,7 @@ def _run_swarm(args: object) -> int:
|
|
|
417
415
|
_track_conversion_event("runtime_user_detected", {"command": "run"})
|
|
418
416
|
if getattr(args, "shadow", False):
|
|
419
417
|
return _run_shadow_mode(args)
|
|
420
|
-
|
|
421
|
-
return _run_platform_only(args)
|
|
422
|
-
if not getattr(args, "local_runtime", False):
|
|
423
|
-
# Contextual nudge when users are still runtime-only.
|
|
424
|
-
print(
|
|
425
|
-
"Tip: run `devsper platform connect` to unlock retries, audit history, billing controls, and team workflows."
|
|
426
|
-
)
|
|
418
|
+
print("Running locally...")
|
|
427
419
|
# Local profile fast-path: route through platform pool + local workers.
|
|
428
420
|
if os.environ.get("DEVSPER_PROFILE", "").strip().lower() == "local":
|
|
429
421
|
try:
|
|
@@ -436,10 +428,14 @@ def _run_swarm(args: object) -> int:
|
|
|
436
428
|
from devsper.config import get_config
|
|
437
429
|
from devsper.utils.event_logger import EventLog
|
|
438
430
|
from devsper.swarm.swarm import Swarm
|
|
431
|
+
from devsper.runtime.executor import Executor
|
|
432
|
+
from devsper.runtime.agent_runner import AgentRunner
|
|
439
433
|
from devsper.memory.memory_router import MemoryRouter
|
|
440
434
|
from devsper.memory.memory_store import get_default_store
|
|
441
435
|
from devsper.memory.memory_index import MemoryIndex
|
|
442
436
|
|
|
437
|
+
_ = (Executor, AgentRunner)
|
|
438
|
+
|
|
443
439
|
task = getattr(args, "task", "Summarize swarm intelligence in one paragraph.")
|
|
444
440
|
quiet = getattr(args, "quiet", False)
|
|
445
441
|
summary_only = getattr(args, "summary", False)
|
|
@@ -625,6 +621,37 @@ def _run_swarm(args: object) -> int:
|
|
|
625
621
|
console.print((result or "")[:2000])
|
|
626
622
|
if (result or "") and len(result) > 2000:
|
|
627
623
|
console.print("...")
|
|
624
|
+
try:
|
|
625
|
+
if getattr(cfg, "export", None) and getattr(cfg.export, "auto_export_on_run", False):
|
|
626
|
+
from devsper.export.service import ExportOptions, export_all_runs
|
|
627
|
+
|
|
628
|
+
ts = int(time.time())
|
|
629
|
+
out_dir = f".devsper/exports/runs_{ts}"
|
|
630
|
+
fmt = str(getattr(cfg.export, "format", "docx") or "docx").lower()
|
|
631
|
+
if fmt == "pdf":
|
|
632
|
+
pdf_pipeline = "both"
|
|
633
|
+
else:
|
|
634
|
+
# docx/html/all still benefit from HTML PDF where available.
|
|
635
|
+
pdf_pipeline = "html"
|
|
636
|
+
manifest = export_all_runs(
|
|
637
|
+
ExportOptions(
|
|
638
|
+
output_dir=out_dir,
|
|
639
|
+
limit=int(getattr(cfg.export, "limit", 1) or 1),
|
|
640
|
+
pdf_pipeline=pdf_pipeline,
|
|
641
|
+
)
|
|
642
|
+
)
|
|
643
|
+
files = manifest.get("files", {}) if isinstance(manifest, dict) else {}
|
|
644
|
+
print(f"Auto-export complete: {out_dir}")
|
|
645
|
+
if fmt in {"docx", "all"} and files.get("all_runs_docx"):
|
|
646
|
+
print(f"DOCX: {files.get('all_runs_docx')}")
|
|
647
|
+
if fmt in {"html", "all"} and files.get("all_runs_html"):
|
|
648
|
+
print(f"HTML: {files.get('all_runs_html')}")
|
|
649
|
+
if fmt in {"pdf", "all"}:
|
|
650
|
+
pdf_out = (manifest.get("pdf_outputs", {}) or {}).get("html_pdf")
|
|
651
|
+
if pdf_out:
|
|
652
|
+
print(f"PDF: {pdf_out}")
|
|
653
|
+
except Exception as e:
|
|
654
|
+
print(f"Auto-export failed: {e}", file=sys.stderr)
|
|
628
655
|
return 0
|
|
629
656
|
|
|
630
657
|
|
|
@@ -2891,11 +2918,6 @@ Examples:
|
|
|
2891
2918
|
action="store_true",
|
|
2892
2919
|
help="Only print run summary, not task results",
|
|
2893
2920
|
)
|
|
2894
|
-
run_parser.add_argument(
|
|
2895
|
-
"--local-runtime",
|
|
2896
|
-
action="store_true",
|
|
2897
|
-
help="Force local runtime path even when platform is connected.",
|
|
2898
|
-
)
|
|
2899
2921
|
run_parser.add_argument(
|
|
2900
2922
|
"--shadow",
|
|
2901
2923
|
action="store_true",
|
|
@@ -2917,6 +2939,12 @@ Examples:
|
|
|
2917
2939
|
default=180.0,
|
|
2918
2940
|
help="Platform run polling timeout seconds.",
|
|
2919
2941
|
)
|
|
2942
|
+
run_parser.add_argument(
|
|
2943
|
+
"--platform-poll-interval",
|
|
2944
|
+
type=float,
|
|
2945
|
+
default=2.0,
|
|
2946
|
+
help="Platform polling interval seconds.",
|
|
2947
|
+
)
|
|
2920
2948
|
run_parser.add_argument(
|
|
2921
2949
|
"--reporter",
|
|
2922
2950
|
action="store_true",
|
|
@@ -48,8 +48,11 @@ from devsper.cli.ui.components import devsperHeader, TaskRow, RoleTag, CostDispl
|
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
def is_interactive() -> bool:
|
|
51
|
-
"""True if we can show interactive prompts (
|
|
52
|
-
|
|
51
|
+
"""True if we can show interactive prompts (requires a real terminal)."""
|
|
52
|
+
try:
|
|
53
|
+
return bool(sys.stdin.isatty() and sys.stdout.isatty())
|
|
54
|
+
except Exception:
|
|
55
|
+
return False
|
|
53
56
|
|
|
54
57
|
|
|
55
58
|
def _field_get(field: Any, key: str, default: Any = None) -> Any:
|
|
@@ -106,6 +109,9 @@ class ClarificationWidget:
|
|
|
106
109
|
from devsper.events import ClarificationResponse
|
|
107
110
|
|
|
108
111
|
if not is_interactive():
|
|
112
|
+
console.print(
|
|
113
|
+
"[hive.warning]HITL prompt auto-skipped: non-interactive terminal detected.[/]"
|
|
114
|
+
)
|
|
109
115
|
answers = {}
|
|
110
116
|
for field in self.req.fields:
|
|
111
117
|
q = _field_get(field, "question")
|
|
@@ -589,9 +595,21 @@ def run_live_view(
|
|
|
589
595
|
except queue.Empty:
|
|
590
596
|
pass
|
|
591
597
|
else:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
598
|
+
# Pause Live while prompting to avoid TUI corruption and hidden input.
|
|
599
|
+
try:
|
|
600
|
+
live.stop()
|
|
601
|
+
except Exception:
|
|
602
|
+
pass
|
|
603
|
+
try:
|
|
604
|
+
widget = ClarificationWidget(req, theme_style)
|
|
605
|
+
response = widget.render()
|
|
606
|
+
executor.receive_clarification(response)
|
|
607
|
+
finally:
|
|
608
|
+
try:
|
|
609
|
+
live.start()
|
|
610
|
+
live.update(get_renderable())
|
|
611
|
+
except Exception:
|
|
612
|
+
pass
|
|
595
613
|
if cloud_hitl_submit is not None:
|
|
596
614
|
payload = _first_pending_cloud_clarification(log_path, handled_cloud_hitl)
|
|
597
615
|
if payload:
|
|
@@ -813,10 +831,14 @@ def print_run_summary(state: RunViewState, results: dict[str, str], summary_only
|
|
|
813
831
|
if duration_s < 0:
|
|
814
832
|
duration_s = 0.0
|
|
815
833
|
cost_str = f"${state.total_cost_usd:.4f}" if (state.total_cost_usd is not None and state.total_cost_usd > 0) else "—"
|
|
834
|
+
hh = int(duration_s // 3600)
|
|
835
|
+
mm = int((duration_s % 3600) // 60)
|
|
836
|
+
ss = int(duration_s % 60)
|
|
837
|
+
duration_hms = f"{hh:02d}:{mm:02d}:{ss:02d}"
|
|
816
838
|
cache_hits = sum(1 for t in state.tasks if t.status == "cached")
|
|
817
839
|
lines = [
|
|
818
840
|
f"{total} tasks · {done} completed · {failed_n} failed · {skipped} skipped",
|
|
819
|
-
f"Duration: {
|
|
841
|
+
f"Duration: {duration_hms} · Cost: {cost_str} · Cache hits: {cache_hits}",
|
|
820
842
|
f"run id: {state.run_id_short}",
|
|
821
843
|
]
|
|
822
844
|
console.print(Panel("\n".join(lines), title="Run complete", border_style="hive.success"))
|