@oneuptime/common 12.0.13 → 12.0.15

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 (561) hide show
  1. package/Models/DatabaseModels/GlobalOidc.ts +20 -0
  2. package/Models/DatabaseModels/GlobalSso.ts +20 -0
  3. package/Models/DatabaseModels/MarketingConversion.ts +19 -9
  4. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +46 -0
  5. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  6. package/Models/DatabaseModels/StatusPage.ts +7 -4
  7. package/Models/DatabaseModels/UserCall.ts +94 -3
  8. package/Models/DatabaseModels/UserEmail.ts +94 -3
  9. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  10. package/Models/DatabaseModels/UserPush.ts +37 -0
  11. package/Models/DatabaseModels/UserSMS.ts +94 -3
  12. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  13. package/Server/API/BaseAPI.ts +79 -14
  14. package/Server/API/StatusPageAPI.ts +29 -4
  15. package/Server/API/UserCallAPI.ts +53 -45
  16. package/Server/API/UserEmailAPI.ts +53 -44
  17. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  18. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  19. package/Server/API/UserPushAPI.ts +126 -2
  20. package/Server/API/UserSmsAPI.ts +53 -44
  21. package/Server/API/UserWhatsAppAPI.ts +53 -50
  22. package/Server/EnvironmentConfig.ts +7 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.ts +19 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.ts +40 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  29. package/Server/Middleware/SlackAuthorization.ts +43 -6
  30. package/Server/Middleware/UserAuthorization.ts +236 -26
  31. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  32. package/Server/Middleware/WhatsAppAuthorization.ts +43 -3
  33. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  34. package/Server/Services/DatabaseService.ts +101 -0
  35. package/Server/Services/GlobalOidcProjectService.ts +126 -1
  36. package/Server/Services/GlobalOidcService.ts +132 -0
  37. package/Server/Services/GlobalSsoProjectService.ts +126 -1
  38. package/Server/Services/GlobalSsoService.ts +132 -0
  39. package/Server/Services/LogAggregationService.ts +5 -0
  40. package/Server/Services/PushNotificationService.ts +127 -12
  41. package/Server/Services/TeamMemberService.ts +53 -13
  42. package/Server/Services/UserCallService.ts +55 -24
  43. package/Server/Services/UserEmailService.ts +83 -17
  44. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  45. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  46. package/Server/Services/UserNotificationRuleService.ts +26 -0
  47. package/Server/Services/UserPushService.ts +89 -0
  48. package/Server/Services/UserSmsService.ts +50 -17
  49. package/Server/Services/UserWhatsAppService.ts +48 -15
  50. package/Server/Types/Database/QueryHelper.ts +30 -0
  51. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  52. package/Server/Utils/ChannelVerification.ts +510 -0
  53. package/Server/Utils/CronTab.ts +73 -0
  54. package/Server/Utils/GlobalSsoAuthorization.ts +175 -0
  55. package/Server/Utils/Marketing/ConversionUploadProvider.ts +35 -5
  56. package/Server/Utils/Marketing/Providers/GoogleAds.ts +1 -1
  57. package/Server/Utils/Marketing/Providers/LinkedIn.ts +1 -1
  58. package/Server/Utils/Marketing/Providers/Meta.ts +1 -1
  59. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +1 -1
  60. package/Server/Utils/Marketing/Providers/Reddit.ts +1 -1
  61. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +48 -33
  62. package/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.ts +35 -30
  63. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +33 -28
  64. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +475 -47
  65. package/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.ts +35 -30
  66. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +47 -44
  67. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +33 -28
  68. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +69 -40
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +35 -29
  70. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +8 -0
  72. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  73. package/Server/Utils/Monitor/MonitorResource.ts +161 -21
  74. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  75. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  76. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  77. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  78. package/Server/Utils/StatusPageContentSecurityPolicy.ts +56 -0
  79. package/Server/Utils/StatusPageCustomizationAccess.ts +117 -0
  80. package/Server/Utils/TotpAuth.ts +137 -9
  81. package/Server/Utils/UserRegistrationToken.ts +182 -0
  82. package/Server/Utils/VerificationCode.ts +134 -0
  83. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  84. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  85. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  86. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  87. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  88. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  89. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  90. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  91. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  92. package/Tests/Server/API/StatusPageCustomizationOrigin.test.ts +348 -0
  93. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  94. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  95. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  96. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  97. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  98. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +265 -0
  99. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +227 -0
  100. package/Tests/Server/Middleware/SlackAuthorization.test.ts +149 -0
  101. package/Tests/Server/Middleware/UserAuthorization.test.ts +27 -13
  102. package/Tests/Server/Middleware/UserAuthorizationGlobalSsoGovernance.test.ts +1455 -0
  103. package/Tests/Server/Middleware/UserAuthorizationSSOProvider.test.ts +91 -2
  104. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  105. package/Tests/Server/Middleware/WhatsAppAuthorization.test.ts +233 -0
  106. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  107. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  108. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  109. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  110. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  111. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  112. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  113. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +21 -8
  114. package/Tests/Server/Services/GlobalSsoProviderAuthorization.test.ts +1242 -0
  115. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  116. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  117. package/Tests/Server/Services/MonitorResourceProbeAgreementHydration.test.ts +459 -0
  118. package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +10 -0
  119. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  120. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  122. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  123. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  124. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  125. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  126. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  127. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  128. package/Tests/Server/Types/AnalyticsDatabase/AggregateUtilBucketTimestamp.test.ts +416 -0
  129. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  130. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  131. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  132. package/Tests/Server/Types/Database/QueryHelperManyToManyAndEmptyValues.test.ts +551 -0
  133. package/Tests/Server/Types/Database/SelectUtil.test.ts +348 -0
  134. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  135. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  136. package/Tests/Server/Utils/Browser.test.ts +162 -0
  137. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  138. package/Tests/Server/Utils/CronTab.test.ts +116 -0
  139. package/Tests/Server/Utils/Express.test.ts +371 -0
  140. package/Tests/Server/Utils/GlobalSSOToken.test.ts +581 -0
  141. package/Tests/Server/Utils/GlobalSsoAuthorization.test.ts +1401 -0
  142. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +254 -0
  143. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +1 -1
  144. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +508 -0
  145. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +30 -9
  146. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +987 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +916 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  152. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +382 -0
  153. package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +1219 -0
  154. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  155. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  156. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  157. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  158. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +86 -0
  159. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  160. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  163. package/Tests/Server/Utils/StatusPageContentSecurityPolicy.test.ts +136 -0
  164. package/Tests/Server/Utils/StatusPageCustomizationAccess.test.ts +223 -0
  165. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  166. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  167. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  168. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  169. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  170. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  171. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  172. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  173. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  174. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  175. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  176. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  177. package/Tests/Types/Monitor/MonitorStepConfigHelpers.test.ts +165 -0
  178. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  179. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  180. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  181. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  182. package/Tests/Types/NetworkDevice/NetworkDeviceLinkRuleScope.test.ts +215 -0
  183. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  184. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  185. package/Tests/UI/Components/Button.test.tsx +175 -1
  186. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  187. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  188. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  189. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  190. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  191. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  192. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  193. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  194. package/Tests/UI/Components/Forms/FormSubmitAnalytics.test.tsx +206 -0
  195. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  196. package/Tests/UI/Components/List.test.tsx +9 -2
  197. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  198. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  199. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  200. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  201. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  202. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  203. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  204. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  205. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  206. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  207. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  208. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  209. package/Tests/UI/Components/Toast.test.tsx +130 -7
  210. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  211. package/Tests/UI/Utils/AIChatExport/ConversationMarkdown.test.ts +774 -0
  212. package/Tests/UI/Utils/AIChatExport/MarkdownBlocks.test.ts +791 -0
  213. package/Tests/UI/Utils/AIChatExport/MarkdownSafety.test.ts +544 -0
  214. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  215. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  216. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  217. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  218. package/Tests/Utils/API.test.ts +16 -2
  219. package/Tests/Utils/Analytics.test.ts +187 -0
  220. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  221. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  223. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +80 -0
  224. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +1291 -0
  225. package/Tests/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.test.ts +214 -0
  226. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  227. package/Types/Email/EmailTemplateType.ts +1 -0
  228. package/Types/Marketing/MarketingConversion.ts +12 -0
  229. package/Types/Monitor/CriteriaFilter.ts +9 -0
  230. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  231. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  232. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  233. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  234. package/Types/NetworkDevice/NetworkDeviceLinkRuleScope.ts +51 -0
  235. package/Types/Permission.ts +35 -0
  236. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  237. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  238. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  239. package/Types/Service/ServiceLanguage.ts +144 -0
  240. package/Types/Text.ts +111 -19
  241. package/UI/Components/Button/Button.tsx +27 -14
  242. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  243. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  244. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  245. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  246. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  247. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  248. package/UI/Components/CommandPalette/Types.ts +49 -0
  249. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  250. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  251. package/UI/Components/Feed/FeedItem.tsx +1 -1
  252. package/UI/Components/FormModal/BasicFormModal.tsx +12 -0
  253. package/UI/Components/Forms/BasicForm.tsx +13 -1
  254. package/UI/Components/Forms/BasicModelForm.tsx +2 -1
  255. package/UI/Components/Forms/ModelForm.tsx +10 -1
  256. package/UI/Components/Forms/Utils/FormAnalyticsName.ts +39 -0
  257. package/UI/Components/List/List.tsx +37 -5
  258. package/UI/Components/List/ListSkeleton.tsx +54 -0
  259. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  260. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  261. package/UI/Components/Modal/Modal.tsx +2 -2
  262. package/UI/Components/ModelFormModal/ModelFormModal.tsx +6 -1
  263. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  264. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  265. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  266. package/UI/Components/Navbar/NavBar.tsx +14 -1
  267. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  268. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  269. package/UI/Components/SideOver/SideOver.tsx +37 -2
  270. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  271. package/UI/Components/Table/Table.tsx +74 -44
  272. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  273. package/UI/Components/Tabs/Tab.tsx +1 -1
  274. package/UI/Components/Toast/Toast.tsx +118 -53
  275. package/UI/Components/Toast/ToastInit.tsx +82 -32
  276. package/UI/Styles/Theme.css +40 -0
  277. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  278. package/UI/Utils/ModelListCache.ts +188 -0
  279. package/UI/Utils/Project.ts +29 -0
  280. package/Utils/API.ts +6 -1
  281. package/Utils/Analytics.ts +55 -2
  282. package/Utils/Monitor/MonitorMetricType.ts +40 -0
  283. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +587 -37
  284. package/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.ts +115 -0
  285. package/build/dist/Models/DatabaseModels/GlobalOidc.js +21 -0
  286. package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/GlobalSso.js +21 -0
  288. package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/MarketingConversion.js +20 -10
  290. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +47 -0
  292. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  294. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  295. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  296. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  297. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  298. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  299. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  300. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  301. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  302. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  303. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  304. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  305. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  306. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  307. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  308. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  309. package/build/dist/Server/API/BaseAPI.js +69 -13
  310. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  311. package/build/dist/Server/API/StatusPageAPI.js +25 -4
  312. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  313. package/build/dist/Server/API/UserCallAPI.js +42 -38
  314. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  315. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  316. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  317. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  318. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  319. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  320. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  321. package/build/dist/Server/API/UserPushAPI.js +95 -2
  322. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  323. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  324. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  325. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  326. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  327. package/build/dist/Server/EnvironmentConfig.js +6 -0
  328. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js +12 -0
  336. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787800000000-AddScopeToNetworkDeviceLinkRule.js.map +1 -0
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js +29 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787900000000-AddRestrictToAttachedProjectsToGlobalSso.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  341. package/build/dist/Server/Middleware/SlackAuthorization.js +28 -4
  342. package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
  343. package/build/dist/Server/Middleware/UserAuthorization.js +197 -22
  344. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  345. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  346. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  347. package/build/dist/Server/Middleware/WhatsAppAuthorization.js +32 -2
  348. package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
  349. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  350. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  351. package/build/dist/Server/Services/DatabaseService.js +74 -0
  352. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  353. package/build/dist/Server/Services/GlobalOidcProjectService.js +105 -0
  354. package/build/dist/Server/Services/GlobalOidcProjectService.js.map +1 -1
  355. package/build/dist/Server/Services/GlobalOidcService.js +127 -0
  356. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  357. package/build/dist/Server/Services/GlobalSsoProjectService.js +105 -0
  358. package/build/dist/Server/Services/GlobalSsoProjectService.js.map +1 -1
  359. package/build/dist/Server/Services/GlobalSsoService.js +127 -0
  360. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  361. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  362. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  363. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  364. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  365. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  366. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  367. package/build/dist/Server/Services/UserCallService.js +54 -22
  368. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  369. package/build/dist/Server/Services/UserEmailService.js +78 -17
  370. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  371. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  372. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  373. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  374. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  375. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  376. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  377. package/build/dist/Server/Services/UserPushService.js +77 -0
  378. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  379. package/build/dist/Server/Services/UserSmsService.js +50 -17
  380. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  381. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  382. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  383. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  384. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  385. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  386. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  387. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  388. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  389. package/build/dist/Server/Utils/CronTab.js +66 -0
  390. package/build/dist/Server/Utils/CronTab.js.map +1 -1
  391. package/build/dist/Server/Utils/GlobalSsoAuthorization.js +112 -0
  392. package/build/dist/Server/Utils/GlobalSsoAuthorization.js.map +1 -0
  393. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +17 -1
  394. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  395. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +1 -1
  396. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  397. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +1 -1
  398. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  399. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +1 -1
  400. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  401. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +1 -1
  402. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  403. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +1 -1
  404. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  405. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +37 -35
  406. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  407. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js +21 -25
  408. package/build/dist/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.js.map +1 -1
  409. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +20 -22
  410. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  411. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +370 -42
  412. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  413. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js +21 -25
  414. package/build/dist/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.js.map +1 -1
  415. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +34 -37
  416. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  417. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +21 -25
  418. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  419. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +64 -52
  420. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
  421. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +25 -29
  422. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  423. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  424. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  425. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +8 -0
  426. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  427. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  428. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/MonitorResource.js +123 -23
  430. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  432. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  433. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  434. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  435. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  436. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  437. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  438. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js +39 -0
  439. package/build/dist/Server/Utils/StatusPageContentSecurityPolicy.js.map +1 -0
  440. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js +85 -0
  441. package/build/dist/Server/Utils/StatusPageCustomizationAccess.js.map +1 -0
  442. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  443. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  444. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  445. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  446. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  447. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  448. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  449. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  450. package/build/dist/Types/Marketing/MarketingConversion.js +10 -0
  451. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  452. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  453. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  454. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  455. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  456. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  457. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  458. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  459. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  460. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  461. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  462. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js +46 -0
  463. package/build/dist/Types/NetworkDevice/NetworkDeviceLinkRuleScope.js.map +1 -0
  464. package/build/dist/Types/Permission.js +33 -0
  465. package/build/dist/Types/Permission.js.map +1 -1
  466. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  467. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  468. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  469. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  470. package/build/dist/Types/Text.js +82 -17
  471. package/build/dist/Types/Text.js.map +1 -1
  472. package/build/dist/UI/Components/Button/Button.js +22 -14
  473. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  474. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  475. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  476. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  477. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  478. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  479. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  480. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  481. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  482. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  483. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  484. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  485. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  486. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  487. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  488. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  489. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  490. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  491. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  492. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  493. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  494. package/build/dist/UI/Components/FormModal/BasicFormModal.js +2 -1
  495. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  496. package/build/dist/UI/Components/Forms/BasicForm.js +10 -1
  497. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  498. package/build/dist/UI/Components/Forms/BasicModelForm.js +2 -1
  499. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  500. package/build/dist/UI/Components/Forms/ModelForm.js +4 -1
  501. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  502. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js +33 -0
  503. package/build/dist/UI/Components/Forms/Utils/FormAnalyticsName.js.map +1 -0
  504. package/build/dist/UI/Components/List/List.js +19 -5
  505. package/build/dist/UI/Components/List/List.js.map +1 -1
  506. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  507. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  508. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  509. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  510. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  511. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  512. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +2 -1
  513. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  514. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  515. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  516. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  517. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  518. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  519. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  520. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  521. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  522. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  523. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  524. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  525. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  526. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  527. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  528. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  529. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  530. package/build/dist/UI/Components/Table/Table.js +35 -24
  531. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  532. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  533. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  534. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  535. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  536. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  537. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  538. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  539. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  540. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  541. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  542. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  543. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  544. package/build/dist/UI/Utils/Project.js +24 -1
  545. package/build/dist/UI/Utils/Project.js.map +1 -1
  546. package/build/dist/Utils/API.js +6 -1
  547. package/build/dist/Utils/API.js.map +1 -1
  548. package/build/dist/Utils/Analytics.js +50 -2
  549. package/build/dist/Utils/Analytics.js.map +1 -1
  550. package/build/dist/Utils/Monitor/MonitorMetricType.js +37 -0
  551. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  552. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +318 -37
  553. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  554. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js +87 -0
  555. package/build/dist/Utils/NetworkDiscovery/UnclaimedScanDiagnosis.js.map +1 -0
  556. package/jest.config.json +1 -1
  557. package/package.json +2 -3
  558. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  559. package/Tests/__mocks__/otpauth.js +0 -30
  560. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  561. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,442 @@
1
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
2
+ import { JSONObject } from "../../../Types/JSON";
3
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
4
+ import MetricsViewConfig from "../../../Types/Metrics/MetricsViewConfig";
5
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
6
+ import MonitorType from "../../../Types/Monitor/MonitorType";
7
+ import ObjectID from "../../../Types/ObjectID";
8
+ import SeriesResourceLabels, {
9
+ SeriesResourceRefs,
10
+ } from "./SeriesResourceLabels";
11
+
12
+ /*
13
+ * The step-config twin of SeriesResourceLabels.
14
+ *
15
+ * SeriesResourceLabels answers "which resources does this BREACHING
16
+ * SERIES point at" by reading the labels of one grouped series. That
17
+ * only works when the criteria is grouped — an ungrouped monitor emits
18
+ * no series labels at all, so it linked nothing, and the vast majority
19
+ * of monitors (every shipped Host / Docker / Podman / RUM template, and
20
+ * every Logs / Traces / Exceptions monitor, which cannot be grouped in
21
+ * the first place) are ungrouped.
22
+ *
23
+ * This module answers the same question from the other, always-present
24
+ * side: "which resources does this MONITOR'S OWN CONFIGURATION point
25
+ * at". A host monitor names its host, a Kubernetes monitor names its
26
+ * cluster, a log monitor names its telemetry services, and any monitor
27
+ * with a metric query can carry resource identity in its attribute
28
+ * filters (e.g. `oneuptime.service.name = checkout-api`). None of that
29
+ * depends on the criteria being grouped.
30
+ *
31
+ * Both modules emit the SAME `SeriesResourceRefs` shape, so the single
32
+ * nine-way resolver in SeriesResourceLinker serves both, and the two can
33
+ * never drift into disagreeing about what identifies a resource.
34
+ *
35
+ * Pure: no database access, no I/O.
36
+ */
37
+
38
+ /*
39
+ * Which relation a monitor type's own step config speaks for. Held as an
40
+ * exhaustive-by-construction map so a new infra monitor type is a
41
+ * one-line addition next to its siblings rather than a new `if` branch
42
+ * buried in the extractor.
43
+ */
44
+ type NameRefKey = keyof Pick<
45
+ SeriesResourceRefs,
46
+ | "hostNames"
47
+ | "dockerHostNames"
48
+ | "podmanHostNames"
49
+ | "kubernetesClusterNames"
50
+ | "proxmoxClusterNames"
51
+ | "cephClusterNames"
52
+ | "dockerSwarmClusterNames"
53
+ | "iotFleetNames"
54
+ >;
55
+
56
+ export default class MonitorStepResourceIdentity {
57
+ /*
58
+ * Every resource the monitor's configuration names, unioned across its
59
+ * steps and deduped. A monitor with three host steps names three
60
+ * hosts: the creation path does not know which step fired, and the
61
+ * alternative — attributing nothing — is what this module exists to
62
+ * fix.
63
+ */
64
+ public static extractResourceRefsFromMonitor(input: {
65
+ monitor: Monitor;
66
+ }): SeriesResourceRefs {
67
+ const refs: SeriesResourceRefs = this.emptyRefs();
68
+
69
+ const monitorType: MonitorType | undefined = input.monitor.monitorType;
70
+
71
+ if (!monitorType) {
72
+ return refs;
73
+ }
74
+
75
+ const monitorSteps: Array<MonitorStep> =
76
+ input.monitor.monitorSteps?.data?.monitorStepsInstanceArray || [];
77
+
78
+ for (const monitorStep of monitorSteps) {
79
+ this.collectFromStep({
80
+ monitorStep: monitorStep,
81
+ monitorType: monitorType,
82
+ refs: refs,
83
+ });
84
+ }
85
+
86
+ return this.dedupeRefs(refs);
87
+ }
88
+
89
+ private static collectFromStep(input: {
90
+ monitorStep: MonitorStep;
91
+ monitorType: MonitorType;
92
+ refs: SeriesResourceRefs;
93
+ }): void {
94
+ const stepData: MonitorStep["data"] = input.monitorStep.data;
95
+
96
+ if (!stepData) {
97
+ return;
98
+ }
99
+
100
+ /*
101
+ * 1. The declared resource identifier — the field the user picked in
102
+ * the monitor form. Validation makes it required for each of
103
+ * these types (see MonitorStep's validation), so this is the
104
+ * strongest signal available.
105
+ */
106
+ const declared: { key: NameRefKey; value: string | undefined } | null =
107
+ this.getDeclaredIdentifier({
108
+ stepData: stepData,
109
+ monitorType: input.monitorType,
110
+ });
111
+
112
+ /*
113
+ * `typeof` rather than a truthiness check: step JSON is not
114
+ * schema-checked, so an identifier written by the API, a seed or an
115
+ * import can be a number or an object, and `.trim()` on those throws
116
+ * out of the incident/alert creation path.
117
+ */
118
+ if (declared && typeof declared.value === "string") {
119
+ const identifier: string = declared.value.trim();
120
+
121
+ if (identifier.length > 0) {
122
+ input.refs[declared.key].push(identifier);
123
+ }
124
+ }
125
+
126
+ /*
127
+ * 2. Telemetry services. Real `Service._id` values written by the
128
+ * monitor form's service picker — a primary key, not a name, so
129
+ * this is the most precise identity in the whole module. Metric
130
+ * monitors carry the field too (RUM recommendation monitors set
131
+ * it), where it is optional.
132
+ */
133
+ for (const serviceId of this.getTelemetryServiceIds({
134
+ stepData: stepData,
135
+ })) {
136
+ input.refs.serviceIds.push(serviceId);
137
+ }
138
+
139
+ /*
140
+ * 3. Metric attribute filters. A generic metric monitor names its
141
+ * resource nowhere else: it scopes itself with filters like
142
+ * `oneuptime.service.name = checkout-api`, which is exactly the
143
+ * key map SeriesResourceLabels already owns. Reusing that map
144
+ * means a filter and a group-by on the same attribute resolve to
145
+ * the same row.
146
+ */
147
+ this.collectFromMetricFilters({
148
+ stepData: stepData,
149
+ monitorType: input.monitorType,
150
+ refs: input.refs,
151
+ });
152
+ }
153
+
154
+ private static getDeclaredIdentifier(input: {
155
+ stepData: NonNullable<MonitorStep["data"]>;
156
+ monitorType: MonitorType;
157
+ }): { key: NameRefKey; value: string | undefined } | null {
158
+ const stepData: NonNullable<MonitorStep["data"]> = input.stepData;
159
+
160
+ switch (input.monitorType) {
161
+ case MonitorType.Host:
162
+ return {
163
+ key: "hostNames",
164
+ value: stepData.hostMonitor?.hostIdentifier,
165
+ };
166
+ case MonitorType.Docker:
167
+ return {
168
+ key: "dockerHostNames",
169
+ value: stepData.dockerMonitor?.hostIdentifier,
170
+ };
171
+ case MonitorType.Podman:
172
+ return {
173
+ key: "podmanHostNames",
174
+ value: stepData.podmanMonitor?.hostIdentifier,
175
+ };
176
+ case MonitorType.Kubernetes:
177
+ return {
178
+ key: "kubernetesClusterNames",
179
+ value: stepData.kubernetesMonitor?.clusterIdentifier,
180
+ };
181
+ case MonitorType.Proxmox:
182
+ return {
183
+ key: "proxmoxClusterNames",
184
+ value: stepData.proxmoxMonitor?.clusterIdentifier,
185
+ };
186
+ case MonitorType.Ceph:
187
+ return {
188
+ key: "cephClusterNames",
189
+ value: stepData.cephMonitor?.clusterIdentifier,
190
+ };
191
+ case MonitorType.DockerSwarm:
192
+ return {
193
+ key: "dockerSwarmClusterNames",
194
+ value: stepData.dockerSwarmMonitor?.clusterIdentifier,
195
+ };
196
+ case MonitorType.IoTDevice:
197
+ return {
198
+ key: "iotFleetNames",
199
+ value: stepData.iotMonitor?.fleetIdentifier,
200
+ };
201
+ default:
202
+ return null;
203
+ }
204
+ }
205
+
206
+ private static getTelemetryServiceIds(input: {
207
+ stepData: NonNullable<MonitorStep["data"]>;
208
+ }): Array<string> {
209
+ const stepData: NonNullable<MonitorStep["data"]> = input.stepData;
210
+
211
+ /*
212
+ * Read from every telemetry sub-config present rather than switching
213
+ * on monitorType: only one of them is ever populated for a given
214
+ * monitor, and this way a step written by an older build (or by the
215
+ * API, a seed, or an import) with a mismatched type still resolves.
216
+ */
217
+ const idLists: Array<Array<ObjectID> | undefined> = [
218
+ stepData.logMonitor?.telemetryServiceIds,
219
+ stepData.traceMonitor?.telemetryServiceIds,
220
+ stepData.exceptionMonitor?.telemetryServiceIds,
221
+ stepData.profileMonitor?.telemetryServiceIds,
222
+ stepData.metricMonitor?.telemetryServiceIds,
223
+ ];
224
+
225
+ const serviceIds: Array<string> = [];
226
+
227
+ for (const idList of idLists) {
228
+ /*
229
+ * `Array.isArray` rather than a truthiness check: an unchecked
230
+ * step written by the API or an import can hold an object or a
231
+ * number here, and `for...of` on those throws out of the
232
+ * incident/alert creation path.
233
+ */
234
+ if (!Array.isArray(idList) || idList.length === 0) {
235
+ continue;
236
+ }
237
+
238
+ for (const id of idList) {
239
+ /*
240
+ * An entry can be a bare string rather than a rehydrated
241
+ * ObjectID, for the same reason. `String()` covers both; empty
242
+ * values are dropped so they can't widen the lookup, and a
243
+ * non-scalar is dropped rather than stringified into a garbage
244
+ * "[object Object]" lookup key.
245
+ */
246
+ if (
247
+ id !== null &&
248
+ typeof id === "object" &&
249
+ !(id instanceof ObjectID)
250
+ ) {
251
+ continue;
252
+ }
253
+
254
+ const idString: string = String(id ?? "").trim();
255
+
256
+ if (idString.length > 0) {
257
+ serviceIds.push(idString);
258
+ }
259
+ }
260
+ }
261
+
262
+ return serviceIds;
263
+ }
264
+
265
+ private static collectFromMetricFilters(input: {
266
+ stepData: NonNullable<MonitorStep["data"]>;
267
+ monitorType: MonitorType;
268
+ refs: SeriesResourceRefs;
269
+ }): void {
270
+ const filterAttributes: JSONObject = this.collectMetricFilterAttributes({
271
+ stepData: input.stepData,
272
+ });
273
+
274
+ if (Object.keys(filterAttributes).length === 0) {
275
+ return;
276
+ }
277
+
278
+ const filterRefs: SeriesResourceRefs =
279
+ SeriesResourceLabels.extractResourceRefs(filterAttributes);
280
+
281
+ /*
282
+ * `resource.host.name` belongs to Host in the label key map, but on
283
+ * a Docker or Podman monitor the worker writes that same attribute
284
+ * from the step's `hostIdentifier` — which names a DockerHost /
285
+ * PodmanHost row, not a Host row. Honouring the map here would
286
+ * attach the wrong model and surface the event on an unrelated
287
+ * Host's Activity tab, so the declared identifier (collected above,
288
+ * into the right bucket) is the only host identity these two types
289
+ * get.
290
+ */
291
+ const suppressHostRefs: boolean =
292
+ input.monitorType === MonitorType.Docker ||
293
+ input.monitorType === MonitorType.Podman;
294
+
295
+ if (suppressHostRefs) {
296
+ filterRefs.hostIds = [];
297
+ filterRefs.hostNames = [];
298
+ }
299
+
300
+ this.mergeRefs({ target: input.refs, source: filterRefs });
301
+ }
302
+
303
+ /*
304
+ * The attribute filters of every metric query on the step, merged.
305
+ * Each infra monitor type keeps its metric view config under its own
306
+ * key, so read them all — exactly the set MonitorStep's own
307
+ * metric-view-config resolver knows about.
308
+ *
309
+ * Values accumulate into an ARRAY per key rather than overwriting: a
310
+ * step can hold several queries, and two of them filtering
311
+ * `oneuptime.service.name` on different services both name a real
312
+ * resource. Last-write-wins would silently drop one of them.
313
+ * SeriesResourceLabels.collectLabelValues already flattens
314
+ * array-valued labels, so the multi-value shape needs nothing extra
315
+ * downstream.
316
+ */
317
+ private static collectMetricFilterAttributes(input: {
318
+ stepData: NonNullable<MonitorStep["data"]>;
319
+ }): JSONObject {
320
+ const stepData: NonNullable<MonitorStep["data"]> = input.stepData;
321
+
322
+ const viewConfigs: Array<MetricsViewConfig | undefined> = [
323
+ stepData.metricMonitor?.metricViewConfig,
324
+ stepData.hostMonitor?.metricViewConfig,
325
+ stepData.kubernetesMonitor?.metricViewConfig,
326
+ stepData.dockerMonitor?.metricViewConfig,
327
+ stepData.podmanMonitor?.metricViewConfig,
328
+ stepData.proxmoxMonitor?.metricViewConfig,
329
+ stepData.cephMonitor?.metricViewConfig,
330
+ stepData.dockerSwarmMonitor?.metricViewConfig,
331
+ stepData.iotMonitor?.metricViewConfig,
332
+ ];
333
+
334
+ const valuesByKey: Map<string, Array<string>> = new Map<
335
+ string,
336
+ Array<string>
337
+ >();
338
+
339
+ for (const viewConfig of viewConfigs) {
340
+ const queryConfigs: Array<MetricQueryConfigData> = Array.isArray(
341
+ viewConfig?.queryConfigs,
342
+ )
343
+ ? viewConfig.queryConfigs
344
+ : [];
345
+
346
+ for (const queryConfig of queryConfigs) {
347
+ const queryAttributes: unknown =
348
+ queryConfig?.metricQueryData?.filterData?.attributes;
349
+
350
+ if (!queryAttributes || typeof queryAttributes !== "object") {
351
+ continue;
352
+ }
353
+
354
+ for (const [key, value] of Object.entries(
355
+ queryAttributes as Record<string, unknown>,
356
+ )) {
357
+ /*
358
+ * Only plain string filters identify a resource. A filter can
359
+ * also hold a Search or Includes instance (substring / set
360
+ * matching), and neither is an identity we can resolve to one
361
+ * row — a `Search("prod")` filter names no specific service.
362
+ */
363
+ if (typeof value !== "string" || value.length === 0) {
364
+ continue;
365
+ }
366
+
367
+ const existing: Array<string> = valuesByKey.get(key) || [];
368
+
369
+ if (!existing.includes(value)) {
370
+ existing.push(value);
371
+ }
372
+
373
+ valuesByKey.set(key, existing);
374
+ }
375
+ }
376
+ }
377
+
378
+ const attributes: JSONObject = {};
379
+
380
+ for (const [key, values] of valuesByKey) {
381
+ /*
382
+ * A single value stays a bare string so the common case reads
383
+ * exactly like a series label; only a genuinely multi-valued
384
+ * filter becomes an array.
385
+ */
386
+ attributes[key] = values.length === 1 ? values[0]! : values;
387
+ }
388
+
389
+ return attributes;
390
+ }
391
+
392
+ private static mergeRefs(input: {
393
+ target: SeriesResourceRefs;
394
+ source: SeriesResourceRefs;
395
+ }): void {
396
+ for (const key of Object.keys(input.target) as Array<
397
+ keyof SeriesResourceRefs
398
+ >) {
399
+ input.target[key].push(...input.source[key]);
400
+ }
401
+ }
402
+
403
+ private static dedupeRefs(refs: SeriesResourceRefs): SeriesResourceRefs {
404
+ for (const key of Object.keys(refs) as Array<keyof SeriesResourceRefs>) {
405
+ refs[key] = Array.from(new Set<string>(refs[key]));
406
+ }
407
+
408
+ return refs;
409
+ }
410
+
411
+ public static emptyRefs(): SeriesResourceRefs {
412
+ return {
413
+ hostIds: [],
414
+ hostNames: [],
415
+ dockerHostIds: [],
416
+ dockerHostNames: [],
417
+ podmanHostIds: [],
418
+ podmanHostNames: [],
419
+ kubernetesClusterIds: [],
420
+ kubernetesClusterNames: [],
421
+ dockerSwarmClusterNames: [],
422
+ proxmoxClusterNames: [],
423
+ cephClusterNames: [],
424
+ iotFleetNames: [],
425
+ serviceIds: [],
426
+ serviceNames: [],
427
+ };
428
+ }
429
+
430
+ /*
431
+ * True when the monitor's configuration names nothing at all — the
432
+ * common case for the ~17 monitor types that have no resource
433
+ * identity (Website, API, Ping, Synthetic, ...). Callers use it to
434
+ * skip the lookup entirely so those monitors keep costing zero
435
+ * database round-trips per evaluation.
436
+ */
437
+ public static isEmpty(refs: SeriesResourceRefs): boolean {
438
+ return Object.values(refs).every((values: Array<string>): boolean => {
439
+ return values.length === 0;
440
+ });
441
+ }
442
+ }
@@ -74,7 +74,7 @@ export const PodmanHostNameLabelKeys: ReadonlyArray<string> = [
74
74
  * Like Proxmox/Ceph, the shipped Swarm alert templates group by
75
75
  * datapoint labels (`container.name`), so their series labels do NOT
76
76
  * carry this key; the deterministic cluster link for those monitors
77
- * comes from the monitor step config instead (see MonitorClusterContext).
77
+ * comes from the monitor step config instead (see MonitorResourceContext).
78
78
  * These keys cover user-built monitors that group by the cluster
79
79
  * attribute.
80
80
  */
@@ -105,7 +105,7 @@ export const KubernetesClusterNameLabelKeys: ReadonlyArray<string> = [
105
105
  * datapoint labels (`id`, `ceph_daemon`, `pool_id`), so their series
106
106
  * labels do NOT carry these keys; the deterministic cluster link for
107
107
  * those monitors comes from the monitor step config instead (see
108
- * MonitorClusterContext). These keys cover user-built monitors that
108
+ * MonitorResourceContext). These keys cover user-built monitors that
109
109
  * group by the cluster attribute, exactly like the K8s keys above.
110
110
  */
111
111
  export const ProxmoxClusterNameLabelKeys: ReadonlyArray<string> = [
@@ -127,7 +127,7 @@ export const CephClusterNameLabelKeys: ReadonlyArray<string> = [
127
127
  * alert templates group by the datapoint label `device.id`, so their
128
128
  * series labels do NOT carry these keys; the deterministic fleet link
129
129
  * for those monitors comes from the monitor step config instead (see
130
- * MonitorClusterContext). These keys cover user-built monitors that
130
+ * MonitorResourceContext). These keys cover user-built monitors that
131
131
  * group by the fleet attribute.
132
132
  */
133
133
  export const IoTFleetNameLabelKeys: ReadonlyArray<string> = [
@@ -10,6 +10,7 @@ import Service from "../../../Models/DatabaseModels/Service";
10
10
  import Includes from "../../../Types/BaseDatabase/Includes";
11
11
  import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
12
12
  import { JSONObject } from "../../../Types/JSON";
13
+ import MonitorType from "../../../Types/Monitor/MonitorType";
13
14
  import ObjectID from "../../../Types/ObjectID";
14
15
  import CephClusterService from "../../Services/CephClusterService";
15
16
  import DockerHostService from "../../Services/DockerHostService";
@@ -20,11 +21,18 @@ import KubernetesClusterService from "../../Services/KubernetesClusterService";
20
21
  import PodmanHostService from "../../Services/PodmanHostService";
21
22
  import ProxmoxClusterService from "../../Services/ProxmoxClusterService";
22
23
  import ServiceService from "../../Services/ServiceService";
23
- import { MonitorClusterContext } from "./MonitorClusterContext";
24
+ import QueryHelper from "../../Types/Database/QueryHelper";
24
25
  import SeriesResourceLabels, {
25
26
  SeriesResourceRefs,
26
27
  } from "./SeriesResourceLabels";
27
28
 
29
+ /*
30
+ * How a resource's NAME is matched against its identifier column.
31
+ * Ingest-written series labels match byte for byte; user-typed monitor
32
+ * step identifiers may differ from the agent-stamped name by case.
33
+ */
34
+ export type NameMatchMode = "exact" | "caseInsensitive";
35
+
28
36
  /*
29
37
  * A grouped monitor opens one alert/incident per breaching series, and
30
38
  * each series carries the identity of the resource it came from in its
@@ -100,11 +108,61 @@ export default class SeriesResourceLinker {
100
108
  public static async resolveResourcesFromSeriesLabels(input: {
101
109
  seriesLabels: JSONObject;
102
110
  projectId: ObjectID;
111
+ /*
112
+ * Optional, and only consulted to disambiguate `host.name`. Left
113
+ * undefined by callers that have no monitor in hand.
114
+ */
115
+ monitorType?: MonitorType | undefined;
103
116
  }): Promise<SeriesResolvedResourceIds> {
104
117
  const refs: SeriesResourceRefs = SeriesResourceLabels.extractResourceRefs(
105
118
  input.seriesLabels,
106
119
  );
107
120
 
121
+ /*
122
+ * On a Docker or Podman monitor, `resource.host.name` names the
123
+ * DockerHost / PodmanHost the containers run on — the agent stamps
124
+ * the container runtime's host under the generic key. The label key
125
+ * map hands that key to Host, which would attach an unrelated Host
126
+ * row and surface the event on that host's Activity tab. The
127
+ * step-config path links the right model instead
128
+ * (MonitorStepResourceIdentity), so drop the host refs here rather
129
+ * than linking a resource the event is not about.
130
+ */
131
+ if (
132
+ input.monitorType === MonitorType.Docker ||
133
+ input.monitorType === MonitorType.Podman
134
+ ) {
135
+ refs.hostIds = [];
136
+ refs.hostNames = [];
137
+ }
138
+
139
+ /*
140
+ * Series labels are ingest-written, so they match the resource
141
+ * rows' identifier columns byte for byte. See resolveResourceIds
142
+ * for why that rules out case-insensitive matching here.
143
+ */
144
+ return this.resolveResourceRefs({
145
+ refs: refs,
146
+ projectId: input.projectId,
147
+ nameMatch: "exact",
148
+ });
149
+ }
150
+
151
+ /*
152
+ * The one place that turns identifiers into database ids, shared by
153
+ * the series-label path and the monitor-step-config path
154
+ * (MonitorStepResourceIdentity). Keeping the nine-way lookup table,
155
+ * the project scoping and the `Includes` batching in a single
156
+ * function is what stops the two paths from resolving the same
157
+ * identifier to different rows.
158
+ */
159
+ public static async resolveResourceRefs(input: {
160
+ refs: SeriesResourceRefs;
161
+ projectId: ObjectID;
162
+ nameMatch: NameMatchMode;
163
+ }): Promise<SeriesResolvedResourceIds> {
164
+ const refs: SeriesResourceRefs = input.refs;
165
+
108
166
  /*
109
167
  * Proxmox / Ceph / Docker Swarm / IoT carry no `oneuptime.*.id`
110
168
  * stamp at ingest — they are addressable by name only — so their
@@ -186,6 +244,7 @@ export default class SeriesResourceLinker {
186
244
  names: spec.names,
187
245
  nameColumn: spec.nameColumn,
188
246
  projectId: input.projectId,
247
+ nameMatch: input.nameMatch,
189
248
  findBy: spec.findBy,
190
249
  });
191
250
  }),
@@ -206,9 +265,10 @@ export default class SeriesResourceLinker {
206
265
 
207
266
  /*
208
267
  * Resolve the series' resources and MERGE them onto the alert/incident.
209
- * Merging (rather than assigning) matters because attachClusterContext
210
- * writes the same four cluster relations from the monitor's step
211
- * config; whichever runs second must not erase the other's work.
268
+ * Merging (rather than assigning) matters because
269
+ * attachResolvedResources writes the same relations from the
270
+ * monitor's step config; whichever runs second must not erase the
271
+ * other's work.
212
272
  *
213
273
  * Relations the series says nothing about are left untouched —
214
274
  * `undefined`, not `[]` — so an ungrouped event and an event whose
@@ -223,11 +283,17 @@ export default class SeriesResourceLinker {
223
283
  model: SeriesLinkableModel;
224
284
  seriesLabels: JSONObject;
225
285
  projectId: ObjectID;
286
+ /*
287
+ * Optional, and only consulted to disambiguate `host.name`. Left
288
+ * undefined by callers that have no monitor in hand.
289
+ */
290
+ monitorType?: MonitorType | undefined;
226
291
  }): Promise<void> {
227
292
  const resolved: SeriesResolvedResourceIds =
228
293
  await this.resolveResourcesFromSeriesLabels({
229
294
  seriesLabels: input.seriesLabels,
230
295
  projectId: input.projectId,
296
+ monitorType: input.monitorType,
231
297
  });
232
298
 
233
299
  this.mergeResolvedIdsIntoModel({
@@ -237,30 +303,22 @@ export default class SeriesResourceLinker {
237
303
  }
238
304
 
239
305
  /*
240
- * Attach the cluster ids resolved from the monitor's step config
241
- * (Proxmox / Ceph / Docker Swarm / IoT), merging with — never
242
- * overwriting — anything the series-label path already linked. Both
243
- * paths can resolve the same cluster, so this dedupes by id. Unlike
244
- * the label path this runs for ungrouped events too: those monitor
245
- * types get their cluster identity from the step config alone.
306
+ * Attach the resources resolved from the monitor's own step config
307
+ * (MonitorResourceContext), merging with — never overwriting —
308
+ * anything the series-label path already linked. Both paths can
309
+ * resolve the same resource, so this dedupes by id.
310
+ *
311
+ * Unlike the label path this runs for ungrouped events too, and that
312
+ * is the whole point: an ungrouped monitor has no series labels, so
313
+ * before this existed it linked nothing at all.
246
314
  */
247
- public static attachClusterContext(input: {
315
+ public static attachResolvedResources(input: {
248
316
  model: SeriesLinkableModel;
249
- clusterContext: MonitorClusterContext;
317
+ resolved: SeriesResolvedResourceIds;
250
318
  }): void {
251
319
  this.mergeResolvedIdsIntoModel({
252
320
  model: input.model,
253
- resolved: {
254
- hostIds: [],
255
- dockerHostIds: [],
256
- podmanHostIds: [],
257
- kubernetesClusterIds: [],
258
- serviceIds: [],
259
- proxmoxClusterIds: input.clusterContext.proxmoxClusterIds,
260
- cephClusterIds: input.clusterContext.cephClusterIds,
261
- dockerSwarmClusterIds: input.clusterContext.dockerSwarmClusterIds,
262
- iotFleetIds: input.clusterContext.iotFleetIds,
263
- },
321
+ resolved: input.resolved,
264
322
  });
265
323
  }
266
324
 
@@ -396,16 +454,23 @@ export default class SeriesResourceLinker {
396
454
  * Costs zero round-trips when the series carries neither, which is the
397
455
  * common case for most of the nine types on any given series.
398
456
  *
399
- * Name matching is exact. Every identifier column read here is written
400
- * by ingest from the same attribute the series label carries — host
401
- * identifiers are canonicalized on both sides — so exact matching is
402
- * what keeps a lookup from straying onto a neighbouring row.
457
+ * `nameMatch: "exact"` is for series labels. Every identifier column
458
+ * read here is written by ingest from the same attribute the series
459
+ * label carries — host identifiers are canonicalized on both sides —
460
+ * so exact matching is what keeps a lookup from straying onto a
461
+ * neighbouring row.
462
+ *
463
+ * `nameMatch: "caseInsensitive"` is for monitor step configs, where
464
+ * the identifier was typed by a user and the row's name was stamped
465
+ * by an agent; the two legitimately differ by case. This mirrors what
466
+ * ingest discovery itself does when it keys a row by name.
403
467
  */
404
468
  private static async resolveResourceIds(input: {
405
469
  ids: Array<string>;
406
470
  names: Array<string>;
407
471
  nameColumn: string;
408
472
  projectId: ObjectID;
473
+ nameMatch: NameMatchMode;
409
474
  /*
410
475
  * Loosely typed because each resource service has its own
411
476
  * `Query<TBaseModel>` shape and we deliberately abstract over
@@ -443,7 +508,10 @@ export default class SeriesResourceLinker {
443
508
  input.findBy({
444
509
  query: {
445
510
  projectId: input.projectId,
446
- [input.nameColumn]: new Includes(input.names),
511
+ [input.nameColumn]:
512
+ input.nameMatch === "caseInsensitive"
513
+ ? QueryHelper.findWithSameTextAnyOf(input.names)
514
+ : new Includes(input.names),
447
515
  },
448
516
  select: { _id: true },
449
517
  skip: 0,