talkops-opscloud 0.3.0b2__tar.gz → 0.3.0b4__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.
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/PKG-INFO +1 -1
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/pyproject.toml +1 -1
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/factory.py +7 -28
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/server.py +33 -11
- talkops_opscloud-0.3.0b4/src/opscloud/server/server_graph.py +123 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_server.py +46 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/uv.lock +1 -1
- talkops_opscloud-0.3.0b2/src/opscloud/server/server_graph.py +0 -79
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.dockerignore +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.env.example +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.github/workflows/ci.yml +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.github/workflows/release-pypi.yml +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.gitignore +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.python-version +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/LICENSE +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/README.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/Configuration.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/approval-mode.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/cli-reference.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/config.toml.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/credentials.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/goal-and-rubrics.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/hooks.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/mcp-tools.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/memory-and-skills.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/model-providers.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/overview.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/plugins.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/quickstart.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/remote-sandboxes.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/subagents.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/scripts/install.sh +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/__main__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_constants.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_debug.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_debug_buffer.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_textual_patches.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_version.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/approval_mode.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/composite.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/local.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_factory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/remember/SKILL.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/SKILL.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/auth.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/doctor.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/mcp.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/threads.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/interactive.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/main.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/non_interactive.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/server_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_base.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_guards.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_router.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_types.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/auth.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/bug.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/clear.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/cloud.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/compact.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/config_cmd.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/cost.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/doctor.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/effort.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/exit_cmd.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/fast.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/help_cmd.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/mcp.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/model.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/permissions.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/plugins.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/pool.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/resume.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/skills.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/agents.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/btw.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/copy.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/goal.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/loop.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/memory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/review.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/rubric.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/runtime.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/skill_creator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/skill_invoke.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/tasks.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/trace.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/ui_toggles.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/version.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/postgres.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/sqlite.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/aws.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/cloud_profiles.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/env_vars.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/langsmith.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/manifest.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/metadata.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/paths.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/plugins.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/settings.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/store_factory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/toml_config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/editor.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/exceptions.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/file_ops.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/env.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/interrupt.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/adapters.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/domain.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/transport.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/tools.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/input.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/base.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/content_filter.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/event_bus.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/hooks.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/identity.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/notifications.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/stream_bridge.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/thread_store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/json_types.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/discovery.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/mcp_info.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/middleware.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/preload.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/raw_config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/semantic_profiler.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/session_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/trust.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/branch.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/guard.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/onboarding.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/_repository_bounds.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/ask_user.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/auto_mode.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/auto_mode_hitl.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/compaction.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/configurable_model.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/cost_tracking.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/glm_stall_recovery.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_criteria.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_state_notice.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_tools.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/headless_mcp_guard.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/jev_model_router.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/local_context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/mcp_context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/mcp_middleware.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/memory_guard.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/model_retry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/reliable_rubric.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/resume_state.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/server_hooks.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/shell_allow_list.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/skills.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagent_artifacts.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagent_telemetry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagents.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/tool_filter.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/unified_system_message.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/factory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/pool.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/reasoning.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/offload.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/output.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/_json.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/agents.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/commands.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/mcp.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/skills.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/commands_cli.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/discovery.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/manifest.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/marketplace.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/models.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/project_plugins.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/protocol.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/substitution.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/project_utils.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/system.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/templates/system_prompt.md +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/types.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/evaluator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/evidence_extractor.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/generator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/jev_compiler.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/jev_grader.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/middleware.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/schema/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/schema/interrupts.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/approval_mode.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/approval_mode_source.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/cli_ast_evaluator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/jev_classifier.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/shell_safety.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/unicode_security.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/url_validation.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/_server_config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/commands.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/invocation.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/load.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/loader.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/merge.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/sources.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/trust.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/base.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/cloud_context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/goal_channels.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/goal_state_limits.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/resume_state.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/service_context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/session.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/state_migration.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/loader.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/subagents_parser.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/types.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/catalog.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/display.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/fetch_url.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/goal_tools.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/thread.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/web_search.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/app.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/app.tcss +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/clipboard.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/command_registry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/message_store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/permission_store.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/preferences.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/prompt_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/remote_client.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/textual_adapter.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/theme.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/ui_help.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_ask_user_types.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_copy_spans.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_inline_prompt.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_js_eval_display.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_links.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_tool_stream.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/agent_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/approval.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/ask_user.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auth.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auth_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auto_mode_notice.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/autocomplete.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/chat_input.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/cloud_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/config_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/debug_console.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/devops_renderers.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/diff.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/effort_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/goal_review.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/goal_status.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/infra_panel.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/install_confirm.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/loading.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/mcp_viewer.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/messages.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/model_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/notification_center.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/notification_settings.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/operation_card.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/permissions_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/plugin_manager.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/pool_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/preamble.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/skills_viewer.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/status.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/subagent_panel.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/theme_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/thread_selector.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/toast.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_display.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_renderers.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_widgets.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/welcome.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/welcome_popup.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/cost_estimation.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/git.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/logger.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/session_stats.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/startup_error.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/conftest.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/datasets/aws_cloud_ops.yaml +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/__init__.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/output_evaluator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/trajectory_evaluator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/runners/test_eval_runner.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/integration_tests/test_agent_lifecycle.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/integration_tests/test_server_lifecycle.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_agent_factory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_approval_widget.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_ask_user.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_ast_evaluator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_backend.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_checkpointer.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cli_enhancements.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cli_rubric.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cloud_command.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_commands.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_config.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cost_tracking.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_default_marketplace.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_criteria.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_state_limits.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_state_notice.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_grader_tools.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_hitl.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_integrations_and_hooks.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_interrupt_schemas.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_jev_model_router.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_jev_rubrics.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_local_context.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_logging.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp_middleware.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp_viewer_and_command.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_memory.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_memory_enhancements.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_middleware_stack.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_model_providers.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_model_retry.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugin_agent_skill_mcp_scoping.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugin_manager_search.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugins.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_project_plugins.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_prompts_and_schema.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_reliable_rubric.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_reload_restart.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_resume_state.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_resumed_thread_latency_fix.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_rubrics.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_security.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_server_hooks.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_skill_creator.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_skills.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_state.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_subagents.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tool_filter.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tools.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tui_app.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_utils.py +0 -0
- {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/uv-requirements.txt +0 -0
|
@@ -707,9 +707,9 @@ def create_opscloud_agent(
|
|
|
707
707
|
from deepagents.middleware.subagents import GENERAL_PURPOSE_SUBAGENT, SubAgent
|
|
708
708
|
|
|
709
709
|
compiled_subagents: list[SubAgent] = []
|
|
710
|
-
base_subagent_tools = [t for t in all_tools if t not in mcp_tools_list]
|
|
711
710
|
for name, subagent_meta in subagent_by_name.items():
|
|
712
711
|
model_spec = subagent_meta.get("model")
|
|
712
|
+
has_explicit_model = bool(model_spec)
|
|
713
713
|
sub_prompt = subagent_meta.get("system_prompt") or ""
|
|
714
714
|
subagent_dict: dict[str, Any] = {
|
|
715
715
|
"name": subagent_meta.get("name") or name,
|
|
@@ -717,30 +717,14 @@ def create_opscloud_agent(
|
|
|
717
717
|
"system_prompt": sub_prompt,
|
|
718
718
|
}
|
|
719
719
|
if model_spec:
|
|
720
|
-
|
|
721
|
-
sub_model_res = create_model(model_spec)
|
|
722
|
-
subagent_dict["model"] = sub_model_res.model
|
|
723
|
-
except Exception as e:
|
|
724
|
-
logger.warning("Failed to resolve model %s for subagent %s: %s", model_spec, name, e)
|
|
720
|
+
subagent_dict["model"] = model_spec
|
|
725
721
|
|
|
726
722
|
subagent_name = subagent_meta.get("name") or name
|
|
727
723
|
subagent_path = subagent_meta.get("path")
|
|
728
724
|
custom_mw = subagent_meta.get("middleware")
|
|
729
725
|
|
|
730
|
-
# Build per-subagent MCP config and tools for this subagent
|
|
731
|
-
from opscloud.plugins.adapters.mcp import prepare_subagent_mcp
|
|
732
|
-
|
|
733
|
-
servers, subagent_mcp_tools, sub_mcp_server_infos = prepare_subagent_mcp(
|
|
734
|
-
subagent_name, subagent_meta, project_scope_root
|
|
735
|
-
)
|
|
736
|
-
|
|
737
|
-
if subagent_mcp_tools:
|
|
738
|
-
subagent_dict["tools"] = [*base_subagent_tools, *subagent_mcp_tools]
|
|
739
|
-
else:
|
|
740
|
-
subagent_dict["tools"] = list(base_subagent_tools)
|
|
741
|
-
|
|
742
726
|
sub_middleware = _subagent_cli_middleware(
|
|
743
|
-
has_explicit_model=
|
|
727
|
+
has_explicit_model=has_explicit_model,
|
|
744
728
|
assistant_id=assistant_id,
|
|
745
729
|
subagent_name=subagent_name,
|
|
746
730
|
subagent_meta=subagent_meta,
|
|
@@ -754,11 +738,8 @@ def create_opscloud_agent(
|
|
|
754
738
|
worktree_root=effective_cwd,
|
|
755
739
|
subagent_path=subagent_path if subagent_path else None,
|
|
756
740
|
custom_middleware=custom_mw if isinstance(custom_mw, list) else None,
|
|
757
|
-
mcp_server_info=sub_mcp_server_infos or None,
|
|
758
|
-
mcp_config=servers or None,
|
|
759
|
-
mcp_tools=subagent_mcp_tools or None,
|
|
760
741
|
backend=composite_backend,
|
|
761
|
-
model=
|
|
742
|
+
model=active_model,
|
|
762
743
|
)
|
|
763
744
|
if sub_middleware:
|
|
764
745
|
subagent_dict["middleware"] = sub_middleware
|
|
@@ -767,10 +748,9 @@ def create_opscloud_agent(
|
|
|
767
748
|
|
|
768
749
|
compiled_subagents.append(cast(SubAgent, subagent_dict))
|
|
769
750
|
logger.info(
|
|
770
|
-
"
|
|
751
|
+
"Registered declarative subagent '%s'",
|
|
771
752
|
subagent_name,
|
|
772
|
-
|
|
773
|
-
extra={"subagent": subagent_name, "tools_count": len(subagent_dict.get("tools", []))},
|
|
753
|
+
extra={"subagent": subagent_name},
|
|
774
754
|
)
|
|
775
755
|
|
|
776
756
|
if not any(sub.get("name") == GENERAL_PURPOSE_SUBAGENT["name"] for sub in compiled_subagents):
|
|
@@ -793,7 +773,6 @@ def create_opscloud_agent(
|
|
|
793
773
|
"name": gp_name,
|
|
794
774
|
"description": gp_description,
|
|
795
775
|
"system_prompt": gp_system_prompt,
|
|
796
|
-
"tools": list(base_subagent_tools),
|
|
797
776
|
"middleware": gp_middleware,
|
|
798
777
|
}
|
|
799
778
|
if interrupt_on is not None:
|
|
@@ -810,7 +789,7 @@ def create_opscloud_agent(
|
|
|
810
789
|
},
|
|
811
790
|
)
|
|
812
791
|
logger.info(
|
|
813
|
-
"
|
|
792
|
+
"Registered declarative subagent '%s'",
|
|
814
793
|
gp_name,
|
|
815
794
|
extra={"subagent": gp_name},
|
|
816
795
|
)
|
|
@@ -132,6 +132,8 @@ class ServerProcess:
|
|
|
132
132
|
server_log_level = getattr(self.config, "server_log_level", "WARNING") or "WARNING"
|
|
133
133
|
# Silence noisy startup/profiler heartbeats in LangGraph API by defaulting LOG_LEVEL to WARNING
|
|
134
134
|
env.setdefault("LOG_LEVEL", server_log_level)
|
|
135
|
+
# Prevent blockbuster from raising BlockingError during model/SDK execution in ASGI server
|
|
136
|
+
env["LANGGRAPH_ALLOW_BLOCKING"] = "true"
|
|
135
137
|
|
|
136
138
|
cmd = [
|
|
137
139
|
sys.executable,
|
|
@@ -144,6 +146,7 @@ class ServerProcess:
|
|
|
144
146
|
str(self.port),
|
|
145
147
|
"--no-browser",
|
|
146
148
|
"--no-reload",
|
|
149
|
+
"--allow-blocking",
|
|
147
150
|
"--config",
|
|
148
151
|
str(self.runtime_dir / "langgraph.json"),
|
|
149
152
|
"--server-log-level",
|
|
@@ -198,23 +201,42 @@ class ServerProcess:
|
|
|
198
201
|
|
|
199
202
|
def wait_for_graph_ready(self, graph_name: str = "agent", timeout: float = 30.0) -> None:
|
|
200
203
|
"""Resolve the served graph once so lazy startup failures surface immediately."""
|
|
204
|
+
if self.process is None:
|
|
205
|
+
raise RuntimeError("Server process is not running")
|
|
206
|
+
|
|
201
207
|
deadline = time.monotonic() + timeout
|
|
202
208
|
graph_url = f"{self.url}/assistants/{graph_name}/graph"
|
|
203
209
|
|
|
204
210
|
while time.monotonic() < deadline:
|
|
205
|
-
if self.process
|
|
211
|
+
if self.process.poll() is not None:
|
|
206
212
|
err = self._read_log_tail()
|
|
207
|
-
raise RuntimeError(f"Server exited
|
|
213
|
+
raise RuntimeError(f"Server process exited with code {self.process.returncode}:\n{err}")
|
|
214
|
+
|
|
215
|
+
remaining = max(0.1, deadline - time.monotonic())
|
|
208
216
|
try:
|
|
209
|
-
resp = httpx.get(graph_url, timeout=
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
217
|
+
resp = httpx.get(graph_url, timeout=remaining)
|
|
218
|
+
except (httpx.TransportError, httpx.TimeoutException, OSError) as exc:
|
|
219
|
+
err = self._read_log_tail()
|
|
220
|
+
if self.process.poll() is not None:
|
|
221
|
+
msg = f"Server process exited with code {self.process.returncode}:\n{err}"
|
|
222
|
+
else:
|
|
223
|
+
msg = f"Server graph '{graph_name}' did not initialize within {timeout}s:\n{err}"
|
|
224
|
+
raise RuntimeError(msg) from exc
|
|
225
|
+
|
|
226
|
+
if resp.status_code == 200:
|
|
227
|
+
logger.info("Server graph %r is ready at %s", graph_name, self.url)
|
|
228
|
+
return
|
|
229
|
+
elif resp.status_code == 404 and graph_name == "agent":
|
|
230
|
+
graph_name = "opscloud"
|
|
231
|
+
graph_url = f"{self.url}/assistants/{graph_name}/graph"
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
err = self._read_log_tail()
|
|
235
|
+
msg = f"Server graph '{graph_name}' failed readiness check (status: {resp.status_code}):\n{err}"
|
|
236
|
+
raise RuntimeError(msg)
|
|
237
|
+
|
|
238
|
+
err = self._read_log_tail()
|
|
239
|
+
raise RuntimeError(f"Server graph '{graph_name}' did not initialize within {timeout}s:\n{err}")
|
|
218
240
|
|
|
219
241
|
def _stop_process(self) -> None:
|
|
220
242
|
"""Stop only the server subprocess and its log file handle."""
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""Server-side graph entry point for `langgraph dev`.
|
|
2
|
+
|
|
3
|
+
Follows the reference implementation in `reference/dcode/server_graph.py` by using
|
|
4
|
+
a closure-managed `ServerRuntime` factory to build and cache all server runtime resources.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
from collections.abc import Awaitable, Callable
|
|
11
|
+
import os
|
|
12
|
+
import sys
|
|
13
|
+
from typing import Any, NamedTuple
|
|
14
|
+
|
|
15
|
+
from opscloud.backend.composite import OpsCloudCompositeBackend
|
|
16
|
+
from opscloud.server._server_config import ServerConfig
|
|
17
|
+
from opscloud.utils.logger import get_logger
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ServerRuntime(NamedTuple):
|
|
23
|
+
"""The one-per-process result with named slots preventing transposition."""
|
|
24
|
+
|
|
25
|
+
agent: Any
|
|
26
|
+
"""Compiled LangGraph agent graph served as `agent`."""
|
|
27
|
+
|
|
28
|
+
backend: OpsCloudCompositeBackend
|
|
29
|
+
"""Composite backend the agent and its operations were built with."""
|
|
30
|
+
|
|
31
|
+
offload: Any | None = None
|
|
32
|
+
"""Server-owned thread offload operation bound to backend."""
|
|
33
|
+
|
|
34
|
+
mcp_server_info: list[Any] | None = None
|
|
35
|
+
"""Workspace-scoped MCP metadata for the interactive client."""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def _make_graphs() -> ServerRuntime:
|
|
39
|
+
"""Create the OpsCloud agent graph and its composite backend."""
|
|
40
|
+
config = ServerConfig.from_env()
|
|
41
|
+
|
|
42
|
+
if config.cwd:
|
|
43
|
+
os.environ["OPSCLOUD_SERVER_CWD"] = config.cwd
|
|
44
|
+
if config.project_root:
|
|
45
|
+
os.environ["OPSCLOUD_SERVER_PROJECT_ROOT"] = config.project_root
|
|
46
|
+
|
|
47
|
+
from opscloud.project_utils import get_server_project_context
|
|
48
|
+
|
|
49
|
+
project_context = get_server_project_context()
|
|
50
|
+
|
|
51
|
+
if config.aws_profile:
|
|
52
|
+
os.environ["AWS_PROFILE"] = config.aws_profile
|
|
53
|
+
if config.aws_region:
|
|
54
|
+
os.environ["AWS_REGION"] = config.aws_region
|
|
55
|
+
if config.aws_profile or config.aws_region:
|
|
56
|
+
from opscloud.config.settings import sync_aws_env_aliases
|
|
57
|
+
|
|
58
|
+
sync_aws_env_aliases()
|
|
59
|
+
|
|
60
|
+
if config.read_only:
|
|
61
|
+
os.environ["OPSCLOUD_READ_ONLY"] = "true"
|
|
62
|
+
if config.shell_allow_list:
|
|
63
|
+
os.environ["OPSCLOUD_SHELL_ALLOW_LIST"] = ",".join(config.shell_allow_list)
|
|
64
|
+
|
|
65
|
+
from opscloud.model.factory import create_model
|
|
66
|
+
|
|
67
|
+
model_res = await asyncio.to_thread(create_model, config.model)
|
|
68
|
+
|
|
69
|
+
effective_cwd = project_context.user_cwd if project_context else config.cwd
|
|
70
|
+
|
|
71
|
+
def _create_cli_graphs_sync() -> ServerRuntime:
|
|
72
|
+
from opscloud.agent.factory import create_opscloud_agent
|
|
73
|
+
|
|
74
|
+
agent, composite_backend = create_opscloud_agent(
|
|
75
|
+
model=model_res.model,
|
|
76
|
+
assistant_id=config.assistant_id,
|
|
77
|
+
system_prompt=config.system_prompt,
|
|
78
|
+
interactive=config.interactive,
|
|
79
|
+
auto_approve=config.auto_approve,
|
|
80
|
+
enable_shell=config.enable_shell,
|
|
81
|
+
cwd=effective_cwd,
|
|
82
|
+
project_context=project_context,
|
|
83
|
+
)
|
|
84
|
+
return ServerRuntime(
|
|
85
|
+
agent=agent,
|
|
86
|
+
backend=composite_backend,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return await asyncio.to_thread(_create_cli_graphs_sync)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _build_runtime_factory(
|
|
93
|
+
builder: Callable[[], Awaitable[ServerRuntime]] | None = None,
|
|
94
|
+
) -> Callable[[], Awaitable[ServerRuntime]]:
|
|
95
|
+
"""Build the cached factory for all server-owned runtime resources.
|
|
96
|
+
|
|
97
|
+
The cache lives in this closure rather than in module-level mutable globals,
|
|
98
|
+
matching reference/dcode/server_graph.py.
|
|
99
|
+
"""
|
|
100
|
+
runtime: ServerRuntime | None = None
|
|
101
|
+
lock = asyncio.Lock()
|
|
102
|
+
|
|
103
|
+
async def get_runtime() -> ServerRuntime:
|
|
104
|
+
nonlocal runtime
|
|
105
|
+
if runtime is None:
|
|
106
|
+
async with lock:
|
|
107
|
+
if runtime is None:
|
|
108
|
+
runtime = await (builder or _make_graphs)()
|
|
109
|
+
return runtime
|
|
110
|
+
|
|
111
|
+
return get_runtime
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
_get_runtime = _build_runtime_factory()
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
async def make_graph() -> Any:
|
|
118
|
+
"""Return the agent graph for `langgraph dev`.
|
|
119
|
+
|
|
120
|
+
Delegates to the cached runtime factory. The compiled graph is created
|
|
121
|
+
on first call and served in <1ms for subsequent requests without rebuild overhead.
|
|
122
|
+
"""
|
|
123
|
+
return (await _get_runtime()).agent
|
|
@@ -155,3 +155,49 @@ def test_server_graph_factory_signature():
|
|
|
155
155
|
|
|
156
156
|
classification = _classify_factory(make_graph)
|
|
157
157
|
assert classification == {}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_wait_for_graph_ready_single_request():
|
|
161
|
+
"""Verify wait_for_graph_ready sends a single request with full remaining timeout."""
|
|
162
|
+
import httpx
|
|
163
|
+
from unittest.mock import MagicMock, patch
|
|
164
|
+
|
|
165
|
+
cfg = ServerConfig()
|
|
166
|
+
proc = ServerProcess(cfg, port=8123)
|
|
167
|
+
proc.process = MagicMock()
|
|
168
|
+
proc.process.poll.return_value = None
|
|
169
|
+
|
|
170
|
+
mock_resp = MagicMock()
|
|
171
|
+
mock_resp.status_code = 200
|
|
172
|
+
|
|
173
|
+
with patch("httpx.get", return_value=mock_resp) as mock_get:
|
|
174
|
+
proc.wait_for_graph_ready("agent", timeout=15.0)
|
|
175
|
+
|
|
176
|
+
# Must be called exactly once
|
|
177
|
+
assert mock_get.call_count == 1
|
|
178
|
+
call_url, call_kwargs = mock_get.call_args[0][0], mock_get.call_args[1]
|
|
179
|
+
assert call_url == f"{proc.url}/assistants/agent/graph"
|
|
180
|
+
# Timeout must be approximately 15.0s, not 2.0s
|
|
181
|
+
assert 14.0 <= call_kwargs["timeout"] <= 15.0
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def test_wait_for_graph_ready_fallback():
|
|
185
|
+
"""Verify wait_for_graph_ready falls back from agent to opscloud on 404."""
|
|
186
|
+
import httpx
|
|
187
|
+
from unittest.mock import MagicMock, patch
|
|
188
|
+
|
|
189
|
+
cfg = ServerConfig()
|
|
190
|
+
proc = ServerProcess(cfg, port=8123)
|
|
191
|
+
proc.process = MagicMock()
|
|
192
|
+
proc.process.poll.return_value = None
|
|
193
|
+
|
|
194
|
+
resp_404 = MagicMock(status_code=404)
|
|
195
|
+
resp_200 = MagicMock(status_code=200)
|
|
196
|
+
|
|
197
|
+
with patch("httpx.get", side_effect=[resp_404, resp_200]) as mock_get:
|
|
198
|
+
proc.wait_for_graph_ready("agent", timeout=15.0)
|
|
199
|
+
|
|
200
|
+
assert mock_get.call_count == 2
|
|
201
|
+
assert mock_get.call_args_list[0][0][0] == f"{proc.url}/assistants/agent/graph"
|
|
202
|
+
assert mock_get.call_args_list[1][0][0] == f"{proc.url}/assistants/opscloud/graph"
|
|
203
|
+
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"""Server-side graph entry point for `langgraph dev`."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import asyncio
|
|
6
|
-
import os
|
|
7
|
-
import sys
|
|
8
|
-
from typing import Any
|
|
9
|
-
|
|
10
|
-
from opscloud.server._server_config import ServerConfig
|
|
11
|
-
from opscloud.utils.logger import get_logger
|
|
12
|
-
|
|
13
|
-
logger = get_logger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _make_graph_sync() -> Any:
|
|
17
|
-
"""Synchronously create and compile the OpsCloud agent graph."""
|
|
18
|
-
from opscloud.agent.factory import create_opscloud_agent
|
|
19
|
-
from opscloud.model.factory import create_model
|
|
20
|
-
from opscloud.project_utils import get_server_project_context
|
|
21
|
-
|
|
22
|
-
config = ServerConfig.from_env()
|
|
23
|
-
|
|
24
|
-
if config.cwd:
|
|
25
|
-
os.environ["OPSCLOUD_SERVER_CWD"] = config.cwd
|
|
26
|
-
if config.project_root:
|
|
27
|
-
os.environ["OPSCLOUD_SERVER_PROJECT_ROOT"] = config.project_root
|
|
28
|
-
|
|
29
|
-
project_context = get_server_project_context()
|
|
30
|
-
|
|
31
|
-
if config.aws_profile:
|
|
32
|
-
os.environ["AWS_PROFILE"] = config.aws_profile
|
|
33
|
-
if config.aws_region:
|
|
34
|
-
os.environ["AWS_REGION"] = config.aws_region
|
|
35
|
-
if config.aws_profile or config.aws_region:
|
|
36
|
-
from opscloud.config.settings import sync_aws_env_aliases
|
|
37
|
-
|
|
38
|
-
sync_aws_env_aliases()
|
|
39
|
-
|
|
40
|
-
if config.read_only:
|
|
41
|
-
os.environ["OPSCLOUD_READ_ONLY"] = "true"
|
|
42
|
-
if config.shell_allow_list:
|
|
43
|
-
os.environ["OPSCLOUD_SHELL_ALLOW_LIST"] = ",".join(config.shell_allow_list)
|
|
44
|
-
|
|
45
|
-
model_spec = config.model or "anthropic:claude-3-5-sonnet-latest"
|
|
46
|
-
model_res = create_model(model_spec)
|
|
47
|
-
|
|
48
|
-
effective_cwd = project_context.user_cwd if project_context else config.cwd
|
|
49
|
-
|
|
50
|
-
agent, _composite_backend = create_opscloud_agent(
|
|
51
|
-
model=model_res.model,
|
|
52
|
-
assistant_id=config.assistant_id,
|
|
53
|
-
system_prompt=config.system_prompt,
|
|
54
|
-
interactive=config.interactive,
|
|
55
|
-
auto_approve=config.auto_approve,
|
|
56
|
-
enable_shell=config.enable_shell,
|
|
57
|
-
cwd=effective_cwd,
|
|
58
|
-
project_context=project_context,
|
|
59
|
-
)
|
|
60
|
-
return agent
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
_precompiled_graph: Any = None
|
|
64
|
-
_graph_lock = asyncio.Lock()
|
|
65
|
-
|
|
66
|
-
async def make_graph() -> Any:
|
|
67
|
-
"""Return the agent graph for `langgraph dev`.
|
|
68
|
-
|
|
69
|
-
Compiles the agent graph lazily on first invocation and caches the CompiledGraph instance
|
|
70
|
-
to serve subsequent requests in <1ms without per-request compilation latency.
|
|
71
|
-
"""
|
|
72
|
-
global _precompiled_graph
|
|
73
|
-
if _precompiled_graph is not None:
|
|
74
|
-
return _precompiled_graph
|
|
75
|
-
|
|
76
|
-
async with _graph_lock:
|
|
77
|
-
if _precompiled_graph is None:
|
|
78
|
-
_precompiled_graph = await asyncio.to_thread(_make_graph_sync)
|
|
79
|
-
return _precompiled_graph
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/goal-and-rubrics.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/memory-and-skills.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/remote-sandboxes.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_config.py
RENAMED
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_factory.py
RENAMED
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/remember/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/config_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/exit_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/help_cmd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/permissions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|