@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
@@ -584,9 +584,37 @@ describe("MicrosoftTeamsUtil.removeTeamFromBotActivity", () => {
584
584
  });
585
585
 
586
586
  expect(removeSpy).toHaveBeenCalledTimes(1);
587
+ /*
588
+ * Uninstall passes both ids: the bot is already out of the team so the
589
+ * Graph id cannot be looked up, and records written before it was captured
590
+ * are only findable by the thread id. TEAM_ID here is a thread id, matching
591
+ * what channelData.team.id carries.
592
+ */
587
593
  expect(removeSpy).toHaveBeenCalledWith({
588
594
  tenantId: TENANT_ID,
589
- teamId: TEAM_ID,
595
+ teamsThreadId: TEAM_ID,
596
+ graphTeamId: undefined,
597
+ });
598
+ });
599
+
600
+ test("an uninstall activity that still carries aadGroupId passes it through", async () => {
601
+ const removeSpy: jest.SpyInstance = jest
602
+ .spyOn(MicrosoftTeamsUtil, "removeTeamFromProjectAuthTokens")
603
+ .mockResolvedValue(undefined as never);
604
+
605
+ await MicrosoftTeamsUtil.removeTeamFromBotActivity({
606
+ activity: teamActivity({
607
+ channelData: {
608
+ team: { id: TEAM_ID, aadGroupId: "graph-team-1" },
609
+ tenant: { id: TENANT_ID },
610
+ },
611
+ }),
612
+ });
613
+
614
+ expect(removeSpy).toHaveBeenCalledWith({
615
+ tenantId: TENANT_ID,
616
+ teamsThreadId: TEAM_ID,
617
+ graphTeamId: "graph-team-1",
590
618
  });
591
619
  });
592
620
 
@@ -884,7 +912,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
884
912
 
885
913
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
886
914
  tenantId: "tenant-abc",
887
- teamId: TEAM_ID,
915
+ teamsThreadId: TEAM_ID,
888
916
  });
889
917
 
890
918
  expect(findBySpy).toHaveBeenCalledWith(
@@ -925,7 +953,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
925
953
 
926
954
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
927
955
  tenantId: "tenant-abc",
928
- teamId: teamToRemove.id,
956
+ teamsThreadId: teamToRemove.id,
929
957
  });
930
958
 
931
959
  expect(updateSpy).toHaveBeenCalledTimes(1);
@@ -950,7 +978,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
950
978
 
951
979
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
952
980
  tenantId: "tenant-abc",
953
- teamId: team.id,
981
+ teamsThreadId: team.id,
954
982
  });
955
983
 
956
984
  const savedMiscData: MicrosoftTeamsMiscData = getUpdateArgs(updateSpy, 0)
@@ -976,7 +1004,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
976
1004
 
977
1005
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
978
1006
  tenantId: "tenant-abc",
979
- teamId: TEAM_ID,
1007
+ teamsThreadId: TEAM_ID,
980
1008
  });
981
1009
 
982
1010
  expect(updateSpy).not.toHaveBeenCalled();
@@ -991,7 +1019,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
991
1019
 
992
1020
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
993
1021
  tenantId: "tenant-abc",
994
- teamId: TEAM_ID,
1022
+ teamsThreadId: TEAM_ID,
995
1023
  });
996
1024
 
997
1025
  expect(updateSpy).not.toHaveBeenCalled();
@@ -1014,7 +1042,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
1014
1042
 
1015
1043
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
1016
1044
  tenantId: "tenant-abc",
1017
- teamId: team.id,
1045
+ teamsThreadId: team.id,
1018
1046
  });
1019
1047
 
1020
1048
  expect(updateSpy).toHaveBeenCalledTimes(3);
@@ -1068,7 +1096,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
1068
1096
 
1069
1097
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
1070
1098
  tenantId: "tenant-abc",
1071
- teamId: team.id,
1099
+ teamsThreadId: team.id,
1072
1100
  });
1073
1101
 
1074
1102
  expect(updateSpy).toHaveBeenCalledTimes(1);
@@ -1104,7 +1132,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
1104
1132
 
1105
1133
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
1106
1134
  tenantId: "tenant-abc",
1107
- teamId: "19:team-aaa@thread.tacv2",
1135
+ teamsThreadId: "19:team-aaa@thread.tacv2",
1108
1136
  });
1109
1137
 
1110
1138
  expect(updateSpy).not.toHaveBeenCalled();
@@ -1120,7 +1148,7 @@ describe("MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens", () => {
1120
1148
 
1121
1149
  await MicrosoftTeamsUtil.removeTeamFromProjectAuthTokens({
1122
1150
  tenantId: "tenant-abc",
1123
- teamId: team.id,
1151
+ teamsThreadId: team.id,
1124
1152
  });
1125
1153
 
1126
1154
  expect(originalMiscData.installedTeams).toEqual({ [team.id]: team });
@@ -1495,9 +1523,15 @@ describe("MicrosoftTeamsUtil.handleBotMessageActivity - team install backfill wi
1495
1523
  });
1496
1524
 
1497
1525
  expect(spies.captureTeamSpy).toHaveBeenCalledTimes(1);
1526
+ /*
1527
+ * onlyIfMissingOrStale, because this runs on every inbound channel message:
1528
+ * once the team is recorded it must cost one read, not a write plus a
1529
+ * possible Bot Framework call to resolve the group id.
1530
+ */
1498
1531
  expect(spies.captureTeamSpy).toHaveBeenCalledWith({
1499
1532
  activity: activity,
1500
1533
  turnContext: turnContext,
1534
+ onlyIfMissingOrStale: true,
1501
1535
  });
1502
1536
  expect(spies.captureChatSpy).not.toHaveBeenCalled();
1503
1537
  });
@@ -0,0 +1,164 @@
1
+ import Hostname from "../../../Types/API/Hostname";
2
+ import { describe, expect, test } from "@jest/globals";
3
+
4
+ /*
5
+ * Hostname.fromAuthority splits a URL authority into a bare host and a real
6
+ * Port. It exists because URL.fromString hands the WHOLE authority to the
7
+ * Hostname constructor, so `URL.fromString("https://example.com:8443/")`
8
+ * yields a hostname of "example.com:8443" and no port at all.
9
+ *
10
+ * Anything that reads the structured accessors rather than toString() then
11
+ * dials a host that does not exist. The SSL Certificate Monitor is one such
12
+ * consumer, which is why a monitor on a non-443 port could never connect —
13
+ * see https://github.com/OneUptime/oneuptime/issues/3225.
14
+ *
15
+ * fromString() is NOT a substitute: it splits on the FIRST colon, which
16
+ * mangles every IPv6 literal.
17
+ */
18
+ describe("Hostname.fromAuthority", () => {
19
+ describe("host and port", () => {
20
+ test("splits a trailing port off the host", () => {
21
+ const hostname: Hostname = Hostname.fromAuthority("example.com:8443");
22
+
23
+ expect(hostname.hostname).toBe("example.com");
24
+ expect(hostname.port?.toNumber()).toBe(8443);
25
+ });
26
+
27
+ test("leaves a bare host without a port", () => {
28
+ const hostname: Hostname = Hostname.fromAuthority("example.com");
29
+
30
+ expect(hostname.hostname).toBe("example.com");
31
+ expect(hostname.port).toBeUndefined();
32
+ });
33
+
34
+ test("handles localhost with a port", () => {
35
+ const hostname: Hostname = Hostname.fromAuthority("localhost:5000");
36
+
37
+ expect(hostname.hostname).toBe("localhost");
38
+ expect(hostname.port?.toNumber()).toBe(5000);
39
+ });
40
+
41
+ test("handles an IPv4 literal with a port", () => {
42
+ const hostname: Hostname = Hostname.fromAuthority("127.0.0.1:8443");
43
+
44
+ expect(hostname.hostname).toBe("127.0.0.1");
45
+ expect(hostname.port?.toNumber()).toBe(8443);
46
+ });
47
+
48
+ test("round-trips back to the original authority", () => {
49
+ expect(Hostname.fromAuthority("example.com:8443").toString()).toBe(
50
+ "example.com:8443",
51
+ );
52
+ expect(Hostname.fromAuthority("example.com").toString()).toBe(
53
+ "example.com",
54
+ );
55
+ });
56
+ });
57
+
58
+ describe("IPv6 literals", () => {
59
+ test("keeps a bracketed IPv6 address intact and takes its port", () => {
60
+ const hostname: Hostname = Hostname.fromAuthority("[::1]:8443");
61
+
62
+ expect(hostname.hostname).toBe("[::1]");
63
+ expect(hostname.port?.toNumber()).toBe(8443);
64
+ });
65
+
66
+ test("keeps a bracketed IPv6 address with no port intact", () => {
67
+ const hostname: Hostname = Hostname.fromAuthority("[::1]");
68
+
69
+ expect(hostname.hostname).toBe("[::1]");
70
+ expect(hostname.port).toBeUndefined();
71
+ });
72
+
73
+ test("does not split an unbracketed IPv6 literal", () => {
74
+ /*
75
+ * Two or more colons cannot be a host:port, so every colon belongs to
76
+ * the address. fromString would have returned a host of "2001".
77
+ */
78
+ const hostname: Hostname = Hostname.fromAuthority("2001:db8::1");
79
+
80
+ expect(hostname.hostname).toBe("2001:db8::1");
81
+ expect(hostname.port).toBeUndefined();
82
+ });
83
+
84
+ test("a full bracketed IPv6 address survives with its port", () => {
85
+ const hostname: Hostname = Hostname.fromAuthority(
86
+ "[2001:db8::8a2e:370:7334]:9000",
87
+ );
88
+
89
+ expect(hostname.hostname).toBe("[2001:db8::8a2e:370:7334]");
90
+ expect(hostname.port?.toNumber()).toBe(9000);
91
+ });
92
+ });
93
+
94
+ describe("userinfo", () => {
95
+ test("drops userinfo and keeps the host", () => {
96
+ const hostname: Hostname = Hostname.fromAuthority(
97
+ "user:token@hooks.example.com",
98
+ );
99
+
100
+ expect(hostname.hostname).toBe("hooks.example.com");
101
+ expect(hostname.port).toBeUndefined();
102
+ });
103
+
104
+ test("drops userinfo and keeps host and port", () => {
105
+ const hostname: Hostname = Hostname.fromAuthority(
106
+ "user:token@example.com:8443",
107
+ );
108
+
109
+ expect(hostname.hostname).toBe("example.com");
110
+ expect(hostname.port?.toNumber()).toBe(8443);
111
+ });
112
+
113
+ test("splits on the LAST @, since userinfo may contain one", () => {
114
+ const hostname: Hostname = Hostname.fromAuthority(
115
+ "user@name:token@example.com:8443",
116
+ );
117
+
118
+ expect(hostname.hostname).toBe("example.com");
119
+ expect(hostname.port?.toNumber()).toBe(8443);
120
+ });
121
+ });
122
+
123
+ describe("malformed input", () => {
124
+ test("an empty authority yields an empty hostname rather than throwing", () => {
125
+ expect(Hostname.fromAuthority("").hostname).toBe("");
126
+ });
127
+
128
+ test("a trailing colon with no digits is not treated as a port", () => {
129
+ const hostname: Hostname = Hostname.fromAuthority("example.com:");
130
+
131
+ expect(hostname.hostname).toBe("example.com");
132
+ expect(hostname.port).toBeUndefined();
133
+ });
134
+
135
+ test("surrounding whitespace is trimmed", () => {
136
+ const hostname: Hostname = Hostname.fromAuthority(" example.com:443 ");
137
+
138
+ expect(hostname.hostname).toBe("example.com");
139
+ expect(hostname.port?.toNumber()).toBe(443);
140
+ });
141
+ });
142
+
143
+ describe("contrast with fromString", () => {
144
+ test("fromString rejects an IPv6 literal that fromAuthority handles", () => {
145
+ /*
146
+ * Pinned deliberately: it documents WHY fromAuthority exists, and
147
+ * guards against someone 'simplifying' one into the other.
148
+ *
149
+ * fromString splits on the FIRST colon, so "[::1]:8443" becomes a
150
+ * host of "[" - which the Hostname setter rejects outright.
151
+ */
152
+ expect(Hostname.fromAuthority("[::1]:8443").hostname).toBe("[::1]");
153
+ expect(() => {
154
+ return Hostname.fromString("[::1]:8443");
155
+ }).toThrow();
156
+ });
157
+
158
+ test("both agree on the simple host:port case", () => {
159
+ expect(Hostname.fromAuthority("example.com:8443").hostname).toBe(
160
+ Hostname.fromString("example.com:8443").hostname,
161
+ );
162
+ });
163
+ });
164
+ });
@@ -0,0 +1,192 @@
1
+ import AutoRemediationSuggestionStatus, {
2
+ AutoRemediationSuggestionStatusHelper,
3
+ } from "../../../Types/AutoRemediation/AutoRemediationSuggestionStatus";
4
+ import { describe, expect, test } from "@jest/globals";
5
+
6
+ /*
7
+ * Contract under test — the lifecycle vocabulary of an auto-remediation
8
+ * suggestion and the single predicate that splits it into terminal vs open.
9
+ *
10
+ * A suggestion is the approvable action object a matched rule attaches to an
11
+ * incident or alert. isTerminalStatus draws the line between states that can
12
+ * still be actioned (Planning, Suggested — a human or the executor may yet
13
+ * move them) and states that are frozen for good (Approved, AutoExecuted,
14
+ * Dismissed, NoneApplicable). Anything downstream that decides whether to show
15
+ * an approve/dismiss control, re-run planning, or leave a suggestion alone
16
+ * relies on this partition being exact — every status classified, none in both
17
+ * halves.
18
+ *
19
+ * The enum is string-valued, so the wire/DB representation of each member is
20
+ * itself part of the contract: renaming a value would silently orphan rows
21
+ * persisted under the old string. These tests pin both the string values and
22
+ * the terminal/open classification.
23
+ */
24
+
25
+ /*
26
+ * The two open (non-terminal) states — still actionable.
27
+ */
28
+ const OPEN_STATUSES: Array<AutoRemediationSuggestionStatus> = [
29
+ AutoRemediationSuggestionStatus.Planning,
30
+ AutoRemediationSuggestionStatus.Suggested,
31
+ ];
32
+
33
+ /*
34
+ * The four terminal states — frozen, never change again.
35
+ */
36
+ const TERMINAL_STATUSES: Array<AutoRemediationSuggestionStatus> = [
37
+ AutoRemediationSuggestionStatus.Approved,
38
+ AutoRemediationSuggestionStatus.AutoExecuted,
39
+ AutoRemediationSuggestionStatus.Dismissed,
40
+ AutoRemediationSuggestionStatus.NoneApplicable,
41
+ ];
42
+
43
+ describe("AutoRemediationSuggestionStatus enum", () => {
44
+ test("each member's string value matches its name", () => {
45
+ expect(AutoRemediationSuggestionStatus.Planning).toBe("Planning");
46
+ expect(AutoRemediationSuggestionStatus.Suggested).toBe("Suggested");
47
+ expect(AutoRemediationSuggestionStatus.Approved).toBe("Approved");
48
+ expect(AutoRemediationSuggestionStatus.AutoExecuted).toBe("AutoExecuted");
49
+ expect(AutoRemediationSuggestionStatus.Dismissed).toBe("Dismissed");
50
+ expect(AutoRemediationSuggestionStatus.NoneApplicable).toBe(
51
+ "NoneApplicable",
52
+ );
53
+ });
54
+
55
+ test("declares exactly six members and no extras", () => {
56
+ const values: Array<string> = Object.values(
57
+ AutoRemediationSuggestionStatus,
58
+ );
59
+ expect(values).toHaveLength(6);
60
+ expect(values.slice().sort()).toEqual(
61
+ [
62
+ "Approved",
63
+ "AutoExecuted",
64
+ "Dismissed",
65
+ "NoneApplicable",
66
+ "Planning",
67
+ "Suggested",
68
+ ].sort(),
69
+ );
70
+ });
71
+
72
+ test("all member string values are unique", () => {
73
+ const values: Array<string> = Object.values(
74
+ AutoRemediationSuggestionStatus,
75
+ );
76
+ const unique: Set<string> = new Set(values);
77
+ expect(unique.size).toBe(values.length);
78
+ });
79
+ });
80
+
81
+ describe("AutoRemediationSuggestionStatusHelper.isTerminalStatus", () => {
82
+ test.each(TERMINAL_STATUSES)(
83
+ "returns true for terminal status %s",
84
+ (status: AutoRemediationSuggestionStatus) => {
85
+ expect(
86
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(status),
87
+ ).toBe(true);
88
+ },
89
+ );
90
+
91
+ test.each(OPEN_STATUSES)(
92
+ "returns false for open status %s",
93
+ (status: AutoRemediationSuggestionStatus) => {
94
+ expect(
95
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(status),
96
+ ).toBe(false);
97
+ },
98
+ );
99
+
100
+ test("terminal and open sets together cover every enum member with no overlap", () => {
101
+ const allStatuses: Array<AutoRemediationSuggestionStatus> = Object.values(
102
+ AutoRemediationSuggestionStatus,
103
+ );
104
+ const partitioned: Array<AutoRemediationSuggestionStatus> = [
105
+ ...TERMINAL_STATUSES,
106
+ ...OPEN_STATUSES,
107
+ ];
108
+
109
+ /*
110
+ * No status appears in both halves.
111
+ */
112
+ expect(new Set(partitioned).size).toBe(partitioned.length);
113
+
114
+ /*
115
+ * Every enum member lands in exactly one half.
116
+ */
117
+ expect(partitioned.slice().sort()).toEqual(allStatuses.slice().sort());
118
+ });
119
+
120
+ test("classifies every enum member without leaving any unclassified", () => {
121
+ const allStatuses: Array<AutoRemediationSuggestionStatus> = Object.values(
122
+ AutoRemediationSuggestionStatus,
123
+ );
124
+
125
+ for (const status of allStatuses) {
126
+ const isTerminal: boolean =
127
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
128
+ const expectedTerminal: boolean = TERMINAL_STATUSES.includes(status);
129
+ expect(isTerminal).toBe(expectedTerminal);
130
+ }
131
+ });
132
+
133
+ test("is a pure predicate — repeated calls yield the same result", () => {
134
+ for (const status of Object.values(AutoRemediationSuggestionStatus)) {
135
+ const first: boolean =
136
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
137
+ const second: boolean =
138
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(status);
139
+ expect(second).toBe(first);
140
+ }
141
+ });
142
+
143
+ test("returns exactly a boolean, never a truthy/falsy proxy", () => {
144
+ const terminalResult: boolean =
145
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
146
+ AutoRemediationSuggestionStatus.Approved,
147
+ );
148
+ const openResult: boolean =
149
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
150
+ AutoRemediationSuggestionStatus.Planning,
151
+ );
152
+ expect(typeof terminalResult).toBe("boolean");
153
+ expect(typeof openResult).toBe("boolean");
154
+ });
155
+
156
+ test("matches the raw string value of each member (DB/wire representation)", () => {
157
+ /*
158
+ * The enum is string-backed, so a persisted row carries the string, not the
159
+ * TS enum reference. Passing the equivalent raw string must classify the
160
+ * same way — guarding against a future rename that would strand old rows.
161
+ */
162
+ expect(
163
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
164
+ "Dismissed" as AutoRemediationSuggestionStatus,
165
+ ),
166
+ ).toBe(true);
167
+ expect(
168
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
169
+ "Suggested" as AutoRemediationSuggestionStatus,
170
+ ),
171
+ ).toBe(false);
172
+ });
173
+
174
+ test("treats an unknown status as non-terminal (no false freeze)", () => {
175
+ /*
176
+ * Defensive edge: a value outside the enum (legacy or corrupt data) is not
177
+ * one of the four terminal constants, so the predicate reports false. That
178
+ * keeps an unrecognized suggestion open/actionable rather than silently
179
+ * frozen.
180
+ */
181
+ expect(
182
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
183
+ "SomethingElse" as AutoRemediationSuggestionStatus,
184
+ ),
185
+ ).toBe(false);
186
+ expect(
187
+ AutoRemediationSuggestionStatusHelper.isTerminalStatus(
188
+ "" as AutoRemediationSuggestionStatus,
189
+ ),
190
+ ).toBe(false);
191
+ });
192
+ });
@@ -0,0 +1,189 @@
1
+ import Phone from "../../../Types/Phone";
2
+ import { isHighRiskPhoneNumber } from "../../../Types/Call/CallRequest";
3
+ import { describe, expect, test } from "@jest/globals";
4
+
5
+ /*
6
+ * isHighRiskPhoneNumber(phone) stringifies the Phone and returns true when the
7
+ * resulting string starts with any of a fixed set of high-risk country dialing
8
+ * codes. The matching is a plain String.prototype.startsWith over the raw
9
+ * value, so behavior hinges on: the exact leading characters (including the
10
+ * "+"), the ordering-independent "some" scan, and the boundary between a real
11
+ * code and a number that merely shares leading digits with one.
12
+ *
13
+ * These tests exercise the real branches: every high-risk code (true path),
14
+ * ordinary countries (false path), near-miss prefixes that share leading digits
15
+ * but are not a code, the required leading "+", formatting/length boundaries,
16
+ * and copy-constructed Phone objects.
17
+ */
18
+
19
+ /*
20
+ * The exact high-risk set encoded in CallRequest.ts. Kept as a local literal so
21
+ * the test asserts against a known expectation rather than re-importing the
22
+ * private constant.
23
+ */
24
+ const HIGH_RISK_DIALING_CODES: Array<string> = [
25
+ "+92",
26
+ "+27",
27
+ "+213",
28
+ "+371",
29
+ "+370",
30
+ "+372",
31
+ "+252",
32
+ "+232",
33
+ "+231",
34
+ "+53",
35
+ "+960",
36
+ "+992",
37
+ "+880",
38
+ "+62",
39
+ "+84",
40
+ "+95",
41
+ ];
42
+
43
+ type MakeValidNumberFunction = (dialingCode: string) => string;
44
+
45
+ /*
46
+ * Build a phone string that starts with the given dialing code and satisfies
47
+ * Phone's constructor regex (3 digits, 3 digits, then 4-7 digits => 10-13 total
48
+ * digits). Padding with zeros to 12 total digits keeps every generated number
49
+ * inside the valid range regardless of whether the code has 2 or 3 digits.
50
+ */
51
+ const makeValidNumber: MakeValidNumberFunction = (
52
+ dialingCode: string,
53
+ ): string => {
54
+ const digits: string = dialingCode.replace("+", "");
55
+ const padding: string = "0000000000000".substring(0, 12 - digits.length);
56
+ return "+" + digits + padding;
57
+ };
58
+
59
+ describe("isHighRiskPhoneNumber flags every high-risk dialing code", () => {
60
+ test.each(HIGH_RISK_DIALING_CODES)(
61
+ "flags a number starting with %s",
62
+ (dialingCode: string) => {
63
+ const phone: Phone = new Phone(makeValidNumber(dialingCode));
64
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
65
+ },
66
+ );
67
+
68
+ test("flags Tajikistan (+992) on its own three-digit code, not via +92", () => {
69
+ /*
70
+ * +992 does not start with +92, so it can only be flagged by its own
71
+ * three-digit entry. This guards against a regression where only the
72
+ * shorter code were present.
73
+ */
74
+ const phone: Phone = new Phone(makeValidNumber("+992"));
75
+ expect(phone.toString().startsWith("+92")).toBe(false);
76
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
77
+ });
78
+ });
79
+
80
+ describe("isHighRiskPhoneNumber does not flag ordinary / low-risk countries", () => {
81
+ const lowRiskNumbers: Array<string> = [
82
+ "+15551234567", // United States / Canada (+1)
83
+ "+442071234567", // United Kingdom (+44)
84
+ "+491234567890", // Germany (+49)
85
+ "+611234567890", // Australia (+61)
86
+ "+331234567890", // France (+33)
87
+ "+811234567890", // Japan (+81)
88
+ "+861234567890", // China (+86)
89
+ "+551234567890", // Brazil (+55)
90
+ "+521234567890", // Mexico (+52) sits right next to Cuba (+53)
91
+ "+919876543210", // India (+91) sits right next to Pakistan (+92)
92
+ ];
93
+
94
+ test.each(lowRiskNumbers)("does not flag %s", (phoneNumber: string) => {
95
+ const phone: Phone = new Phone(phoneNumber);
96
+ expect(isHighRiskPhoneNumber(phone)).toBe(false);
97
+ });
98
+ });
99
+
100
+ describe("near-miss prefixes that only share leading digits are not flagged", () => {
101
+ /*
102
+ * Each entry starts with the same first digits as a real high-risk code but
103
+ * diverges before the full code, so startsWith must return false. This is the
104
+ * key discriminating branch: matching is prefix-exact, not "close enough".
105
+ */
106
+ const nearMisses: Array<[string, string]> = [
107
+ ["+254123456789", "Kenya (+254) vs Somalia (+252)"],
108
+ ["+994123456789", "Azerbaijan (+994) vs Tajikistan (+992)"],
109
+ ["+886123456789", "Taiwan (+886) vs Bangladesh (+880)"],
110
+ [
111
+ "+373123456789",
112
+ "Moldova (+373) vs Latvia/Lithuania/Estonia (+371/+370/+372)",
113
+ ],
114
+ ["+919876543210", "India (+91) vs Pakistan (+92)"],
115
+ ["+521234567890", "Mexico (+52) vs Cuba (+53)"],
116
+ ];
117
+
118
+ test.each(nearMisses)("does not flag %s", (phoneNumber: string) => {
119
+ const phone: Phone = new Phone(phoneNumber);
120
+ expect(isHighRiskPhoneNumber(phone)).toBe(false);
121
+ });
122
+ });
123
+
124
+ describe("the leading + is part of the match", () => {
125
+ test("a high-risk number without the leading + is not flagged", () => {
126
+ /*
127
+ * The stored value is exactly what the caller passed. Without the "+", the
128
+ * string is "920000000000", which does not start with "+92".
129
+ */
130
+ const phone: Phone = new Phone("920000000000");
131
+ expect(phone.toString().startsWith("+")).toBe(false);
132
+ expect(isHighRiskPhoneNumber(phone)).toBe(false);
133
+ });
134
+
135
+ test("the same digits with the leading + are flagged", () => {
136
+ const phone: Phone = new Phone("+920000000000");
137
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
138
+ });
139
+ });
140
+
141
+ describe("formatting and length boundaries", () => {
142
+ test("flags a high-risk number written with separators after the code", () => {
143
+ /*
144
+ * "+232-123-4567" is a valid Phone (3 digits, sep, 3 digits, sep, 4 digits)
145
+ * whose string still starts with the Sierra Leone code "+232".
146
+ */
147
+ const phone: Phone = new Phone("+232-123-4567");
148
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
149
+ });
150
+
151
+ test("flags the shortest valid high-risk number (10 digits)", () => {
152
+ const phone: Phone = new Phone("+9200000000");
153
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
154
+ });
155
+
156
+ test("flags the longest valid high-risk number (13 digits)", () => {
157
+ const phone: Phone = new Phone("+9200000000000");
158
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
159
+ });
160
+ });
161
+
162
+ describe("Phone construction variants are evaluated identically", () => {
163
+ test("a Phone copy-constructed from another Phone is still flagged", () => {
164
+ const original: Phone = new Phone("+920000000000");
165
+ const copy: Phone = new Phone(original);
166
+ expect(copy.toString()).toEqual(original.toString());
167
+ expect(isHighRiskPhoneNumber(copy)).toBe(true);
168
+ });
169
+
170
+ test("mutating a Phone to a high-risk value changes the result", () => {
171
+ const phone: Phone = new Phone("+15551234567");
172
+ expect(isHighRiskPhoneNumber(phone)).toBe(false);
173
+ phone.phone = "+840000000000";
174
+ expect(isHighRiskPhoneNumber(phone)).toBe(true);
175
+ });
176
+ });
177
+
178
+ describe("return value contract", () => {
179
+ test("always returns a strict boolean", () => {
180
+ const flagged: boolean = isHighRiskPhoneNumber(new Phone("+920000000000"));
181
+ const notFlagged: boolean = isHighRiskPhoneNumber(
182
+ new Phone("+15551234567"),
183
+ );
184
+ expect(typeof flagged).toBe("boolean");
185
+ expect(typeof notFlagged).toBe("boolean");
186
+ expect(flagged).toBe(true);
187
+ expect(notFlagged).toBe(false);
188
+ });
189
+ });