@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
@@ -5,6 +5,12 @@ import { SeverityNumber } from "@opentelemetry/api-logs";
5
5
  import Exception from "../../Types/Exception/Exception";
6
6
  import { JSONObject } from "../../Types/JSON";
7
7
  import ConfigLogLevel from "../Types/ConfigLogLevel";
8
+ import {
9
+ REDACTED,
10
+ isSensitiveLogKey,
11
+ redactLogString,
12
+ redactLogValue,
13
+ } from "./LogRedaction";
8
14
 
9
15
  export type LogBody = string | JSONObject | Exception | Error | unknown;
10
16
 
@@ -68,9 +74,10 @@ export default class logger {
68
74
  private static readonly recentLogTrimSlack: number = 256;
69
75
  private static readonly maxRecentLogMessageLength: number = 4000;
70
76
 
77
+ // `body` has already been through redactBody -- see the level methods.
71
78
  private static record(level: string, body: LogBody): void {
72
79
  try {
73
- const message: string = this.serializeLogBody(body);
80
+ const message: string = this.serializeRedactedBody(body);
74
81
 
75
82
  this.recentLogs.push({
76
83
  time: new Date().toISOString(),
@@ -114,13 +121,71 @@ export default class logger {
114
121
  return LogLevel;
115
122
  }
116
123
 
117
- public static serializeLogBody(body: LogBody): string {
118
- if (typeof body === "string") {
119
- return body;
120
- } else if (body instanceof Exception || body instanceof Error) {
121
- return body.message;
124
+ /*
125
+ * Turns a body into a redacted copy, once, before it is handed to any sink.
126
+ * Every level method calls this and then passes the RESULT to console, to
127
+ * the recent-log buffer and to telemetry, so a log record is redacted a
128
+ * single time no matter how many places it ends up in.
129
+ *
130
+ * Objects come back as plain redacted copies, so console keeps printing them
131
+ * as objects rather than as a JSON string.
132
+ *
133
+ * Errors are special-cased: when nothing in the message or the stack needed
134
+ * redacting -- the overwhelmingly common case -- the original Error is
135
+ * returned untouched, so console still renders a real stack trace.
136
+ */
137
+ private static redactBody(body: LogBody): LogBody {
138
+ try {
139
+ if (typeof body === "string") {
140
+ return redactLogString(body);
141
+ }
142
+
143
+ if (body instanceof Exception || body instanceof Error) {
144
+ const originalStack: string = body.stack || "";
145
+ const message: string = redactLogString(body.message);
146
+ const stack: string = redactLogString(originalStack);
147
+
148
+ if (message === body.message && stack === originalStack) {
149
+ return body;
150
+ }
151
+
152
+ return stack || `${body.name}: ${message}`;
153
+ }
154
+
155
+ return redactLogValue(body) as LogBody;
156
+ } catch {
157
+ // Never pass on a body we could not prove was redacted.
158
+ return REDACTED;
122
159
  }
123
- return JSON.stringify(body);
160
+ }
161
+
162
+ // Serialization only. The body must already have been through redactBody.
163
+ private static serializeRedactedBody(body: LogBody): string {
164
+ try {
165
+ if (typeof body === "string") {
166
+ return body;
167
+ } else if (body instanceof Exception || body instanceof Error) {
168
+ return body.message;
169
+ }
170
+
171
+ /*
172
+ * redactBody swept every string inside this copy already, so stringifying
173
+ * it needs no second textual pass.
174
+ */
175
+ const serialized: string | undefined = JSON.stringify(body);
176
+
177
+ return serialized === undefined ? "" : serialized;
178
+ } catch {
179
+ return REDACTED;
180
+ }
181
+ }
182
+
183
+ /*
184
+ * Redacts and serializes in one step, for callers outside the level methods
185
+ * that hold a raw body.
186
+ */
187
+ public static serializeLogBody(body: LogBody): string {
188
+ return this.serializeRedactedBody(this.redactBody(body));
124
189
  }
125
190
 
126
191
  private static sanitizeAttributes(
@@ -136,7 +201,16 @@ export default class logger {
136
201
  for (const key in attributes) {
137
202
  const value: string | number | boolean | undefined = attributes[key];
138
203
 
139
- if (value !== undefined && value !== null) {
204
+ if (value === undefined || value === null) {
205
+ continue;
206
+ }
207
+
208
+ // Attributes are a log sink too, and they travel to telemetry verbatim.
209
+ if (isSensitiveLogKey(key, value)) {
210
+ sanitized[key] = REDACTED;
211
+ } else if (typeof value === "string") {
212
+ sanitized[key] = redactLogString(value);
213
+ } else {
140
214
  sanitized[key] = value;
141
215
  }
142
216
  }
@@ -151,16 +225,14 @@ export default class logger {
151
225
  const logLevel: ConfigLogLevel = this.getLogLevel();
152
226
 
153
227
  if (logLevel === ConfigLogLevel.DEBUG || logLevel === ConfigLogLevel.INFO) {
228
+ const body: LogBody = this.redactBody(message);
229
+
154
230
  // eslint-disable-next-line no-console
155
- console.info(message);
231
+ console.info(body);
156
232
 
157
- this.record("INFO", message);
233
+ this.record("INFO", body);
158
234
 
159
- this.emit({
160
- body: message,
161
- severityNumber: SeverityNumber.INFO,
162
- attributes,
163
- });
235
+ this.emitRedacted(body, SeverityNumber.INFO, attributes);
164
236
  }
165
237
  }
166
238
 
@@ -173,16 +245,14 @@ export default class logger {
173
245
  logLevel === ConfigLogLevel.WARN ||
174
246
  logLevel === ConfigLogLevel.ERROR
175
247
  ) {
248
+ const body: LogBody = this.redactBody(message);
249
+
176
250
  // eslint-disable-next-line no-console
177
- console.error(message);
251
+ console.error(body);
178
252
 
179
- this.record("ERROR", message);
253
+ this.record("ERROR", body);
180
254
 
181
- this.emit({
182
- body: message,
183
- severityNumber: SeverityNumber.ERROR,
184
- attributes,
185
- });
255
+ this.emitRedacted(body, SeverityNumber.ERROR, attributes);
186
256
  }
187
257
  }
188
258
 
@@ -194,16 +264,14 @@ export default class logger {
194
264
  logLevel === ConfigLogLevel.INFO ||
195
265
  logLevel === ConfigLogLevel.WARN
196
266
  ) {
267
+ const body: LogBody = this.redactBody(message);
268
+
197
269
  // eslint-disable-next-line no-console
198
- console.warn(message);
270
+ console.warn(body);
199
271
 
200
- this.record("WARN", message);
272
+ this.record("WARN", body);
201
273
 
202
- this.emit({
203
- body: message,
204
- severityNumber: SeverityNumber.WARN,
205
- attributes,
206
- });
274
+ this.emitRedacted(body, SeverityNumber.WARN, attributes);
207
275
  }
208
276
  }
209
277
 
@@ -211,16 +279,14 @@ export default class logger {
211
279
  const logLevel: ConfigLogLevel = this.getLogLevel();
212
280
 
213
281
  if (logLevel === ConfigLogLevel.DEBUG) {
282
+ const body: LogBody = this.redactBody(message);
283
+
214
284
  // eslint-disable-next-line no-console
215
- console.debug(message);
285
+ console.debug(body);
216
286
 
217
- this.record("DEBUG", message);
287
+ this.record("DEBUG", body);
218
288
 
219
- this.emit({
220
- body: message,
221
- severityNumber: SeverityNumber.DEBUG,
222
- attributes,
223
- });
289
+ this.emitRedacted(body, SeverityNumber.DEBUG, attributes);
224
290
  }
225
291
  }
226
292
 
@@ -229,6 +295,19 @@ export default class logger {
229
295
  severityNumber: SeverityNumber;
230
296
  attributes?: LogAttributes | undefined;
231
297
  }): void {
298
+ this.emitRedacted(
299
+ this.redactBody(data.body),
300
+ data.severityNumber,
301
+ data.attributes,
302
+ );
303
+ }
304
+
305
+ // `body` must already have been through redactBody.
306
+ private static emitRedacted(
307
+ body: LogBody,
308
+ severityNumber: SeverityNumber,
309
+ attributes?: LogAttributes | undefined,
310
+ ): void {
232
311
  try {
233
312
  const logger: TelemetryLogger | null = OneUptimeTelemetry.getLogger();
234
313
 
@@ -243,7 +322,7 @@ export default class logger {
243
322
  */
244
323
  const mergedAttributes: LogAttributes = {
245
324
  ...TelemetryContext.getAttributes(),
246
- ...(data.attributes || {}),
325
+ ...(attributes || {}),
247
326
  };
248
327
 
249
328
  const sanitizedAttributes:
@@ -251,8 +330,8 @@ export default class logger {
251
330
  | undefined = this.sanitizeAttributes(mergedAttributes);
252
331
 
253
332
  logger.emit({
254
- body: this.serializeLogBody(data.body),
255
- severityNumber: data.severityNumber,
333
+ body: this.serializeRedactedBody(body),
334
+ severityNumber: severityNumber,
256
335
  ...(sanitizedAttributes ? { attributes: sanitizedAttributes } : {}),
257
336
  });
258
337
  } catch {
@@ -264,16 +343,14 @@ export default class logger {
264
343
  const logLevel: ConfigLogLevel = this.getLogLevel();
265
344
 
266
345
  if (logLevel === ConfigLogLevel.DEBUG) {
346
+ const body: LogBody = this.redactBody(message);
347
+
267
348
  // eslint-disable-next-line no-console
268
- console.trace(message);
349
+ console.trace(body);
269
350
 
270
- this.record("TRACE", message);
351
+ this.record("TRACE", body);
271
352
 
272
- this.emit({
273
- body: message,
274
- severityNumber: SeverityNumber.DEBUG,
275
- attributes,
276
- });
353
+ this.emitRedacted(body, SeverityNumber.DEBUG, attributes);
277
354
  }
278
355
  }
279
356
  }
@@ -160,36 +160,33 @@ export default class IncomingRequestCriteria {
160
160
  }
161
161
 
162
162
  if (input.criteriaFilter.checkOn === CheckOn.RequestBody) {
163
- let responseBody: string | JSONObject | undefined = (
163
+ let requestBody: string | JSONObject | undefined = (
164
164
  input.dataToProcess as IncomingMonitorRequest
165
165
  ).requestBody;
166
166
 
167
- if (responseBody && typeof responseBody === Typeof.Object) {
168
- responseBody = JSON.stringify(responseBody);
167
+ if (requestBody && typeof requestBody === Typeof.Object) {
168
+ requestBody = JSON.stringify(requestBody);
169
169
  }
170
170
 
171
- if (!responseBody) {
172
- return null;
173
- }
171
+ /*
172
+ * A request that carried no body is an empty body, not an unknown one.
173
+ * Normalising to "" (the same thing IncomingEmailCriteria does for the
174
+ * email fields) is what lets a "Not Contains" filter match a bodiless
175
+ * heartbeat ping - the default online criteria for this monitor type.
176
+ * "Contains" is unaffected: "" contains nothing.
177
+ */
178
+ const body: string = (requestBody as string | undefined) || "";
174
179
 
175
180
  // contains
176
181
  if (input.criteriaFilter.filterType === FilterType.Contains) {
177
- if (
178
- value &&
179
- responseBody &&
180
- (responseBody as string).includes(value as string)
181
- ) {
182
+ if (value && body.includes(value as string)) {
182
183
  return `Request body contains ${value}.`;
183
184
  }
184
185
  return null;
185
186
  }
186
187
 
187
188
  if (input.criteriaFilter.filterType === FilterType.NotContains) {
188
- if (
189
- value &&
190
- responseBody &&
191
- !(responseBody as string).includes(value as string)
192
- ) {
189
+ if (value && !body.includes(value as string)) {
193
190
  return `Request body does not contain ${value}.`;
194
191
  }
195
192
  return null;
@@ -78,16 +78,8 @@ export default class ServerMonitorCriteria {
78
78
  }
79
79
 
80
80
  if (input.criteriaFilter.checkOn === CheckOn.IsValidCertificate) {
81
- const isValidCertificate: boolean = Boolean(
82
- sslResponse &&
83
- dataToProcess.isOnline &&
84
- sslResponse.expiresAt &&
85
- !sslResponse.isSelfSigned &&
86
- OneUptimeDate.isAfter(
87
- sslResponse.expiresAt,
88
- OneUptimeDate.getCurrentDate(),
89
- ),
90
- );
81
+ const isValidCertificate: boolean =
82
+ ServerMonitorCriteria.isValidCertificate(dataToProcess);
91
83
 
92
84
  const isTrue: boolean =
93
85
  input.criteriaFilter.filterType === FilterType.True;
@@ -100,7 +92,7 @@ export default class ServerMonitorCriteria {
100
92
  }
101
93
 
102
94
  if (!isValidCertificate && isFalse) {
103
- return "SSL certificate is not valid.";
95
+ return ServerMonitorCriteria.invalidCertificateReason(dataToProcess);
104
96
  }
105
97
  }
106
98
 
@@ -149,18 +141,19 @@ export default class ServerMonitorCriteria {
149
141
  }
150
142
 
151
143
  if (input.criteriaFilter.checkOn === CheckOn.IsNotAValidCertificate) {
144
+ /*
145
+ * The exact complement of IsValidCertificate, by construction.
146
+ *
147
+ * These two used to be computed independently, and both came out
148
+ * false whenever expiresAt was missing or unparseable - so a
149
+ * certificate the probe could not fully read satisfied NEITHER
150
+ * "valid" nor "not valid", every criterion went unmatched, and the
151
+ * monitor silently stayed at its default status. Deriving one from
152
+ * the other makes that state unreachable.
153
+ */
152
154
  const isNotValid: boolean =
153
- !sslResponse ||
154
- !dataToProcess.isOnline ||
155
- Boolean(
156
- sslResponse &&
157
- sslResponse.expiresAt &&
158
- (sslResponse.isSelfSigned ||
159
- OneUptimeDate.isBefore(
160
- sslResponse.expiresAt,
161
- OneUptimeDate.getCurrentDate(),
162
- )),
163
- );
155
+ !ServerMonitorCriteria.isValidCertificate(dataToProcess);
156
+
164
157
  const isTrue: boolean =
165
158
  input.criteriaFilter.filterType === FilterType.True;
166
159
 
@@ -168,7 +161,7 @@ export default class ServerMonitorCriteria {
168
161
  input.criteriaFilter.filterType === FilterType.False;
169
162
 
170
163
  if (isNotValid && isTrue) {
171
- return "SSL certificate is not valid.";
164
+ return ServerMonitorCriteria.invalidCertificateReason(dataToProcess);
172
165
  }
173
166
 
174
167
  if (!isNotValid && isFalse) {
@@ -230,4 +223,82 @@ export default class ServerMonitorCriteria {
230
223
 
231
224
  return null;
232
225
  }
226
+
227
+ /*
228
+ * The single source of truth for "is this certificate trustworthy",
229
+ * shared by IsValidCertificate and IsNotAValidCertificate so the two can
230
+ * never both be false for the same response.
231
+ *
232
+ * The probe now records the strict-TLS verdict explicitly on
233
+ * sslResponse.isValidCertificate. Responses written before that field
234
+ * existed (rows already in MonitorProbe.lastMonitoringLog, and any probe
235
+ * still running an older build) do not carry it, so the pre-existing
236
+ * heuristic is kept as the fallback rather than treating those as
237
+ * invalid and flipping healthy monitors to Down on upgrade.
238
+ */
239
+ private static isValidCertificate(
240
+ dataToProcess: ProbeMonitorResponse,
241
+ ): boolean {
242
+ const sslResponse: SslMonitorResponse | undefined =
243
+ dataToProcess.sslResponse;
244
+
245
+ if (!sslResponse || !dataToProcess.isOnline) {
246
+ return false;
247
+ }
248
+
249
+ if (sslResponse.isValidCertificate !== undefined) {
250
+ return Boolean(sslResponse.isValidCertificate);
251
+ }
252
+
253
+ // Legacy payload: fall back to what could be inferred before.
254
+ return Boolean(
255
+ sslResponse.expiresAt &&
256
+ !sslResponse.isSelfSigned &&
257
+ OneUptimeDate.isAfter(
258
+ sslResponse.expiresAt,
259
+ OneUptimeDate.getCurrentDate(),
260
+ ),
261
+ );
262
+ }
263
+
264
+ /*
265
+ * Names WHY the certificate is not trustworthy. The root cause is what
266
+ * reaches the incident and the person paged by it, so "SSL certificate is
267
+ * not valid" on its own is not good enough when the probe knows it was a
268
+ * hostname mismatch.
269
+ */
270
+ private static invalidCertificateReason(
271
+ dataToProcess: ProbeMonitorResponse,
272
+ ): string {
273
+ const sslResponse: SslMonitorResponse | undefined =
274
+ dataToProcess.sslResponse;
275
+
276
+ if (!dataToProcess.isOnline) {
277
+ return "SSL certificate could not be checked because the endpoint is not reachable.";
278
+ }
279
+
280
+ if (!sslResponse) {
281
+ return "SSL certificate is not valid.";
282
+ }
283
+
284
+ if (sslResponse.certificateValidationError) {
285
+ return `SSL certificate is not valid: ${sslResponse.certificateValidationError}`;
286
+ }
287
+
288
+ if (sslResponse.isSelfSigned) {
289
+ return "SSL certificate is not valid: the certificate is self signed.";
290
+ }
291
+
292
+ if (
293
+ sslResponse.expiresAt &&
294
+ OneUptimeDate.isBefore(
295
+ sslResponse.expiresAt,
296
+ OneUptimeDate.getCurrentDate(),
297
+ )
298
+ ) {
299
+ return "SSL certificate is not valid: the certificate has expired.";
300
+ }
301
+
302
+ return "SSL certificate is not valid.";
303
+ }
233
304
  }
@@ -24,11 +24,11 @@ import NetworkDeviceOwnerUserService, {
24
24
  import logger, { LogAttributes } from "../Logger";
25
25
  import CaptureSpan from "../Telemetry/CaptureSpan";
26
26
  import DataToProcess from "./DataToProcess";
27
- import MonitorClusterContextUtil, {
28
- MonitorClusterContext,
29
- } from "./MonitorClusterContext";
27
+ import MonitorResourceContextUtil from "./MonitorResourceContext";
30
28
  import MonitorTemplateUtil from "./MonitorTemplateUtil";
31
- import SeriesResourceLinker from "./SeriesResourceLinker";
29
+ import SeriesResourceLinker, {
30
+ SeriesResolvedResourceIds,
31
+ } from "./SeriesResourceLinker";
32
32
  import MonitorDependencySuppression, {
33
33
  DependencySuppressionResult,
34
34
  } from "./MonitorDependencySuppression";
@@ -322,15 +322,17 @@ export default class MonitorAlert {
322
322
  }
323
323
 
324
324
  /*
325
- * Proxmox/Ceph monitors: resolve the monitored cluster once per
326
- * evaluation (lookup-only, from the step config's clusterIdentifier)
327
- * so every alert created below is attached to it. Series labels
328
- * cannot supply this they carry datapoint labels (`id`,
329
- * `ceph_daemon`, `pool_id`), not cluster identity, and ungrouped
330
- * templates have no series at all. No-op for other monitor types.
325
+ * Resolve the resources this monitor's own config names — its host,
326
+ * cluster, fleet, telemetry services, or the resource its metric
327
+ * filters scope it to once per evaluation, so every alert created
328
+ * below is attached to them. Series labels cannot supply this: they
329
+ * only exist for grouped criteria, and most monitors (every shipped
330
+ * Host/Docker/Podman template, all Logs/Traces/Exceptions monitors)
331
+ * are ungrouped. No-op, and no round-trip, for monitor types whose
332
+ * config names no resource.
331
333
  */
332
- const clusterContext: MonitorClusterContext =
333
- await MonitorClusterContextUtil.resolveClusterContextForMonitor({
334
+ const resourceContext: SeriesResolvedResourceIds =
335
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
334
336
  monitor: input.monitor,
335
337
  });
336
338
 
@@ -556,21 +558,22 @@ export default class MonitorAlert {
556
558
  model: alert,
557
559
  seriesLabels,
558
560
  projectId: input.monitor.projectId!,
561
+ monitorType: input.monitor.monitorType,
559
562
  });
560
563
  }
561
564
 
562
565
  /*
563
- * Deterministic Proxmox/Ceph/Swarm/IoT cluster link from the
564
- * monitor's step config (resolved once above). The shipped
565
- * templates for those monitor types group by datapoint labels
566
- * that carry no cluster identity, so this — not the label path
567
- * above is what makes the per-cluster Activity tabs and badge
568
- * counts see monitor-created alerts. Runs for both grouped and
569
- * ungrouped alerts, and merges with whatever the labels resolved.
566
+ * Deterministic resource link from the monitor's step config
567
+ * (resolved once above). For most monitor types this — not the
568
+ * label path above is what makes the per-resource Activity
569
+ * tabs and badge counts see monitor-created alerts, because
570
+ * their criteria are ungrouped and emit no series labels at
571
+ * all. Runs for both grouped and ungrouped alerts, and merges
572
+ * with whatever the labels resolved.
570
573
  */
571
- SeriesResourceLinker.attachClusterContext({
574
+ SeriesResourceLinker.attachResolvedResources({
572
575
  model: alert,
573
- clusterContext,
576
+ resolved: resourceContext,
574
577
  });
575
578
 
576
579
  alert.onCallDutyPolicies =
@@ -37,10 +37,10 @@ import MonitorSummarySnapshot from "../../../Types/Monitor/MonitorSummarySnapsho
37
37
  import MonitorSummarySnapshotUtil from "../../../Utils/Monitor/MonitorSummarySnapshotUtil";
38
38
  import { IncidentMemberRoleAssignment } from "../../../Types/Monitor/CriteriaIncident";
39
39
  import { PerSeriesCriteriaMatch } from "../../../Types/Probe/ProbeApiIngestResponse";
40
- import MonitorClusterContextUtil, {
41
- MonitorClusterContext,
42
- } from "./MonitorClusterContext";
43
- import SeriesResourceLinker from "./SeriesResourceLinker";
40
+ import MonitorResourceContextUtil from "./MonitorResourceContext";
41
+ import SeriesResourceLinker, {
42
+ SeriesResolvedResourceIds,
43
+ } from "./SeriesResourceLinker";
44
44
 
45
45
  export default class MonitorIncident {
46
46
  @CaptureSpan()
@@ -364,15 +364,17 @@ export default class MonitorIncident {
364
364
  }
365
365
 
366
366
  /*
367
- * Proxmox/Ceph monitors: resolve the monitored cluster once per
368
- * evaluation (lookup-only, from the step config's clusterIdentifier)
369
- * so every incident created below is attached to it. Series labels
370
- * cannot supply this they carry datapoint labels (`id`,
371
- * `ceph_daemon`, `pool_id`), not cluster identity, and ungrouped
372
- * templates have no series at all. No-op for other monitor types.
367
+ * Resolve the resources this monitor's own config names — its host,
368
+ * cluster, fleet, telemetry services, or the resource its metric
369
+ * filters scope it to once per evaluation, so every incident
370
+ * created below is attached to them. Series labels cannot supply
371
+ * this: they only exist for grouped criteria, and most monitors
372
+ * (every shipped Host/Docker/Podman template, all Logs/Traces/
373
+ * Exceptions monitors) are ungrouped. No-op, and no round-trip, for
374
+ * monitor types whose config names no resource.
373
375
  */
374
- const clusterContext: MonitorClusterContext =
375
- await MonitorClusterContextUtil.resolveClusterContextForMonitor({
376
+ const resourceContext: SeriesResolvedResourceIds =
377
+ await MonitorResourceContextUtil.resolveResourceContextForMonitor({
376
378
  monitor: input.monitor,
377
379
  });
378
380
 
@@ -656,19 +658,20 @@ export default class MonitorIncident {
656
658
  model: incident,
657
659
  seriesLabels,
658
660
  projectId: input.monitor.projectId!,
661
+ monitorType: input.monitor.monitorType,
659
662
  });
660
663
  }
661
664
 
662
665
  /*
663
- * Deterministic Proxmox/Ceph cluster link from the monitor's
664
- * step config (resolved once above). Runs for both grouped and
665
- * ungrouped incidents and merges with anything the series-label
666
- * path resolved, so the per-cluster Activity tabs always see
666
+ * Deterministic resource link from the monitor's step config
667
+ * (resolved once above). Runs for both grouped and ungrouped
668
+ * incidents and merges with anything the series-label path
669
+ * resolved, so the per-resource Activity tabs always see
667
670
  * monitor-created incidents.
668
671
  */
669
- SeriesResourceLinker.attachClusterContext({
672
+ SeriesResourceLinker.attachResolvedResources({
670
673
  model: incident,
671
- clusterContext,
674
+ resolved: resourceContext,
672
675
  });
673
676
 
674
677
  incident.onCallDutyPolicies =
@@ -636,7 +636,16 @@ export default class MonitorResourceUtil {
636
636
  }
637
637
  }
638
638
 
639
- const monitorStep: MonitorStep | undefined =
639
+ /*
640
+ * The step this result was actually produced for. A probe result carries
641
+ * the monitorStepId it ran, and a monitor can have several steps whose
642
+ * criteria differ - so the step must be looked up, not assumed to be the
643
+ * first one. The lookup used to be performed and its result thrown away,
644
+ * which silently evaluated every result against step 0's criteria and fed
645
+ * step 0's id into checkProbeAgreement (so agreement compared this
646
+ * result against other probes' logs for the wrong step).
647
+ */
648
+ let monitorStep: MonitorStep | undefined =
640
649
  monitorSteps.data.monitorStepsInstanceArray[0];
641
650
 
642
651
  logger.debug(
@@ -644,14 +653,25 @@ export default class MonitorResourceUtil {
644
653
  );
645
654
 
646
655
  if ((dataToProcess as ProbeMonitorResponse).monitorStepId) {
647
- monitorSteps.data.monitorStepsInstanceArray.find(
648
- (monitorStep: MonitorStep) => {
649
- return (
650
- monitorStep.id.toString() ===
651
- (dataToProcess as ProbeMonitorResponse).monitorStepId.toString()
652
- );
653
- },
654
- );
656
+ const ingestedMonitorStep: MonitorStep | undefined =
657
+ monitorSteps.data.monitorStepsInstanceArray.find(
658
+ (step: MonitorStep) => {
659
+ return (
660
+ step.id.toString() ===
661
+ (dataToProcess as ProbeMonitorResponse).monitorStepId.toString()
662
+ );
663
+ },
664
+ );
665
+
666
+ /*
667
+ * An id that matches no step is stale - the step was deleted after the
668
+ * probe was scheduled. Keep the existing behaviour there and fall back
669
+ * to the first step rather than dropping the result.
670
+ */
671
+ if (ingestedMonitorStep) {
672
+ monitorStep = ingestedMonitorStep;
673
+ }
674
+
655
675
  logger.debug(
656
676
  `Found Monitor Step ID: ${(dataToProcess as ProbeMonitorResponse).monitorStepId}`,
657
677
  );