devops-bot-sdk 1.6.51__tar.gz → 1.6.52__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 (223) hide show
  1. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/SOURCES.txt +1 -0
  4. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/setup_manager.py +3 -0
  6. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/updater.py +31 -4
  7. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/vps_health.py +17 -1
  8. devops_bot_sdk-1.6.52/tests/test_updater_pep668.py +53 -0
  9. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_vps_health.py +11 -2
  10. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/README.md +0 -0
  11. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  12. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  13. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/requires.txt +0 -0
  14. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  15. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/pyproject.toml +0 -0
  16. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/__init__.py +0 -0
  17. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/classifier.py +0 -0
  18. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/collectors/__init__.py +0 -0
  19. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/collectors/common.py +0 -0
  20. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/collectors/linux_auditd.py +0 -0
  21. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/collectors/macos_eslogger.py +0 -0
  22. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/collectors/windows_eventlog.py +0 -0
  23. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/models.py +0 -0
  24. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/os_setup.py +0 -0
  25. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/recorder.py +0 -0
  26. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/redact.py +0 -0
  27. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/settings.py +0 -0
  28. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/shipper.py +0 -0
  29. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/activity/spool.py +0 -0
  30. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agentd.py +0 -0
  31. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/__init__.py +0 -0
  32. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/activity.py +0 -0
  33. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/builder.py +0 -0
  34. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/chat.py +0 -0
  35. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/connectors.py +0 -0
  36. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/__init__.py +0 -0
  37. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/claude_code.py +0 -0
  38. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/http.py +0 -0
  39. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/mcp.py +0 -0
  40. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/n8n.py +0 -0
  41. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/engines/shell.py +0 -0
  42. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/integrations.py +0 -0
  43. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/inventory.py +0 -0
  44. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/library/__init__.py +0 -0
  45. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/manifest.py +0 -0
  46. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/prompt_studio.py +0 -0
  47. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/prompt_template.py +0 -0
  48. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/prompt_vars.py +0 -0
  49. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/run_log.py +0 -0
  50. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/schedules.py +0 -0
  51. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/secrets.py +0 -0
  52. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/ticket_run.py +0 -0
  53. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/usage.py +0 -0
  54. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/agents/varstore.py +0 -0
  55. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/browser_profile.py +0 -0
  56. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/cli.py +0 -0
  57. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/client.py +0 -0
  58. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/collectors/__init__.py +0 -0
  59. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/collectors/files.py +0 -0
  60. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/collectors/process.py +0 -0
  61. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/collectors/screenshot.py +0 -0
  62. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/config.py +0 -0
  63. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/crucial.py +0 -0
  64. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/departments.py +0 -0
  65. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/__init__.py +0 -0
  66. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/assets.py +0 -0
  67. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/bootstrap.py +0 -0
  68. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/browser.py +0 -0
  69. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/compare.py +0 -0
  70. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/design_verify/loop.py +0 -0
  71. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/estimator.py +0 -0
  72. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/exceptions.py +0 -0
  73. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/firewall.py +0 -0
  74. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/formats.py +0 -0
  75. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/git_ops.py +0 -0
  76. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/github_fetch.py +0 -0
  77. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/github_ingest.py +0 -0
  78. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/graph_recon.py +0 -0
  79. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/graphify.py +0 -0
  80. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/hooks/__init__.py +0 -0
  81. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/hooks/crucial_guard.py +0 -0
  82. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/intake.py +0 -0
  83. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ipc/__init__.py +0 -0
  84. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ipc/electron_bridge.py +0 -0
  85. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ipc/handlers.py +0 -0
  86. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/journal.py +0 -0
  87. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/local_exec.py +0 -0
  88. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/memory_guard.py +0 -0
  89. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/models/__init__.py +0 -0
  90. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/models/envelope.py +0 -0
  91. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/models/requests.py +0 -0
  92. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/models/responses.py +0 -0
  93. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/models/snapshots.py +0 -0
  94. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/phase_timer.py +0 -0
  95. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/plan_run.py +0 -0
  96. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/platform_compat.py +0 -0
  97. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/prd_progress.py +0 -0
  98. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/proof_readers.py +0 -0
  99. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/providers.py +0 -0
  100. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/py.typed +0 -0
  101. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/resume.py +0 -0
  102. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/router.py +0 -0
  103. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/run_auto.py +0 -0
  104. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/scheduler.py +0 -0
  105. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/self_report.py +0 -0
  106. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/self_report_local.py +0 -0
  107. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/sse.py +0 -0
  108. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/swagger.py +0 -0
  109. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/task_file.py +0 -0
  110. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/task_types.py +0 -0
  111. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/test.py +0 -0
  112. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/test_pipeline.py +0 -0
  113. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ticket_fields.py +0 -0
  114. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/tiers/__init__.py +0 -0
  115. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/tiers/mini_agent.py +0 -0
  116. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/__init__.py +0 -0
  117. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/api.py +0 -0
  118. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/dashboard.py +0 -0
  119. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/health.py +0 -0
  120. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/ip_allowlist.py +0 -0
  121. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/jobs.py +0 -0
  122. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/models.py +0 -0
  123. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/runner.py +0 -0
  124. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/security.py +0 -0
  125. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/server.py +0 -0
  126. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/service.py +0 -0
  127. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/session.py +0 -0
  128. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/agents.html +0 -0
  129. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/app.js +0 -0
  130. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/chat.html +0 -0
  131. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/custom-agents.html +0 -0
  132. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/default-agents.html +0 -0
  133. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/index.html +0 -0
  134. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/report.html +0 -0
  135. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/runs.html +0 -0
  136. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/schedules.html +0 -0
  137. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/setup.html +0 -0
  138. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/styles.css +0 -0
  139. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/static/tickets.html +0 -0
  140. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/ui/swagger.py +0 -0
  141. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/url_access.py +0 -0
  142. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/sdk/write_hook.py +0 -0
  143. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/setup.cfg +0 -0
  144. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_activity_collectors.py +0 -0
  145. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_activity_core.py +0 -0
  146. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_activity_macos.py +0 -0
  147. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_activity_os_setup.py +0 -0
  148. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_activity_pipeline.py +0 -0
  149. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_activity.py +0 -0
  150. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_activity_tracking.py +0 -0
  151. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_chat_features.py +0 -0
  152. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_listing.py +0 -0
  153. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_prompt_async.py +0 -0
  154. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_prompt_models.py +0 -0
  155. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_run_ticket.py +0 -0
  156. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_schedules.py +0 -0
  157. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agent_workspace_settings.py +0 -0
  158. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_agents_connectors_builder.py +0 -0
  159. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_allowed_tools_config.py +0 -0
  160. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_auto_agent_dispatch.py +0 -0
  161. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_browser_profile.py +0 -0
  162. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_cheap_tier.py +0 -0
  163. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_client_jira_projects.py +0 -0
  164. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_config_token_diagnostics.py +0 -0
  165. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_configure_token_owner.py +0 -0
  166. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_console_encoding.py +0 -0
  167. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_crash_recovery.py +0 -0
  168. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_departments.py +0 -0
  169. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_done_transition.py +0 -0
  170. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_epic_decompose_run.py +0 -0
  171. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_epic_inherited_agent_id.py +0 -0
  172. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_epic_session_isolation.py +0 -0
  173. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_estimator.py +0 -0
  174. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_firewall_open_on_update.py +0 -0
  175. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_formats.py +0 -0
  176. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_git_action.py +0 -0
  177. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_github_fetch.py +0 -0
  178. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_github_ingest.py +0 -0
  179. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_graph_recon.py +0 -0
  180. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_graphify_build.py +0 -0
  181. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_graphify_hook_install.py +0 -0
  182. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_health.py +0 -0
  183. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_intake_job_outcome.py +0 -0
  184. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_intake_plan_review.py +0 -0
  185. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_journal.py +0 -0
  186. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_local_exec_provider.py +0 -0
  187. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_mcp_route_contract.py +0 -0
  188. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_memory_guard.py +0 -0
  189. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_phase_timer.py +0 -0
  190. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_plan_new_command.py +0 -0
  191. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_plan_run_activity.py +0 -0
  192. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_pr_identity.py +0 -0
  193. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_prd_artifact.py +0 -0
  194. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_project_path_resolution.py +0 -0
  195. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_proof_readers.py +0 -0
  196. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_providers.py +0 -0
  197. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_recon_session_isolation.py +0 -0
  198. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_resume.py +0 -0
  199. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_router.py +0 -0
  200. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_run_auto_agent_only.py +0 -0
  201. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_run_outputs.py +0 -0
  202. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_run_verdict_is_honest.py +0 -0
  203. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_schedule_api.py +0 -0
  204. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_schedule_outputs_and_plans.py +0 -0
  205. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_scheduler.py +0 -0
  206. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_self_report.py +0 -0
  207. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_service_token_warning.py +0 -0
  208. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_stale_panel_restart.py +0 -0
  209. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_swagger_command.py +0 -0
  210. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_task_file_and_plan_run.py +0 -0
  211. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_task_file_format_doc.py +0 -0
  212. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_ticket_fields.py +0 -0
  213. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_ticket_run_resolve_by_id.py +0 -0
  214. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_ticket_speed_fixes.py +0 -0
  215. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_tier_flag_parity.py +0 -0
  216. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_ui_gate.py +0 -0
  217. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_ui_lifespan.py +0 -0
  218. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_update_timer.py +0 -0
  219. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_updater_extras.py +0 -0
  220. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_updater_reports_the_truth.py +0 -0
  221. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_url_access.py +0 -0
  222. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_windows_loop_identity.py +0 -0
  223. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.52}/tests/test_write_hook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.6.51
3
+ Version: 1.6.52
4
4
  Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
5
5
  Author: noumanaziz2128
6
6
  License-Expression: LicenseRef-Proprietary
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devops-bot-sdk
3
- Version: 1.6.51
3
+ Version: 1.6.52
4
4
  Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
5
5
  Author: noumanaziz2128
6
6
  License-Expression: LicenseRef-Proprietary
@@ -213,6 +213,7 @@ tests/test_ui_gate.py
213
213
  tests/test_ui_lifespan.py
214
214
  tests/test_update_timer.py
215
215
  tests/test_updater_extras.py
216
+ tests/test_updater_pep668.py
216
217
  tests/test_updater_reports_the_truth.py
217
218
  tests/test_url_access.py
218
219
  tests/test_vps_health.py
@@ -1,6 +1,6 @@
1
1
  """AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
2
2
 
3
- Version: 1.6.51
3
+ Version: 1.6.52
4
4
 
5
5
  Public surface:
6
6
  BackendClient.from_config() — create client from ~/.agentos/config.toml
@@ -34,7 +34,7 @@ Rules:
34
34
  - All data egress through submit_webhook only
35
35
  """
36
36
 
37
- __version__ = "1.6.51" # SINGLE SOURCE OF TRUTH — bump on every change; pyproject,
37
+ __version__ = "1.6.52" # SINGLE SOURCE OF TRUTH — bump on every change; pyproject,
38
38
  __author__ = "AgentOS" # sdk.client.SDK_VERSION and the UI server version all read this.
39
39
 
40
40
  from sdk.client import BackendClient
@@ -102,9 +102,12 @@ async def reinstall_sdk(upgrade: bool = True):
102
102
  which is the managed ``agentsystem`` venv in normal operation. Used by
103
103
  ``/setup`` for a repair/reinstall.
104
104
  """
105
+ from sdk.updater import _pip_flags
106
+
105
107
  argv = [sys.executable, "-m", "pip", "install"]
106
108
  if upgrade:
107
109
  argv.append("--upgrade")
110
+ argv += _pip_flags()
108
111
  argv.append(SDK_GIT_SPEC)
109
112
 
110
113
  yield f"$ {' '.join(argv)}\n"
@@ -8,7 +8,8 @@ Upgrade priority:
8
8
  (backend returns the user's stored GitHub OAuth token — no extra config)
9
9
  4. PyPI dist name as last resort
10
10
 
11
- Adds --break-system-packages automatically on Linux (Ubuntu 22.04+/Debian 12+).
11
+ Adds --break-system-packages automatically on any externally-managed Python
12
+ (PEP 668: Ubuntu 22.04+/Debian 12+, Homebrew Python on macOS).
12
13
  Disable entirely with AGENTOS_NO_UPDATE=1.
13
14
  """
14
15
  from __future__ import annotations
@@ -54,9 +55,35 @@ def _with_extras(target: str) -> str:
54
55
 
55
56
  # ── Platform helpers ──────────────────────────────────────────────────────────
56
57
 
58
+ def _externally_managed() -> bool:
59
+ """True when pip will refuse this interpreter under PEP 668.
60
+
61
+ The marker is an ``EXTERNALLY-MANAGED`` file in the stdlib directory, and a
62
+ venv is exempt. Checking for it, rather than the OS, is what covers Homebrew
63
+ Python on macOS: a Mac VPS on ``/opt/homebrew/.../python3.14`` was refused on
64
+ every upgrade attempt and stayed on an old version indefinitely, because the
65
+ flag below used to be added on Linux only.
66
+ """
67
+ if sys.prefix != getattr(sys, "base_prefix", sys.prefix):
68
+ return False
69
+ try:
70
+ import sysconfig
71
+ return os.path.isfile(
72
+ os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED"))
73
+ except Exception: # noqa: BLE001 — an unreadable layout is not "managed"
74
+ return False
75
+
76
+
57
77
  def _pip_flags() -> list[str]:
58
- """--break-system-packages on Linux (PEP 668); empty elsewhere."""
59
- return ["--break-system-packages"] if platform.system() == "Linux" else []
78
+ """--break-system-packages where PEP 668 applies; empty elsewhere.
79
+
80
+ Linux keeps the flag unconditionally, as before (every supported distro pip
81
+ accepts it). Elsewhere it is added only when the marker is present, since an
82
+ old pip that predates PEP 668 rejects the option outright.
83
+ """
84
+ if platform.system() == "Linux" or _externally_managed():
85
+ return ["--break-system-packages"]
86
+ return []
60
87
 
61
88
 
62
89
  def _vtuple(v: str) -> tuple:
@@ -589,7 +616,7 @@ def _report(result: UpgradeResult, latest: str | None) -> None:
589
616
  _say(f" pip said: {result.detail}")
590
617
  _say(" fix it by hand with:\n"
591
618
  f' "{sys.executable}" -m pip install --upgrade --force-reinstall '
592
- f'--no-cache-dir "{_DIST}{_EXTRAS}"')
619
+ f'--no-cache-dir {" ".join(_pip_flags() + [""])}"{_DIST}{_EXTRAS}"')
593
620
  return
594
621
 
595
622
  if result.ran:
@@ -33,6 +33,7 @@ ping just waits for the next tick.
33
33
  from __future__ import annotations
34
34
 
35
35
  import asyncio
36
+ import ipaddress
36
37
  import logging
37
38
  import os
38
39
  import socket
@@ -120,6 +121,21 @@ def _outbound_ip() -> str:
120
121
  pass
121
122
 
122
123
 
124
+ def _is_public(ip: str) -> bool:
125
+ """Only a globally-routable address may overwrite the allocation's IP.
126
+
127
+ Behind NAT (an AWS instance, a laptop on Wi-Fi) the route-to-internet address
128
+ is private — ``172.31.x.x``, ``192.168.x.x`` — and sending it replaced the
129
+ VPS's real public IP on ``contabo_allocation``, after which the backend could
130
+ no longer reach the panel at all. Omitting the key leaves the stored value
131
+ alone, the same rule every other unavailable metric here follows.
132
+ """
133
+ try:
134
+ return bool(ip) and ipaddress.ip_address(ip).is_global
135
+ except ValueError:
136
+ return False
137
+
138
+
123
139
  def _bandwidth_used_mb() -> float | None:
124
140
  """Total bytes in+out since boot, in MB. None when psutil is unavailable.
125
141
 
@@ -183,7 +199,7 @@ def build_payload(health: dict | None = None) -> dict:
183
199
  payload["bandwidthUsed"] = bw # MB, cumulative
184
200
 
185
201
  ip = _outbound_ip()
186
- if ip:
202
+ if _is_public(ip):
187
203
  payload["ipAddress"] = ip
188
204
 
189
205
  return payload
@@ -0,0 +1,53 @@
1
+ """PEP 668 is a property of the interpreter, not of Linux.
2
+
3
+ Homebrew Python on macOS ships an EXTERNALLY-MANAGED marker, and the updater
4
+ used to add --break-system-packages on Linux only — so a Mac VPS was refused on
5
+ every upgrade path and stayed on an old SDK indefinitely.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import sys
10
+
11
+ from sdk import updater
12
+
13
+
14
+ def _stdlib(monkeypatch, tmp_path, *, marker: bool, venv: bool = False):
15
+ import sysconfig
16
+ if marker:
17
+ (tmp_path / "EXTERNALLY-MANAGED").write_text("[externally-managed]\n")
18
+ monkeypatch.setattr(sysconfig, "get_path", lambda name: str(tmp_path))
19
+ monkeypatch.setattr(sys, "base_prefix", "/base" if venv else sys.prefix)
20
+
21
+
22
+ def test_homebrew_macos_gets_the_flag(monkeypatch, tmp_path):
23
+ monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
24
+ _stdlib(monkeypatch, tmp_path, marker=True)
25
+ assert updater._pip_flags() == ["--break-system-packages"]
26
+
27
+
28
+ def test_unmanaged_macos_python_does_not(monkeypatch, tmp_path):
29
+ """An old pip that predates PEP 668 rejects the option outright."""
30
+ monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
31
+ _stdlib(monkeypatch, tmp_path, marker=False)
32
+ assert updater._pip_flags() == []
33
+
34
+
35
+ def test_a_venv_is_exempt(monkeypatch, tmp_path):
36
+ monkeypatch.setattr(updater.platform, "system", lambda: "Windows")
37
+ _stdlib(monkeypatch, tmp_path, marker=True, venv=True)
38
+ assert updater._pip_flags() == []
39
+
40
+
41
+ def test_linux_keeps_the_flag_unconditionally(monkeypatch, tmp_path):
42
+ monkeypatch.setattr(updater.platform, "system", lambda: "Linux")
43
+ _stdlib(monkeypatch, tmp_path, marker=False)
44
+ assert updater._pip_flags() == ["--break-system-packages"]
45
+
46
+
47
+ def test_the_hand_fix_hint_carries_the_flag(monkeypatch, tmp_path, capsys):
48
+ monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
49
+ _stdlib(monkeypatch, tmp_path, marker=True)
50
+ res = updater.UpgradeResult(before="1.6.44", after="1.6.44", changed=False,
51
+ ran=True, detail="externally-managed-environment")
52
+ updater._report(res, latest="1.6.51")
53
+ assert "--break-system-packages" in capsys.readouterr().out
@@ -73,7 +73,7 @@ class TestBuildPayload:
73
73
  def test_maps_every_field(self, monkeypatch):
74
74
  monkeypatch.delenv("AGENTOS_VPS_HEALTH_STATUS", raising=False)
75
75
  monkeypatch.setattr(vps_health, "_bandwidth_used_mb", lambda: 1024.5)
76
- monkeypatch.setattr(vps_health, "_outbound_ip", lambda: "192.168.1.1")
76
+ monkeypatch.setattr(vps_health, "_outbound_ip", lambda: "77.68.16.238")
77
77
 
78
78
  p = vps_health.build_payload(_HEALTH)
79
79
 
@@ -85,7 +85,7 @@ class TestBuildPayload:
85
85
  assert p["diskUsage"] == 30.2
86
86
  assert p["totalDisk"] == 500.0
87
87
  assert p["bandwidthUsed"] == 1024.5
88
- assert p["ipAddress"] == "192.168.1.1"
88
+ assert p["ipAddress"] == "77.68.16.238"
89
89
  assert p["uptimeSeconds"] == 86400
90
90
  # ISO-8601 with millis + Z, as the backend sample shows.
91
91
  assert p["lastPingedAt"].endswith("Z") and "T" in p["lastPingedAt"]
@@ -118,6 +118,15 @@ class TestBuildPayload:
118
118
  "totalDisk", "uptimeSeconds", "bandwidthUsed", "ipAddress"):
119
119
  assert absent not in p
120
120
 
121
+ @pytest.mark.parametrize("ip", ["172.31.44.234", "192.168.18.16", "10.0.0.5",
122
+ "127.0.0.1", "not-an-ip"])
123
+ def test_a_private_ip_never_overwrites_the_allocation(self, monkeypatch, ip):
124
+ """Behind NAT the outbound address is private; sending it replaced the
125
+ VPS's public IP and left the backend unable to reach the panel."""
126
+ monkeypatch.setattr(vps_health, "_bandwidth_used_mb", lambda: None)
127
+ monkeypatch.setattr(vps_health, "_outbound_ip", lambda: ip)
128
+ assert "ipAddress" not in vps_health.build_payload(_HEALTH)
129
+
121
130
 
122
131
  class _FakeClient:
123
132
  def __init__(self, ok: bool = True) -> None: