devops-bot-sdk 1.6.51__tar.gz → 1.6.53__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.53}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/SOURCES.txt +1 -0
  4. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/__init__.py +2 -2
  5. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/macos_eslogger.py +11 -0
  6. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/setup_manager.py +3 -0
  7. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/updater.py +31 -4
  8. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/vps_health.py +17 -1
  9. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_macos.py +31 -0
  10. devops_bot_sdk-1.6.53/tests/test_updater_pep668.py +53 -0
  11. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_vps_health.py +11 -2
  12. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/README.md +0 -0
  13. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  14. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  15. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/requires.txt +0 -0
  16. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  17. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/pyproject.toml +0 -0
  18. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/__init__.py +0 -0
  19. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/classifier.py +0 -0
  20. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/__init__.py +0 -0
  21. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/common.py +0 -0
  22. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/linux_auditd.py +0 -0
  23. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/windows_eventlog.py +0 -0
  24. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/models.py +0 -0
  25. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/os_setup.py +0 -0
  26. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/recorder.py +0 -0
  27. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/redact.py +0 -0
  28. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/settings.py +0 -0
  29. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/shipper.py +0 -0
  30. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/spool.py +0 -0
  31. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agentd.py +0 -0
  32. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/__init__.py +0 -0
  33. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/activity.py +0 -0
  34. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/builder.py +0 -0
  35. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/chat.py +0 -0
  36. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/connectors.py +0 -0
  37. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/__init__.py +0 -0
  38. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/claude_code.py +0 -0
  39. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/http.py +0 -0
  40. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/mcp.py +0 -0
  41. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/n8n.py +0 -0
  42. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/shell.py +0 -0
  43. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/integrations.py +0 -0
  44. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/inventory.py +0 -0
  45. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/library/__init__.py +0 -0
  46. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/manifest.py +0 -0
  47. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_studio.py +0 -0
  48. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_template.py +0 -0
  49. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_vars.py +0 -0
  50. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/run_log.py +0 -0
  51. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/schedules.py +0 -0
  52. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/secrets.py +0 -0
  53. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/ticket_run.py +0 -0
  54. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/usage.py +0 -0
  55. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/varstore.py +0 -0
  56. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/browser_profile.py +0 -0
  57. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/cli.py +0 -0
  58. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/client.py +0 -0
  59. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/__init__.py +0 -0
  60. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/files.py +0 -0
  61. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/process.py +0 -0
  62. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/screenshot.py +0 -0
  63. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/config.py +0 -0
  64. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/crucial.py +0 -0
  65. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/departments.py +0 -0
  66. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/__init__.py +0 -0
  67. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/assets.py +0 -0
  68. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/bootstrap.py +0 -0
  69. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/browser.py +0 -0
  70. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/compare.py +0 -0
  71. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/loop.py +0 -0
  72. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/estimator.py +0 -0
  73. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/exceptions.py +0 -0
  74. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/firewall.py +0 -0
  75. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/formats.py +0 -0
  76. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/git_ops.py +0 -0
  77. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/github_fetch.py +0 -0
  78. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/github_ingest.py +0 -0
  79. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/graph_recon.py +0 -0
  80. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/graphify.py +0 -0
  81. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/hooks/__init__.py +0 -0
  82. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/hooks/crucial_guard.py +0 -0
  83. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/intake.py +0 -0
  84. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/__init__.py +0 -0
  85. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/electron_bridge.py +0 -0
  86. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/handlers.py +0 -0
  87. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/journal.py +0 -0
  88. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/local_exec.py +0 -0
  89. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/memory_guard.py +0 -0
  90. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/__init__.py +0 -0
  91. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/envelope.py +0 -0
  92. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/requests.py +0 -0
  93. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/responses.py +0 -0
  94. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/snapshots.py +0 -0
  95. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/phase_timer.py +0 -0
  96. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/plan_run.py +0 -0
  97. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/platform_compat.py +0 -0
  98. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/prd_progress.py +0 -0
  99. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/proof_readers.py +0 -0
  100. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/providers.py +0 -0
  101. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/py.typed +0 -0
  102. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/resume.py +0 -0
  103. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/router.py +0 -0
  104. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/run_auto.py +0 -0
  105. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/scheduler.py +0 -0
  106. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/self_report.py +0 -0
  107. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/self_report_local.py +0 -0
  108. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/sse.py +0 -0
  109. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/swagger.py +0 -0
  110. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/task_file.py +0 -0
  111. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/task_types.py +0 -0
  112. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/test.py +0 -0
  113. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/test_pipeline.py +0 -0
  114. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ticket_fields.py +0 -0
  115. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/tiers/__init__.py +0 -0
  116. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/tiers/mini_agent.py +0 -0
  117. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/__init__.py +0 -0
  118. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/api.py +0 -0
  119. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/dashboard.py +0 -0
  120. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/health.py +0 -0
  121. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/ip_allowlist.py +0 -0
  122. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/jobs.py +0 -0
  123. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/models.py +0 -0
  124. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/runner.py +0 -0
  125. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/security.py +0 -0
  126. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/server.py +0 -0
  127. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/service.py +0 -0
  128. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/session.py +0 -0
  129. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/agents.html +0 -0
  130. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/app.js +0 -0
  131. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/chat.html +0 -0
  132. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/custom-agents.html +0 -0
  133. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/default-agents.html +0 -0
  134. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/index.html +0 -0
  135. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/report.html +0 -0
  136. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/runs.html +0 -0
  137. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/schedules.html +0 -0
  138. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/setup.html +0 -0
  139. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/styles.css +0 -0
  140. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/tickets.html +0 -0
  141. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/swagger.py +0 -0
  142. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/url_access.py +0 -0
  143. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/write_hook.py +0 -0
  144. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/setup.cfg +0 -0
  145. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_collectors.py +0 -0
  146. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_core.py +0 -0
  147. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_os_setup.py +0 -0
  148. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_pipeline.py +0 -0
  149. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_activity.py +0 -0
  150. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_activity_tracking.py +0 -0
  151. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_chat_features.py +0 -0
  152. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_listing.py +0 -0
  153. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_prompt_async.py +0 -0
  154. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_prompt_models.py +0 -0
  155. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_run_ticket.py +0 -0
  156. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_schedules.py +0 -0
  157. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_workspace_settings.py +0 -0
  158. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agents_connectors_builder.py +0 -0
  159. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_allowed_tools_config.py +0 -0
  160. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_auto_agent_dispatch.py +0 -0
  161. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_browser_profile.py +0 -0
  162. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_cheap_tier.py +0 -0
  163. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_client_jira_projects.py +0 -0
  164. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_config_token_diagnostics.py +0 -0
  165. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_configure_token_owner.py +0 -0
  166. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_console_encoding.py +0 -0
  167. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_crash_recovery.py +0 -0
  168. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_departments.py +0 -0
  169. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_done_transition.py +0 -0
  170. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_decompose_run.py +0 -0
  171. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_inherited_agent_id.py +0 -0
  172. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_session_isolation.py +0 -0
  173. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_estimator.py +0 -0
  174. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_firewall_open_on_update.py +0 -0
  175. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_formats.py +0 -0
  176. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_git_action.py +0 -0
  177. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_github_fetch.py +0 -0
  178. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_github_ingest.py +0 -0
  179. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graph_recon.py +0 -0
  180. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graphify_build.py +0 -0
  181. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graphify_hook_install.py +0 -0
  182. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_health.py +0 -0
  183. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_intake_job_outcome.py +0 -0
  184. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_intake_plan_review.py +0 -0
  185. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_journal.py +0 -0
  186. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_local_exec_provider.py +0 -0
  187. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_mcp_route_contract.py +0 -0
  188. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_memory_guard.py +0 -0
  189. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_phase_timer.py +0 -0
  190. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_plan_new_command.py +0 -0
  191. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_plan_run_activity.py +0 -0
  192. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_pr_identity.py +0 -0
  193. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_prd_artifact.py +0 -0
  194. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_project_path_resolution.py +0 -0
  195. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_proof_readers.py +0 -0
  196. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_providers.py +0 -0
  197. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_recon_session_isolation.py +0 -0
  198. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_resume.py +0 -0
  199. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_router.py +0 -0
  200. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_auto_agent_only.py +0 -0
  201. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_outputs.py +0 -0
  202. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_verdict_is_honest.py +0 -0
  203. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_schedule_api.py +0 -0
  204. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_schedule_outputs_and_plans.py +0 -0
  205. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_scheduler.py +0 -0
  206. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_self_report.py +0 -0
  207. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_service_token_warning.py +0 -0
  208. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_stale_panel_restart.py +0 -0
  209. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_swagger_command.py +0 -0
  210. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_task_file_and_plan_run.py +0 -0
  211. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_task_file_format_doc.py +0 -0
  212. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_fields.py +0 -0
  213. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_run_resolve_by_id.py +0 -0
  214. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_speed_fixes.py +0 -0
  215. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_tier_flag_parity.py +0 -0
  216. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ui_gate.py +0 -0
  217. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ui_lifespan.py +0 -0
  218. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_update_timer.py +0 -0
  219. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_updater_extras.py +0 -0
  220. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_updater_reports_the_truth.py +0 -0
  221. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_url_access.py +0 -0
  222. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_windows_loop_identity.py +0 -0
  223. {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/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.53
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.53
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.53" # 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
@@ -167,6 +167,17 @@ class EsloggerParser:
167
167
  def flush(self) -> None:
168
168
  """Nothing is buffered — every eslogger line is a whole event."""
169
169
 
170
+ def flush_older_than(self, cutoff: float) -> None:
171
+ """No-op, for the same reason as :meth:`flush`: nothing is held.
172
+
173
+ :class:`EsloggerCollector` reuses :class:`AuditdCollector`'s tail loop, which
174
+ calls this on the parser every poll to close auditd events whose trailing
175
+ records never arrived. An eslogger line is already a whole event, so there is
176
+ nothing to time-flush — but the method MUST exist, or the shared loop raises
177
+ ``AttributeError`` on its first idle poll and the whole collector thread dies
178
+ before a single event is recorded (the tail starts at EOF, so the very first
179
+ poll reads nothing and goes straight here)."""
180
+
170
181
  # ── sessions ─────────────────────────────────────────────────────────────
171
182
 
172
183
  def _asid_session(self, asid: int, ts: float) -> str:
@@ -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
@@ -158,6 +158,37 @@ class TestParser:
158
158
  c = M.EsloggerCollector(str(log), parser=_parser(), state_file=tmp_path / "st.json")
159
159
  assert c._state == tmp_path / "st.json"
160
160
 
161
+ def test_tail_loop_records_events_and_does_not_crash_on_an_idle_poll(
162
+ self, tmp_path, monkeypatch
163
+ ):
164
+ """Regression: EsloggerCollector reuses AuditdCollector's tail loop, which calls
165
+ ``parser.flush_older_than`` on EVERY poll. EsloggerParser was missing it, so the
166
+ collector thread died with AttributeError on its first (idle) poll — the tail
167
+ starts at EOF, so the first poll reads nothing and goes straight to that call —
168
+ and not a single event was ever recorded (SDK v1.6.52 on the Mac VPS)."""
169
+ from sdk.activity.collectors import linux_auditd as L
170
+
171
+ log = tmp_path / "es.ndjson"
172
+ log.write_text(_exec(1, ["old"], tty="/dev/ttys001") + "\n") # pre-install: not backfilled
173
+ collector = M.EsloggerCollector(
174
+ str(log), parser=_parser(), state_file=tmp_path / "st.json", poll_s=0,
175
+ )
176
+ calls = {"n": 0}
177
+
178
+ def fake_sleep(_):
179
+ calls["n"] += 1
180
+ if calls["n"] == 1: # new activity lands after the first, empty poll
181
+ with log.open("a") as fh:
182
+ fh.write(_exec(2, ["whoami"], tty="/dev/ttys001") + "\n")
183
+ else:
184
+ collector.stop()
185
+
186
+ monkeypatch.setattr(L.time, "sleep", fake_sleep)
187
+ collector.run() # before the fix: raises AttributeError out of the loop
188
+
189
+ _, events = _queued()
190
+ assert [e["command"] for e in events] == ["whoami"]
191
+
161
192
 
162
193
  # ─────────────────────────────── setup ───────────────────────────────
163
194
 
@@ -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: