@oneuptime/common 12.0.12 → 12.0.14

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 (596) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  4. package/Models/DatabaseModels/StatusPage.ts +59 -0
  5. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  6. package/Models/DatabaseModels/UserCall.ts +94 -3
  7. package/Models/DatabaseModels/UserEmail.ts +94 -3
  8. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  9. package/Models/DatabaseModels/UserPush.ts +37 -0
  10. package/Models/DatabaseModels/UserSMS.ts +94 -3
  11. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  12. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  13. package/Server/API/AIChatAPI.ts +55 -56
  14. package/Server/API/BaseAPI.ts +79 -14
  15. package/Server/API/CommonAPI.ts +89 -0
  16. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  17. package/Server/API/SlackAPI.ts +13 -10
  18. package/Server/API/StatusPageAPI.ts +2197 -2128
  19. package/Server/API/TelemetryAPI.ts +72 -3
  20. package/Server/API/UserCallAPI.ts +53 -45
  21. package/Server/API/UserEmailAPI.ts +53 -44
  22. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  23. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  24. package/Server/API/UserPushAPI.ts +126 -2
  25. package/Server/API/UserSmsAPI.ts +53 -44
  26. package/Server/API/UserWhatsAppAPI.ts +53 -50
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  33. package/Server/Middleware/UserAuthorization.ts +11 -2
  34. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  36. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  37. package/Server/Services/DatabaseService.ts +118 -6
  38. package/Server/Services/LogAggregationService.ts +39 -0
  39. package/Server/Services/LogService.ts +21 -0
  40. package/Server/Services/NetworkSiteService.ts +12 -0
  41. package/Server/Services/PushNotificationService.ts +127 -12
  42. package/Server/Services/SpanService.ts +21 -0
  43. package/Server/Services/TeamMemberService.ts +53 -13
  44. package/Server/Services/TraceAggregationService.ts +15 -0
  45. package/Server/Services/UserCallService.ts +55 -24
  46. package/Server/Services/UserEmailService.ts +83 -17
  47. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  48. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  49. package/Server/Services/UserNotificationRuleService.ts +26 -0
  50. package/Server/Services/UserPushService.ts +89 -0
  51. package/Server/Services/UserSmsService.ts +50 -17
  52. package/Server/Services/UserWhatsAppService.ts +48 -15
  53. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  54. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  55. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  56. package/Server/Types/Database/QueryHelper.ts +30 -0
  57. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  58. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  59. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  60. package/Server/Utils/ChannelVerification.ts +510 -0
  61. package/Server/Utils/LogRedaction.ts +576 -0
  62. package/Server/Utils/Logger.ts +123 -46
  63. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  64. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  65. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  66. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  67. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  68. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  69. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  70. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  71. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  72. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  73. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  74. package/Server/Utils/StartServer.ts +30 -9
  75. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  76. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  77. package/Server/Utils/TotpAuth.ts +137 -9
  78. package/Server/Utils/UserRegistrationToken.ts +182 -0
  79. package/Server/Utils/VerificationCode.ts +134 -0
  80. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  81. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  82. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  83. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  84. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  85. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  86. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
  87. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  88. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  89. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  90. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  91. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  92. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  93. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  94. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  95. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  96. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  97. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  98. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  99. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  100. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  101. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  102. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  103. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  104. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  105. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  106. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  107. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  108. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  109. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  110. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  111. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
  112. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  113. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  114. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  115. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  116. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  117. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  118. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  119. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  120. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  121. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  122. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  123. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  124. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  125. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  126. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  127. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  128. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  129. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  130. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  131. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  132. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  133. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  134. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  135. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  136. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  137. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  138. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  139. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  140. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  141. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  142. package/Tests/Server/Utils/Browser.test.ts +162 -0
  143. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  144. package/Tests/Server/Utils/Express.test.ts +371 -0
  145. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  146. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  152. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  153. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  154. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  155. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  156. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  157. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  158. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  159. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  160. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  163. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  164. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  165. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  166. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  167. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  168. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  169. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  170. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  171. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  172. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  173. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  174. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  175. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  176. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  177. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  178. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  179. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  180. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  181. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  182. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  183. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  184. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  185. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  186. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  187. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  188. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  189. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  190. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  191. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  192. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  193. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  194. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  195. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  196. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  197. package/Tests/UI/Components/Button.test.tsx +175 -1
  198. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  199. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  200. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  201. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  202. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  203. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  204. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  205. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  206. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  207. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  208. package/Tests/UI/Components/List.test.tsx +9 -2
  209. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  210. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  211. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  212. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  213. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  214. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  215. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  216. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  217. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  218. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  219. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  220. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  221. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  222. package/Tests/UI/Components/Toast.test.tsx +130 -7
  223. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  224. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  225. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  226. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  227. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  228. package/Tests/Utils/API.test.ts +16 -2
  229. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  230. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  231. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  232. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  233. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  234. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  235. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  236. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  237. package/Types/API/Hostname.ts +79 -0
  238. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  239. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  240. package/Types/Database/DatabaseProperty.ts +38 -0
  241. package/Types/Database/TableColumn.ts +34 -7
  242. package/Types/Email/EmailTemplateType.ts +1 -0
  243. package/Types/Events/Recurring.ts +16 -1
  244. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  245. package/Types/Monitor/MonitorStep.ts +13 -1
  246. package/Types/Monitor/MonitorType.ts +345 -40
  247. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  248. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  249. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  250. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  251. package/Types/Permission.ts +35 -0
  252. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  253. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  254. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  255. package/Types/Service/ServiceLanguage.ts +144 -0
  256. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  257. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  258. package/Types/Text.ts +111 -19
  259. package/UI/Components/Button/Button.tsx +27 -14
  260. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  261. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  262. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  263. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  264. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  265. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  266. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  267. package/UI/Components/CommandPalette/Types.ts +49 -0
  268. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  269. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  270. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  271. package/UI/Components/Feed/FeedItem.tsx +1 -1
  272. package/UI/Components/Footer/Footer.tsx +32 -6
  273. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  274. package/UI/Components/Forms/Types/Field.ts +8 -0
  275. package/UI/Components/List/List.tsx +37 -5
  276. package/UI/Components/List/ListSkeleton.tsx +54 -0
  277. package/UI/Components/Loader/PageLoader.tsx +29 -8
  278. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  279. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
  280. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  281. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  282. package/UI/Components/Modal/Modal.tsx +2 -2
  283. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  284. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  285. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  286. package/UI/Components/Navbar/NavBar.tsx +14 -1
  287. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  288. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  289. package/UI/Components/SideOver/SideOver.tsx +37 -2
  290. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  291. package/UI/Components/Table/Table.tsx +74 -44
  292. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  293. package/UI/Components/Tabs/Tab.tsx +1 -1
  294. package/UI/Components/Toast/Toast.tsx +118 -53
  295. package/UI/Components/Toast/ToastInit.tsx +82 -32
  296. package/UI/Styles/Theme.css +40 -0
  297. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  298. package/UI/Utils/ModelListCache.ts +188 -0
  299. package/UI/Utils/Project.ts +29 -0
  300. package/Utils/API.ts +6 -1
  301. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  302. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  303. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  304. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  305. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  307. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  309. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  311. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  313. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  315. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  317. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  319. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  321. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  323. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  325. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  327. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  328. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  329. package/build/dist/Server/API/AIChatAPI.js +48 -35
  330. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  331. package/build/dist/Server/API/BaseAPI.js +69 -13
  332. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  333. package/build/dist/Server/API/CommonAPI.js +59 -0
  334. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  335. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  336. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  337. package/build/dist/Server/API/SlackAPI.js +13 -10
  338. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  339. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  340. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/API/UserCallAPI.js +42 -38
  344. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  345. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  346. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  347. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  348. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  349. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  350. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  351. package/build/dist/Server/API/UserPushAPI.js +95 -2
  352. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  353. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  354. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  355. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  356. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  358. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  359. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  360. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  361. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  362. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  363. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  364. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  365. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  366. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  369. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  370. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  371. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  372. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  373. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  374. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  375. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  376. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  377. package/build/dist/Server/Services/DatabaseService.js +89 -6
  378. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  379. package/build/dist/Server/Services/LogAggregationService.js +7 -0
  380. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/LogService.js +16 -0
  382. package/build/dist/Server/Services/LogService.js.map +1 -1
  383. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  384. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  385. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  386. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  387. package/build/dist/Server/Services/SpanService.js +16 -0
  388. package/build/dist/Server/Services/SpanService.js.map +1 -1
  389. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  390. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  391. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  392. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  393. package/build/dist/Server/Services/UserCallService.js +54 -22
  394. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  395. package/build/dist/Server/Services/UserEmailService.js +78 -17
  396. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  397. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  398. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  399. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  400. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  401. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  402. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  403. package/build/dist/Server/Services/UserPushService.js +77 -0
  404. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  405. package/build/dist/Server/Services/UserSmsService.js +50 -17
  406. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  407. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  408. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  409. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  410. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  411. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  412. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  413. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  414. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  415. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  416. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  417. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  418. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  419. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  420. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  421. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  422. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  423. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  424. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  425. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  426. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  427. package/build/dist/Server/Utils/Logger.js +98 -45
  428. package/build/dist/Server/Utils/Logger.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  430. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  432. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  434. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  437. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  438. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  439. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  440. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  441. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  442. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  443. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  445. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  446. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  447. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  448. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  449. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  450. package/build/dist/Server/Utils/StartServer.js +10 -7
  451. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  452. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  453. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  454. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  455. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  456. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  457. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  458. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  459. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  460. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  461. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  462. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  463. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  464. package/build/dist/Types/API/Hostname.js +63 -0
  465. package/build/dist/Types/API/Hostname.js.map +1 -1
  466. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  467. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  468. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  469. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  470. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  471. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  472. package/build/dist/Types/Database/TableColumn.js +24 -6
  473. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  474. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  475. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  476. package/build/dist/Types/Events/Recurring.js +13 -1
  477. package/build/dist/Types/Events/Recurring.js.map +1 -1
  478. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  479. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  480. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  481. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  482. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  483. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  484. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  485. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  486. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  487. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  488. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  489. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  490. package/build/dist/Types/Permission.js +33 -0
  491. package/build/dist/Types/Permission.js.map +1 -1
  492. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  493. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  494. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  495. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  496. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  497. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  498. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  499. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  500. package/build/dist/Types/Text.js +82 -17
  501. package/build/dist/Types/Text.js.map +1 -1
  502. package/build/dist/UI/Components/Button/Button.js +22 -14
  503. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  504. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  505. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  506. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  507. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  508. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  509. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  510. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  511. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  512. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  513. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  514. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  515. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  516. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  517. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  518. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  519. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  520. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  521. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  522. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  523. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  524. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  525. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  526. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  527. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  528. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  529. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  531. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  532. package/build/dist/UI/Components/List/List.js +19 -5
  533. package/build/dist/UI/Components/List/List.js.map +1 -1
  534. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  535. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  536. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  537. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  539. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  540. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  541. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  542. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  543. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  544. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  545. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  546. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  547. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  548. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  549. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  550. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  551. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  552. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  553. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  554. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  555. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  556. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  558. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  562. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  563. package/build/dist/UI/Components/Table/Table.js +35 -24
  564. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  565. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  566. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  567. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  568. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  569. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  570. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  571. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  572. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  573. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  574. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  575. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  576. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  577. package/build/dist/UI/Utils/Project.js +24 -1
  578. package/build/dist/UI/Utils/Project.js.map +1 -1
  579. package/build/dist/Utils/API.js +6 -1
  580. package/build/dist/Utils/API.js.map +1 -1
  581. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  582. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  583. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  584. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  585. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  586. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  587. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  588. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  589. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  590. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  591. package/jest.config.json +1 -1
  592. package/package.json +2 -3
  593. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  594. package/Tests/__mocks__/otpauth.js +0 -30
  595. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  596. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -158,7 +158,9 @@ describe("SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet", () => {
158
158
  },
159
159
  );
160
160
 
161
- expect(result).toBe("SSL certificate is not valid.");
161
+ // The reason is appended so the root cause reaches whoever is paged.
162
+ expect(result).toContain("SSL certificate is not valid");
163
+ expect(result).toContain("self signed");
162
164
  });
163
165
 
164
166
  test("valid cert + False → not met", async () => {
@@ -196,7 +198,7 @@ describe("SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet", () => {
196
198
  },
197
199
  );
198
200
 
199
- expect(result).toBe("SSL certificate is not valid.");
201
+ expect(result).toContain("not reachable");
200
202
  });
201
203
  });
202
204
 
@@ -311,7 +313,8 @@ describe("SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet", () => {
311
313
  },
312
314
  );
313
315
 
314
- expect(result).toBe("SSL certificate is not valid.");
316
+ expect(result).toContain("SSL certificate is not valid");
317
+ expect(result).toContain("expired");
315
318
  });
316
319
 
317
320
  test("healthy cert + False → met", async () => {
@@ -343,7 +346,7 @@ describe("SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet", () => {
343
346
  },
344
347
  );
345
348
 
346
- expect(result).toBe("SSL certificate is not valid.");
349
+ expect(result).toContain("SSL certificate is not valid");
347
350
  });
348
351
  });
349
352
 
@@ -465,4 +468,371 @@ describe("SSLMonitorCriteria.isMonitorInstanceCriteriaFilterMet", () => {
465
468
 
466
469
  expect(result).toBeNull();
467
470
  });
471
+
472
+ /*
473
+ * Regression suite for https://github.com/OneUptime/oneuptime/issues/3225.
474
+ *
475
+ * The reported monitor pointed at a host with an invalid certificate and
476
+ * sat Operational forever. Two things made that possible:
477
+ *
478
+ * 1. IsValidCertificate and IsNotAValidCertificate were computed
479
+ * independently, so BOTH came out false whenever expiresAt was
480
+ * missing or unparseable. No criterion matched, and a monitor already
481
+ * at its default status writes no timeline entry when nothing
482
+ * matches - so the check left no trace at all.
483
+ *
484
+ * 2. The verdict was inferred from !isSelfSigned, and the probe labelled
485
+ * every validation failure "self signed". A certificate that failed
486
+ * for any other reason could not be described.
487
+ */
488
+ describe("certificate validity (issue #3225)", () => {
489
+ const failureModes: Array<{ name: string; response: SslMonitorResponse }> =
490
+ [
491
+ {
492
+ name: "self-signed",
493
+ response: {
494
+ isValidCertificate: false,
495
+ isSelfSigned: true,
496
+ certificateValidationErrorCode: "DEPTH_ZERO_SELF_SIGNED_CERT",
497
+ certificateValidationError: "self signed certificate",
498
+ expiresAt: dateFromNow({ days: 100 }),
499
+ },
500
+ },
501
+ {
502
+ name: "hostname mismatch",
503
+ response: {
504
+ isValidCertificate: false,
505
+ isSelfSigned: false,
506
+ certificateValidationErrorCode: "ERR_TLS_CERT_ALTNAME_INVALID",
507
+ certificateValidationError: "Hostname/IP does not match",
508
+ expiresAt: dateFromNow({ days: 100 }),
509
+ },
510
+ },
511
+ {
512
+ name: "untrusted CA",
513
+ response: {
514
+ isValidCertificate: false,
515
+ isSelfSigned: false,
516
+ certificateValidationErrorCode: "SELF_SIGNED_CERT_IN_CHAIN",
517
+ certificateValidationError: "self signed certificate in chain",
518
+ expiresAt: dateFromNow({ days: 100 }),
519
+ },
520
+ },
521
+ {
522
+ name: "expired",
523
+ response: {
524
+ isValidCertificate: false,
525
+ isSelfSigned: false,
526
+ certificateValidationErrorCode: "CERT_HAS_EXPIRED",
527
+ certificateValidationError: "certificate has expired",
528
+ expiresAt: dateFromNow({ days: -5 }),
529
+ },
530
+ },
531
+ {
532
+ name: "incomplete chain",
533
+ response: {
534
+ isValidCertificate: false,
535
+ isSelfSigned: false,
536
+ certificateValidationErrorCode: "UNABLE_TO_VERIFY_LEAF_SIGNATURE",
537
+ certificateValidationError:
538
+ "unable to verify the first certificate",
539
+ expiresAt: dateFromNow({ days: 100 }),
540
+ },
541
+ },
542
+ ];
543
+
544
+ test.each(failureModes)(
545
+ "$name: IsNotAValidCertificate + True → met",
546
+ async ({ response }: { response: SslMonitorResponse }) => {
547
+ const result: string | null = await evaluate(
548
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
549
+ {
550
+ checkOn: CheckOn.IsNotAValidCertificate,
551
+ filterType: FilterType.True,
552
+ value: undefined,
553
+ },
554
+ );
555
+
556
+ expect(result).toBeTruthy();
557
+ },
558
+ );
559
+
560
+ test.each(failureModes)(
561
+ "$name: IsValidCertificate + True → not met",
562
+ async ({ response }: { response: SslMonitorResponse }) => {
563
+ const result: string | null = await evaluate(
564
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
565
+ {
566
+ checkOn: CheckOn.IsValidCertificate,
567
+ filterType: FilterType.True,
568
+ value: undefined,
569
+ },
570
+ );
571
+
572
+ expect(result).toBeNull();
573
+ },
574
+ );
575
+
576
+ test.each(failureModes)(
577
+ "$name: IsValidCertificate + False → met",
578
+ async ({ response }: { response: SslMonitorResponse }) => {
579
+ const result: string | null = await evaluate(
580
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
581
+ {
582
+ checkOn: CheckOn.IsValidCertificate,
583
+ filterType: FilterType.False,
584
+ value: undefined,
585
+ },
586
+ );
587
+
588
+ expect(result).toBeTruthy();
589
+ },
590
+ );
591
+
592
+ test("the two predicates are exact complements, even with no expiry", async () => {
593
+ /*
594
+ * The silent-healthy case: a certificate the probe could not fully
595
+ * read. Before the fix BOTH of these returned null and the monitor
596
+ * recorded nothing.
597
+ */
598
+ const response: SslMonitorResponse = {
599
+ isValidCertificate: false,
600
+ isSelfSigned: false,
601
+ certificateValidationErrorCode: "UNABLE_TO_GET_ISSUER_CERT",
602
+ certificateValidationError: "unable to get issuer certificate",
603
+ // deliberately no expiresAt
604
+ };
605
+
606
+ const isValid: string | null = await evaluate(
607
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
608
+ {
609
+ checkOn: CheckOn.IsValidCertificate,
610
+ filterType: FilterType.True,
611
+ value: undefined,
612
+ },
613
+ );
614
+
615
+ const isNotValid: string | null = await evaluate(
616
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
617
+ {
618
+ checkOn: CheckOn.IsNotAValidCertificate,
619
+ filterType: FilterType.True,
620
+ value: undefined,
621
+ },
622
+ );
623
+
624
+ expect(isValid).toBeNull();
625
+ expect(isNotValid).toBeTruthy();
626
+ });
627
+
628
+ test("a valid certificate satisfies IsValidCertificate and not its negation", async () => {
629
+ const response: SslMonitorResponse = {
630
+ isValidCertificate: true,
631
+ isSelfSigned: false,
632
+ certificateValidationErrorCode: "",
633
+ certificateValidationError: "",
634
+ expiresAt: dateFromNow({ days: 90 }),
635
+ };
636
+
637
+ const isValid: string | null = await evaluate(
638
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
639
+ {
640
+ checkOn: CheckOn.IsValidCertificate,
641
+ filterType: FilterType.True,
642
+ value: undefined,
643
+ },
644
+ );
645
+
646
+ const isNotValid: string | null = await evaluate(
647
+ buildDataToProcess({ isOnline: true, sslResponse: response }),
648
+ {
649
+ checkOn: CheckOn.IsNotAValidCertificate,
650
+ filterType: FilterType.True,
651
+ value: undefined,
652
+ },
653
+ );
654
+
655
+ expect(isValid).toBeTruthy();
656
+ expect(isNotValid).toBeNull();
657
+ });
658
+
659
+ test("the reason names the underlying validation error", async () => {
660
+ const result: string | null = await evaluate(
661
+ buildDataToProcess({
662
+ isOnline: true,
663
+ sslResponse: {
664
+ isValidCertificate: false,
665
+ isSelfSigned: false,
666
+ certificateValidationErrorCode: "ERR_TLS_CERT_ALTNAME_INVALID",
667
+ certificateValidationError: "Hostname/IP does not match",
668
+ expiresAt: dateFromNow({ days: 100 }),
669
+ },
670
+ }),
671
+ {
672
+ checkOn: CheckOn.IsNotAValidCertificate,
673
+ filterType: FilterType.True,
674
+ value: undefined,
675
+ },
676
+ );
677
+
678
+ // The root cause has to reach whoever gets paged.
679
+ expect(result).toContain("Hostname/IP does not match");
680
+ });
681
+
682
+ test("an unreachable endpoint is not a valid certificate", async () => {
683
+ const result: string | null = await evaluate(
684
+ buildDataToProcess({
685
+ isOnline: false,
686
+ sslResponse: { isValidCertificate: false },
687
+ }),
688
+ {
689
+ checkOn: CheckOn.IsNotAValidCertificate,
690
+ filterType: FilterType.True,
691
+ value: undefined,
692
+ },
693
+ );
694
+
695
+ expect(result).toBeTruthy();
696
+ });
697
+
698
+ test("only genuine self-signed responses satisfy IsSelfSignedCertificate", async () => {
699
+ const mismatch: string | null = await evaluate(
700
+ buildDataToProcess({
701
+ isOnline: true,
702
+ sslResponse: {
703
+ isValidCertificate: false,
704
+ isSelfSigned: false,
705
+ certificateValidationErrorCode: "ERR_TLS_CERT_ALTNAME_INVALID",
706
+ expiresAt: dateFromNow({ days: 100 }),
707
+ },
708
+ }),
709
+ {
710
+ checkOn: CheckOn.IsSelfSignedCertificate,
711
+ filterType: FilterType.True,
712
+ value: undefined,
713
+ },
714
+ );
715
+
716
+ /*
717
+ * Pre-fix the probe set isSelfSigned=true for a hostname mismatch, so
718
+ * this criterion fired on a certificate that was not self-signed at
719
+ * all.
720
+ */
721
+ expect(mismatch).toBeNull();
722
+ });
723
+ });
724
+
725
+ /*
726
+ * Payloads written by a probe running an older build carry no
727
+ * isValidCertificate field. They must keep evaluating exactly as before,
728
+ * or upgrading the server would flip healthy monitors to Down.
729
+ */
730
+ describe("legacy payloads without an explicit verdict", () => {
731
+ test("a healthy legacy response is still valid", async () => {
732
+ const result: string | null = await evaluate(
733
+ buildDataToProcess({
734
+ isOnline: true,
735
+ sslResponse: {
736
+ isSelfSigned: false,
737
+ expiresAt: dateFromNow({ days: 60 }),
738
+ },
739
+ }),
740
+ {
741
+ checkOn: CheckOn.IsValidCertificate,
742
+ filterType: FilterType.True,
743
+ value: undefined,
744
+ },
745
+ );
746
+
747
+ expect(result).toBeTruthy();
748
+ });
749
+
750
+ test("a legacy self-signed response is still not valid", async () => {
751
+ const result: string | null = await evaluate(
752
+ buildDataToProcess({
753
+ isOnline: true,
754
+ sslResponse: {
755
+ isSelfSigned: true,
756
+ expiresAt: dateFromNow({ days: 60 }),
757
+ },
758
+ }),
759
+ {
760
+ checkOn: CheckOn.IsNotAValidCertificate,
761
+ filterType: FilterType.True,
762
+ value: undefined,
763
+ },
764
+ );
765
+
766
+ expect(result).toBeTruthy();
767
+ });
768
+
769
+ test("a legacy expired response is still not valid", async () => {
770
+ const result: string | null = await evaluate(
771
+ buildDataToProcess({
772
+ isOnline: true,
773
+ sslResponse: {
774
+ isSelfSigned: false,
775
+ expiresAt: dateFromNow({ days: -1 }),
776
+ },
777
+ }),
778
+ {
779
+ checkOn: CheckOn.IsValidCertificate,
780
+ filterType: FilterType.True,
781
+ value: undefined,
782
+ },
783
+ );
784
+
785
+ expect(result).toBeNull();
786
+ });
787
+ });
788
+
789
+ /*
790
+ * The probe serialises Dates to ISO strings over the wire, so by the time
791
+ * criteria run, expiresAt is a string rather than a Date. Expiry maths
792
+ * must behave identically either way.
793
+ */
794
+ describe("expiresAt arriving as an ISO string", () => {
795
+ test("a future expiry read from a string is still valid", async () => {
796
+ const result: string | null = await evaluate(
797
+ buildDataToProcess({
798
+ isOnline: true,
799
+ sslResponse: {
800
+ isValidCertificate: true,
801
+ isSelfSigned: false,
802
+ expiresAt: dateFromNow({
803
+ days: 30,
804
+ }).toISOString() as unknown as Date,
805
+ },
806
+ }),
807
+ {
808
+ checkOn: CheckOn.IsValidCertificate,
809
+ filterType: FilterType.True,
810
+ value: undefined,
811
+ },
812
+ );
813
+
814
+ expect(result).toBeTruthy();
815
+ });
816
+
817
+ test("ExpiresInDays compares correctly against a string expiry", async () => {
818
+ const result: string | null = await evaluate(
819
+ buildDataToProcess({
820
+ isOnline: true,
821
+ sslResponse: {
822
+ isValidCertificate: true,
823
+ expiresAt: dateFromNow({
824
+ days: 10,
825
+ }).toISOString() as unknown as Date,
826
+ },
827
+ }),
828
+ {
829
+ checkOn: CheckOn.ExpiresInDays,
830
+ filterType: FilterType.LessThan,
831
+ value: 30,
832
+ },
833
+ );
834
+
835
+ expect(result).toBeTruthy();
836
+ });
837
+ });
468
838
  });
@@ -26,7 +26,8 @@ import ProxmoxClusterService from "../../../../Server/Services/ProxmoxClusterSer
26
26
  import ServiceService from "../../../../Server/Services/ServiceService";
27
27
  import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
28
28
  import MonitorAlert from "../../../../Server/Utils/Monitor/MonitorAlert";
29
- import MonitorClusterContextUtil from "../../../../Server/Utils/Monitor/MonitorClusterContext";
29
+ import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
30
+ import { SeriesResolvedResourceIds } from "../../../../Server/Utils/Monitor/SeriesResourceLinker";
30
31
  import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
31
32
  import Dictionary from "../../../../Types/Dictionary";
32
33
  import { JSONObject } from "../../../../Types/JSON";
@@ -133,6 +134,25 @@ function idsOn(
133
134
  });
134
135
  }
135
136
 
137
+ /*
138
+ * The nine-relation shape MonitorResourceContext resolves from the
139
+ * monitor's own step config. Tests stub the util and hand back one of
140
+ * these, spreading over it to name only the relations under test.
141
+ */
142
+ function emptyResourceContext(): SeriesResolvedResourceIds {
143
+ return {
144
+ hostIds: [],
145
+ dockerHostIds: [],
146
+ podmanHostIds: [],
147
+ kubernetesClusterIds: [],
148
+ serviceIds: [],
149
+ proxmoxClusterIds: [],
150
+ cephClusterIds: [],
151
+ dockerSwarmClusterIds: [],
152
+ iotFleetIds: [],
153
+ };
154
+ }
155
+
136
156
  describe("Alerts link the resources their series identifies", () => {
137
157
  let createdAlerts: Array<Alert> = [];
138
158
  let createdIncidents: Array<Incident> = [];
@@ -151,12 +171,7 @@ describe("Alerts link the resources their series identifies", () => {
151
171
  let dockerSwarmClusterRows: Array<{ _id: string }> = [];
152
172
  let iotFleetRows: Array<{ _id: string }> = [];
153
173
 
154
- let clusterContext: {
155
- proxmoxClusterIds: Array<string>;
156
- cephClusterIds: Array<string>;
157
- dockerSwarmClusterIds: Array<string>;
158
- iotFleetIds: Array<string>;
159
- };
174
+ let resourceContext: SeriesResolvedResourceIds;
160
175
 
161
176
  beforeEach(() => {
162
177
  createdAlerts = [];
@@ -172,12 +187,7 @@ describe("Alerts link the resources their series identifies", () => {
172
187
  dockerSwarmClusterRows = [];
173
188
  iotFleetRows = [];
174
189
 
175
- clusterContext = {
176
- proxmoxClusterIds: [],
177
- cephClusterIds: [],
178
- dockerSwarmClusterIds: [],
179
- iotFleetIds: [],
180
- };
190
+ resourceContext = emptyResourceContext();
181
191
 
182
192
  // No alert / incident is already open for this monitor.
183
193
  jest.spyOn(AlertService, "findBy").mockResolvedValue([]);
@@ -188,9 +198,9 @@ describe("Alerts link the resources their series identifies", () => {
188
198
  .mockResolvedValue(true);
189
199
 
190
200
  jest
191
- .spyOn(MonitorClusterContextUtil, "resolveClusterContextForMonitor")
201
+ .spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
192
202
  .mockImplementation(async () => {
193
- return clusterContext;
203
+ return resourceContext;
194
204
  });
195
205
 
196
206
  jest
@@ -396,10 +406,13 @@ describe("Alerts link the resources their series identifies", () => {
396
406
  expect(idsOn(createdAlerts[1]!.hosts)).toEqual(["host-7"]);
397
407
  });
398
408
 
399
- it("links nothing, and still opens the alert, for an ungrouped monitor", async () => {
409
+ it("links nothing from LABELS, and still opens the alert, for an ungrouped monitor", async () => {
400
410
  /*
401
- * A whole-monitor alert has no series and therefore no resource
402
- * identity. It must not inherit one, and it must still be created.
411
+ * A whole-monitor alert has no series, so the LABEL path has nothing
412
+ * to work with. It must not invent an identity from another
413
+ * series, and it must still be created. (The step-config path can
414
+ * still name a resource here — that is the test above; this one
415
+ * pins that the label path alone contributes nothing.)
403
416
  */
404
417
  hostRows = [{ _id: "host-1" }];
405
418
 
@@ -417,6 +430,131 @@ describe("Alerts link the resources their series identifies", () => {
417
430
  expect(HostService.findBy).not.toHaveBeenCalled();
418
431
  });
419
432
 
433
+ it("links the service an ungrouped metric monitor is scoped to", async () => {
434
+ /*
435
+ * THE REPORTED BUG. ALT-144 came from a Metrics monitor whose only
436
+ * resource identity was the attribute filter
437
+ * `oneuptime.service.name = app-plan-starship-online-production`.
438
+ * It is ungrouped, so there are no series labels and the label path
439
+ * links nothing — the alert's "Affected Resources" card read "No
440
+ * resources affected" even though the monitor named the service.
441
+ *
442
+ * `matchesPerSeries` is deliberately omitted: that is what makes
443
+ * this the ungrouped path.
444
+ */
445
+ resourceContext = {
446
+ ...emptyResourceContext(),
447
+ serviceIds: ["service-1"],
448
+ };
449
+
450
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
451
+ criteriaInstance: criteriaInstance(),
452
+ monitor: monitor(),
453
+ dataToProcess: dataToProcess,
454
+ rootCause: "Memory is above 60%",
455
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: NO_AUTO_RESOLVE,
456
+ props: {},
457
+ });
458
+
459
+ expect(createdAlerts).toHaveLength(1);
460
+ expect(idsOn(createdAlerts[0]!.services)).toEqual(["service-1"]);
461
+ });
462
+
463
+ it("links the host an ungrouped host monitor is scoped to", async () => {
464
+ // Same shape for the infra types: the step config names the host.
465
+ resourceContext = {
466
+ ...emptyResourceContext(),
467
+ hostIds: ["host-1"],
468
+ };
469
+
470
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
471
+ criteriaInstance: criteriaInstance(),
472
+ monitor: monitor(),
473
+ dataToProcess: dataToProcess,
474
+ rootCause: "CPU is above 90%",
475
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: NO_AUTO_RESOLVE,
476
+ props: {},
477
+ });
478
+
479
+ expect(idsOn(createdAlerts[0]!.hosts)).toEqual(["host-1"]);
480
+ });
481
+
482
+ it("merges the step-config service with the one the series names", async () => {
483
+ /*
484
+ * A grouped monitor can resolve a service from its labels while the
485
+ * step config names another. Neither may erase the other.
486
+ */
487
+ serviceRows = [{ _id: "service-from-label" }];
488
+ resourceContext = {
489
+ ...emptyResourceContext(),
490
+ serviceIds: ["service-from-step-config"],
491
+ };
492
+
493
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
494
+ criteriaInstance: criteriaInstance(),
495
+ monitor: monitor(),
496
+ dataToProcess: dataToProcess,
497
+ rootCause: "CPU is above 90%",
498
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: NO_AUTO_RESOLVE,
499
+ matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
500
+ props: {},
501
+ });
502
+
503
+ expect(idsOn(createdAlerts[0]!.services).sort()).toEqual([
504
+ "service-from-label",
505
+ "service-from-step-config",
506
+ ]);
507
+ });
508
+
509
+ it("dedupes a service both paths resolved", async () => {
510
+ serviceRows = [{ _id: "service-1" }];
511
+ resourceContext = {
512
+ ...emptyResourceContext(),
513
+ serviceIds: ["service-1"],
514
+ };
515
+
516
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
517
+ criteriaInstance: criteriaInstance(),
518
+ monitor: monitor(),
519
+ dataToProcess: dataToProcess,
520
+ rootCause: "CPU is above 90%",
521
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: NO_AUTO_RESOLVE,
522
+ matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
523
+ props: {},
524
+ });
525
+
526
+ expect(idsOn(createdAlerts[0]!.services)).toEqual(["service-1"]);
527
+ });
528
+
529
+ it("attaches the step-config resources to EVERY alert of a grouped monitor", async () => {
530
+ /*
531
+ * One evaluation, two breaching series, one shared monitor config.
532
+ * Both alerts are about the same service.
533
+ */
534
+ hostRows = [{ _id: "host-2" }];
535
+ resourceContext = {
536
+ ...emptyResourceContext(),
537
+ serviceIds: ["service-1"],
538
+ };
539
+
540
+ await MonitorAlert.criteriaMetCreateAlertsAndUpdateMonitorStatus({
541
+ criteriaInstance: criteriaInstance(),
542
+ monitor: monitor(),
543
+ dataToProcess: dataToProcess,
544
+ rootCause: "CPU is above 90%",
545
+ autoResolveCriteriaInstanceIdAlertIdsDictionary: NO_AUTO_RESOLVE,
546
+ matchesPerSeries: [
547
+ series({ "host.name": "node-a" }, "fp-1"),
548
+ series({ "host.name": "node-b" }, "fp-2"),
549
+ ],
550
+ props: {},
551
+ });
552
+
553
+ expect(createdAlerts).toHaveLength(2);
554
+ expect(idsOn(createdAlerts[0]!.services)).toEqual(["service-1"]);
555
+ expect(idsOn(createdAlerts[1]!.services)).toEqual(["service-1"]);
556
+ });
557
+
420
558
  it("merges the monitor's step-config cluster with the one the series names", async () => {
421
559
  /*
422
560
  * The alert path used to ASSIGN the step-config clusters over
@@ -424,7 +562,8 @@ describe("Alerts link the resources their series identifies", () => {
424
562
  * Proxmox cluster, an assignment would drop one of them.
425
563
  */
426
564
  proxmoxClusterRows = [{ _id: "pve-from-label" }];
427
- clusterContext = {
565
+ resourceContext = {
566
+ ...emptyResourceContext(),
428
567
  proxmoxClusterIds: ["pve-from-step-config"],
429
568
  cephClusterIds: [],
430
569
  dockerSwarmClusterIds: [],
@@ -448,7 +587,8 @@ describe("Alerts link the resources their series identifies", () => {
448
587
  });
449
588
 
450
589
  it("still attaches the step-config cluster to an ungrouped alert", async () => {
451
- clusterContext = {
590
+ resourceContext = {
591
+ ...emptyResourceContext(),
452
592
  proxmoxClusterIds: [],
453
593
  cephClusterIds: ["ceph-1"],
454
594
  dockerSwarmClusterIds: [],