devops-bot-sdk 1.6.41__tar.gz → 1.6.42__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 (217) hide show
  1. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/PKG-INFO +1 -1
  2. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
  3. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/SOURCES.txt +16 -0
  4. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/__init__.py +2 -2
  5. devops_bot_sdk-1.6.42/sdk/activity/__init__.py +15 -0
  6. devops_bot_sdk-1.6.42/sdk/activity/classifier.py +143 -0
  7. devops_bot_sdk-1.6.42/sdk/activity/collectors/__init__.py +79 -0
  8. devops_bot_sdk-1.6.42/sdk/activity/collectors/common.py +98 -0
  9. devops_bot_sdk-1.6.42/sdk/activity/collectors/linux_auditd.py +401 -0
  10. devops_bot_sdk-1.6.42/sdk/activity/collectors/windows_eventlog.py +326 -0
  11. devops_bot_sdk-1.6.42/sdk/activity/models.py +200 -0
  12. devops_bot_sdk-1.6.42/sdk/activity/recorder.py +198 -0
  13. devops_bot_sdk-1.6.42/sdk/activity/redact.py +86 -0
  14. devops_bot_sdk-1.6.42/sdk/activity/settings.py +93 -0
  15. devops_bot_sdk-1.6.42/sdk/activity/shipper.py +178 -0
  16. devops_bot_sdk-1.6.42/sdk/activity/spool.py +199 -0
  17. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agentd.py +32 -2
  18. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/schedules.py +231 -11
  19. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/client.py +23 -0
  20. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/scheduler.py +79 -0
  21. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/api.py +47 -20
  22. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/models.py +31 -5
  23. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/server.py +10 -1
  24. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/app.js +60 -6
  25. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/schedules.html +38 -3
  26. devops_bot_sdk-1.6.42/tests/test_activity_collectors.py +509 -0
  27. devops_bot_sdk-1.6.42/tests/test_activity_core.py +279 -0
  28. devops_bot_sdk-1.6.42/tests/test_activity_pipeline.py +408 -0
  29. devops_bot_sdk-1.6.42/tests/test_schedule_outputs_and_plans.py +226 -0
  30. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_ui_lifespan.py +18 -5
  31. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/README.md +0 -0
  32. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
  33. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
  34. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/requires.txt +0 -0
  35. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/devops_bot_sdk.egg-info/top_level.txt +0 -0
  36. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/pyproject.toml +0 -0
  37. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/__init__.py +0 -0
  38. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/activity.py +0 -0
  39. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/builder.py +0 -0
  40. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/chat.py +0 -0
  41. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/connectors.py +0 -0
  42. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/__init__.py +0 -0
  43. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/claude_code.py +0 -0
  44. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/http.py +0 -0
  45. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/mcp.py +0 -0
  46. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/n8n.py +0 -0
  47. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/engines/shell.py +0 -0
  48. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/integrations.py +0 -0
  49. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/inventory.py +0 -0
  50. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/library/__init__.py +0 -0
  51. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/manifest.py +0 -0
  52. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/prompt_studio.py +0 -0
  53. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/prompt_template.py +0 -0
  54. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/prompt_vars.py +0 -0
  55. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/run_log.py +0 -0
  56. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/secrets.py +0 -0
  57. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/ticket_run.py +0 -0
  58. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/usage.py +0 -0
  59. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/agents/varstore.py +0 -0
  60. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/browser_profile.py +0 -0
  61. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/cli.py +0 -0
  62. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/collectors/__init__.py +0 -0
  63. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/collectors/files.py +0 -0
  64. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/collectors/process.py +0 -0
  65. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/collectors/screenshot.py +0 -0
  66. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/config.py +0 -0
  67. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/crucial.py +0 -0
  68. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/departments.py +0 -0
  69. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/__init__.py +0 -0
  70. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/assets.py +0 -0
  71. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/bootstrap.py +0 -0
  72. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/browser.py +0 -0
  73. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/compare.py +0 -0
  74. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/design_verify/loop.py +0 -0
  75. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/estimator.py +0 -0
  76. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/exceptions.py +0 -0
  77. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/firewall.py +0 -0
  78. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/formats.py +0 -0
  79. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/git_ops.py +0 -0
  80. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/github_fetch.py +0 -0
  81. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/github_ingest.py +0 -0
  82. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/graph_recon.py +0 -0
  83. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/graphify.py +0 -0
  84. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/hooks/__init__.py +0 -0
  85. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/hooks/crucial_guard.py +0 -0
  86. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/intake.py +0 -0
  87. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ipc/__init__.py +0 -0
  88. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ipc/electron_bridge.py +0 -0
  89. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ipc/handlers.py +0 -0
  90. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/journal.py +0 -0
  91. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/local_exec.py +0 -0
  92. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/memory_guard.py +0 -0
  93. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/models/__init__.py +0 -0
  94. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/models/envelope.py +0 -0
  95. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/models/requests.py +0 -0
  96. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/models/responses.py +0 -0
  97. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/models/snapshots.py +0 -0
  98. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/phase_timer.py +0 -0
  99. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/plan_run.py +0 -0
  100. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/platform_compat.py +0 -0
  101. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/prd_progress.py +0 -0
  102. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/proof_readers.py +0 -0
  103. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/providers.py +0 -0
  104. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/py.typed +0 -0
  105. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/resume.py +0 -0
  106. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/router.py +0 -0
  107. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/run_auto.py +0 -0
  108. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/self_report.py +0 -0
  109. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/self_report_local.py +0 -0
  110. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/sse.py +0 -0
  111. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/swagger.py +0 -0
  112. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/task_file.py +0 -0
  113. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/task_types.py +0 -0
  114. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/test.py +0 -0
  115. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/test_pipeline.py +0 -0
  116. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ticket_fields.py +0 -0
  117. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/tiers/__init__.py +0 -0
  118. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/tiers/mini_agent.py +0 -0
  119. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/__init__.py +0 -0
  120. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/dashboard.py +0 -0
  121. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/health.py +0 -0
  122. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/ip_allowlist.py +0 -0
  123. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/jobs.py +0 -0
  124. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/runner.py +0 -0
  125. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/security.py +0 -0
  126. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/service.py +0 -0
  127. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/session.py +0 -0
  128. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/setup_manager.py +0 -0
  129. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/agents.html +0 -0
  130. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/chat.html +0 -0
  131. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/custom-agents.html +0 -0
  132. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/default-agents.html +0 -0
  133. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/index.html +0 -0
  134. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/report.html +0 -0
  135. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/runs.html +0 -0
  136. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/setup.html +0 -0
  137. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/styles.css +0 -0
  138. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/static/tickets.html +0 -0
  139. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/ui/swagger.py +0 -0
  140. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/updater.py +0 -0
  141. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/url_access.py +0 -0
  142. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/vps_health.py +0 -0
  143. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/sdk/write_hook.py +0 -0
  144. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/setup.cfg +0 -0
  145. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_activity.py +0 -0
  146. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_activity_tracking.py +0 -0
  147. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_chat_features.py +0 -0
  148. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_listing.py +0 -0
  149. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_prompt_async.py +0 -0
  150. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_prompt_models.py +0 -0
  151. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_run_ticket.py +0 -0
  152. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_schedules.py +0 -0
  153. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agent_workspace_settings.py +0 -0
  154. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_agents_connectors_builder.py +0 -0
  155. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_allowed_tools_config.py +0 -0
  156. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_auto_agent_dispatch.py +0 -0
  157. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_browser_profile.py +0 -0
  158. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_cheap_tier.py +0 -0
  159. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_client_jira_projects.py +0 -0
  160. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_config_token_diagnostics.py +0 -0
  161. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_configure_token_owner.py +0 -0
  162. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_console_encoding.py +0 -0
  163. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_crash_recovery.py +0 -0
  164. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_departments.py +0 -0
  165. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_done_transition.py +0 -0
  166. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_epic_decompose_run.py +0 -0
  167. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_epic_inherited_agent_id.py +0 -0
  168. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_epic_session_isolation.py +0 -0
  169. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_estimator.py +0 -0
  170. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_firewall_open_on_update.py +0 -0
  171. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_formats.py +0 -0
  172. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_git_action.py +0 -0
  173. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_github_fetch.py +0 -0
  174. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_github_ingest.py +0 -0
  175. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_graph_recon.py +0 -0
  176. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_graphify_build.py +0 -0
  177. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_graphify_hook_install.py +0 -0
  178. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_health.py +0 -0
  179. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_intake_job_outcome.py +0 -0
  180. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_intake_plan_review.py +0 -0
  181. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_journal.py +0 -0
  182. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_local_exec_provider.py +0 -0
  183. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_mcp_route_contract.py +0 -0
  184. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_memory_guard.py +0 -0
  185. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_phase_timer.py +0 -0
  186. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_plan_new_command.py +0 -0
  187. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_plan_run_activity.py +0 -0
  188. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_pr_identity.py +0 -0
  189. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_prd_artifact.py +0 -0
  190. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_project_path_resolution.py +0 -0
  191. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_proof_readers.py +0 -0
  192. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_providers.py +0 -0
  193. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_recon_session_isolation.py +0 -0
  194. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_resume.py +0 -0
  195. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_router.py +0 -0
  196. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_run_auto_agent_only.py +0 -0
  197. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_run_outputs.py +0 -0
  198. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_run_verdict_is_honest.py +0 -0
  199. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_schedule_api.py +0 -0
  200. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_scheduler.py +0 -0
  201. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_self_report.py +0 -0
  202. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_service_token_warning.py +0 -0
  203. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_swagger_command.py +0 -0
  204. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_task_file_and_plan_run.py +0 -0
  205. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_task_file_format_doc.py +0 -0
  206. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_ticket_fields.py +0 -0
  207. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_ticket_run_resolve_by_id.py +0 -0
  208. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_ticket_speed_fixes.py +0 -0
  209. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_tier_flag_parity.py +0 -0
  210. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_ui_gate.py +0 -0
  211. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_update_timer.py +0 -0
  212. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_updater_extras.py +0 -0
  213. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_updater_reports_the_truth.py +0 -0
  214. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_url_access.py +0 -0
  215. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_vps_health.py +0 -0
  216. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/tests/test_windows_loop_identity.py +0 -0
  217. {devops_bot_sdk-1.6.41 → devops_bot_sdk-1.6.42}/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.41
3
+ Version: 1.6.42
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.41
3
+ Version: 1.6.42
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
@@ -51,6 +51,18 @@ sdk/updater.py
51
51
  sdk/url_access.py
52
52
  sdk/vps_health.py
53
53
  sdk/write_hook.py
54
+ sdk/activity/__init__.py
55
+ sdk/activity/classifier.py
56
+ sdk/activity/models.py
57
+ sdk/activity/recorder.py
58
+ sdk/activity/redact.py
59
+ sdk/activity/settings.py
60
+ sdk/activity/shipper.py
61
+ sdk/activity/spool.py
62
+ sdk/activity/collectors/__init__.py
63
+ sdk/activity/collectors/common.py
64
+ sdk/activity/collectors/linux_auditd.py
65
+ sdk/activity/collectors/windows_eventlog.py
54
66
  sdk/agents/__init__.py
55
67
  sdk/agents/activity.py
56
68
  sdk/agents/builder.py
@@ -123,6 +135,9 @@ sdk/ui/static/schedules.html
123
135
  sdk/ui/static/setup.html
124
136
  sdk/ui/static/styles.css
125
137
  sdk/ui/static/tickets.html
138
+ tests/test_activity_collectors.py
139
+ tests/test_activity_core.py
140
+ tests/test_activity_pipeline.py
126
141
  tests/test_agent_activity.py
127
142
  tests/test_agent_activity_tracking.py
128
143
  tests/test_agent_chat_features.py
@@ -178,6 +193,7 @@ tests/test_run_auto_agent_only.py
178
193
  tests/test_run_outputs.py
179
194
  tests/test_run_verdict_is_honest.py
180
195
  tests/test_schedule_api.py
196
+ tests/test_schedule_outputs_and_plans.py
181
197
  tests/test_scheduler.py
182
198
  tests/test_self_report.py
183
199
  tests/test_service_token_warning.py
@@ -1,6 +1,6 @@
1
1
  """AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
2
2
 
3
- Version: 1.6.41
3
+ Version: 1.6.42
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.41" # SINGLE SOURCE OF TRUTH — bump on every change; pyproject,
37
+ __version__ = "1.6.42" # 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
@@ -0,0 +1,15 @@
1
+ """VPS activity audit trail.
2
+
3
+ Records what happens on the machine the SDK runs on — commands, logins, processes,
4
+ file and network changes, and every agent run / tool call — classifies it HUMAN /
5
+ AGENT / SYSTEM, and ships it to the backend so it is stored against this VPS.
6
+
7
+ recorder the one safe write API (redacts, never raises)
8
+ spool durable SQLite queue — rows survive crashes and outages
9
+ shipper 5-minute flush loop → devops-bot-ai → devops-bot-be
10
+ classifier pure human-vs-agent decision, identical on every OS
11
+ redact strips secrets from command lines at capture time
12
+ collectors per-OS fact gatherers (opt-in: AGENTOS_ACTIVITY_AUDIT=1)
13
+
14
+ See docs/ACTIVITY_AUDIT.md for the data flow and the OS-side setup.
15
+ """
@@ -0,0 +1,143 @@
1
+ """Decide whether activity on a VPS was done by a HUMAN, an AGENT, or the SYSTEM.
2
+
3
+ The label is per SESSION / process tree, not per event: every event in a session
4
+ inherits it. Collectors on each OS gather *facts* about a process (who it
5
+ descends from, which OS user, whether it has a terminal, how its logon started)
6
+ and this module turns those facts into a verdict. Keeping the decision pure — no
7
+ OS calls — means the same rules run, and are tested, identically on Linux,
8
+ Windows and macOS; only the fact-gathering differs per platform.
9
+
10
+ Signals, strongest first (the confidence is what gets stored and shown):
11
+
12
+ 1. descends from a process agentos launched ................ AGENT 95
13
+ 2. runs as the dedicated agent OS user ..................... AGENT 90
14
+ 3. an interactive login (SSH / RDP / console) .............. HUMAN 85
15
+ … a terminal but no recorded login ...................... HUMAN 70
16
+ 4. started by init / service manager / scheduler, no tty ... SYSTEM 80
17
+ 5. none of the above ....................................... UNKNOWN 0
18
+
19
+ AGENT beats HUMAN on purpose: a person who SSHes in and starts an agent creates an
20
+ agent subtree; the person's session is recorded separately and linked through
21
+ ``initiatedByKey`` so "who launched it" is still answerable.
22
+
23
+ Provenance beats guessing. Anything agentos itself spawns is registered in an
24
+ :class:`AgentProcessRegistry`, which is exact; rows 3-4 are heuristics for
25
+ everything agentos did NOT launch.
26
+ """
27
+ from __future__ import annotations
28
+
29
+ from collections.abc import Callable
30
+ from dataclasses import dataclass, field
31
+
32
+ from sdk.activity.models import ActorType, SessionKind
33
+
34
+ #: How far up the process tree to walk before giving up (guards against cycles).
35
+ MAX_ANCESTRY_DEPTH = 64
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class ProcessFacts:
40
+ """What a collector observed about a process, in OS-neutral terms."""
41
+
42
+ #: Ancestry reaches a process agentos launched (see AgentProcessRegistry).
43
+ descends_from_agent: bool = False
44
+ agent_run_id: str | None = None
45
+ agent_id: str | None = None
46
+ #: Runs as the dedicated agent OS user (``agentos``; a local account on Windows).
47
+ is_agent_os_user: bool = False
48
+ #: Attached to a terminal / interactive window station.
49
+ has_tty: bool = False
50
+ #: How the logon began, when known: SSH, RDP or CONSOLE.
51
+ login_kind: SessionKind | None = None
52
+ #: Parent chain ends at init/systemd/cron (Linux), services.exe/svchost or the
53
+ #: task scheduler (Windows), or launchd (macOS) — with no terminal.
54
+ spawned_by_service_manager: bool = False
55
+
56
+
57
+ @dataclass(frozen=True)
58
+ class Verdict:
59
+ actor_type: ActorType
60
+ confidence: int
61
+ #: Short machine-readable reasons, e.g. ``["ancestry:agentos", "os_user:agentos"]``.
62
+ reasons: tuple[str, ...] = field(default_factory=tuple)
63
+ session_kind: SessionKind = SessionKind.UNKNOWN
64
+
65
+ def reasons_wire(self) -> dict[str, list[str]]:
66
+ """Shape stored in ``vps_sessions.actor_reasons``."""
67
+ return {"signals": list(self.reasons)}
68
+
69
+
70
+ def classify(facts: ProcessFacts) -> Verdict:
71
+ """Apply the signal table to ``facts``."""
72
+ reasons: list[str] = []
73
+
74
+ if facts.descends_from_agent:
75
+ reasons.append("ancestry:agentos")
76
+ if facts.is_agent_os_user:
77
+ reasons.append("os_user:agentos")
78
+ return Verdict(ActorType.AGENT, 95, tuple(reasons), SessionKind.AGENT_RUN)
79
+
80
+ if facts.is_agent_os_user:
81
+ return Verdict(ActorType.AGENT, 90, ("os_user:agentos",), SessionKind.AGENT_RUN)
82
+
83
+ if facts.login_kind in (SessionKind.SSH, SessionKind.RDP, SessionKind.CONSOLE):
84
+ reasons.append(f"login:{facts.login_kind.value}")
85
+ if facts.has_tty:
86
+ reasons.append("tty")
87
+ return Verdict(ActorType.HUMAN, 85, tuple(reasons), facts.login_kind)
88
+
89
+ if facts.has_tty:
90
+ return Verdict(ActorType.HUMAN, 70, ("tty",), SessionKind.CONSOLE)
91
+
92
+ if facts.spawned_by_service_manager:
93
+ return Verdict(
94
+ ActorType.SYSTEM, 80, ("parent:service-manager", "no-tty"), SessionKind.SERVICE
95
+ )
96
+
97
+ return Verdict(ActorType.UNKNOWN, 0, (), SessionKind.UNKNOWN)
98
+
99
+
100
+ @dataclass(frozen=True)
101
+ class AgentRoot:
102
+ pid: int
103
+ run_id: str
104
+ agent_id: str | None = None
105
+
106
+
107
+ class AgentProcessRegistry:
108
+ """Pids agentos launched itself, so descendants can be attributed EXACTLY.
109
+
110
+ ``register`` is called wherever the SDK spawns an agent process (the ``claude -p``
111
+ subprocess, agentd jobs). Collectors then ask :meth:`lookup` with a pid and a
112
+ ``parent_of`` function, and get the owning run if any ancestor is a root.
113
+ """
114
+
115
+ def __init__(self) -> None:
116
+ self._roots: dict[int, AgentRoot] = {}
117
+
118
+ def register(self, pid: int, run_id: str, agent_id: str | None = None) -> None:
119
+ self._roots[pid] = AgentRoot(pid, run_id, agent_id)
120
+
121
+ def unregister(self, pid: int) -> None:
122
+ self._roots.pop(pid, None)
123
+
124
+ def lookup(self, pid: int, parent_of: Callable[[int], int | None]) -> AgentRoot | None:
125
+ """The agent run ``pid`` belongs to, by walking its ancestry, or ``None``.
126
+
127
+ ``parent_of(pid)`` returns the parent pid, or ``None``/``0`` at the top. A
128
+ pid that has already exited can't be walked, so a collector that sees events
129
+ late should cache ppid at exec time.
130
+ """
131
+ seen: set[int] = set()
132
+ current: int | None = pid
133
+ for _ in range(MAX_ANCESTRY_DEPTH):
134
+ if current is None or current <= 0 or current in seen:
135
+ return None
136
+ if current in self._roots:
137
+ return self._roots[current]
138
+ seen.add(current)
139
+ current = parent_of(current)
140
+ return None
141
+
142
+ def __len__(self) -> int:
143
+ return len(self._roots)
@@ -0,0 +1,79 @@
1
+ """OS-level collectors — opt-in (``AGENTOS_ACTIVITY_AUDIT=1``).
2
+
3
+ Linux auditd sdk.activity.collectors.linux_auditd
4
+ Windows Security log sdk.activity.collectors.windows_eventlog
5
+ macOS not supported yet — a faithful collector needs an Endpoint Security
6
+ client, which is a signed system extension rather than Python. See
7
+ docs/ACTIVITY_AUDIT.md. (Agent runs are still recorded on macOS: that
8
+ part is the SDK's own and needs no OS support.)
9
+
10
+ ``start()`` has the same contract as the other crons the UI lifespan starts
11
+ (``sdk.vps_health.start`` …): it returns an asyncio task, or ``None`` when disabled
12
+ or unsupported, and never raises into the panel.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ import asyncio
17
+ import logging
18
+ from typing import Any
19
+
20
+ from sdk.activity import settings
21
+ from sdk.activity.models import Os, current_os
22
+
23
+ logger = logging.getLogger("sdk.activity.collectors")
24
+
25
+ #: Local account agentos runs agents as (see docs/ACTIVITY_AUDIT.md).
26
+ AGENT_OS_USER = "agentos"
27
+
28
+
29
+ def make_collector(os_name: Os | None = None) -> Any | None:
30
+ """The collector for this OS, or ``None`` when there isn't one."""
31
+ os_name = os_name or current_os()
32
+ if os_name is Os.LINUX:
33
+ from sdk.activity.collectors.linux_auditd import AuditdCollector, AuditdParser
34
+
35
+ agent_uid: int | None = None
36
+ try:
37
+ import pwd
38
+
39
+ agent_uid = pwd.getpwnam(AGENT_OS_USER).pw_uid
40
+ except Exception: # noqa: BLE001 — no such user (yet): heuristics 1/3/4 still apply
41
+ agent_uid = None
42
+ return AuditdCollector(parser=AuditdParser(agent_uid=agent_uid))
43
+ if os_name is Os.WINDOWS:
44
+ from sdk.activity.collectors.windows_eventlog import (
45
+ WindowsEventLogCollector,
46
+ WindowsEventProcessor,
47
+ )
48
+
49
+ return WindowsEventLogCollector(WindowsEventProcessor(agent_user=AGENT_OS_USER))
50
+ return None
51
+
52
+
53
+ async def run_forever(collector: Any) -> None:
54
+ """Run a blocking collector in a worker thread until cancelled."""
55
+ try:
56
+ await asyncio.to_thread(collector.run)
57
+ except asyncio.CancelledError:
58
+ collector.stop() # the thread exits after its current poll
59
+ raise
60
+ except Exception:
61
+ logger.exception("activity collector crashed")
62
+
63
+
64
+ def start() -> asyncio.Task[None] | None:
65
+ if not (settings.enabled() and settings.audit_enabled()):
66
+ return None
67
+ try:
68
+ collector = make_collector()
69
+ except Exception as exc: # noqa: BLE001
70
+ logger.warning("activity collector could not be created: %s", exc)
71
+ return None
72
+ if collector is None:
73
+ logger.warning(
74
+ "AGENTOS_ACTIVITY_AUDIT is on but there is no OS collector for %s yet; "
75
+ "agent runs are still recorded", current_os().value,
76
+ )
77
+ return None
78
+ logger.info("activity collector starting (%s)", type(collector).__name__)
79
+ return asyncio.ensure_future(run_forever(collector))
@@ -0,0 +1,98 @@
1
+ """Session bookkeeping shared by the OS collectors.
2
+
3
+ A collector turns raw OS records into (a) sessions — logins, and agent-attributed
4
+ process trees — and (b) events inside them. This module owns the part that is the
5
+ same on every OS: deciding a session's label with the classifier, recording it once,
6
+ and keeping the key → verdict map so later events can inherit it.
7
+
8
+ An AGENT verdict needs an ``agentRunId`` on the wire: devops-bot-be only keeps an
9
+ AGENT claim that points at an AGENT session carrying that run id on the same VPS.
10
+ When agentos launched the process, the run id is the real one (``agent-run:<id>``,
11
+ recorded by the agent runner). When the label came from the OS user alone there is
12
+ no such run, so :meth:`SessionBook.ensure` synthesises one (``os:<session key>``) and
13
+ records the session that backs it — the claim is then self-consistent and the
14
+ reason it was made (``os_user:agentos``) is kept in ``actorReasons``.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ from dataclasses import dataclass
19
+
20
+ from sdk.activity import recorder
21
+ from sdk.activity.classifier import Verdict
22
+ from sdk.activity.models import ActivitySession, ActorType, SessionKind
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class SessionInfo:
27
+ key: str
28
+ verdict: Verdict
29
+ kind: SessionKind
30
+ agent_run_id: str | None
31
+
32
+
33
+ class SessionBook:
34
+ """Tracks sessions a collector has already recorded, by key."""
35
+
36
+ def __init__(self) -> None:
37
+ self._sessions: dict[str, SessionInfo] = {}
38
+
39
+ def get(self, key: str) -> SessionInfo | None:
40
+ return self._sessions.get(key)
41
+
42
+ def ensure(
43
+ self,
44
+ key: str,
45
+ *,
46
+ started: float,
47
+ verdict: Verdict,
48
+ kind: SessionKind | None = None,
49
+ os_user: str | None = None,
50
+ remote_ip: str | None = None,
51
+ agent_run_id: str | None = None,
52
+ agent_id: str | None = None,
53
+ initiated_by_key: str | None = None,
54
+ ) -> SessionInfo:
55
+ """Record the session the first time it is seen; return it either way."""
56
+ known = self._sessions.get(key)
57
+ if known:
58
+ return known
59
+
60
+ run_id = agent_run_id
61
+ if verdict.actor_type is ActorType.AGENT and not run_id:
62
+ run_id = f"os:{key}" # see module docstring
63
+
64
+ info = SessionInfo(key, verdict, kind or verdict.session_kind, run_id)
65
+ self._sessions[key] = info
66
+ recorder.record_session(
67
+ ActivitySession(
68
+ externalKey=key,
69
+ startedAt=started,
70
+ kind=info.kind,
71
+ actorType=verdict.actor_type,
72
+ actorConfidence=verdict.confidence,
73
+ actorReasons=verdict.reasons_wire(),
74
+ osUser=os_user,
75
+ remoteIp=remote_ip,
76
+ agentRunId=run_id,
77
+ agentId=agent_id,
78
+ initiatedByKey=initiated_by_key,
79
+ )
80
+ )
81
+ return info
82
+
83
+ def end(self, key: str, ended: float) -> None:
84
+ """Close a session. A no-op for a session we never saw open."""
85
+ info = self._sessions.pop(key, None)
86
+ if info is None:
87
+ return
88
+ recorder.record_session(
89
+ ActivitySession(
90
+ externalKey=key,
91
+ startedAt=ended, # ignored by the backend on update; the model requires it
92
+ kind=info.kind,
93
+ actorType=info.verdict.actor_type,
94
+ actorConfidence=info.verdict.confidence,
95
+ agentRunId=info.agent_run_id,
96
+ endedAt=ended,
97
+ )
98
+ )