@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
package/Utils/API.ts CHANGED
@@ -226,8 +226,13 @@ export default class API {
226
226
  }
227
227
 
228
228
  public static getDefaultHeaders(_props?: any): Headers {
229
+ /*
230
+ * NOTE: no "Access-Control-Allow-Origin" here - that is a RESPONSE-only
231
+ * header. Sending it as a request header forces a CORS preflight on every
232
+ * cross-origin call (self-hosted setups where the API is on a different
233
+ * origin), doubling the request count for zero benefit.
234
+ */
229
235
  const defaultHeaders: Headers = {
230
- "Access-Control-Allow-Origin": "*",
231
236
  Accept: "application/json",
232
237
  "Content-Type": "application/json;charset=UTF-8",
233
238
  };
@@ -1,7 +1,9 @@
1
1
  import AggregationType from "../../Types/BaseDatabase/AggregationType";
2
2
  import { CheckOn } from "../../Types/Monitor/CriteriaFilter";
3
3
  import MonitorMetricType from "../../Types/Monitor/MonitorMetricType";
4
- import MonitorType from "../../Types/Monitor/MonitorType";
4
+ import MonitorType, {
5
+ MonitorTypeHelper,
6
+ } from "../../Types/Monitor/MonitorType";
5
7
 
6
8
  /*
7
9
  * Groups of metrics rendered as separate cards on the monitor metrics page.
@@ -238,11 +240,24 @@ class MonitorMetricTypeUtil {
238
240
  monitorType === MonitorType.DNSSEC ||
239
241
  monitorType === MonitorType.Domain ||
240
242
  monitorType === MonitorType.SQLQuery ||
243
+ monitorType === MonitorType.SSLCertificate ||
241
244
  monitorType === MonitorType.ExternalStatusPage
242
245
  ) {
243
246
  return [MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime];
244
247
  }
245
248
 
249
+ /*
250
+ * Any other type the probe actually checks still writes IsOnline and
251
+ * ResponseTime rows, so default to showing them rather than to an empty
252
+ * list. Falling through to [] hides the Monitor Metrics tab entirely -
253
+ * SSL Certificate monitors were missing from the list above and so had
254
+ * no metrics tab at all, which left an operator with no way to see that
255
+ * their monitor was running.
256
+ */
257
+ if (MonitorTypeHelper.isProbableMonitor(monitorType)) {
258
+ return [MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime];
259
+ }
260
+
246
261
  return [];
247
262
  }
248
263
 
@@ -13,13 +13,27 @@ import {
13
13
  classifyEndpointRole,
14
14
  resolveDeviceRole,
15
15
  } from "./NetworkDeviceRoleUtil";
16
+ import DeviceReachabilityUtil, {
17
+ NetworkDeviceReachability,
18
+ } from "../NetworkDevice/DeviceReachabilityUtil";
16
19
 
17
20
  export interface TopologyDeviceInput {
18
21
  id: string;
19
22
  name: string;
20
23
  hostname?: string | undefined;
21
24
  sysName?: string | undefined;
25
+ /*
26
+ * Reachability inputs, all three of them. `isReachable` is the outcome of
27
+ * the last poll and is what actually decides up/down; `lastPolledAt` and
28
+ * `pollingIntervalInMinutes` only size the "we have stopped polling
29
+ * entirely" backstop. Passing lastSeenAt alone still works (that is the
30
+ * legacy path for rows written before the columns existed) but re-creates
31
+ * the bug where a fleet the probe cannot keep up with draws all-red.
32
+ */
33
+ isReachable?: boolean | undefined;
34
+ lastPolledAt?: Date | undefined;
22
35
  lastSeenAt?: Date | undefined;
36
+ pollingIntervalInMinutes?: number | undefined;
23
37
  interfacesUp?: number | undefined;
24
38
  interfacesDown?: number | undefined;
25
39
  vendor?: string | undefined;
@@ -232,12 +246,17 @@ interface ResolvedClaim {
232
246
  */
233
247
  const IPV4_PATTERN: RegExp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
234
248
 
235
- // A device not seen within this window is treated as not currently up.
236
- const FRESH_WINDOW_MS: number = 15 * 60 * 1000;
237
-
238
249
  // Endpoint nodes rendered per graph; the slice is deterministic (by MAC).
239
250
  const ENDPOINT_RENDER_CAP: number = 2000;
240
251
 
252
+ /*
253
+ * How long an ARP/FDB-learned endpoint keeps its "up" colour after the last
254
+ * walk that saw it. Taken from the shared device rule at its default
255
+ * interval so the map's two node kinds age out on comparable timescales.
256
+ */
257
+ const ENDPOINT_FRESH_WINDOW_MS: number =
258
+ DeviceReachabilityUtil.getStaleWindowInMinutes(undefined) * 60 * 1000;
259
+
241
260
  export default class NetworkTopologyUtil {
242
261
  /*
243
262
  * Builds the topology graph from every device in a project. Nodes are the
@@ -1305,10 +1324,17 @@ export default class NetworkTopologyUtil {
1305
1324
  if (device.monitorStatus) {
1306
1325
  return device.monitorStatus;
1307
1326
  }
1308
- return NetworkTopologyUtil.statusFromLastSeen(device.lastSeenAt, now);
1327
+ return NetworkTopologyUtil.statusFromPoll(device, now);
1309
1328
  }
1310
1329
 
1311
- // The shared freshness rule: seen within the window = up, stale = down.
1330
+ /*
1331
+ * Endpoints (ARP/FDB-learned hosts) have no poll of their own: they are
1332
+ * re-learned from whichever device's tables they appear in, so freshness
1333
+ * really is all there is to go on. The window is the shared default
1334
+ * staleness window rather than the old fixed 15 minutes, so a host on a
1335
+ * switch its probe polls slowly does not blink out of the map between
1336
+ * walks.
1337
+ */
1312
1338
  private static statusFromLastSeen(
1313
1339
  lastSeenAt: Date | undefined,
1314
1340
  now: Date,
@@ -1316,10 +1342,36 @@ export default class NetworkTopologyUtil {
1316
1342
  if (!lastSeenAt) {
1317
1343
  return "unknown";
1318
1344
  }
1345
+
1319
1346
  const ageMs: number = now.getTime() - new Date(lastSeenAt).getTime();
1320
- if (ageMs > FRESH_WINDOW_MS) {
1321
- return "down";
1347
+
1348
+ return ageMs > ENDPOINT_FRESH_WINDOW_MS ? "down" : "up";
1349
+ }
1350
+
1351
+ /*
1352
+ * The shared reachability rule (DeviceReachabilityUtil), mapped onto the
1353
+ * graph's three node states. "Pending" — never polled — is the graph's
1354
+ * "unknown", which is what keeps a device nothing walks from being drawn
1355
+ * as a failure.
1356
+ */
1357
+ private static statusFromPoll(
1358
+ device: TopologyDeviceInput,
1359
+ now: Date,
1360
+ ): NetworkTopologyNodeStatus {
1361
+ const status: NetworkDeviceReachability = DeviceReachabilityUtil.getStatus(
1362
+ {
1363
+ isReachable: device.isReachable,
1364
+ lastPolledAt: device.lastPolledAt,
1365
+ lastSeenAt: device.lastSeenAt,
1366
+ pollingIntervalInMinutes: device.pollingIntervalInMinutes,
1367
+ },
1368
+ now,
1369
+ );
1370
+
1371
+ if (status === NetworkDeviceReachability.Pending) {
1372
+ return "unknown";
1322
1373
  }
1323
- return "up";
1374
+
1375
+ return status === NetworkDeviceReachability.Up ? "up" : "down";
1324
1376
  }
1325
1377
  }
@@ -0,0 +1,262 @@
1
+ import OneUptimeDate from "../../Types/Date";
2
+
3
+ /*
4
+ * The one place that decides whether a NetworkDevice is reachable.
5
+ *
6
+ * The rule this replaces was "lastSeenAt within a fixed 15 minutes = up",
7
+ * which conflates two different facts:
8
+ *
9
+ * 1. the device did not answer the probe (the device is down), and
10
+ * 2. the probe has not asked it recently (WE are behind).
11
+ *
12
+ * (2) is not a device outage. A probe hands out at most a bounded number of
13
+ * devices per fetch cycle, so a large fleet's real poll cadence is
14
+ * `fleetSize / claimRate` minutes however short the configured interval is —
15
+ * and a fleet whose cadence exceeds the freshness window paints healthy
16
+ * devices red on the device list, the topology graph and the site rollup,
17
+ * while the device's own Interfaces tab (written by that same successful
18
+ * walk) still reads "Up". A device polled on a 30-minute interval was
19
+ * permanently "Down" for the same reason: it can never satisfy a 15-minute
20
+ * window.
21
+ *
22
+ * So reachability is now the OUTCOME of the most recent poll —
23
+ * NetworkDevice.isReachable, stamped by the walk pipeline on every ingested
24
+ * walk — and freshness is only a backstop for "the polling pipeline itself
25
+ * stopped", measured generously against the device's own interval.
26
+ */
27
+
28
+ export enum NetworkDeviceReachability {
29
+ Up = "Up",
30
+ Down = "Down",
31
+ Pending = "Pending",
32
+ }
33
+
34
+ /*
35
+ * Mirrors the NetworkDevice.pollingIntervalInMinutes column default, and is
36
+ * what a NULL interval (rows written before that column existed) is read as.
37
+ */
38
+ export const DEFAULT_DEVICE_POLLING_INTERVAL_IN_MINUTES: number = 5;
39
+
40
+ /*
41
+ * Consecutive missed polls before a device's last verdict is reported as
42
+ * STALE. Staleness is an annotation on the verdict, never the verdict
43
+ * itself — see getReachability for why turning it into "Down" would both
44
+ * re-create this bug at a longer timescale and put the pill permanently at
45
+ * odds with the summary counts.
46
+ *
47
+ * Deliberately generous: a device that stops answering is marked
48
+ * unreachable by the very next poll, so the only thing this flags is the
49
+ * whole polling pipeline going silent (probe offline, claim loop wedged,
50
+ * walk queue backed up). Ten missed cycles is unambiguous.
51
+ */
52
+ export const DEVICE_MISSED_POLL_ALLOWANCE: number = 10;
53
+
54
+ /*
55
+ * Floor under the window above, so a device on a one-minute interval is not
56
+ * declared out of contact after ten minutes of ordinary scheduling jitter.
57
+ */
58
+ export const DEVICE_MIN_STALE_WINDOW_IN_MINUTES: number = 60;
59
+
60
+ // The columns this util reads. Every caller selects exactly these.
61
+ export interface DeviceReachabilityInput {
62
+ /*
63
+ * Outcome of the most recent poll: true = the device answered, false = the
64
+ * probe could not reach it, null/undefined = never polled, or a row
65
+ * written before this column existed.
66
+ */
67
+ isReachable?: boolean | null | undefined;
68
+ // When the probe last ATTEMPTED a walk, whatever the outcome.
69
+ lastPolledAt?: Date | string | null | undefined;
70
+ // When the device last ANSWERED one.
71
+ lastSeenAt?: Date | string | null | undefined;
72
+ // The device's own schedule; sizes the staleness backstop.
73
+ pollingIntervalInMinutes?: number | null | undefined;
74
+ }
75
+
76
+ export interface DeviceReachabilityResult {
77
+ status: NetworkDeviceReachability;
78
+ /*
79
+ * True when the last poll ATTEMPT is older than the staleness window —
80
+ * i.e. this verdict is being read off data nothing has refreshed for a
81
+ * long time. Strictly independent of `status`: it qualifies the verdict
82
+ * ("and nobody has checked lately") rather than changing it, and either
83
+ * an Up or a Down device can be stale.
84
+ */
85
+ isStale: boolean;
86
+ // The window `isStale` was measured against, so the UI can name it.
87
+ staleWindowInMinutes: number;
88
+ // Latest of lastPolledAt / lastSeenAt; null when neither is set.
89
+ lastContactAt: Date | null;
90
+ }
91
+
92
+ const MS_PER_MINUTE: number = 60 * 1000;
93
+
94
+ export default class DeviceReachabilityUtil {
95
+ /*
96
+ * The device's poll interval as a usable positive number. NULL, zero,
97
+ * negative and non-finite values all fall back to the column default —
98
+ * the same clamp NetworkDeviceService.claimDevicesForPolling applies when
99
+ * it advances nextPollAt, so the window and the schedule agree.
100
+ */
101
+ public static getPollingIntervalInMinutes(
102
+ pollingIntervalInMinutes?: number | null | undefined,
103
+ ): number {
104
+ if (
105
+ typeof pollingIntervalInMinutes !== "number" ||
106
+ !Number.isFinite(pollingIntervalInMinutes) ||
107
+ pollingIntervalInMinutes <= 0
108
+ ) {
109
+ return DEFAULT_DEVICE_POLLING_INTERVAL_IN_MINUTES;
110
+ }
111
+
112
+ return Math.max(pollingIntervalInMinutes, 1);
113
+ }
114
+
115
+ // How long a device may go unpolled before its last verdict goes stale.
116
+ public static getStaleWindowInMinutes(
117
+ pollingIntervalInMinutes?: number | null | undefined,
118
+ ): number {
119
+ const interval: number = DeviceReachabilityUtil.getPollingIntervalInMinutes(
120
+ pollingIntervalInMinutes,
121
+ );
122
+
123
+ return Math.max(
124
+ interval * DEVICE_MISSED_POLL_ALLOWANCE,
125
+ DEVICE_MIN_STALE_WINDOW_IN_MINUTES,
126
+ );
127
+ }
128
+
129
+ public static getReachability(
130
+ device: DeviceReachabilityInput,
131
+ now?: Date | undefined,
132
+ ): DeviceReachabilityResult {
133
+ const currentDate: Date = now || OneUptimeDate.getCurrentDate();
134
+
135
+ const staleWindowInMinutes: number =
136
+ DeviceReachabilityUtil.getStaleWindowInMinutes(
137
+ device.pollingIntervalInMinutes,
138
+ );
139
+
140
+ const lastPolledAt: Date | null = toDate(device.lastPolledAt);
141
+ const lastSeenAt: Date | null = toDate(device.lastSeenAt);
142
+
143
+ /*
144
+ * Newest of the two. lastPolledAt alone would be wrong for rows written
145
+ * before it existed (they only have lastSeenAt), and lastSeenAt alone
146
+ * would call a device that is being polled and failing "out of contact"
147
+ * — it is very much in contact, it is just down.
148
+ */
149
+ const lastContactAt: Date | null = newerOf(lastPolledAt, lastSeenAt);
150
+
151
+ const isStale: boolean = lastContactAt
152
+ ? currentDate.getTime() - lastContactAt.getTime() >
153
+ staleWindowInMinutes * MS_PER_MINUTE
154
+ : false;
155
+
156
+ const result: (
157
+ status: NetworkDeviceReachability,
158
+ ) => DeviceReachabilityResult = (
159
+ status: NetworkDeviceReachability,
160
+ ): DeviceReachabilityResult => {
161
+ return {
162
+ status: status,
163
+ isStale: isStale,
164
+ staleWindowInMinutes: staleWindowInMinutes,
165
+ lastContactAt: lastContactAt,
166
+ };
167
+ };
168
+
169
+ /*
170
+ * The probe asked and got nothing. Authoritative however long ago it
171
+ * was — nothing since has said otherwise.
172
+ */
173
+ if (device.isReachable === false) {
174
+ return result(NetworkDeviceReachability.Down);
175
+ }
176
+
177
+ /*
178
+ * The probe asked and the device answered. The answer stands until a
179
+ * later poll contradicts it.
180
+ *
181
+ * Staleness deliberately does NOT override this. Turning "we have not
182
+ * asked in a while" into "the device is down" is the exact move this
183
+ * whole change exists to undo — doing it again at a longer timescale
184
+ * would just relocate the bug. It is also not expressible as a database
185
+ * filter (the window is per-device, derived from each row's own
186
+ * interval), so a status that depended on it could never agree with the
187
+ * summary counts or the Status filter, which have to run in SQL over
188
+ * `isReachable`. A verdict the list cannot count or filter by is a
189
+ * verdict that contradicts itself on screen.
190
+ *
191
+ * `isStale` still comes back in the result, and the UI shows it as what
192
+ * it is — "nothing has polled this device in N minutes, check its
193
+ * probe" — which is a different and more actionable statement than
194
+ * "this device is down".
195
+ */
196
+ if (device.isReachable === true) {
197
+ return result(NetworkDeviceReachability.Up);
198
+ }
199
+
200
+ /*
201
+ * No recorded outcome. Either the device has genuinely never been polled
202
+ * (Pending), or the row predates the column — in which case lastSeenAt
203
+ * is all we have and freshness is the only rule available. The upgrade
204
+ * migration backfills these, so this is a short-lived path.
205
+ */
206
+ if (!lastSeenAt) {
207
+ /*
208
+ * Polled but never once answered — the probe has been trying and
209
+ * failing, which is Down, not "not set up yet".
210
+ */
211
+ if (lastPolledAt) {
212
+ return result(NetworkDeviceReachability.Down);
213
+ }
214
+
215
+ return result(NetworkDeviceReachability.Pending);
216
+ }
217
+
218
+ return result(
219
+ isStale ? NetworkDeviceReachability.Down : NetworkDeviceReachability.Up,
220
+ );
221
+ }
222
+
223
+ // Shorthand for callers that only render the pill.
224
+ public static getStatus(
225
+ device: DeviceReachabilityInput,
226
+ now?: Date | undefined,
227
+ ): NetworkDeviceReachability {
228
+ return DeviceReachabilityUtil.getReachability(device, now).status;
229
+ }
230
+ }
231
+
232
+ /*
233
+ * Tolerant of everything an API payload can carry in a date column: a Date,
234
+ * an ISO string, the serialized {_type, value} form, null, undefined and the
235
+ * empty string. Anything unparseable reads as "not set" rather than as an
236
+ * Invalid Date that would silently compare false against every window.
237
+ */
238
+ function toDate(value: Date | string | null | undefined): Date | null {
239
+ if (value === null || value === undefined || value === "") {
240
+ return null;
241
+ }
242
+
243
+ const parsed: Date = OneUptimeDate.fromString(value);
244
+
245
+ if (!(parsed instanceof Date) || Number.isNaN(parsed.getTime())) {
246
+ return null;
247
+ }
248
+
249
+ return parsed;
250
+ }
251
+
252
+ function newerOf(first: Date | null, second: Date | null): Date | null {
253
+ if (!first) {
254
+ return second;
255
+ }
256
+
257
+ if (!second) {
258
+ return first;
259
+ }
260
+
261
+ return first.getTime() >= second.getTime() ? first : second;
262
+ }
@@ -1,3 +1,7 @@
1
+ import DeviceReachabilityUtil, {
2
+ NetworkDeviceReachability,
3
+ } from "../NetworkDevice/DeviceReachabilityUtil";
4
+
1
5
  /*
2
6
  * Worst-of health rollup for a NetworkSite's device subtree.
3
7
  *
@@ -16,8 +20,17 @@ export interface DeviceHealthState {
16
20
  currentMonitorStatusId?: string | null | undefined;
17
21
  // Priority of that status row; missing when the row no longer exists.
18
22
  monitorStatusPriority?: number | null | undefined;
19
- // Last SNMP contact; drives the freshness fallback for unmonitored devices.
23
+ /*
24
+ * The SNMP fallback for devices no monitor stamps, resolved by the shared
25
+ * DeviceReachabilityUtil rule: the OUTCOME of the last poll, not the age
26
+ * of the last success. Rolling a site up from freshness alone is what
27
+ * turned "the probe is behind on a 900-device fleet" into a red site card
28
+ * over devices that were all answering.
29
+ */
30
+ isReachable?: boolean | null | undefined;
31
+ lastPolledAt?: Date | null | undefined;
20
32
  lastSeenAt?: Date | null | undefined;
33
+ pollingIntervalInMinutes?: number | null | undefined;
21
34
  }
22
35
 
23
36
  // A project MonitorStatus row a freshness fallback can resolve to.
@@ -27,32 +40,27 @@ export interface RollupStatusOption {
27
40
  }
28
41
 
29
42
  export class SiteStatusRollupUtil {
30
- // A device is considered alive when SNMP data arrived within this window.
31
- public static readonly DEFAULT_FRESHNESS_WINDOW_IN_MINUTES: number = 15;
32
-
33
43
  /*
34
44
  * Returns the winning MonitorStatus id for a set of devices, or null when
35
- * no device contributes anything (empty subtree, or freshness fallbacks
36
- * unavailable because the project has no operational/offline rows) - the
37
- * caller treats null as "leave the site's status untouched".
45
+ * no device contributes anything (empty subtree, or fallbacks unavailable
46
+ * because the project has no operational/offline rows) - the caller
47
+ * treats null as "leave the site's status untouched".
38
48
  *
39
49
  * Per device: a stamped monitor status (with a known priority) wins;
40
- * otherwise lastSeenAt within the freshness window maps to the project's
41
- * isOperationalState row and anything staler (or never seen) maps to the
42
- * isOfflineState row. Priority ties keep the first contributor (stable).
50
+ * otherwise the device's SNMP reachability maps Up to the project's
51
+ * isOperationalState row and Down to its isOfflineState row. A device
52
+ * that has never been polled contributes nothing at all - it is not
53
+ * evidence of an outage, and counting it as one used to pin a site red
54
+ * for as long as it took the first walk to land. Priority ties keep the
55
+ * first contributor (stable).
43
56
  */
44
57
  public static worstStatus(data: {
45
58
  deviceStates: Array<DeviceHealthState>;
46
59
  operationalStatus?: RollupStatusOption | null | undefined;
47
60
  offlineStatus?: RollupStatusOption | null | undefined;
48
61
  now?: Date | undefined;
49
- freshnessWindowInMinutes?: number | undefined;
50
62
  }): string | null {
51
63
  const now: Date = data.now || new Date();
52
- const windowInMinutes: number =
53
- data.freshnessWindowInMinutes ??
54
- SiteStatusRollupUtil.DEFAULT_FRESHNESS_WINDOW_IN_MINUTES;
55
- const windowInMs: number = windowInMinutes * 60 * 1000;
56
64
 
57
65
  let winner: RollupStatusOption | null = null;
58
66
 
@@ -69,16 +77,25 @@ export class SiteStatusRollupUtil {
69
77
  priority: device.monitorStatusPriority,
70
78
  };
71
79
  } else {
72
- const lastSeenAtInMs: number | null = device.lastSeenAt
73
- ? new Date(device.lastSeenAt).getTime()
74
- : null;
75
- const isFresh: boolean =
76
- lastSeenAtInMs !== null &&
77
- now.getTime() - lastSeenAtInMs <= windowInMs;
80
+ const reachability: NetworkDeviceReachability =
81
+ DeviceReachabilityUtil.getStatus(
82
+ {
83
+ isReachable: device.isReachable,
84
+ lastPolledAt: device.lastPolledAt,
85
+ lastSeenAt: device.lastSeenAt,
86
+ pollingIntervalInMinutes: device.pollingIntervalInMinutes,
87
+ },
88
+ now,
89
+ );
90
+
91
+ if (reachability === NetworkDeviceReachability.Pending) {
92
+ continue;
93
+ }
78
94
 
79
- candidate = isFresh
80
- ? data.operationalStatus || null
81
- : data.offlineStatus || null;
95
+ candidate =
96
+ reachability === NetworkDeviceReachability.Up
97
+ ? data.operationalStatus || null
98
+ : data.offlineStatus || null;
82
99
  }
83
100
 
84
101
  if (!candidate) {
@@ -1,4 +1,9 @@
1
1
  import Dictionary from "../../Types/Dictionary";
2
+ import {
3
+ RESOURCE_ENTITY_FACET_KEYS,
4
+ ResourceEntityFacetSelections,
5
+ isResourceEntityFacetKey,
6
+ } from "../../Types/Telemetry/ResourceEntityFacet";
2
7
  import OneUptimeDate from "../../Types/Date";
3
8
  import TimeRange from "../../Types/Time/TimeRange";
4
9
  import MetricExplorerUrl, {
@@ -61,6 +66,16 @@ const WHITESPACE: RegExp = /\s/;
61
66
  export interface TelemetryCrossSignalScope {
62
67
  /** Service ObjectID strings (Log/Span `primaryEntityId` values). */
63
68
  serviceIds?: Array<string> | undefined;
69
+ /**
70
+ * Non-Service resource selections keyed by facet — e.g.
71
+ * `{ kubernetesClusterId: ["<id>"] }`. Deliberately NOT merged into
72
+ * `serviceIds`: a host or cluster id is not a `primaryEntityId` value for
73
+ * telemetry that carries a `service.name`, so it has to reach the target
74
+ * explorer as its own facet and be resolved to the resource's entity key
75
+ * there. Both the logs and the traces `filters` grammar carry arbitrary
76
+ * facet keys, so these survive the trip intact.
77
+ */
78
+ resourceFacetSelections?: ResourceEntityFacetSelections | undefined;
64
79
  /** Exact-match telemetry attribute filters. Keys may contain dots. */
65
80
  attributes?: Dictionary<string> | undefined;
66
81
  traceIds?: Array<string> | undefined;
@@ -165,6 +180,36 @@ function sanitizeAttributeEntries(
165
180
  return entries;
166
181
  }
167
182
 
183
+ /*
184
+ * Drop unknown facet keys and blank ids from a resource selection map. An
185
+ * unknown key would become a filter chip the target explorer cannot compile
186
+ * (it would land as an unknown column predicate), so it is reported as
187
+ * dropped by the callers instead of being emitted.
188
+ */
189
+ function sanitizeResourceFacetSelections(
190
+ selections: ResourceEntityFacetSelections | undefined,
191
+ ): Array<[string, Array<string>]> {
192
+ if (!selections) {
193
+ return [];
194
+ }
195
+
196
+ const entries: Array<[string, Array<string>]> = [];
197
+
198
+ for (const facetKey of RESOURCE_ENTITY_FACET_KEYS) {
199
+ if (!isResourceEntityFacetKey(facetKey)) {
200
+ continue;
201
+ }
202
+
203
+ const values: Array<string> = sanitizeValues(selections[facetKey]);
204
+
205
+ if (values.length > 0) {
206
+ entries.push([facetKey, values]);
207
+ }
208
+ }
209
+
210
+ return entries;
211
+ }
212
+
168
213
  function isValidDate(value: Date | undefined): value is Date {
169
214
  return value instanceof Date && !isNaN(value.getTime());
170
215
  }
@@ -250,6 +295,12 @@ export function toLogsExplorerQueryParams(
250
295
  tuples.push(["primaryEntityId", serviceIds]);
251
296
  }
252
297
 
298
+ for (const [facetKey, values] of sanitizeResourceFacetSelections(
299
+ scope.resourceFacetSelections,
300
+ )) {
301
+ tuples.push([facetKey, values]);
302
+ }
303
+
253
304
  const traceIds: Array<string> = sanitizeValues(scope.traceIds);
254
305
 
255
306
  if (traceIds.length > 0) {
@@ -372,6 +423,19 @@ export function toTracesExplorerQueryParams(
372
423
  filterTuples.push(["primaryEntityId", serviceId]);
373
424
  }
374
425
 
426
+ /*
427
+ * The traces `filters` grammar is one [key, value] pair per chip, so a
428
+ * multi-valued selection fans out into one chip per id — the explorer
429
+ * groups same-key chips back into a single facet selection.
430
+ */
431
+ for (const [facetKey, values] of sanitizeResourceFacetSelections(
432
+ scope.resourceFacetSelections,
433
+ )) {
434
+ for (const value of values) {
435
+ filterTuples.push([facetKey, value]);
436
+ }
437
+ }
438
+
375
439
  for (const [key, value] of sanitizeAttributeEntries(scope.attributes)) {
376
440
  const tokenValue: string | null = isTraceTokenSafeKey(key)
377
441
  ? buildTraceSearchTokenValue(value)
@@ -438,10 +502,11 @@ export function toTracesExplorerQueryParams(
438
502
  * Custom by the absolute params alone — see MetricExplorerUrl). The
439
503
  * optional `metricName` argument names the query.
440
504
  *
441
- * Dropped: serviceIds, traceIds, spanIds, severityTexts — the metric
442
- * explorer's URL grammar has no service / trace / span / severity
443
- * dimension (metrics carry a primaryEntityId column, but the explorer only
444
- * parses metricName + attributes out of `metricQueries`).
505
+ * Dropped: serviceIds, resourceFacetSelections, traceIds, spanIds,
506
+ * severityTexts — the metric explorer's URL grammar has no service /
507
+ * resource / trace / span / severity dimension (metrics carry a
508
+ * primaryEntityId column, but the explorer only parses metricName +
509
+ * attributes out of `metricQueries`).
445
510
  */
446
511
  export function toMetricsExplorerQueryParams(
447
512
  scope: TelemetryCrossSignalScope,
@@ -484,6 +549,12 @@ export function toMetricsExplorerQueryParams(
484
549
  dropped.push("serviceIds");
485
550
  }
486
551
 
552
+ for (const [facetKey] of sanitizeResourceFacetSelections(
553
+ scope.resourceFacetSelections,
554
+ )) {
555
+ dropped.push(facetKey);
556
+ }
557
+
487
558
  if (sanitizeValues(scope.traceIds).length > 0) {
488
559
  dropped.push("traceIds");
489
560
  }