argus-alm 0.15.10__tar.gz → 0.15.12__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 (439) hide show
  1. argus_alm-0.15.12/.github/workflows/call_jira_sync.yml +42 -0
  2. argus_alm-0.15.12/.github/workflows/close_issue_for_scylla_employee.yml +62 -0
  3. {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/test.yml +1 -1
  4. {argus_alm-0.15.10 → argus_alm-0.15.12}/PKG-INFO +6 -2
  5. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/_version.py +3 -3
  6. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sct/client.py +37 -1
  7. argus_alm-0.15.12/argusAI/README.md +149 -0
  8. argus_alm-0.15.12/argusAI/event_similarity_processor_v2.py +237 -0
  9. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/event_message_sanitizer.py +2 -0
  10. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/PKG-INFO +6 -2
  11. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/SOURCES.txt +12 -2
  12. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/requires.txt +6 -1
  13. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_backend.py +19 -1
  14. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_web.example.yaml +6 -0
  15. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/scylla.yaml +1 -0
  16. argus_alm-0.15.12/dev-db/docker-compose.yaml +42 -0
  17. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/UserManager.svelte +5 -0
  18. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/GithubIssue.svelte +15 -11
  19. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Jira/JiraIssue.svelte +31 -26
  20. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/Login.svelte +18 -1
  21. argus_alm-0.15.12/frontend/TestRun/MiscConfig.svelte +15 -0
  22. argus_alm-0.15.12/frontend/TestRun/RuntimeConfig.svelte +126 -0
  23. argus_alm-0.15.12/frontend/TestRun/SCT/SctConfig.svelte +79 -0
  24. argus_alm-0.15.12/frontend/TestRun/SCT/SctEvent.svelte +390 -0
  25. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCT/SctEvents.svelte +5 -3
  26. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCT/SctNemesis.svelte +5 -3
  27. argus_alm-0.15.12/frontend/TestRun/SCT/SctSetup.svelte +64 -0
  28. argus_alm-0.15.12/frontend/TestRun/SCT/SctSimilarEvents.svelte +289 -0
  29. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRun.svelte +32 -1
  30. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/login.js +1 -0
  31. {argus_alm-0.15.10 → argus_alm-0.15.12}/pyproject.toml +6 -1
  32. argus_alm-0.15.12/scripts/migration/migration_2026-01-20-1.py +29 -0
  33. argus_alm-0.15.12/scripts/migration/migration_2026-01-20.py +106 -0
  34. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/auth/login.html.j2 +1 -0
  35. argus_alm-0.15.12/templates/auth/user_switch.html.j2 +39 -0
  36. argus_alm-0.15.12/templates/create_user.html.j2 +61 -0
  37. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/partials/nav_bar.html.j2 +10 -1
  38. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile.html.j2 +23 -4
  39. argus_alm-0.15.12/uv.lock +3043 -0
  40. argus_alm-0.15.10/argusAI/README.md +0 -5
  41. argus_alm-0.15.10/argusAI/pyproject.toml +0 -11
  42. argus_alm-0.15.10/argusAI/uv.lock +0 -1636
  43. argus_alm-0.15.10/dev-db/docker-compose.yaml +0 -19
  44. argus_alm-0.15.10/frontend/TestRun/SCT/SctEvent.svelte +0 -209
  45. argus_alm-0.15.10/uv.lock +0 -1402
  46. {argus_alm-0.15.10 → argus_alm-0.15.12}/.dockerignore +0 -0
  47. {argus_alm-0.15.10 → argus_alm-0.15.12}/.envrc +0 -0
  48. {argus_alm-0.15.10 → argus_alm-0.15.12}/.eslintrc.js +0 -0
  49. {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/.gitkeep +0 -0
  50. {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/lint.yml +0 -0
  51. {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/release.yml +0 -0
  52. {argus_alm-0.15.10 → argus_alm-0.15.12}/.gitignore +0 -0
  53. {argus_alm-0.15.10 → argus_alm-0.15.12}/.pre-commit-config.yaml +0 -0
  54. {argus_alm-0.15.10 → argus_alm-0.15.12}/.prettierrc.js +0 -0
  55. {argus_alm-0.15.10 → argus_alm-0.15.12}/AGENTS.md +0 -0
  56. {argus_alm-0.15.10 → argus_alm-0.15.12}/Dockerfile +0 -0
  57. {argus_alm-0.15.10 → argus_alm-0.15.12}/LICENSE +0 -0
  58. {argus_alm-0.15.10 → argus_alm-0.15.12}/MANIFEST.in +0 -0
  59. {argus_alm-0.15.10 → argus_alm-0.15.12}/README.md +0 -0
  60. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/__init__.py +0 -0
  61. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/__init__.py +0 -0
  62. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/base.py +0 -0
  63. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/driver_matrix_tests/cli.py +0 -0
  64. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/driver_matrix_tests/client.py +0 -0
  65. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic/cli.py +0 -0
  66. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic/client.py +0 -0
  67. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic_result.py +0 -0
  68. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sct/types.py +0 -0
  69. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sirenada/client.py +0 -0
  70. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/__init__.py +0 -0
  71. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/email.py +0 -0
  72. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/enums.py +0 -0
  73. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/sct_types.py +0 -0
  74. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/sirenada_types.py +0 -0
  75. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus.yaml +0 -0
  76. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/deployment/argusai_event_similarity_processor.service +0 -0
  77. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/event_similarity_processor.py +0 -0
  78. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/logs/.gitignore +0 -0
  79. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/__init__.py +0 -0
  80. {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/scylla_connection.py +0 -0
  81. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/dependency_links.txt +0 -0
  82. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/entry_points.txt +0 -0
  83. {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/top_level.txt +0 -0
  84. {argus_alm-0.15.10 → argus_alm-0.15.12}/commitlint.config.js +0 -0
  85. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/.gitignore +0 -0
  86. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/cassandra-rackdc.properties +0 -0
  87. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/machine_image_configured +0 -0
  88. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-data/.gitignore +0 -0
  89. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/export_data.py +0 -0
  90. {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/import_data.py +0 -0
  91. {argus_alm-0.15.10 → argus_alm-0.15.12}/docker/config/nginx-docker.conf +0 -0
  92. {argus_alm-0.15.10 → argus_alm-0.15.12}/docker/config/supervisord.conf +0 -0
  93. {argus_alm-0.15.10 → argus_alm-0.15.12}/docker-entrypoint.sh +0 -0
  94. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/api_usage.md +0 -0
  95. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/argus_status_page.md +0 -0
  96. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/argus_status_page_diagram.jpg +0 -0
  97. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/config/argus.nginx.conf +0 -0
  98. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/config/argus.service +0 -0
  99. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/dev-setup.md +0 -0
  100. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/generic_results.md +0 -0
  101. {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/pypi-guide.md +0 -0
  102. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/AdminPanel.svelte +0 -0
  103. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/AdminPanelWelcome.svelte +0 -0
  104. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/BatchTestMover.svelte +0 -0
  105. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/GroupCreator.svelte +0 -0
  106. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseCreator.svelte +0 -0
  107. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseDeletionConfirmationPopup.svelte +0 -0
  108. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseEditor.svelte +0 -0
  109. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManager.svelte +0 -0
  110. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManagerGroup.svelte +0 -0
  111. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManagerTest.svelte +0 -0
  112. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/TestCreator.svelte +0 -0
  113. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewListItem.svelte +0 -0
  114. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewSelectItem.svelte +0 -0
  115. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewWidget.svelte +0 -0
  116. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewsManager.svelte +0 -0
  117. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alert.js +0 -0
  118. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alerts/AlertMessage.svelte +0 -0
  119. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alerts/AlertWidget.svelte +0 -0
  120. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ApiUtils.js +0 -0
  121. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ArgusNotification.ts +0 -0
  122. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/AssigneeSelector.svelte +0 -0
  123. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/AssigneeUtils.js +0 -0
  124. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/DateUtils.js +0 -0
  125. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/DriverMatrixTypes.ts +0 -0
  126. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/IssueDestinations.js +0 -0
  127. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/JenkinsSettingsHelp.js +0 -0
  128. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ModalWindow.svelte +0 -0
  129. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/PluginDispatch.js +0 -0
  130. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/PluginNames.js +0 -0
  131. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/RunUtils.js +0 -0
  132. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/SelectUtils.js +0 -0
  133. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/StateManagement.js +0 -0
  134. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/TestStatus.js +0 -0
  135. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/TextUtils.js +0 -0
  136. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/UserTypes.ts +0 -0
  137. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/UserUtils.js +0 -0
  138. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ViewTypes.js +0 -0
  139. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Debug/FlashDebugComponent.svelte +0 -0
  140. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/Comment.svelte +0 -0
  141. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/CommentEditor.svelte +0 -0
  142. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/MarkedMentionExtension.js +0 -0
  143. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/MentionSelector.svelte +0 -0
  144. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/UserProfile.svelte +0 -0
  145. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/Issues.svelte +0 -0
  146. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/IssuesCopyModal.svelte +0 -0
  147. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/JobsList.svelte +0 -0
  148. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/Notification.svelte +0 -0
  149. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationCommentWrapper.svelte +0 -0
  150. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationCounter.svelte +0 -0
  151. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationSender.svelte +0 -0
  152. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationTestRunWrapper.svelte +0 -0
  153. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationsReader.svelte +0 -0
  154. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/PlannedJob.svelte +0 -0
  155. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/PlannedJobs.svelte +0 -0
  156. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJob.svelte +0 -0
  157. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJobs.svelte +0 -0
  158. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJobsTab.svelte +0 -0
  159. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileSchedules.svelte +0 -0
  160. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/User.svelte +0 -0
  161. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/UserSelection.svelte +0 -0
  162. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ViewUserResolver.svelte +0 -0
  163. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/AssigneeFilter.svelte +0 -0
  164. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/FlatViewHelper.svelte +0 -0
  165. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/GroupedViewHelper.svelte +0 -0
  166. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseActivity.svelte +0 -0
  167. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseDashboard.svelte +0 -0
  168. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseGithubIssues.svelte +0 -0
  169. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboard.svelte +0 -0
  170. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardFlatView.svelte +0 -0
  171. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardGroup.svelte +0 -0
  172. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardTest.svelte +0 -0
  173. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestPopoutSelector.svelte +0 -0
  174. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestWithIssuesCard.svelte +0 -0
  175. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/CommentTableRow.svelte +0 -0
  176. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/DutyPlanner.svelte +0 -0
  177. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/EntityReplacer.svelte +0 -0
  178. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlan.svelte +0 -0
  179. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanCopyForm.svelte +0 -0
  180. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanCreator.svelte +0 -0
  181. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanEditor.svelte +0 -0
  182. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanTable.svelte +0 -0
  183. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanner.svelte +0 -0
  184. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlannerGridView.svelte +0 -0
  185. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleaseScheduler.svelte +0 -0
  186. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/Schedule.svelte +0 -0
  187. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ScheduleTable.svelte +0 -0
  188. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/SearchBar.svelte +0 -0
  189. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ChartStats.svelte +0 -0
  190. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/NumberStats.svelte +0 -0
  191. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ProgressBarStats.svelte +0 -0
  192. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ReleaseStats.svelte +0 -0
  193. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/StatsFetcher.svelte +0 -0
  194. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/AlertStore.js +0 -0
  195. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/AssigneeSubscriber.js +0 -0
  196. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/SingleTestRunSubscriber.js +0 -0
  197. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/TestRunsSubscriber.js +0 -0
  198. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/UserlistSubscriber.js +0 -0
  199. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/WorkspaceStore.js +0 -0
  200. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamCreateForm.svelte +0 -0
  201. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamDetail.svelte +0 -0
  202. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamList.svelte +0 -0
  203. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamManager.svelte +0 -0
  204. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamMember.svelte +0 -0
  205. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamShort.svelte +0 -0
  206. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamUtils.ts +0 -0
  207. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ActivityTab.svelte +0 -0
  208. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ArtifactRow.svelte +0 -0
  209. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ArtifactTab.svelte +0 -0
  210. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/Cell.svelte +0 -0
  211. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/Filters.svelte +0 -0
  212. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/GraphFilters.svelte +0 -0
  213. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/ResultTable.svelte +0 -0
  214. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/ScreenshotModal.svelte +0 -0
  215. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixBreakdown.svelte +0 -0
  216. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixRunInfo.svelte +0 -0
  217. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestCollection.svelte +0 -0
  218. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestRun.svelte +0 -0
  219. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestSuites.svelte +0 -0
  220. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/EventsTab.svelte +0 -0
  221. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/GenericTestRun.svelte +0 -0
  222. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/GenericTestRunInfo.svelte +0 -0
  223. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/Subtest.js +0 -0
  224. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/HeartbeatIndicator.svelte +0 -0
  225. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/IssueTab.svelte +0 -0
  226. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/IssueTemplate.svelte +0 -0
  227. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/Build.js +0 -0
  228. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildConfirmationDialog.svelte +0 -0
  229. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildStartPlaceholder.svelte +0 -0
  230. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildSuccessPlaceholder.svelte +0 -0
  231. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CheckParam.svelte +0 -0
  232. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneCreatePlaceholder.svelte +0 -0
  233. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneSuccess.svelte +0 -0
  234. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneTargetSelector.svelte +0 -0
  235. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/DummyCheckParam.svelte +0 -0
  236. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/DummySelectParam.svelte +0 -0
  237. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/JenkinsBuildModal.svelte +0 -0
  238. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/JenkinsCloneModal.svelte +0 -0
  239. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/LoadTargetsPlaceholder.svelte +0 -0
  240. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ModalError.svelte +0 -0
  241. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ParamFetchPlaceholder.svelte +0 -0
  242. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ParameterEditor.svelte +0 -0
  243. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/SCTParameterWizard.svelte +0 -0
  244. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/SelectParam.svelte +0 -0
  245. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/StringParam.svelte +0 -0
  246. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/TextParam.svelte +0 -0
  247. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/WizardUnavailable.svelte +0 -0
  248. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisData.svelte +0 -0
  249. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisReason.svelte +0 -0
  250. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisTable.svelte +0 -0
  251. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/PackagesInfo.svelte +0 -0
  252. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/DtestTab.svelte +0 -0
  253. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestItem.svelte +0 -0
  254. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestRun.svelte +0 -0
  255. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestTab.svelte +0 -0
  256. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/index.js +0 -0
  257. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/types.ts +0 -0
  258. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RawEvent.svelte +0 -0
  259. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResourcesInfo.svelte +0 -0
  260. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsGraph.svelte +0 -0
  261. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsGraphs.svelte +0 -0
  262. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsTab.svelte +0 -0
  263. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunAssigneeSelector.svelte +0 -0
  264. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunInvestigationStatusButton.svelte +0 -0
  265. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunStatusButton.svelte +0 -0
  266. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Gemini/GeminiTabBodyComponent.svelte +0 -0
  267. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Gemini/GeminiTabComponent.svelte +0 -0
  268. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Performance/PerformanceTabBodyComponent.svelte +0 -0
  269. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Performance/PerformanceTabComponent.svelte +0 -0
  270. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Subtest.js +0 -0
  271. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Screenshots.svelte +0 -0
  272. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaIssueTemplate.svelte +0 -0
  273. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaRunInfo.svelte +0 -0
  274. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaTestBreakdown.svelte +0 -0
  275. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaTestRun.svelte +0 -0
  276. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/StructuredEvent.svelte +0 -0
  277. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRunComments.svelte +0 -0
  278. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRunInfo.svelte +0 -0
  279. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/jUnitChart.svelte +0 -0
  280. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/jUnitResults.svelte +0 -0
  281. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Utils/IntersectionObserver.svelte +0 -0
  282. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/ViewDashboard.svelte +0 -0
  283. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/ViewSelect.svelte +0 -0
  284. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/CheckValue.svelte +0 -0
  285. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/IntegerValue.svelte +0 -0
  286. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/MultiSelectValue.svelte +0 -0
  287. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/MultiStringValue.svelte +0 -0
  288. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/StringValue.svelte +0 -0
  289. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/GraphsWidget/GraphsWidget.svelte +0 -0
  290. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestCalendarSelector.svelte +0 -0
  291. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestCollapseHelper.svelte +0 -0
  292. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestFlatHelper.svelte +0 -0
  293. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestOverviewWidget.svelte +0 -0
  294. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestResultRow.svelte +0 -0
  295. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestTableWidget.svelte +0 -0
  296. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/ViewPytestOverview.svelte +0 -0
  297. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/SummaryWidget/RunIssues.svelte +0 -0
  298. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/SummaryWidget/SummaryWidget.svelte +0 -0
  299. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGithubIssues.svelte +0 -0
  300. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/AssigneeCell.svelte +0 -0
  301. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/Filters.svelte +0 -0
  302. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/Interfaces.ts +0 -0
  303. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/InvestigationStatusCell.svelte +0 -0
  304. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/IssuesCell.svelte +0 -0
  305. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/NemesisTable.svelte +0 -0
  306. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/PaginatedTable.svelte +0 -0
  307. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StackTracePreview.svelte +0 -0
  308. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StatusBadge.svelte +0 -0
  309. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StatusCell.svelte +0 -0
  310. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/TestRunTable.svelte +0 -0
  311. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats.svelte +0 -0
  312. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/ActionItem.svelte +0 -0
  313. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/Comment.svelte +0 -0
  314. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/HighlightItem.svelte +0 -0
  315. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/ViewHighlights.svelte +0 -0
  316. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewNemesisStats.svelte +0 -0
  317. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewReleaseStats.svelte +0 -0
  318. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewTestDashboard.svelte +0 -0
  319. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewUnsupportedPlaceholder.svelte +0 -0
  320. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/AssigneeList.svelte +0 -0
  321. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/JobConfigureModal.svelte +0 -0
  322. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/RunGroup.svelte +0 -0
  323. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/RunRelease.svelte +0 -0
  324. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/Test.svelte +0 -0
  325. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunDispatcher.svelte +0 -0
  326. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRuns.svelte +0 -0
  327. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsMessage.svelte +0 -0
  328. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsPanel.svelte +0 -0
  329. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsSelector.svelte +0 -0
  330. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/UnknownTest.svelte +0 -0
  331. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/WorkArea.svelte +0 -0
  332. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/admin-panel.js +0 -0
  333. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/argus.css +0 -0
  334. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/argus.js +0 -0
  335. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/duty-planner.js +0 -0
  336. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/flashDebug.js +0 -0
  337. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/font-awesome.css +0 -0
  338. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/font-awesome.js +0 -0
  339. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Bold.ttf +0 -0
  340. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-BoldItalic.ttf +0 -0
  341. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Italic.ttf +0 -0
  342. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Regular.ttf +0 -0
  343. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/OFL.txt +0 -0
  344. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/noto.css +0 -0
  345. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/markdownOptions.js +0 -0
  346. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/notification-counter.js +0 -0
  347. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/plan.js +0 -0
  348. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-jobs.js +0 -0
  349. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-notifications.js +0 -0
  350. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-schedules.js +0 -0
  351. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-dashboard.js +0 -0
  352. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-page.js +0 -0
  353. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-planner.js +0 -0
  354. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-scheduler.js +0 -0
  355. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/run-by-plugin.js +0 -0
  356. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/teams.js +0 -0
  357. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-run-details.js +0 -0
  358. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-runs-breakout.js +0 -0
  359. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-runs-standalone.js +0 -0
  360. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/view-dashboard.js +0 -0
  361. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/view-user-resolver.js +0 -0
  362. {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/work-area.js +0 -0
  363. {argus_alm-0.15.10 → argus_alm-0.15.12}/package.json +0 -0
  364. {argus_alm-0.15.10 → argus_alm-0.15.12}/profile/.gitkeep +0 -0
  365. {argus_alm-0.15.10 → argus_alm-0.15.12}/public/argus.png +0 -0
  366. {argus_alm-0.15.10 → argus_alm-0.15.12}/public/no-user-picture.png +0 -0
  367. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/.envrc +0 -0
  368. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/LICENSE +0 -0
  369. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/MANIFEST.in +0 -0
  370. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/README.md +0 -0
  371. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/noxfile.py +0 -0
  372. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/pyproject.toml +0 -0
  373. {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/pytest_argus_reporter.py +0 -0
  374. {argus_alm-0.15.10 → argus_alm-0.15.12}/rollup.config.js +0 -0
  375. {argus_alm-0.15.10 → argus_alm-0.15.12}/run_with_profiler.py +0 -0
  376. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/index.html +0 -0
  377. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/js/status.js +0 -0
  378. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/app.css +0 -0
  379. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/argus.png +0 -0
  380. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/scylla.png +0 -0
  381. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/status.json +0 -0
  382. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2023-04-07.py +0 -0
  383. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2024-04-14.py +0 -0
  384. {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2025-07-18.py +0 -0
  385. {argus_alm-0.15.10 → argus_alm-0.15.12}/setup.cfg +0 -0
  386. {argus_alm-0.15.10 → argus_alm-0.15.12}/start_argus.sh +0 -0
  387. {argus_alm-0.15.10 → argus_alm-0.15.12}/storage/profile_pictures/.gitignore +0 -0
  388. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/admin/base.html.j2 +0 -0
  389. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/admin/index.html.j2 +0 -0
  390. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/auth/register.html.j2 +0 -0
  391. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/base.html.j2 +0 -0
  392. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/dashboard.html.j2 +0 -0
  393. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/duty_planner.html.j2 +0 -0
  394. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/base.html.j2 +0 -0
  395. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/css/styles.css +0 -0
  396. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/cloud.html.j2 +0 -0
  397. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/custom_html.html.j2 +0 -0
  398. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/custom_table.html.j2 +0 -0
  399. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/events.html.j2 +0 -0
  400. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/generic_results.html.j2 +0 -0
  401. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/header.html.j2 +0 -0
  402. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/logs.html.j2 +0 -0
  403. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/main.html.j2 +0 -0
  404. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/nemesis.html.j2 +0 -0
  405. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/packages.html.j2 +0 -0
  406. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/screenshots.html.j2 +0 -0
  407. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/unsupported.html.j2 +0 -0
  408. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/error.html.j2 +0 -0
  409. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/flash_debug.html.j2 +0 -0
  410. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/groups.html.j2 +0 -0
  411. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/home.html.j2 +0 -0
  412. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/assigned.html.j2 +0 -0
  413. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/assigned_email.html.j2 +0 -0
  414. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/email_mention.html.j2 +0 -0
  415. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/mention.html.j2 +0 -0
  416. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_action_item_assigned.html.j2 +0 -0
  417. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_action_item_assigned_email.html.j2 +0 -0
  418. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_highlight_mention.html.j2 +0 -0
  419. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_highlight_mention_email.html.j2 +0 -0
  420. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/plan_dashboard.html.j2 +0 -0
  421. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_jobs.html.j2 +0 -0
  422. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_notifications.html.j2 +0 -0
  423. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_schedules.html.j2 +0 -0
  424. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_dashboard.html.j2 +0 -0
  425. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_planner.html.j2 +0 -0
  426. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_schedule.html.j2 +0 -0
  427. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/releases.html.j2 +0 -0
  428. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/run_view_by_plugin.html.j2 +0 -0
  429. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/runs.html.j2 +0 -0
  430. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/standalone_test_with_runs.html.j2 +0 -0
  431. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/teams.html.j2 +0 -0
  432. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/test_run.html.j2 +0 -0
  433. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/test_runs.html.j2 +0 -0
  434. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/tests.html.j2 +0 -0
  435. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/view_dashboard.html.j2 +0 -0
  436. {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/views.html.j2 +0 -0
  437. {argus_alm-0.15.10 → argus_alm-0.15.12}/tsconfig.json +0 -0
  438. {argus_alm-0.15.10 → argus_alm-0.15.12}/uwsgi.ini +0 -0
  439. {argus_alm-0.15.10 → argus_alm-0.15.12}/yarn.lock +0 -0
@@ -0,0 +1,42 @@
1
+ name: Sync Jira Based on PR Events
2
+
3
+ on:
4
+ pull_request_target:
5
+ types:
6
+ [opened, ready_for_review, review_requested, labeled, unlabeled, closed]
7
+
8
+ permissions:
9
+ contents: read
10
+ pull-requests: write
11
+ issues: write
12
+
13
+ jobs:
14
+ jira-sync-pr-opened:
15
+ if: github.event.action == 'opened'
16
+ uses: scylladb/github-automation/.github/workflows/main_jira_sync_pr_opened.yml@main
17
+ secrets:
18
+ caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
19
+
20
+ jira-sync-in-review:
21
+ if: github.event.action == 'ready_for_review' || github.event.action == 'review_requested'
22
+ uses: scylladb/github-automation/.github/workflows/main_jira_sync_in_review.yml@main
23
+ secrets:
24
+ caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
25
+
26
+ jira-sync-add-label:
27
+ if: github.event.action == 'labeled'
28
+ uses: scylladb/github-automation/.github/workflows/main_jira_sync_add_label.yml@main
29
+ secrets:
30
+ caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
31
+
32
+ jira-status-remove-label:
33
+ if: github.event.action == 'unlabeled'
34
+ uses: scylladb/github-automation/.github/workflows/main_jira_sync_remove_label.yml@main
35
+ secrets:
36
+ caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
37
+
38
+ jira-status-pr-closed:
39
+ if: github.event.action == 'closed'
40
+ uses: scylladb/github-automation/.github/workflows/main_jira_sync_pr_closed.yml@main
41
+ secrets:
42
+ caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
@@ -0,0 +1,62 @@
1
+ name: Close issues created by Scylla employees
2
+
3
+ on:
4
+ issues:
5
+ types: [opened, reopened]
6
+
7
+ permissions:
8
+ issues: write
9
+
10
+ jobs:
11
+ comment-and-close:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - name: Comment and close if author email is scylladb.com
16
+ uses: actions/github-script@v7
17
+ with:
18
+ github-token: ${{ secrets.GITHUB_TOKEN }}
19
+ script: |
20
+ const issue = context.payload.issue;
21
+ const actor = context.actor;
22
+
23
+ // Get user data (only public email is available)
24
+ const { data: user } = await github.rest.users.getByUsername({
25
+ username: actor,
26
+ });
27
+
28
+ const email = user.email || "";
29
+ console.log(`Actor: ${actor}, public email: ${email || "<none>"}`);
30
+
31
+ // Only continue if email exists and ends with @scylladb.com
32
+ if (!email || !email.toLowerCase().endsWith("@scylladb.com")) {
33
+ console.log("User is not a scylladb.com email (or email not public); skipping.");
34
+ return;
35
+ }
36
+
37
+ const owner = context.repo.owner;
38
+ const repo = context.repo.repo;
39
+ const issue_number = issue.number;
40
+
41
+ const body = "Issues in this repository are closed automatically. Scylla employees should use Jira to manage issues.\nPlease move this issue to Jira https://scylladb.atlassian.net/jira/software/c/projects/ARGUS/list";
42
+
43
+ // Add the comment
44
+ await github.rest.issues.createComment({
45
+ owner,
46
+ repo,
47
+ issue_number,
48
+ body,
49
+ });
50
+
51
+ console.log(`Comment added to #${issue_number}`);
52
+
53
+ // Close the issue
54
+ await github.rest.issues.update({
55
+ owner,
56
+ repo,
57
+ issue_number,
58
+ state: "closed",
59
+ state_reason: "not_planned"
60
+ });
61
+
62
+ console.log(`Issue #${issue_number} closed.`);
@@ -29,7 +29,7 @@ jobs:
29
29
  python-version: '3.12'
30
30
 
31
31
  - name: Install project dependencies
32
- run: uv sync --extra web-backend --extra dev
32
+ run: uv sync --extra web-backend --extra dev --extra ai
33
33
 
34
34
  - name: Verify Docker installation
35
35
  run: docker --version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-alm
3
- Version: 0.15.10
3
+ Version: 0.15.12
4
4
  Summary: Argus
5
5
  Author-email: Alexey Kartashov <alexey.kartashov@scylladb.com>, Łukasz Sójka <lukasz.sojka@scylladb.com>
6
6
  License-Expression: Apache-2.0
@@ -11,13 +11,15 @@ Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: requests>=2.26.0
13
13
  Requires-Dist: click>=8.1.3
14
+ Requires-Dist: lz4>=4.4.4
14
15
  Provides-Extra: web-backend
15
16
  Requires-Dist: PyYAML~=6.0.0; extra == "web-backend"
16
- Requires-Dist: scylla-driver>=3.26.8; extra == "web-backend"
17
+ Requires-Dist: scylla-driver>=3.29.4; extra == "web-backend"
17
18
  Requires-Dist: Flask~=3.0.0; extra == "web-backend"
18
19
  Requires-Dist: Flask-WTF~=1.0.0; extra == "web-backend"
19
20
  Requires-Dist: Flask-Login~=0.5.0; extra == "web-backend"
20
21
  Requires-Dist: humanize~=3.13.1; extra == "web-backend"
22
+ Requires-Dist: PyJWT[crypto]>=2.10.0; extra == "web-backend"
21
23
  Requires-Dist: python-magic~=0.4.24; extra == "web-backend"
22
24
  Requires-Dist: uwsgi~=2.0.20; extra == "web-backend"
23
25
  Requires-Dist: python-jenkins>=1.7.0; extra == "web-backend"
@@ -43,6 +45,8 @@ Requires-Dist: nox~=2025.5.1; extra == "dev"
43
45
  Requires-Dist: pytest-xdist~=3.7.0; extra == "dev"
44
46
  Requires-Dist: pytest-subtests~=0.14.1; extra == "dev"
45
47
  Requires-Dist: boto3-stubs~=1.38.9; extra == "dev"
48
+ Provides-Extra: ai
49
+ Requires-Dist: chromadb>=1.0.15; extra == "ai"
46
50
  Dynamic: license-file
47
51
 
48
52
  # Argus
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.15.10'
32
- __version_tuple__ = version_tuple = (0, 15, 10)
31
+ __version__ = version = '0.15.12'
32
+ __version_tuple__ = version_tuple = (0, 15, 12)
33
33
 
34
- __commit_id__ = commit_id = 'gfb79cf01d'
34
+ __commit_id__ = commit_id = 'g11df55d0a'
@@ -28,7 +28,9 @@ class ArgusSCTClient(ArgusClient):
28
28
  SUBMIT_EVENTS = "/sct/$id/events/submit"
29
29
  SUBMIT_EVENT = "/sct/$id/event/submit"
30
30
  SUBMIT_JUNIT_REPORT = "/sct/$id/junit/submit"
31
+ SUBMIT_STRESS_CMD = "/sct/$id//stress_cmd/submit"
31
32
  SUBMIT_EMAIL = "/testrun/report/email"
33
+ SUBMIT_CONFIG = "/$id/config/submit"
32
34
 
33
35
  def __init__(self, run_id: UUID, auth_token: str, base_url: str, api_version="v1", extra_headers: dict | None = None,
34
36
  timeout: int = 60, max_retries: int = 3) -> None:
@@ -126,6 +128,22 @@ class ArgusSCTClient(ArgusClient):
126
128
  )
127
129
  self.check_response(response)
128
130
 
131
+ def add_stress_command(self, command: str, log_name: str, loader_name: str) -> None:
132
+ """
133
+ Submits stress command information to be viewed inside Argus.
134
+ """
135
+ response = self.post(
136
+ endpoint=self.Routes.SUBMIT_STRESS_CMD,
137
+ location_params={"id": str(self.run_id)},
138
+ body={
139
+ **self.generic_body,
140
+ "cmd": command,
141
+ "log_name": log_name,
142
+ "loader_name": loader_name,
143
+ }
144
+ )
145
+ self.check_response(response)
146
+
129
147
  def submit_screenshots(self, screenshot_links: list[str]) -> None:
130
148
  """
131
149
  Submits links to the screenshots from grafana, taken at the end of the test.
@@ -260,7 +278,8 @@ class ArgusSCTClient(ArgusClient):
260
278
  self.check_response(response)
261
279
 
262
280
  def submit_nemesis(self, name: str, class_name: str, start_time: int,
263
- target_name: str, target_ip: str, target_shards: int) -> None:
281
+ target_name: str, target_ip: str, target_shards: int,
282
+ description: str | None = None) -> None:
264
283
  """
265
284
  Submits a nemesis record. Should then be finalized by
266
285
  .finalize_nemesis method on nemesis completion.
@@ -277,6 +296,7 @@ class ArgusSCTClient(ArgusClient):
277
296
  "node_name": target_name,
278
297
  "node_ip": target_ip,
279
298
  "node_shards": target_shards,
299
+ "description": description,
280
300
  }
281
301
  }
282
302
  )
@@ -334,3 +354,19 @@ class ArgusSCTClient(ArgusClient):
334
354
  "content": str(base64.encodebytes(bytes(raw_content, encoding="utf-8")), encoding="utf-8")
335
355
  }
336
356
  )
357
+ self.check_response(response)
358
+
359
+ def sct_submit_config(self, name: str, content: str) -> None:
360
+ """
361
+ Submit a config file.
362
+ """
363
+ response = self.post(
364
+ endpoint=self.Routes.SUBMIT_CONFIG,
365
+ location_params={"id": str(self.run_id)},
366
+ body={
367
+ **self.generic_body,
368
+ "name": name,
369
+ "content": str(base64.encodebytes(bytes(content, encoding="utf-8")), encoding="utf-8")
370
+ }
371
+ )
372
+ self.check_response(response)
@@ -0,0 +1,149 @@
1
+ # Event Similarity Processor V2
2
+
3
+ ## Overview
4
+
5
+ This directory contains the Event Similarity Processor V2 — the new system that generates and stores embeddings for SCT events. It supersedes the legacy `event_similarity_processor.py` that worked with the deprecated `sct_run` table, but for now both systems are allowed to run in parallel (see "Co‑existence with V1").
6
+
7
+ ## Architecture
8
+
9
+ The processor follows a clean, decoupled flow:
10
+
11
+ 1. Event creation → SCT events are submitted via `SCTService.submit_event()`
12
+ 2. Queue → ERROR and CRITICAL events are added to `sct_unprocessed_events`
13
+ 3. Processing loop → `event_similarity_processor_v2.py` continuously reads from the queue
14
+ 4. Embedding generation → Message is sanitized, then embedded via the BGE‑Small‑EN model
15
+ 5. Storage → Embeddings are written into severity‑specific tables
16
+ 6. Cleanup → Processed events are removed from the queue
17
+
18
+ ## Database Tables
19
+
20
+ ### sct_unprocessed_events
21
+ Tracks events that need embedding generation:
22
+ - `run_id` (UUID, partition key)
23
+ - `severity` (text, clustering key)
24
+ - `ts` (timestamp, clustering key)
25
+
26
+ ### sct_error_event_embedding
27
+ Stores ERROR event embeddings (separate table for performance):
28
+ - `run_id` (UUID, partition key)
29
+ - `ts` (timestamp, clustering key)
30
+ - `embedding` (list<float>)
31
+
32
+ ### sct_critical_event_embedding
33
+ Stores CRITICAL event embeddings (separate table for performance):
34
+ - `run_id` (UUID, partition key)
35
+ - `ts` (timestamp, clustering key)
36
+ - `embedding` (list<float>)
37
+
38
+ Note: Using separate tables for ERROR and CRITICAL events keeps similarity searches scoped to a single severity class and improves query performance by avoiding mixed‑severity comparisons.
39
+
40
+ ## Running the Processor
41
+
42
+ ### Standalone
43
+ ```bash
44
+ cd argusAI
45
+ PYTHONPATH=.. uv run event_similarity_processor_v2.py
46
+ ```
47
+
48
+ ### As a Service
49
+ The processor runs in an infinite loop and every ~1s:
50
+ - Reads up to 100 unprocessed events per batch
51
+ - Routes embeddings to the table matching the event severity
52
+ - Handles errors gracefully (logs and continues)
53
+ - Can be stopped with Ctrl+C
54
+
55
+ ## Key Features
56
+
57
+ ### Severity‑specific storage
58
+ - ERROR → `sct_error_event_embedding`
59
+ - CRITICAL → `sct_critical_event_embedding`
60
+ - Faster similarity searches within the same severity
61
+
62
+ ### Message sanitization
63
+ Uses `MessageSanitizer` from `argusAI/utils/event_message_sanitizer.py` to:
64
+ - Remove IPs, URLs, file paths
65
+ - Normalize timestamps and memory addresses
66
+ - Clean up stack traces and backtraces
67
+ - Remove redundant/noisy details
68
+
69
+ ### Embedding model
70
+ `BgeSmallEnEmbeddingModel` (BGE‑Small‑EN‑v1.5):
71
+ - 384‑dimensional embeddings
72
+ - Optimized for semantic similarity search
73
+ - Same model family used by the legacy processor for consistency
74
+
75
+ ### Error handling
76
+ - Event not found → logged and skipped
77
+ - Empty message → logged and skipped
78
+ - Sanitization failure → logged and removed from queue
79
+ - Embedding failure → logged and removed from queue
80
+ - Failures are removed from the queue to avoid infinite retries
81
+
82
+ ## Testing
83
+
84
+ ### Unit tests
85
+ ```bash
86
+ PYTHONPATH=. uv run pytest argusAI
87
+ ```
88
+
89
+ Covers initialization, single/batch processing, error handling, and shutdown behavior.
90
+
91
+ ### Integration tests
92
+ ```bash
93
+ uv run pytest argus/backend/tests/sct_events/test_event_embedding_integration.py -v
94
+ ```
95
+
96
+ Covers the end‑to‑end flow from event creation to storage, proper routing to severity tables, verifying that non‑ERROR/CRITICAL events don’t create queue entries, multi‑event processing, and error recovery.
97
+
98
+ ## Monitoring & Metrics
99
+
100
+ Logging:
101
+ - INFO: processing cycles, batch counts, startup/shutdown, table routing
102
+ - DEBUG: per‑event processing, chosen table names
103
+ - WARNING: missing events, empty messages
104
+ - ERROR: processing/database failures
105
+
106
+ Metrics:
107
+ - `processed_count`: total successfully processed events
108
+ - `error_count`: total errors encountered
109
+
110
+ ## Differences from V1
111
+
112
+ Improvements in V2:
113
+ 1. Cleaner architecture: no Vector DB dependency for processing
114
+ 2. Better error handling: failures don’t block processing
115
+ 3. Simpler flow: queue → process → store
116
+ 4. Severity‑specific tables for similarity performance
117
+ 5. Comprehensive unit and integration tests
118
+
119
+ What’s not included in V2:
120
+ - Similarity search (removed from the processor itself)
121
+ - ChromaDB collections (not required for embedding storage)
122
+ - Historical event backfill (processes only new events)
123
+
124
+ ## Performance Benefits
125
+
126
+ By separating ERROR and CRITICAL embeddings:
127
+ - Faster similarity searches (smaller, severity‑scoped sets)
128
+ - Better data locality
129
+ - Reduced query complexity (no severity filters inside similarity search)
130
+ - Improved scalability (per‑table tuning)
131
+
132
+ ## Configuration
133
+
134
+ No dedicated config file is required for the processor itself. It uses the standard Argus configuration for database connectivity (e.g., ScyllaDB settings from your environment or YAML config such as `argus.yaml`/`argus.local.yaml`, depending on your deployment). The embedding model is auto‑downloaded to `~/.cache/chroma/onnx_models/`.
135
+
136
+ ## Co‑existence with V1 (temporary)
137
+
138
+ - For now, both V1 (`event_similarity_processor.py`) and V2 (`event_similarity_processor_v2.py`) may run in parallel.
139
+ - There is no data migration at this time; V1 will be disabled once the team fully moves to V2.
140
+ - If you still need to run V1 locally for comparison or fallback:
141
+ ```bash
142
+ cd argusAI
143
+ PYTHONPATH=.. uv run event_similarity_processor.py
144
+ ```
145
+
146
+ ## Notes
147
+
148
+ - Avoid mixing severities in similarity queries; use the dedicated tables for the best performance.
149
+ - If you encounter repeated failures for the same event, verify the event content after sanitization and check connectivity to the database and model files.
@@ -0,0 +1,237 @@
1
+ """
2
+ Event Similarity Processor V2
3
+
4
+ This module processes SCT events by:
5
+ 1. Reading unprocessed events from SCTUnprocessedEvent table
6
+ 2. Sanitizing event messages
7
+ 3. Generating embeddings using BGE-Small-EN model
8
+ 4. Storing embeddings in separate tables (sct_error_event_embedding or sct_critical_event_embedding)
9
+ 5. Removing processed events from unprocessed queue
10
+ """
11
+
12
+ import logging
13
+ import time
14
+ from pathlib import Path
15
+ from threading import Event
16
+ from uuid import UUID
17
+ from datetime import datetime
18
+
19
+ from chromadb.utils.embedding_functions.onnx_mini_lm_l6_v2 import ONNXMiniLM_L6_V2
20
+
21
+ from argus.backend.models.argus_ai import SCTCriticalEventEmbedding, SCTErrorEventEmbedding
22
+ from argus.backend.plugins.sct.testrun import SCTUnprocessedEvent, SCTEvent
23
+ from argus.backend.util.logsetup import setup_application_logging
24
+ from argusAI.utils.scylla_connection import ScyllaConnection
25
+ from argusAI.utils.event_message_sanitizer import MessageSanitizer
26
+
27
+ LOGGER = logging.getLogger(__name__)
28
+ SLEEP_INTERVAL = 1 # Sleep for 1 second between processing cycles
29
+
30
+
31
+ class BgeSmallEnEmbeddingModel(ONNXMiniLM_L6_V2):
32
+ """
33
+ Compact English text embedding model by BAAI, released Sep 2023.
34
+ Trained on large-scale paired data with RetroMAE and contrastive learning.
35
+ Produces high-quality 384-dim embeddings, optimized for efficiency in semantic search, classification, and clustering.
36
+ """
37
+
38
+ MODEL_NAME: str = "bge-small-en-v1.5"
39
+ DOWNLOAD_PATH: Path = Path.home() / ".cache" / "chroma" / "onnx_models" / MODEL_NAME
40
+ EXTRACTED_FOLDER_NAME: str = "onnx"
41
+ ARCHIVE_FILENAME: str = "onnx.tar.gz"
42
+ MODEL_DOWNLOAD_URL: str = (
43
+ "https://scylla-qa-public.s3.us-east-1.amazonaws.com/ArgusAI/bge-small-en-v1.5/onnx.tar.gz"
44
+ )
45
+ _MODEL_SHA256: str = "e7d1743b0c08f55c687cff6af696683398682f9ab4fb3cad1be644ee5553a72d"
46
+
47
+
48
+ class EventSimilarityProcessorV2:
49
+ """
50
+ Processes unprocessed SCT events by generating embeddings and storing them in severity-specific tables.
51
+ """
52
+
53
+ def __init__(self, stop_event: Event | None = None) -> None:
54
+ """
55
+ Initialize the processor with embedding model and sanitizer.
56
+
57
+ Args:
58
+ stop_event: Optional threading.Event to signal shutdown
59
+ """
60
+ self.embedding_model = BgeSmallEnEmbeddingModel()
61
+ self.sanitizer = MessageSanitizer()
62
+ self.stop_event = stop_event or Event()
63
+ self.db = ScyllaConnection()
64
+ self.processed_count = 0
65
+ self.error_count = 0
66
+ LOGGER.info("EventSimilarityProcessorV2 initialized")
67
+
68
+ def process_unprocessed_events(self) -> None:
69
+ """
70
+ Main processing loop that continuously reads and processes unprocessed events.
71
+ """
72
+ LOGGER.info("Starting event processing loop")
73
+
74
+ while not self.stop_event.is_set():
75
+ try:
76
+ batch_processed = self._process_batch()
77
+ if batch_processed == 0:
78
+ # No events to process, sleep before next iteration
79
+ time.sleep(SLEEP_INTERVAL)
80
+ else:
81
+ LOGGER.info(f"Processed {batch_processed} events in this batch")
82
+ except Exception as e:
83
+ LOGGER.error(f"Error in processing loop: {e}", exc_info=True)
84
+ self.error_count += 1
85
+ time.sleep(SLEEP_INTERVAL)
86
+
87
+ LOGGER.info(f"Processing loop stopped. Total processed: {self.processed_count}, Errors: {self.error_count}")
88
+
89
+ def _process_batch(self, batch_size: int = 100) -> int:
90
+ """
91
+ Process a batch of unprocessed events.
92
+
93
+ Args:
94
+ batch_size: Maximum number of events to process in one batch
95
+
96
+ Returns:
97
+ Number of events processed in this batch
98
+ """
99
+ # Fetch unprocessed events using raw query
100
+ query = f"SELECT run_id, severity, ts FROM {SCTUnprocessedEvent.__table_name__} LIMIT {batch_size}"
101
+ try:
102
+ rows = self.db.execute(query)
103
+ unprocessed_events = list(rows)
104
+ except Exception as e:
105
+ LOGGER.error(f"Failed to fetch unprocessed events: {e}", exc_info=True)
106
+ return 0
107
+
108
+ if not unprocessed_events:
109
+ return 0
110
+
111
+ processed_in_batch = 0
112
+
113
+ for event_row in unprocessed_events:
114
+ try:
115
+ self._process_single_event(run_id=event_row.run_id, severity=event_row.severity, ts=event_row.ts)
116
+ processed_in_batch += 1
117
+ self.processed_count += 1
118
+ except Exception as e:
119
+ LOGGER.error(
120
+ f"Failed to process event (run_id={event_row.run_id}, "
121
+ f"severity={event_row.severity}, ts={event_row.ts}): {e}",
122
+ exc_info=True,
123
+ )
124
+ self.error_count += 1
125
+ # Still delete the unprocessed event to avoid infinite retries
126
+ delete_query = (
127
+ f"DELETE FROM {SCTUnprocessedEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
128
+ )
129
+ self.db.execute(delete_query, (event_row.run_id, event_row.severity, event_row.ts))
130
+
131
+ return processed_in_batch
132
+
133
+ def _process_single_event(self, run_id: UUID, severity: str, ts: datetime) -> None:
134
+ """
135
+ Process a single event: read, sanitize, embed, store, and cleanup.
136
+
137
+ Args:
138
+ run_id: Test run UUID
139
+ severity: Event severity (ERROR or CRITICAL)
140
+ ts: Event timestamp
141
+
142
+ Raises:
143
+ Exception: If event not found or embedding generation fails
144
+ """
145
+ LOGGER.debug(f"Processing event: run_id={run_id}, severity={severity}, ts={ts}")
146
+
147
+ # Step 1: Read event message from SCTEvent table
148
+ try:
149
+ query = f"SELECT message FROM {SCTEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
150
+ result = self.db.execute(query, (run_id, severity, ts))
151
+ event = result.one()
152
+ if not event:
153
+ raise ValueError("Event not found")
154
+ except Exception:
155
+ LOGGER.warning(f"Event not found in SCTEvent table: run_id={run_id}, severity={severity}, ts={ts}")
156
+ raise
157
+
158
+ message = event.message
159
+ if not message:
160
+ LOGGER.warning(f"Event has no message: run_id={run_id}, severity={severity}, ts={ts}")
161
+ raise ValueError("Event message is empty")
162
+
163
+ # Step 2: Sanitize event message
164
+ try:
165
+ sanitized_message = self.sanitizer.sanitize(run_id, message)
166
+ except Exception as e:
167
+ LOGGER.error(f"Failed to sanitize message for event (run_id={run_id}): {e}", exc_info=True)
168
+ raise
169
+
170
+ if not sanitized_message or not sanitized_message.strip():
171
+ LOGGER.warning(f"Sanitized message is empty for event: run_id={run_id}, severity={severity}, ts={ts}")
172
+ raise ValueError("Sanitized message is empty")
173
+
174
+ # Step 3: Generate embedding
175
+ try:
176
+ embeddings = self.embedding_model([sanitized_message])
177
+ if not embeddings or len(embeddings) == 0:
178
+ raise ValueError("Embedding generation returned empty result")
179
+ embedding = embeddings[0]
180
+ except Exception as e:
181
+ LOGGER.error(f"Failed to generate embedding for event (run_id={run_id}): {e}", exc_info=True)
182
+ raise
183
+
184
+ # Step 4: Store embedding in severity-specific table
185
+ try:
186
+ if severity == "ERROR":
187
+ table_name = SCTErrorEventEmbedding.__table_name__
188
+ elif severity == "CRITICAL":
189
+ table_name = SCTCriticalEventEmbedding.__table_name__
190
+ else:
191
+ raise ValueError(f"Unsupported severity: {severity}")
192
+
193
+ insert_query = f"INSERT INTO {table_name} (run_id, ts, embedding) VALUES (?, ?, ?)"
194
+ self.db.execute(insert_query, (run_id, ts, embedding))
195
+ LOGGER.debug(f"Stored embedding in {table_name} for event: run_id={run_id}, ts={ts}")
196
+ except Exception as e:
197
+ LOGGER.error(f"Failed to store embedding for event (run_id={run_id}): {e}", exc_info=True)
198
+ raise
199
+
200
+ # Step 5: Remove entry from unprocessed_events table
201
+ try:
202
+ delete_query = (
203
+ f"DELETE FROM {SCTUnprocessedEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
204
+ )
205
+ self.db.execute(delete_query, (run_id, severity, ts))
206
+ LOGGER.debug(f"Removed unprocessed event: run_id={run_id}, severity={severity}, ts={ts}")
207
+ except Exception as e:
208
+ LOGGER.error(f"Failed to delete unprocessed event (run_id={run_id}): {e}", exc_info=True)
209
+ raise
210
+
211
+ def shutdown(self) -> None:
212
+ """Shutdown the processor and cleanup resources."""
213
+ self.stop_event.set()
214
+ self.db.shutdown()
215
+ LOGGER.info("EventSimilarityProcessorV2 shutdown complete")
216
+
217
+
218
+ def main():
219
+ """Main entry point for the event similarity processor."""
220
+ setup_application_logging(log_level=logging.INFO)
221
+
222
+ LOGGER.info("Starting Event Similarity Processor V2...")
223
+
224
+ stop_event = Event()
225
+ processor = EventSimilarityProcessorV2(stop_event=stop_event)
226
+
227
+ try:
228
+ processor.process_unprocessed_events()
229
+ except KeyboardInterrupt:
230
+ LOGGER.info("Received keyboard interrupt, shutting down...")
231
+ finally:
232
+ processor.shutdown()
233
+ LOGGER.info("Event Similarity Processor V2 stopped")
234
+
235
+
236
+ if __name__ == "__main__":
237
+ main()
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import re
2
3
  from datetime import datetime
3
4
 
@@ -107,6 +108,7 @@ class MessageSanitizer:
107
108
  self.remove_special_chars,
108
109
  self.normalize_whitespace,
109
110
  ]
111
+ os.makedirs("logs", exist_ok=True)
110
112
  self.sanitized_messages_fp = open(
111
113
  "logs/sanitized_messages_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".log", "w"
112
114
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-alm
3
- Version: 0.15.10
3
+ Version: 0.15.12
4
4
  Summary: Argus
5
5
  Author-email: Alexey Kartashov <alexey.kartashov@scylladb.com>, Łukasz Sójka <lukasz.sojka@scylladb.com>
6
6
  License-Expression: Apache-2.0
@@ -11,13 +11,15 @@ Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: requests>=2.26.0
13
13
  Requires-Dist: click>=8.1.3
14
+ Requires-Dist: lz4>=4.4.4
14
15
  Provides-Extra: web-backend
15
16
  Requires-Dist: PyYAML~=6.0.0; extra == "web-backend"
16
- Requires-Dist: scylla-driver>=3.26.8; extra == "web-backend"
17
+ Requires-Dist: scylla-driver>=3.29.4; extra == "web-backend"
17
18
  Requires-Dist: Flask~=3.0.0; extra == "web-backend"
18
19
  Requires-Dist: Flask-WTF~=1.0.0; extra == "web-backend"
19
20
  Requires-Dist: Flask-Login~=0.5.0; extra == "web-backend"
20
21
  Requires-Dist: humanize~=3.13.1; extra == "web-backend"
22
+ Requires-Dist: PyJWT[crypto]>=2.10.0; extra == "web-backend"
21
23
  Requires-Dist: python-magic~=0.4.24; extra == "web-backend"
22
24
  Requires-Dist: uwsgi~=2.0.20; extra == "web-backend"
23
25
  Requires-Dist: python-jenkins>=1.7.0; extra == "web-backend"
@@ -43,6 +45,8 @@ Requires-Dist: nox~=2025.5.1; extra == "dev"
43
45
  Requires-Dist: pytest-xdist~=3.7.0; extra == "dev"
44
46
  Requires-Dist: pytest-subtests~=0.14.1; extra == "dev"
45
47
  Requires-Dist: boto3-stubs~=1.38.9; extra == "dev"
48
+ Provides-Extra: ai
49
+ Requires-Dist: chromadb>=1.0.15; extra == "ai"
46
50
  Dynamic: license-file
47
51
 
48
52
  # Argus