devsper 2.3.0__tar.gz → 2.4.1__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.1}/CHANGELOG.md +31 -0
- {devsper-2.3.0 → devsper-2.4.1}/PKG-INFO +1 -1
- devsper-2.4.1/devsper/README.md +148 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/agent.py +252 -8
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/main.py +60 -32
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/run_view.py +28 -6
- {devsper-2.3.0 → devsper-2.4.1}/devsper/config/resolver.py +4 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/config/schema.py +7 -0
- devsper-2.4.1/devsper/distributed/__init__.py +7 -0
- devsper-2.4.1/devsper/distributed/controller.py +70 -0
- devsper-2.4.1/devsper/distributed/worker_runtime.py +43 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/docs/architecture/execution-model.md +5 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/collector.py +14 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/writers.py +51 -12
- {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/request_builder.py +22 -3
- devsper-2.4.1/devsper/runtime/__init__.py +34 -0
- devsper-2.4.1/devsper/runtime/agent_pool.py +85 -0
- devsper-2.4.1/devsper/runtime/agent_runner.py +95 -0
- devsper-2.4.1/devsper/runtime/event_stream.py +58 -0
- devsper-2.4.1/devsper/runtime/execution_graph.py +101 -0
- devsper-2.4.1/devsper/runtime/executor.py +277 -0
- devsper-2.4.1/devsper/runtime/hitl.py +71 -0
- devsper-2.4.1/devsper/runtime/model_router.py +53 -0
- devsper-2.4.1/devsper/runtime/planner.py +28 -0
- devsper-2.4.1/devsper/runtime/retry.py +61 -0
- devsper-2.4.1/devsper/runtime/speculative_planner.py +51 -0
- devsper-2.4.1/devsper/runtime/state_manager.py +52 -0
- devsper-2.4.1/devsper/runtime/task_runner.py +106 -0
- devsper-2.4.1/devsper/runtime/tool_runner.py +169 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/server/swarmworker.py +27 -5
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/swarm.py +6 -1
- {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/otel.py +6 -3
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/selector.py +56 -2
- {devsper-2.3.0 → devsper-2.4.1}/pyproject.toml +1 -1
- {devsper-2.3.0 → devsper-2.4.1}/uv.lock +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.1}/.env.example +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.github/FUNDING.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/pypi-publish.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/release-on-tag.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.github/workflows/worker-release.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.gitignore +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/.python-version +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/CODE_OF_CONDUCT.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/CONTRIBUTING.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/Cargo.lock +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/Dockerfile.local-pool +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/LICENSE +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/SECURITY.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/benchmarks/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_dataset_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_repository_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/benchmarks/bench_research_pipeline.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/branding/logo.svg +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/discovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/server.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/tool_adapter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/a2a/types.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/critic.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/identity.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/message_bus.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/roles.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/agents/run_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/analytics/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/analytics/tool_analytics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/audit/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/audit/logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/budget.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/backends/redis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/message.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/schema_version.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/bus/topics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/embedding_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/hashing.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cache/task_cache.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/commands/cloud.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/github_oauth.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/init.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/run_progress.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/components.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/controller_run_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/errors.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/logging.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/onboarding.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/progress.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cli/ui/theme.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/election.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/local.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/node_info.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/cluster/state_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/compliance/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/compliance/pii.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/config/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/config/config_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/config/defaults.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/connectors/sample_connector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/agent/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/agent/runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/hitl/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/hitl/state_machine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/memory/shared_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/reporting/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/reporting/publisher.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/durability.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/runtime/orchestrator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/base_tool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/core/tools/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/cli.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/migration.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/credentials/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dashboard/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dashboard/dashboard.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/debugger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/repo_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/dev/scaffold.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/embeddings/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/embeddings/service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/decision_tree.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/rationale.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/explainability/simulation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/branding.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/manifest.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/model.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/packager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/pdf.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/export/service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/approval.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/hitl/escalation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/adaptation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/cost_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/formatter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/analysis/run_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/learning_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/code_analysis_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/data_science_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/document_pipeline_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/experiment_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategies/research_strategy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/strategy_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/synthesis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/intelligence/task_optimizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/knowledge_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/knowledge/query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/consolidation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/context.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/embeddings.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/memory_types.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/namespaces.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/platform_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/redis_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/scoring.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/summarizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/memory/supermemory_rust_ranker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/base_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/architect_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/coder_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/debugger_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/docs_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/coding/tester_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/iteration_loop.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/mission_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/editor_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/researcher_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/reviewer_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/missions/research/writer_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/controller.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/rpc.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/single.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/nodes/worker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/meta_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/orchestration/priority_queue.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/redis_results_sink.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/reporter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/platform/runtime_events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/marketplace/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/plugin_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/plugins/plugin_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/policy/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/config.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/crypto.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/local_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/manager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/org_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/dev.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/local.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/profiles/prod.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/security.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/pool/worker_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/protocol/server.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/protocols/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/anthropic.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/complexity_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/gemini.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/github.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/model_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/openai.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/anthropic_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/custom_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/gemini_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/github_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/ollama_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/openai_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/backends/vllm_backend.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/factory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/legacy.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/providers/router/router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/nodes.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/reasoning/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/clarification_manager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/health.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/replay.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/replay_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/run_history.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/task_state.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/telemetry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/trace_tree.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/runtime/visualize.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/sandbox/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/sandbox/sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/server/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/server/events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/server/topology.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/uploads/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/storage/uploads/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/checkpointer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/executor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/prefetcher.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/scheduler.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/swarm/speculation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/telemetry/pricing.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/base.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/api_surface_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/architecture_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/codebase_indexer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/dependency_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/design_pattern_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/large_function_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/module_responsibility_mapper.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/parallel_codebase_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/refactor_candidate_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/repository_semantic_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/code_intelligence/test_coverage_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/analyze_code_complexity.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/dependency_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/extract_functions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/format_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/generate_docstrings.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/generate_unit_tests.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/lint_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/refactor_function.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/repo_structure_map.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/coding/run_python.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/column_type_detection.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/csv_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_filter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_groupby.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataframe_stats.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataset_sampling.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/dataset_schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/json_pretty_print.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/json_query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data/missing_value_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/correlation_heatmap.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_bias_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_distribution_report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_drift_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_outlier_detector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/dataset_profile.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/distributed_dataset_processor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/feature_engineering_suggestions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/feature_importance_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/model_input_validator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/data_science/time_series_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/fetch_url.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/python_exec.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/read_csv.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/upload_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/default/web_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/_docproc.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/document_to_markdown.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_document_images.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_document_text.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_equations.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/extract_tables.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/summarize_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_latex_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_markdown_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/documents/write_word_document.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/bootstrap_estimator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/experiment_report_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/experiment_tracker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/grid_search_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/model_benchmark_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/monte_carlo_experiment.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/parameter_sweep_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/result_comparator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/simulation_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/statistical_significance_test.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/experiments/swarm_map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/append_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_hash.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_line_count.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_metadata.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/file_preview.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/find_large_files.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/list_directory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/read_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/search_files.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/filesystem/write_file.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/distributed_document_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/docproc_corpus_pipeline.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/repository_semantic_map.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/research_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/flagship/swarm_experiment_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/hitl_request.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/citation_graph_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/concept_frequency_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/corpus_builder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/cross_document_entity_linker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/document_corpus_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/document_topic_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/knowledge_graph_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/knowledge/timeline_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/calculate_expression.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/correlation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/distribution_summary.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/histogram.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/linear_regression.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/matrix_multiply.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/mean_std.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/monte_carlo_simulation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/polynomial_fit.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/math/random_sample.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/adapter.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/client.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/mcp/discovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/delete_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/list_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/search_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/store_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/summarize_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/memory/tag_memory.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/pipelines.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/arxiv_download.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/arxiv_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/citation_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/duckduckgo_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/paper_metadata_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/paper_summarizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/research_question_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/topic_cluster.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/web_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research/wikipedia_lookup.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/citation_context_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/literature_review_generator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/methodology_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_contribution_extractor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_dataset_identifier.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_method_comparator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_similarity_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/paper_trend_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/parallel_document_analyzer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/research_gap_finder.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/research_topic_mapper.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/research_advanced/swarm_literature_review.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/report.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/scorer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/scoring/store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/cpu_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/disk_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/environment_variables.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/memory_usage.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/pip_install.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/pip_search.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/process_list.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/python_package_list.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/run_shell_command.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/system/system_info.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tools/tool_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/activity_feed_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/adaptive_tasks_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/agent_role_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/app.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/dashboard_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/dev_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/inject_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/knowledge_graph_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/layout.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/logs_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/memory_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/mission_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/performance_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/reasoning_graph_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/results_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/swarm_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/task_detail_screen.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/tui/task_view.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/types/event.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/types/exceptions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/types/swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/types/task.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/changelog.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/cli.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/installer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/notifier.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/upgrade/version_check.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/event_logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/http.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/utils/models.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/visualization/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/visualization/dag_export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/conditions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/context.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/resolver.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper/workflow/validator.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/devsper.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/docker-compose.yml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/_common.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/_config.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/coding/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/coding/analyze_repository.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/coding/generate_docs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/coding/refactor_candidates.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/dataset_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/data_science/run_experiments.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/demo_swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/controller.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/parallel_survey.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_controller.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_demo.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/run_worker.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/distributed/worker.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/documents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/documents/analyze_documents.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/monte_carlo_demo.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/experiments/parameter_sweep.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/research/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/research/literature_review.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/research/research_gap_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/examples/research/research_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/requirements-docs.txt +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/seed_tool_scores.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_cli.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_full.sh +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/test_tool_scoring_smoke.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/scripts/test_v2_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/supermemory-core/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/supermemory-core/src/main.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/agents/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/agents/test_roles.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/benchmarks/test_v16_perf.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_controller_restart_hitl.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_duplicate_event_delivery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_event_idempotency.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_event_retry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_hitl_pause_resume.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_sse_reconnect.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_sse_stream.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/integration/test_worker_crash_recovery.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_adaptation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_learning_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_strategy_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/intelligence/test_task_optimizer.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_agent_memory_integration.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_context_run_scope.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/memory/test_memory_store.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/fixtures.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_crypto.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_e2e_redis_loop.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_heartbeat_eviction.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_local_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_org_pool.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_priority_chain.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/pool/test_rate_limiting.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/reasoning/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/reasoning/test_reasoning_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_budget.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_otel_phase1.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_packager.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_protocol_schema.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_replay.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_replay_engine.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_telemetry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/runtime/test_visualize.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_agent.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_analysis.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_analytics.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_auto_model.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_clarification.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_clarification_multinode.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_config_loader.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_credentials.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_cross_boundary_serialization.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dag_export.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_agents.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_build_cmd.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_debugger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_repo_index.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_sandbox.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_dev_scaffold.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_distributed_bugs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_embeddings_service.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_event_logger.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_executor.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_export_runs.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_github_provider.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_init.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_knowledge_graph.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_knowledge_query.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_map_reduce.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_memory_evolution.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_memory_isolation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_missions.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_model_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_planner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_platform_runtime_events.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_plugins.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_protocols.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_router.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_scheduler.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_speculation.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_strategies.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_swarm.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_task_cache.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_tool_scoring.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_tool_selector.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_upgrade.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_v110.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_v16.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_v17.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_v18.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_v19.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/test_workflow.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/__init__.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_code_intelligence_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_coding_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_core_tool_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_data_science_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_data_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_document_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_experiments_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_filesystem_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_flagship_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_knowledge_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_math_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_memory_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_pipelines.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_registry.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_research_advanced_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_research_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_system_tools.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/tests/tools/test_tool_runner.py +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/.dockerignore +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/Cargo.lock +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/Cargo.toml +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/Dockerfile +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/README.md +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/budget.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/bus.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/claim.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/clarification.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/config.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/controller.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/election.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/error.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/executor.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/health.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/heartbeat.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/lib.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/main.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/metrics.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/reconnect.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/registry.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/router.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/rpc.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/scheduler.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/snapshot.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/telemetry.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/agent.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/event.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/mod.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/node.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/types/task.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/src/worker_node.rs +0 -0
- {devsper-2.3.0 → devsper-2.4.1}/worker/tests/integration.rs +0 -0
|
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.4.1] — 2026-03-31
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **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.
|
|
15
|
+
- **Run view prompt stability** — Local clarification prompts now pause/resume live rendering cleanly, reducing TUI corruption and preventing hidden/stuck prompts during interactive runs.
|
|
16
|
+
- **Silent-failure propagation** — Agent failures now surface as explicit task failures (instead of empty-success paths), with clearer errors for missing model configuration.
|
|
17
|
+
- **Executor compatibility regression** — Restored `budget_manager` compatibility on the runtime executor path to avoid end-of-run `AttributeError` crashes.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **Research tool routing defaults** — Tool selection now biases web-first for research/business discovery tasks when no local dataset path is provided.
|
|
22
|
+
- **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.
|
|
23
|
+
- **Duration formatting** — CLI run summary and export outputs now prefer `HH:MM:SS` format.
|
|
24
|
+
- **Telemetry noise control** — Console span export is now opt-in (`DEVSPER_OTEL_CONSOLE=1`) to keep interactive TUI output clean by default.
|
|
25
|
+
- **Auto-export workflow** — Added config-driven post-run export option (`[export] auto_export_on_run`) with selectable output format.
|
|
26
|
+
|
|
27
|
+
## [2.4.0] — 2026-03-31
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **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`).
|
|
32
|
+
- **Runtime architecture documentation** — Expanded runtime docs with distributed architecture, worker/controller lifecycle, speculative execution flow, and HITL lifecycle details.
|
|
33
|
+
- **Tool execution hardening** — Upgraded runtime tool runner with bounded parallelism, dependency-aware batching, per-call timeout isolation, and cancellation support.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- **Executor orchestration** — Runtime executor now supports agent-pool-backed execution, model routing integration, speculative follow-up scheduling hooks, and improved cancellation/backpressure behavior.
|
|
38
|
+
- **Prompt/token efficiency** — Tool schema injection in agent prompts was compressed to reduce runtime token overhead in tool-enabled turns.
|
|
39
|
+
- **Homepage and release communication** — Updated README homepage with v2.4.0 release CTA and an architecture upgrade blog entry for this release.
|
|
40
|
+
|
|
10
41
|
## [2.3.0] — 2026-03-30
|
|
11
42
|
|
|
12
43
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsper
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
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
|
|
|
@@ -581,6 +594,176 @@ class Agent:
|
|
|
581
594
|
self.audit_logger = audit_logger
|
|
582
595
|
self.audit_run_id = audit_run_id or ""
|
|
583
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
|
|
584
767
|
|
|
585
768
|
def run(self, request: AgentRequest) -> AgentResponse:
|
|
586
769
|
"""Stateless run: all context in AgentRequest, all output in AgentResponse."""
|
|
@@ -757,6 +940,12 @@ class Agent:
|
|
|
757
940
|
message_bus_section = self.message_bus.get_context_sync(task.id) or ""
|
|
758
941
|
if message_bus_section:
|
|
759
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()
|
|
760
949
|
from devsper.agents.roles import get_role_config
|
|
761
950
|
|
|
762
951
|
role_config = get_role_config(getattr(task, "role", None))
|
|
@@ -844,6 +1033,8 @@ class Agent:
|
|
|
844
1033
|
success=True,
|
|
845
1034
|
)
|
|
846
1035
|
self.apply_response(task, response)
|
|
1036
|
+
if not response.success:
|
|
1037
|
+
raise RuntimeError(response.error or "Agent run failed")
|
|
847
1038
|
return response.result
|
|
848
1039
|
|
|
849
1040
|
def _enrich_task(self, task: Task, answers: dict) -> Task:
|
|
@@ -1210,6 +1401,57 @@ class Agent:
|
|
|
1210
1401
|
if not fields:
|
|
1211
1402
|
return json.dumps({"error": "hitl.request has no valid fields"})
|
|
1212
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
|
+
|
|
1213
1455
|
req = ClarificationRequest(
|
|
1214
1456
|
request_id=str(uuid.uuid4()),
|
|
1215
1457
|
task_id=request.task.id,
|
|
@@ -1220,13 +1462,15 @@ class Agent:
|
|
|
1220
1462
|
timeout_seconds=int(tool_args.get("timeout_seconds", 120)),
|
|
1221
1463
|
)
|
|
1222
1464
|
resp = requester.request_clarification(req)
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
}
|
|
1229
|
-
|
|
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)
|
|
1230
1474
|
|
|
1231
1475
|
def _emit_tool_called_audit(
|
|
1232
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",
|