@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
@@ -30,7 +30,7 @@ import IncidentStateTimelineService from "../../../../Server/Services/IncidentSt
30
30
  import NetworkDeviceOwnerUserService from "../../../../Server/Services/NetworkDeviceOwnerUserService";
31
31
  import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
32
32
  import MonitorAlert from "../../../../Server/Utils/Monitor/MonitorAlert";
33
- import MonitorClusterContextUtil from "../../../../Server/Utils/Monitor/MonitorClusterContext";
33
+ import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
34
34
  import { DependencySuppressionResult } from "../../../../Server/Utils/Monitor/MonitorDependencySuppression";
35
35
  import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
36
36
  import Dictionary from "../../../../Types/Dictionary";
@@ -185,7 +185,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
185
185
 
186
186
  let alertFindBySpy: SpyLike;
187
187
  let incidentFindBySpy: SpyLike;
188
- let clusterContextSpy: SpyLike;
188
+ let resourceContextSpy: SpyLike;
189
189
 
190
190
  beforeEach(() => {
191
191
  createdIncidents = [];
@@ -211,9 +211,14 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
211
211
  * creators — its call count is how these tests observe whether the flow
212
212
  * proceeded past the block.
213
213
  */
214
- clusterContextSpy = jest
215
- .spyOn(MonitorClusterContextUtil, "resolveClusterContextForMonitor")
214
+ resourceContextSpy = jest
215
+ .spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
216
216
  .mockResolvedValue({
217
+ hostIds: [],
218
+ dockerHostIds: [],
219
+ podmanHostIds: [],
220
+ kubernetesClusterIds: [],
221
+ serviceIds: [],
217
222
  proxmoxClusterIds: [],
218
223
  cephClusterIds: [],
219
224
  dockerSwarmClusterIds: [],
@@ -349,7 +354,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
349
354
  expect(skipEvent.relatedCriteriaId).toBe("criteria-1");
350
355
 
351
356
  // The skip block RETURNS: nothing after it (cluster context) runs.
352
- expect(clusterContextSpy.mock.calls).toHaveLength(0);
357
+ expect(resourceContextSpy.mock.calls).toHaveLength(0);
353
358
  });
354
359
 
355
360
  it("suppressed: the open-alert resolve pass still runs before the skip block (resolution is never suppressed)", async () => {
@@ -421,7 +426,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
421
426
  // The resolve pass still ran (it sits above both gates) ...
422
427
  expect(alertFindBySpy.mock.calls).toHaveLength(1);
423
428
  // ... and nothing after the gates did.
424
- expect(clusterContextSpy.mock.calls).toHaveLength(0);
429
+ expect(resourceContextSpy.mock.calls).toHaveLength(0);
425
430
  });
426
431
 
427
432
  it("resolve-only entry point resolves an open alert — suppression state cannot block resolution", async () => {
@@ -488,7 +493,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
488
493
  );
489
494
  expect(skipEvent.relatedCriteriaId).toBe("criteria-1");
490
495
 
491
- expect(clusterContextSpy.mock.calls).toHaveLength(0);
496
+ expect(resourceContextSpy.mock.calls).toHaveLength(0);
492
497
  });
493
498
 
494
499
  it("suppressed: the open-incident resolve pass still runs before the skip block (resolution is never suppressed)", async () => {
@@ -556,7 +561,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
556
561
  expect(createdIncidents).toHaveLength(0);
557
562
 
558
563
  expect(incidentFindBySpy.mock.calls).toHaveLength(1);
559
- expect(clusterContextSpy.mock.calls).toHaveLength(0);
564
+ expect(resourceContextSpy.mock.calls).toHaveLength(0);
560
565
  });
561
566
 
562
567
  it("resolve-only entry point resolves an open incident — suppression state cannot block resolution", async () => {
@@ -23,7 +23,8 @@ import PodmanHostService from "../../../../Server/Services/PodmanHostService";
23
23
  import ProxmoxClusterService from "../../../../Server/Services/ProxmoxClusterService";
24
24
  import ServiceService from "../../../../Server/Services/ServiceService";
25
25
  import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
26
- import MonitorClusterContextUtil from "../../../../Server/Utils/Monitor/MonitorClusterContext";
26
+ import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
27
+ import { SeriesResolvedResourceIds } from "../../../../Server/Utils/Monitor/SeriesResourceLinker";
27
28
  import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
28
29
  import Dictionary from "../../../../Types/Dictionary";
29
30
  import { JSONObject } from "../../../../Types/JSON";
@@ -125,6 +126,25 @@ function idsOn(
125
126
  });
126
127
  }
127
128
 
129
+ /*
130
+ * The nine-relation shape MonitorResourceContext resolves from the
131
+ * monitor's own step config. Tests stub the util and hand back one of
132
+ * these, spreading over it to name only the relations under test.
133
+ */
134
+ function emptyResourceContext(): SeriesResolvedResourceIds {
135
+ return {
136
+ hostIds: [],
137
+ dockerHostIds: [],
138
+ podmanHostIds: [],
139
+ kubernetesClusterIds: [],
140
+ serviceIds: [],
141
+ proxmoxClusterIds: [],
142
+ cephClusterIds: [],
143
+ dockerSwarmClusterIds: [],
144
+ iotFleetIds: [],
145
+ };
146
+ }
147
+
128
148
  describe("Incidents link the resources their series identifies", () => {
129
149
  let createdIncidents: Array<Incident> = [];
130
150
 
@@ -138,12 +158,7 @@ describe("Incidents link the resources their series identifies", () => {
138
158
  let dockerSwarmClusterRows: Array<{ _id: string }> = [];
139
159
  let iotFleetRows: Array<{ _id: string }> = [];
140
160
 
141
- let clusterContext: {
142
- proxmoxClusterIds: Array<string>;
143
- cephClusterIds: Array<string>;
144
- dockerSwarmClusterIds: Array<string>;
145
- iotFleetIds: Array<string>;
146
- };
161
+ let resourceContext: SeriesResolvedResourceIds;
147
162
 
148
163
  beforeEach(() => {
149
164
  createdIncidents = [];
@@ -158,12 +173,7 @@ describe("Incidents link the resources their series identifies", () => {
158
173
  dockerSwarmClusterRows = [];
159
174
  iotFleetRows = [];
160
175
 
161
- clusterContext = {
162
- proxmoxClusterIds: [],
163
- cephClusterIds: [],
164
- dockerSwarmClusterIds: [],
165
- iotFleetIds: [],
166
- };
176
+ resourceContext = emptyResourceContext();
167
177
 
168
178
  // No incident is already open for this monitor.
169
179
  jest.spyOn(IncidentService, "findBy").mockResolvedValue([]);
@@ -173,9 +183,9 @@ describe("Incidents link the resources their series identifies", () => {
173
183
  .mockResolvedValue(true);
174
184
 
175
185
  jest
176
- .spyOn(MonitorClusterContextUtil, "resolveClusterContextForMonitor")
186
+ .spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
177
187
  .mockImplementation(async () => {
178
- return clusterContext;
188
+ return resourceContext;
179
189
  });
180
190
 
181
191
  jest
@@ -422,7 +432,14 @@ describe("Incidents link the resources their series identifies", () => {
422
432
  expect(idsOn(createdIncidents[1]!.hosts)).toEqual(["host-7"]);
423
433
  });
424
434
 
425
- it("links nothing, and still opens the incident, for an ungrouped monitor", async () => {
435
+ it("links nothing from LABELS, and still opens the incident, for an ungrouped monitor", async () => {
436
+ /*
437
+ * A whole-monitor incident has no series, so the label path has
438
+ * nothing to work with. It must not invent an identity from another
439
+ * series, and it must still be created. (The step-config path can
440
+ * still name a resource here — that is the test above; this one
441
+ * pins that the label path alone contributes nothing.)
442
+ */
426
443
  hostRows = [{ _id: "host-1" }];
427
444
 
428
445
  await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
@@ -441,7 +458,8 @@ describe("Incidents link the resources their series identifies", () => {
441
458
 
442
459
  it("merges the monitor's step-config cluster with the one the series names", async () => {
443
460
  proxmoxClusterRows = [{ _id: "pve-from-label" }];
444
- clusterContext = {
461
+ resourceContext = {
462
+ ...emptyResourceContext(),
445
463
  proxmoxClusterIds: ["pve-from-step-config"],
446
464
  cephClusterIds: [],
447
465
  dockerSwarmClusterIds: [],
@@ -464,8 +482,134 @@ describe("Incidents link the resources their series identifies", () => {
464
482
  ]);
465
483
  });
466
484
 
485
+ it("links the service an ungrouped metric monitor is scoped to", async () => {
486
+ /*
487
+ * THE REPORTED BUG. The alert twin of this came from a Metrics monitor whose only
488
+ * resource identity was the attribute filter
489
+ * `oneuptime.service.name = app-plan-starship-online-production`.
490
+ * It is ungrouped, so there are no series labels and the label path
491
+ * links nothing — the incident's "Affected Resources" card read "No
492
+ * resources affected" even though the monitor named the service.
493
+ *
494
+ * `matchesPerSeries` is deliberately omitted: that is what makes
495
+ * this the ungrouped path.
496
+ */
497
+ resourceContext = {
498
+ ...emptyResourceContext(),
499
+ serviceIds: ["service-1"],
500
+ };
501
+
502
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
503
+ criteriaInstance: criteriaInstance(),
504
+ monitor: monitor(),
505
+ dataToProcess: dataToProcess,
506
+ rootCause: "Memory is above 60%",
507
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
508
+ props: {},
509
+ });
510
+
511
+ expect(createdIncidents).toHaveLength(1);
512
+ expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
513
+ });
514
+
515
+ it("links the host an ungrouped host monitor is scoped to", async () => {
516
+ // Same shape for the infra types: the step config names the host.
517
+ resourceContext = {
518
+ ...emptyResourceContext(),
519
+ hostIds: ["host-1"],
520
+ };
521
+
522
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
523
+ criteriaInstance: criteriaInstance(),
524
+ monitor: monitor(),
525
+ dataToProcess: dataToProcess,
526
+ rootCause: "CPU is above 90%",
527
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
528
+ props: {},
529
+ });
530
+
531
+ expect(idsOn(createdIncidents[0]!.hosts)).toEqual(["host-1"]);
532
+ });
533
+
534
+ it("merges the step-config service with the one the series names", async () => {
535
+ /*
536
+ * A grouped monitor can resolve a service from its labels while the
537
+ * step config names another. Neither may erase the other.
538
+ */
539
+ serviceRows = [{ _id: "service-from-label" }];
540
+ resourceContext = {
541
+ ...emptyResourceContext(),
542
+ serviceIds: ["service-from-step-config"],
543
+ };
544
+
545
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
546
+ criteriaInstance: criteriaInstance(),
547
+ monitor: monitor(),
548
+ dataToProcess: dataToProcess,
549
+ rootCause: "CPU is above 90%",
550
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
551
+ matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
552
+ props: {},
553
+ });
554
+
555
+ expect(idsOn(createdIncidents[0]!.services).sort()).toEqual([
556
+ "service-from-label",
557
+ "service-from-step-config",
558
+ ]);
559
+ });
560
+
561
+ it("dedupes a service both paths resolved", async () => {
562
+ serviceRows = [{ _id: "service-1" }];
563
+ resourceContext = {
564
+ ...emptyResourceContext(),
565
+ serviceIds: ["service-1"],
566
+ };
567
+
568
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
569
+ criteriaInstance: criteriaInstance(),
570
+ monitor: monitor(),
571
+ dataToProcess: dataToProcess,
572
+ rootCause: "CPU is above 90%",
573
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
574
+ matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
575
+ props: {},
576
+ });
577
+
578
+ expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
579
+ });
580
+
581
+ it("attaches the step-config resources to EVERY incident of a grouped monitor", async () => {
582
+ /*
583
+ * One evaluation, two breaching series, one shared monitor config.
584
+ * Both incidents are about the same service.
585
+ */
586
+ hostRows = [{ _id: "host-2" }];
587
+ resourceContext = {
588
+ ...emptyResourceContext(),
589
+ serviceIds: ["service-1"],
590
+ };
591
+
592
+ await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
593
+ criteriaInstance: criteriaInstance(),
594
+ monitor: monitor(),
595
+ dataToProcess: dataToProcess,
596
+ rootCause: "CPU is above 90%",
597
+ autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
598
+ matchesPerSeries: [
599
+ series({ "host.name": "node-a" }, "fp-1"),
600
+ series({ "host.name": "node-b" }, "fp-2"),
601
+ ],
602
+ props: {},
603
+ });
604
+
605
+ expect(createdIncidents).toHaveLength(2);
606
+ expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
607
+ expect(idsOn(createdIncidents[1]!.services)).toEqual(["service-1"]);
608
+ });
609
+
467
610
  it("still attaches the step-config cluster to an ungrouped incident", async () => {
468
- clusterContext = {
611
+ resourceContext = {
612
+ ...emptyResourceContext(),
469
613
  proxmoxClusterIds: [],
470
614
  cephClusterIds: ["ceph-1"],
471
615
  dockerSwarmClusterIds: [],
@@ -0,0 +1,349 @@
1
+ /*
2
+ * PasswordHash carries a pre-existing TS5.9 diagnostic that fails any suite
3
+ * whose runtime require graph reaches it (DatabaseService, the base class of
4
+ * every concrete service, imports it). Nothing password-related is under
5
+ * test here, so the module is replaced WITH A FACTORY — an automock would
6
+ * still require (and type-check) the real file.
7
+ */
8
+ jest.mock("../../../../Server/Utils/PasswordHash", () => {
9
+ return {
10
+ __esModule: true,
11
+ default: {
12
+ hash: jest.fn(),
13
+ verify: jest.fn(),
14
+ generateSalt: jest.fn(),
15
+ needsUpgrade: jest.fn(),
16
+ applyPepper: jest.fn(),
17
+ },
18
+ };
19
+ });
20
+
21
+ import Monitor from "../../../../Models/DatabaseModels/Monitor";
22
+ import HostService from "../../../../Server/Services/HostService";
23
+ import KubernetesClusterService from "../../../../Server/Services/KubernetesClusterService";
24
+ import ServiceService from "../../../../Server/Services/ServiceService";
25
+ import DockerHostService from "../../../../Server/Services/DockerHostService";
26
+ import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
27
+ import SeriesResourceLinker, {
28
+ SeriesResolvedResourceIds,
29
+ } from "../../../../Server/Utils/Monitor/SeriesResourceLinker";
30
+ import { JSONObject } from "../../../../Types/JSON";
31
+ import MonitorStep from "../../../../Types/Monitor/MonitorStep";
32
+ import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
33
+ import MonitorType from "../../../../Types/Monitor/MonitorType";
34
+ import ObjectID from "../../../../Types/ObjectID";
35
+ import {
36
+ afterEach,
37
+ beforeEach,
38
+ describe,
39
+ expect,
40
+ jest,
41
+ test,
42
+ } from "@jest/globals";
43
+
44
+ /*
45
+ * MonitorResourceContext turns a monitor's own step config into the real
46
+ * resource rows its incidents and alerts should be attached to. It is
47
+ * what makes an UNGROUPED monitor link anything at all — the series-label
48
+ * path only fires for grouped criteria, and most monitors are ungrouped.
49
+ *
50
+ * The regression it fixes: an alert from a metric monitor scoped to one
51
+ * service showed "No resources affected", because the only thing naming
52
+ * that service was an attribute filter nobody read.
53
+ */
54
+
55
+ const PROJECT_ID: ObjectID = new ObjectID(
56
+ "11111111-1111-4111-8111-111111111111",
57
+ );
58
+ const MONITOR_ID: ObjectID = new ObjectID(
59
+ "22222222-2222-4222-8222-222222222222",
60
+ );
61
+ const SERVICE_ID: string = "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
62
+
63
+ function monitorWith(
64
+ monitorType: MonitorType,
65
+ stepData: JSONObject,
66
+ options?: { projectId?: ObjectID | undefined },
67
+ ): Monitor {
68
+ const model: Monitor = new Monitor();
69
+ model._id = MONITOR_ID.toString();
70
+ model.monitorType = monitorType;
71
+
72
+ if (!options || options.projectId !== undefined) {
73
+ model.projectId = options?.projectId ?? PROJECT_ID;
74
+ }
75
+
76
+ const step: MonitorStep = new MonitorStep();
77
+ step.data = { ...step.data, ...stepData } as MonitorStep["data"];
78
+
79
+ const steps: MonitorSteps = new MonitorSteps();
80
+ steps.data = { monitorStepsInstanceArray: [step] };
81
+ model.monitorSteps = steps;
82
+
83
+ return model;
84
+ }
85
+
86
+ function metricViewConfigWith(attributes: JSONObject): JSONObject {
87
+ return {
88
+ queryConfigs: [
89
+ {
90
+ metricQueryData: {
91
+ filterData: { metricName: "some.metric", attributes: attributes },
92
+ },
93
+ },
94
+ ],
95
+ formulaConfigs: [],
96
+ };
97
+ }
98
+
99
+ /*
100
+ * A TypeORM Raw() FindOperator as it appears in a captured query. Its
101
+ * SQL generator is a function on `.value` — invisible to JSON — so the
102
+ * only inspectable part is the bound-parameter bag.
103
+ */
104
+ interface RawOperator {
105
+ type?: string | undefined;
106
+ objectLiteralParameters?: Record<string, unknown> | undefined;
107
+ }
108
+
109
+ /*
110
+ * The query each service's findBy was handed, so a test can assert the
111
+ * lookup was project-scoped and root-privileged rather than only
112
+ * checking the ids that came back.
113
+ */
114
+ let capturedQueries: Array<{ service: string; query: JSONObject }> = [];
115
+
116
+ function stubService(
117
+ name: string,
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ service: any,
120
+ rows: Array<{ _id: string }>,
121
+ ): void {
122
+ jest
123
+ .spyOn(service, "findBy")
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ .mockImplementation(async (args: any) => {
126
+ capturedQueries.push({ service: name, query: args.query as JSONObject });
127
+ return rows;
128
+ });
129
+ }
130
+
131
+ describe("MonitorResourceContext", () => {
132
+ beforeEach(() => {
133
+ capturedQueries = [];
134
+
135
+ stubService("host", HostService, []);
136
+ stubService("dockerHost", DockerHostService, []);
137
+ stubService("kubernetesCluster", KubernetesClusterService, []);
138
+ stubService("service", ServiceService, []);
139
+ });
140
+
141
+ afterEach(() => {
142
+ jest.restoreAllMocks();
143
+ });
144
+
145
+ test("resolves the service a metric monitor's filter names", async () => {
146
+ stubService("service", ServiceService, [{ _id: SERVICE_ID }]);
147
+
148
+ const resolved: SeriesResolvedResourceIds =
149
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
150
+ monitor: monitorWith(MonitorType.Metrics, {
151
+ metricMonitor: {
152
+ metricViewConfig: metricViewConfigWith({
153
+ "oneuptime.service.name": "app-plan-starship-online-production",
154
+ }),
155
+ },
156
+ }),
157
+ });
158
+
159
+ expect(resolved.serviceIds).toEqual([SERVICE_ID]);
160
+ });
161
+
162
+ test("resolves the services a log monitor's telemetryServiceIds name", async () => {
163
+ stubService("service", ServiceService, [{ _id: SERVICE_ID }]);
164
+
165
+ const resolved: SeriesResolvedResourceIds =
166
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
167
+ monitor: monitorWith(MonitorType.Logs, {
168
+ logMonitor: { telemetryServiceIds: [new ObjectID(SERVICE_ID)] },
169
+ }),
170
+ });
171
+
172
+ expect(resolved.serviceIds).toEqual([SERVICE_ID]);
173
+
174
+ // Looked up by primary key, not by name.
175
+ const serviceQuery: JSONObject | undefined = capturedQueries.find(
176
+ (entry: { service: string }): boolean => {
177
+ return entry.service === "service";
178
+ },
179
+ )?.query;
180
+
181
+ expect(serviceQuery?.["_id"]).toBeDefined();
182
+ expect(serviceQuery?.["name"]).toBeUndefined();
183
+ });
184
+
185
+ test("resolves the host a host monitor names", async () => {
186
+ stubService("host", HostService, [{ _id: "host-1" }]);
187
+
188
+ const resolved: SeriesResolvedResourceIds =
189
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
190
+ monitor: monitorWith(MonitorType.Host, {
191
+ hostMonitor: { hostIdentifier: "prod-01" },
192
+ }),
193
+ });
194
+
195
+ expect(resolved.hostIds).toEqual(["host-1"]);
196
+ });
197
+
198
+ test("resolves the cluster a kubernetes monitor names", async () => {
199
+ stubService("kubernetesCluster", KubernetesClusterService, [
200
+ { _id: "k8s-1" },
201
+ ]);
202
+
203
+ const resolved: SeriesResolvedResourceIds =
204
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
205
+ monitor: monitorWith(MonitorType.Kubernetes, {
206
+ kubernetesMonitor: { clusterIdentifier: "prod-cluster" },
207
+ }),
208
+ });
209
+
210
+ expect(resolved.kubernetesClusterIds).toEqual(["k8s-1"]);
211
+ });
212
+
213
+ test("matches a name case-insensitively", async () => {
214
+ /*
215
+ * The identifier was typed by a user into the monitor form; the row's
216
+ * name was stamped by an agent at ingest. They legitimately differ by
217
+ * case, so the lookup must not be an exact-match Includes().
218
+ */
219
+ stubService("host", HostService, [{ _id: "host-1" }]);
220
+
221
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
222
+ monitor: monitorWith(MonitorType.Host, {
223
+ hostMonitor: { hostIdentifier: "PROD-01" },
224
+ }),
225
+ });
226
+
227
+ const hostQuery: JSONObject | undefined = capturedQueries.find(
228
+ (entry: { service: string }): boolean => {
229
+ return entry.service === "host";
230
+ },
231
+ )?.query;
232
+
233
+ const identifierClause: RawOperator | undefined = hostQuery?.[
234
+ "hostIdentifier"
235
+ ] as RawOperator | undefined;
236
+
237
+ /*
238
+ * A TypeORM Raw() operator, not a plain Includes: the SQL generator
239
+ * lives on `.value` (a function, invisible to JSON) and the
240
+ * identifiers are BOUND under a per-call random key in
241
+ * `.objectLiteralParameters`. Asserting on the bound value proves
242
+ * two things at once — the comparison is case-folded (the value was
243
+ * lowercased on the way in), and the identifier is parameterized
244
+ * rather than interpolated into the SQL.
245
+ */
246
+ expect(identifierClause?.type).toBe("raw");
247
+
248
+ expect(
249
+ Object.values(identifierClause?.objectLiteralParameters || {}),
250
+ ).toEqual([["prod-01"]]);
251
+ });
252
+
253
+ test("scopes every lookup to the monitor's project", async () => {
254
+ stubService("host", HostService, [{ _id: "host-1" }]);
255
+
256
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
257
+ monitor: monitorWith(MonitorType.Host, {
258
+ hostMonitor: { hostIdentifier: "prod-01" },
259
+ }),
260
+ });
261
+
262
+ expect(capturedQueries.length).toBeGreaterThan(0);
263
+
264
+ for (const entry of capturedQueries) {
265
+ expect(String(entry.query["projectId"])).toBe(PROJECT_ID.toString());
266
+ }
267
+ });
268
+
269
+ test("costs zero round-trips when the monitor names no resource", async () => {
270
+ const resolved: SeriesResolvedResourceIds =
271
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
272
+ monitor: monitorWith(MonitorType.Website, {}),
273
+ });
274
+
275
+ expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
276
+ expect(capturedQueries).toHaveLength(0);
277
+ });
278
+
279
+ test("returns empty without a lookup when the monitor has no project", async () => {
280
+ const model: Monitor = monitorWith(
281
+ MonitorType.Host,
282
+ { hostMonitor: { hostIdentifier: "prod-01" } },
283
+ { projectId: undefined },
284
+ );
285
+
286
+ const resolved: SeriesResolvedResourceIds =
287
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
288
+ monitor: model,
289
+ });
290
+
291
+ expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
292
+ expect(capturedQueries).toHaveLength(0);
293
+ });
294
+
295
+ test("returns empty instead of throwing when a lookup fails", async () => {
296
+ /*
297
+ * This runs inside the probe / telemetry queue workers. A throw here
298
+ * would fail the whole job and retry forever, so a lookup failure
299
+ * must degrade to "no resources linked", never block creation.
300
+ */
301
+ jest
302
+ .spyOn(SeriesResourceLinker, "resolveResourceRefs")
303
+ .mockRejectedValue(new Error("database is down"));
304
+
305
+ const resolved: SeriesResolvedResourceIds =
306
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
307
+ monitor: monitorWith(MonitorType.Host, {
308
+ hostMonitor: { hostIdentifier: "prod-01" },
309
+ }),
310
+ });
311
+
312
+ expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
313
+ });
314
+
315
+ test("links nothing when the named resource is in another project", async () => {
316
+ // The project-scoped query simply returns no row.
317
+ stubService("host", HostService, []);
318
+
319
+ const resolved: SeriesResolvedResourceIds =
320
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
321
+ monitor: monitorWith(MonitorType.Host, {
322
+ hostMonitor: { hostIdentifier: "someone-elses-host" },
323
+ }),
324
+ });
325
+
326
+ expect(resolved.hostIds).toEqual([]);
327
+ });
328
+
329
+ test("a docker monitor resolves a DockerHost and never a Host", async () => {
330
+ stubService("dockerHost", DockerHostService, [{ _id: "docker-1" }]);
331
+ stubService("host", HostService, [{ _id: "host-should-not-be-used" }]);
332
+
333
+ const resolved: SeriesResolvedResourceIds =
334
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
335
+ monitor: monitorWith(MonitorType.Docker, {
336
+ dockerMonitor: {
337
+ hostIdentifier: "docker-prod-01",
338
+ metricViewConfig: metricViewConfigWith({
339
+ "resource.host.name": "docker-prod-01",
340
+ }),
341
+ },
342
+ }),
343
+ });
344
+
345
+ expect(resolved.dockerHostIds).toEqual(["docker-1"]);
346
+ expect(resolved.hostIds).toEqual([]);
347
+ expect(HostService.findBy).not.toHaveBeenCalled();
348
+ });
349
+ });