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.
Files changed (396) hide show
  1. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/PKG-INFO +1 -1
  2. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/pyproject.toml +1 -1
  3. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/factory.py +7 -28
  4. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/server.py +33 -11
  5. talkops_opscloud-0.3.0b4/src/opscloud/server/server_graph.py +123 -0
  6. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_server.py +46 -0
  7. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/uv.lock +1 -1
  8. talkops_opscloud-0.3.0b2/src/opscloud/server/server_graph.py +0 -79
  9. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.dockerignore +0 -0
  10. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.env.example +0 -0
  11. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.github/workflows/ci.yml +0 -0
  12. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.github/workflows/release-pypi.yml +0 -0
  13. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.gitignore +0 -0
  14. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/.python-version +0 -0
  15. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/LICENSE +0 -0
  16. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/README.md +0 -0
  17. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/Configuration.md +0 -0
  18. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/approval-mode.md +0 -0
  19. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/cli-reference.md +0 -0
  20. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/config.toml.md +0 -0
  21. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/credentials.md +0 -0
  22. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/goal-and-rubrics.md +0 -0
  23. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/hooks.md +0 -0
  24. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/mcp-tools.md +0 -0
  25. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/memory-and-skills.md +0 -0
  26. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/model-providers.md +0 -0
  27. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/overview.md +0 -0
  28. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/plugins.md +0 -0
  29. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/quickstart.md +0 -0
  30. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/remote-sandboxes.md +0 -0
  31. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/docs/opscloud-docs/subagents.md +0 -0
  32. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/scripts/install.sh +0 -0
  33. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/__init__.py +0 -0
  34. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/__main__.py +0 -0
  35. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_constants.py +0 -0
  36. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_debug.py +0 -0
  37. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_debug_buffer.py +0 -0
  38. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_textual_patches.py +0 -0
  39. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/_version.py +0 -0
  40. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/__init__.py +0 -0
  41. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/agent/config.py +0 -0
  42. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/approval_mode.py +0 -0
  43. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/__init__.py +0 -0
  44. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/composite.py +0 -0
  45. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/local.py +0 -0
  46. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/registry.py +0 -0
  47. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_config.py +0 -0
  48. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/backend/sandbox_factory.py +0 -0
  49. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/remember/SKILL.md +0 -0
  50. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/SKILL.md +0 -0
  51. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/scripts/init_skill.py +0 -0
  52. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/built_in_skills/skill-creator/scripts/quick_validate.py +0 -0
  53. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/__init__.py +0 -0
  54. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/__init__.py +0 -0
  55. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/auth.py +0 -0
  56. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/doctor.py +0 -0
  57. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/mcp.py +0 -0
  58. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/commands/threads.py +0 -0
  59. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/interactive.py +0 -0
  60. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/main.py +0 -0
  61. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/non_interactive.py +0 -0
  62. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/cli/server_manager.py +0 -0
  63. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/__init__.py +0 -0
  64. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_base.py +0 -0
  65. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_guards.py +0 -0
  66. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_router.py +0 -0
  67. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/_types.py +0 -0
  68. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/__init__.py +0 -0
  69. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/auth.py +0 -0
  70. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/bug.py +0 -0
  71. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/clear.py +0 -0
  72. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/cloud.py +0 -0
  73. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/compact.py +0 -0
  74. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/config_cmd.py +0 -0
  75. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/context.py +0 -0
  76. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/cost.py +0 -0
  77. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/doctor.py +0 -0
  78. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/effort.py +0 -0
  79. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/exit_cmd.py +0 -0
  80. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/fast.py +0 -0
  81. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/help_cmd.py +0 -0
  82. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/mcp.py +0 -0
  83. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/model.py +0 -0
  84. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/permissions.py +0 -0
  85. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/plugins.py +0 -0
  86. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/pool.py +0 -0
  87. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/resume.py +0 -0
  88. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/core/skills.py +0 -0
  89. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/__init__.py +0 -0
  90. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/agents.py +0 -0
  91. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/btw.py +0 -0
  92. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/copy.py +0 -0
  93. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/goal.py +0 -0
  94. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/loop.py +0 -0
  95. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/memory.py +0 -0
  96. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/review.py +0 -0
  97. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/rubric.py +0 -0
  98. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/runtime.py +0 -0
  99. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/skill_creator.py +0 -0
  100. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/skill_invoke.py +0 -0
  101. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/tasks.py +0 -0
  102. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/trace.py +0 -0
  103. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/ui_toggles.py +0 -0
  104. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/power/version.py +0 -0
  105. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/commands/registry.py +0 -0
  106. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/__init__.py +0 -0
  107. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/__init__.py +0 -0
  108. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/postgres.py +0 -0
  109. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/adapters/sqlite.py +0 -0
  110. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/aws.py +0 -0
  111. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/cloud_profiles.py +0 -0
  112. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/env_vars.py +0 -0
  113. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/langsmith.py +0 -0
  114. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/manifest.py +0 -0
  115. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/metadata.py +0 -0
  116. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/paths.py +0 -0
  117. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/plugins.py +0 -0
  118. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/settings.py +0 -0
  119. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/store.py +0 -0
  120. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/store_factory.py +0 -0
  121. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/config/toml_config.py +0 -0
  122. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/editor.py +0 -0
  123. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/exceptions.py +0 -0
  124. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/file_ops.py +0 -0
  125. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/__init__.py +0 -0
  126. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/env.py +0 -0
  127. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/interrupt.py +0 -0
  128. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/__init__.py +0 -0
  129. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/adapters.py +0 -0
  130. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/config.py +0 -0
  131. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/domain.py +0 -0
  132. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/models/transport.py +0 -0
  133. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/hooks/tools.py +0 -0
  134. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/input.py +0 -0
  135. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/__init__.py +0 -0
  136. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/base.py +0 -0
  137. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/content_filter.py +0 -0
  138. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/event_bus.py +0 -0
  139. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/hooks.py +0 -0
  140. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/identity.py +0 -0
  141. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/notifications.py +0 -0
  142. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/stream_bridge.py +0 -0
  143. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/integrations/thread_store.py +0 -0
  144. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/json_types.py +0 -0
  145. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/__init__.py +0 -0
  146. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/config.py +0 -0
  147. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/discovery.py +0 -0
  148. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/mcp_info.py +0 -0
  149. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/middleware.py +0 -0
  150. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/preload.py +0 -0
  151. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/raw_config.py +0 -0
  152. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/semantic_profiler.py +0 -0
  153. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/session_manager.py +0 -0
  154. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/mcp/trust.py +0 -0
  155. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/__init__.py +0 -0
  156. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/branch.py +0 -0
  157. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/guard.py +0 -0
  158. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/onboarding.py +0 -0
  159. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/registry.py +0 -0
  160. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/memory/store.py +0 -0
  161. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/__init__.py +0 -0
  162. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/_repository_bounds.py +0 -0
  163. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/ask_user.py +0 -0
  164. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/auto_mode.py +0 -0
  165. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/auto_mode_hitl.py +0 -0
  166. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/compaction.py +0 -0
  167. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/configurable_model.py +0 -0
  168. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/cost_tracking.py +0 -0
  169. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/glm_stall_recovery.py +0 -0
  170. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_criteria.py +0 -0
  171. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_state_notice.py +0 -0
  172. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/goal_tools.py +0 -0
  173. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/headless_mcp_guard.py +0 -0
  174. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/jev_model_router.py +0 -0
  175. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/local_context.py +0 -0
  176. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/mcp_context.py +0 -0
  177. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/mcp_middleware.py +0 -0
  178. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/memory_guard.py +0 -0
  179. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/model_retry.py +0 -0
  180. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/registry.py +0 -0
  181. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/reliable_rubric.py +0 -0
  182. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/resume_state.py +0 -0
  183. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/server_hooks.py +0 -0
  184. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/shell_allow_list.py +0 -0
  185. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/skills.py +0 -0
  186. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagent_artifacts.py +0 -0
  187. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagent_telemetry.py +0 -0
  188. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/subagents.py +0 -0
  189. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/tool_filter.py +0 -0
  190. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/middleware/unified_system_message.py +0 -0
  191. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/__init__.py +0 -0
  192. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/config.py +0 -0
  193. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/factory.py +0 -0
  194. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/pool.py +0 -0
  195. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/model/reasoning.py +0 -0
  196. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/offload.py +0 -0
  197. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/output.py +0 -0
  198. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/__init__.py +0 -0
  199. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/_json.py +0 -0
  200. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/__init__.py +0 -0
  201. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/agents.py +0 -0
  202. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/commands.py +0 -0
  203. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/mcp.py +0 -0
  204. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/adapters/skills.py +0 -0
  205. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/commands_cli.py +0 -0
  206. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/discovery.py +0 -0
  207. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/manifest.py +0 -0
  208. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/marketplace.py +0 -0
  209. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/models.py +0 -0
  210. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/project_plugins.py +0 -0
  211. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/protocol.py +0 -0
  212. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/store.py +0 -0
  213. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/plugins/substitution.py +0 -0
  214. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/project_utils.py +0 -0
  215. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/__init__.py +0 -0
  216. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/system.py +0 -0
  217. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/templates/system_prompt.md +0 -0
  218. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/prompts/types.py +0 -0
  219. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/__init__.py +0 -0
  220. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/evaluator.py +0 -0
  221. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/evidence_extractor.py +0 -0
  222. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/generator.py +0 -0
  223. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/jev_compiler.py +0 -0
  224. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/jev_grader.py +0 -0
  225. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/rubrics/middleware.py +0 -0
  226. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/schema/__init__.py +0 -0
  227. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/schema/interrupts.py +0 -0
  228. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/__init__.py +0 -0
  229. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/approval_mode.py +0 -0
  230. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/approval_mode_source.py +0 -0
  231. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/cli_ast_evaluator.py +0 -0
  232. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/jev_classifier.py +0 -0
  233. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/shell_safety.py +0 -0
  234. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/unicode_security.py +0 -0
  235. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/security/url_validation.py +0 -0
  236. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/__init__.py +0 -0
  237. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/server/_server_config.py +0 -0
  238. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/__init__.py +0 -0
  239. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/commands.py +0 -0
  240. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/invocation.py +0 -0
  241. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/load.py +0 -0
  242. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/loader.py +0 -0
  243. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/merge.py +0 -0
  244. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/registry.py +0 -0
  245. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/sources.py +0 -0
  246. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/skills/trust.py +0 -0
  247. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/__init__.py +0 -0
  248. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/base.py +0 -0
  249. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/cloud_context.py +0 -0
  250. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/goal_channels.py +0 -0
  251. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/goal_state_limits.py +0 -0
  252. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/resume_state.py +0 -0
  253. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/service_context.py +0 -0
  254. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/session.py +0 -0
  255. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/state/state_migration.py +0 -0
  256. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/__init__.py +0 -0
  257. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/loader.py +0 -0
  258. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/subagents_parser.py +0 -0
  259. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/subagents/types.py +0 -0
  260. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/__init__.py +0 -0
  261. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/catalog.py +0 -0
  262. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/display.py +0 -0
  263. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/fetch_url.py +0 -0
  264. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/goal_tools.py +0 -0
  265. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/registry.py +0 -0
  266. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/thread.py +0 -0
  267. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/tools/web_search.py +0 -0
  268. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/__init__.py +0 -0
  269. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/app.py +0 -0
  270. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/app.tcss +0 -0
  271. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/clipboard.py +0 -0
  272. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/command_registry.py +0 -0
  273. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/message_store.py +0 -0
  274. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/permission_store.py +0 -0
  275. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/preferences.py +0 -0
  276. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/prompt_manager.py +0 -0
  277. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/remote_client.py +0 -0
  278. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/textual_adapter.py +0 -0
  279. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/theme.py +0 -0
  280. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/ui_help.py +0 -0
  281. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/__init__.py +0 -0
  282. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_ask_user_types.py +0 -0
  283. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_copy_spans.py +0 -0
  284. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_inline_prompt.py +0 -0
  285. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_js_eval_display.py +0 -0
  286. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_links.py +0 -0
  287. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/_tool_stream.py +0 -0
  288. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/agent_selector.py +0 -0
  289. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/approval.py +0 -0
  290. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/ask_user.py +0 -0
  291. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auth.py +0 -0
  292. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auth_manager.py +0 -0
  293. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/auto_mode_notice.py +0 -0
  294. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/autocomplete.py +0 -0
  295. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/chat_input.py +0 -0
  296. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/cloud_selector.py +0 -0
  297. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/config_manager.py +0 -0
  298. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/debug_console.py +0 -0
  299. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/devops_renderers.py +0 -0
  300. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/diff.py +0 -0
  301. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/effort_selector.py +0 -0
  302. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/goal_review.py +0 -0
  303. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/goal_status.py +0 -0
  304. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/infra_panel.py +0 -0
  305. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/install_confirm.py +0 -0
  306. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/loading.py +0 -0
  307. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/mcp_viewer.py +0 -0
  308. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/messages.py +0 -0
  309. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/model_selector.py +0 -0
  310. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/notification_center.py +0 -0
  311. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/notification_settings.py +0 -0
  312. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/operation_card.py +0 -0
  313. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/permissions_manager.py +0 -0
  314. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/plugin_manager.py +0 -0
  315. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/pool_selector.py +0 -0
  316. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/preamble.py +0 -0
  317. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/skills_viewer.py +0 -0
  318. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/status.py +0 -0
  319. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/subagent_panel.py +0 -0
  320. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/theme_selector.py +0 -0
  321. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/thread_selector.py +0 -0
  322. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/toast.py +0 -0
  323. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_display.py +0 -0
  324. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_renderers.py +0 -0
  325. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/tool_widgets.py +0 -0
  326. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/welcome.py +0 -0
  327. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/ui/widgets/welcome_popup.py +0 -0
  328. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/__init__.py +0 -0
  329. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/cost_estimation.py +0 -0
  330. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/git.py +0 -0
  331. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/logger.py +0 -0
  332. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/session_stats.py +0 -0
  333. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/src/opscloud/utils/startup_error.py +0 -0
  334. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/__init__.py +0 -0
  335. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/conftest.py +0 -0
  336. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/__init__.py +0 -0
  337. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/datasets/aws_cloud_ops.yaml +0 -0
  338. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/__init__.py +0 -0
  339. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/output_evaluator.py +0 -0
  340. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/evaluators/trajectory_evaluator.py +0 -0
  341. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/evals/runners/test_eval_runner.py +0 -0
  342. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/integration_tests/test_agent_lifecycle.py +0 -0
  343. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/integration_tests/test_server_lifecycle.py +0 -0
  344. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_agent_factory.py +0 -0
  345. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_approval_widget.py +0 -0
  346. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_ask_user.py +0 -0
  347. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_ast_evaluator.py +0 -0
  348. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_backend.py +0 -0
  349. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_checkpointer.py +0 -0
  350. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cli_enhancements.py +0 -0
  351. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cli_rubric.py +0 -0
  352. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cloud_command.py +0 -0
  353. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_commands.py +0 -0
  354. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_config.py +0 -0
  355. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_cost_tracking.py +0 -0
  356. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_default_marketplace.py +0 -0
  357. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_criteria.py +0 -0
  358. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_state_limits.py +0 -0
  359. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_goal_state_notice.py +0 -0
  360. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_grader_tools.py +0 -0
  361. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_hitl.py +0 -0
  362. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_integrations_and_hooks.py +0 -0
  363. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_interrupt_schemas.py +0 -0
  364. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_jev_model_router.py +0 -0
  365. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_jev_rubrics.py +0 -0
  366. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_local_context.py +0 -0
  367. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_logging.py +0 -0
  368. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp.py +0 -0
  369. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp_middleware.py +0 -0
  370. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_mcp_viewer_and_command.py +0 -0
  371. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_memory.py +0 -0
  372. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_memory_enhancements.py +0 -0
  373. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_middleware_stack.py +0 -0
  374. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_model_providers.py +0 -0
  375. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_model_retry.py +0 -0
  376. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugin_agent_skill_mcp_scoping.py +0 -0
  377. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugin_manager_search.py +0 -0
  378. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_plugins.py +0 -0
  379. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_project_plugins.py +0 -0
  380. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_prompts_and_schema.py +0 -0
  381. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_reliable_rubric.py +0 -0
  382. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_reload_restart.py +0 -0
  383. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_resume_state.py +0 -0
  384. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_resumed_thread_latency_fix.py +0 -0
  385. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_rubrics.py +0 -0
  386. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_security.py +0 -0
  387. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_server_hooks.py +0 -0
  388. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_skill_creator.py +0 -0
  389. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_skills.py +0 -0
  390. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_state.py +0 -0
  391. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_subagents.py +0 -0
  392. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tool_filter.py +0 -0
  393. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tools.py +0 -0
  394. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_tui_app.py +0 -0
  395. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/tests/unit_tests/test_utils.py +0 -0
  396. {talkops_opscloud-0.3.0b2 → talkops_opscloud-0.3.0b4}/uv-requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: talkops-opscloud
3
- Version: 0.3.0b2
3
+ Version: 0.3.0b4
4
4
  Summary: Extensible Terminal Multi-Agent Framework for Cloud Operations & DevOps Coding
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "talkops-opscloud"
3
- version = "0.3.0b2"
3
+ version = "0.3.0b4"
4
4
  description = "Extensible Terminal Multi-Agent Framework for Cloud Operations & DevOps Coding"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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
- try:
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=bool(model_spec),
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=subagent_dict.get("model") or active_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
- "Compiled subagent '%s' (tools: %d)",
751
+ "Registered declarative subagent '%s'",
771
752
  subagent_name,
772
- len(subagent_dict.get("tools", [])),
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
- "Compiled subagent '%s'",
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 and self.process.poll() is not None:
211
+ if self.process.poll() is not None:
206
212
  err = self._read_log_tail()
207
- raise RuntimeError(f"Server exited prematurely with code {self.process.returncode}:\n{err}")
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=2.0)
210
- if resp.status_code == 200:
211
- logger.info("Server graph %r is ready at %s", graph_name, self.url)
212
- return
213
- elif resp.status_code == 404 and graph_name == "agent":
214
- graph_name = "opscloud"
215
- graph_url = f"{self.url}/assistants/{graph_name}/graph"
216
- except Exception:
217
- time.sleep(0.2)
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
+
@@ -4844,7 +4844,7 @@ wheels = [
4844
4844
 
4845
4845
  [[package]]
4846
4846
  name = "talkops-opscloud"
4847
- version = "0.3.0b2"
4847
+ version = "0.3.0b4"
4848
4848
  source = { editable = "." }
4849
4849
  dependencies = [
4850
4850
  { name = "agent-client-protocol" },
@@ -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