@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
@@ -1542,6 +1542,159 @@ export default class AnalyticsDatabaseService<
1542
1542
  return { ...sort, _id: direction } as Sort<TBaseModel>;
1543
1543
  }
1544
1544
 
1545
+ /**
1546
+ * Bounds the rows an `ORDER BY ... , _id` find has to sort, without
1547
+ * changing which rows it returns.
1548
+ *
1549
+ * ClickHouse can read in sorting-key order — and stop early — only when the
1550
+ * ORDER BY lines up with the table's physical key. The `_id` tiebreaker
1551
+ * appended by `toPaginationStableSort` is deliberately NOT a sorting-key
1552
+ * column, so it denies that plan: the engine reads every row matching the
1553
+ * WHERE, sorts the lot in memory, then discards all but one page. On the
1554
+ * Logs viewer that turned a 100-row page into a full-window scan and tripped
1555
+ * the 3 GiB `max_memory_usage` ceiling (Code 241, surfacing as
1556
+ * "Server Error").
1557
+ *
1558
+ * Weakening the tiebreaker would reintroduce the skip/repeat paging bug it
1559
+ * was added to fix, so bound the input instead. `min(k)` over the top
1560
+ * `skip + limit` values of the leading sort key `k` is a rank statistic of
1561
+ * k's MULTISET: it does not depend on which of several tied rows the inner
1562
+ * LIMIT happened to keep. Every row that could reach position `skip + limit`
1563
+ * satisfies `k >= min(k)`, and every row tied at the boundary value is
1564
+ * admitted — so the page is exactly the page the unbounded query returns.
1565
+ * That is what makes this a pure cost change: every gate below is a
1566
+ * performance gate, and getting one wrong can only make a query slower,
1567
+ * never lose or repeat a row.
1568
+ *
1569
+ * The inner pass reads one narrow key column in physical order and stops at
1570
+ * `skip + limit` rows, so it costs far less than the wide outer read it
1571
+ * saves.
1572
+ *
1573
+ * `min()` is nested over a subquery rather than taken as the N-th value via
1574
+ * `ORDER BY k DESC LIMIT 1 OFFSET n - 1` on purpose: on a final page with
1575
+ * fewer than `skip + limit` matching rows the latter returns no row, the
1576
+ * scalar is NULL, `k >= NULL` is NULL, and the page comes back empty.
1577
+ * `min()` over the available rows degrades to the smallest matching value.
1578
+ */
1579
+ private toSortKeyBoundaryFilter(
1580
+ findBy: FindBy<TBaseModel>,
1581
+ sort: Sort<TBaseModel>,
1582
+ options: { hasGroupBy: boolean; databaseName: string },
1583
+ ): Statement | null {
1584
+ /*
1585
+ * Under GROUP BY the predicate would restrict the aggregation INPUT
1586
+ * rather than the page, so it would change results. Mirrors the
1587
+ * tiebreaker's own exemption, leaving grouped finds byte-identical.
1588
+ */
1589
+ if (options.hasGroupBy) {
1590
+ return null;
1591
+ }
1592
+
1593
+ /*
1594
+ * Without an `_id` column there is no off-key tiebreaker — the six
1595
+ * `includeBaseColumns: false` aggregate targets — so the ORDER BY is
1596
+ * already key-aligned and the bound would be pure overhead. Same
1597
+ * condition toPaginationStableSort bails on.
1598
+ */
1599
+ const hasIdColumn: boolean = this.model.tableColumns.some(
1600
+ (column: AnalyticsTableColumn): boolean => {
1601
+ return column.key === "_id";
1602
+ },
1603
+ );
1604
+
1605
+ if (!hasIdColumn) {
1606
+ return null;
1607
+ }
1608
+
1609
+ const leadingSortKey: string | undefined = Object.keys(sort || {})[0];
1610
+
1611
+ if (!leadingSortKey) {
1612
+ return null;
1613
+ }
1614
+
1615
+ /*
1616
+ * Only a column in the physical sorting key can be read in order, so
1617
+ * only there can the off-key `_id` term have cost anything. Off-key
1618
+ * leads (e.g. Log by `severityText`) already plan a bounded top-N and
1619
+ * an extra pass would be pure waste.
1620
+ */
1621
+ if (!this.model.sortKeys.includes(leadingSortKey)) {
1622
+ return null;
1623
+ }
1624
+
1625
+ /*
1626
+ * A non-required column is `Nullable(...)` in the DDL, and `k >= NULL`
1627
+ * is NULL — the predicate would DROP those rows rather than just
1628
+ * narrowing the scan. Fail safe to today's behavior.
1629
+ */
1630
+ const leadingSortColumn: AnalyticsTableColumn | null =
1631
+ this.model.getTableColumn(leadingSortKey);
1632
+
1633
+ if (!leadingSortColumn || !leadingSortColumn.required) {
1634
+ return null;
1635
+ }
1636
+
1637
+ /*
1638
+ * `findOneById` funnels a point lookup through `findOneBy` carrying the
1639
+ * model's default sort. At most one row can match, so bounding it would
1640
+ * double a query that has no ordering problem to begin with.
1641
+ */
1642
+ if ((findBy.query as Record<string, unknown> | undefined)?.["_id"]) {
1643
+ return null;
1644
+ }
1645
+
1646
+ /*
1647
+ * The predicate is valid only BECAUSE of LIMIT/OFFSET: it admits the
1648
+ * rows that can reach position `skip + limit` and no more. Guards the
1649
+ * `new PositiveNumber(undefined)` -> NaN path that exists upstream.
1650
+ */
1651
+ const limit: number = Number(findBy.limit);
1652
+ const skip: number = Number(findBy.skip);
1653
+
1654
+ if (!Number.isFinite(limit) || !Number.isFinite(skip)) {
1655
+ return null;
1656
+ }
1657
+
1658
+ const boundaryRowCount: number = skip + limit;
1659
+
1660
+ if (boundaryRowCount <= 0) {
1661
+ return null;
1662
+ }
1663
+
1664
+ const isDescending: boolean =
1665
+ (sort as Record<string, SortOrder | undefined>)[leadingSortKey] !==
1666
+ SortOrder.Ascending;
1667
+
1668
+ /*
1669
+ * The bound must be computed over the same row set the outer query
1670
+ * filters on, so the WHERE is regenerated rather than shared: appending
1671
+ * one Statement into two places would bind its parameters twice.
1672
+ */
1673
+ const boundaryWhereStatement: Statement =
1674
+ this.statementGenerator.toWhereStatement(findBy.query);
1675
+
1676
+ const boundaryStatement: Statement = SQL` AND ${leadingSortKey} `;
1677
+
1678
+ boundaryStatement.append(isDescending ? SQL`>=` : SQL`<=`);
1679
+ boundaryStatement.append(
1680
+ isDescending
1681
+ ? SQL` (SELECT min(${leadingSortKey}) FROM (SELECT ${leadingSortKey} FROM ${options.databaseName}.${this.model.tableName} WHERE TRUE `
1682
+ : SQL` (SELECT max(${leadingSortKey}) FROM (SELECT ${leadingSortKey} FROM ${options.databaseName}.${this.model.tableName} WHERE TRUE `,
1683
+ );
1684
+ boundaryStatement.append(boundaryWhereStatement);
1685
+ boundaryStatement.append(this.getRetentionReadFilter());
1686
+ boundaryStatement.append(SQL` ORDER BY ${leadingSortKey} `);
1687
+ boundaryStatement.append(isDescending ? SQL`DESC` : SQL`ASC`);
1688
+ boundaryStatement.append(
1689
+ SQL` LIMIT ${{
1690
+ value: boundaryRowCount,
1691
+ type: TableColumnType.Number,
1692
+ }}))`,
1693
+ );
1694
+
1695
+ return boundaryStatement;
1696
+ }
1697
+
1545
1698
  public toFindStatement(findBy: FindBy<TBaseModel>): {
1546
1699
  statement: Statement;
1547
1700
  columns: Array<string>;
@@ -1577,6 +1730,18 @@ export default class AnalyticsDatabaseService<
1577
1730
  }),
1578
1731
  );
1579
1732
 
1733
+ /*
1734
+ * Keeps the `_id` tiebreaker affordable. Result-preserving by
1735
+ * construction, so it is appended to the WHERE without touching the
1736
+ * ORDER BY above. Null whenever the bound cannot help or cannot be
1737
+ * proven safe.
1738
+ */
1739
+ const sortKeyBoundaryStatement: Statement | null =
1740
+ this.toSortKeyBoundaryFilter(findBy, findBy.sort!, {
1741
+ hasGroupBy: Boolean(groupByStatement),
1742
+ databaseName: databaseName,
1743
+ });
1744
+
1580
1745
  const statement: Statement = SQL``;
1581
1746
 
1582
1747
  statement.append(SQL`SELECT `.append(select.statement));
@@ -1586,6 +1751,10 @@ export default class AnalyticsDatabaseService<
1586
1751
  .append(whereStatement)
1587
1752
  .append(this.getRetentionReadFilter());
1588
1753
 
1754
+ if (sortKeyBoundaryStatement) {
1755
+ statement.append(sortKeyBoundaryStatement);
1756
+ }
1757
+
1589
1758
  if (groupByStatement) {
1590
1759
  statement.append(SQL` GROUP BY `).append(groupByStatement);
1591
1760
  }
@@ -1,20 +1,120 @@
1
1
  import CreateBy from "../Types/Database/CreateBy";
2
- import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
2
+ import DeleteBy from "../Types/Database/DeleteBy";
3
+ import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
3
4
  import UpdateBy from "../Types/Database/UpdateBy";
4
5
  import DatabaseService from "./DatabaseService";
5
- import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
6
+ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
6
7
  import BadDataException from "../../Types/Exception/BadDataException";
7
8
  import Model from "../../Models/DatabaseModels/ApiKeyPermission";
9
+ import Label from "../../Models/DatabaseModels/Label";
10
+ import ObjectID from "../../Types/ObjectID";
11
+ import Permission from "../../Types/Permission";
8
12
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
13
+ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
14
+
15
+ /*
16
+ * 60s is the worst-case staleness on any single API node after a key's
17
+ * permissions are edited. We invalidate in-process immediately on
18
+ * create/update/delete; this TTL is the upper bound for *other* processes
19
+ * (same bound the ApiKeyService key cache accepted).
20
+ */
21
+ const PERMISSIONS_TTL_MS: number = 60 * 1000;
22
+
23
+ interface CachedApiKeyPermissionRow {
24
+ permission: Permission;
25
+ labelIds: Array<string>;
26
+ isBlockPermission: boolean | undefined;
27
+ }
28
+
29
+ export interface ApiKeyPermissionRow {
30
+ permission: Permission;
31
+ labelIds: Array<ObjectID>;
32
+ isBlockPermission: boolean | undefined;
33
+ }
34
+
9
35
  export class Service extends DatabaseService<Model> {
36
+ /*
37
+ * Cache of `apiKeyId -> permission rows`. The API-key auth path builds the
38
+ * request's tenant permissions from these rows on every request; without it
39
+ * that's a Postgres findBy (with a labels join) per request.
40
+ */
41
+ private permissionCache: InMemoryTTLCache<Array<CachedApiKeyPermissionRow>> =
42
+ new InMemoryTTLCache(10_000);
43
+
10
44
  public constructor() {
11
45
  super(Model);
12
46
  }
13
47
 
48
+ public clearCache(): void {
49
+ this.permissionCache.clear();
50
+ }
51
+
52
+ /**
53
+ * Resolves the permission rows granted to an API key, with a short-lived
54
+ * in-process cache. Returns freshly built objects on every call (hit or
55
+ * miss), so callers never share mutable state with the cache. Use this from
56
+ * the auth hot path instead of calling `findBy` directly.
57
+ */
58
+ @CaptureSpan()
59
+ public async findPermissionsByApiKeyId(
60
+ apiKeyId: ObjectID,
61
+ ): Promise<Array<ApiKeyPermissionRow>> {
62
+ const cacheKey: string = apiKeyId.toString();
63
+
64
+ let cachedRows: Array<CachedApiKeyPermissionRow> | undefined =
65
+ this.permissionCache.get(cacheKey);
66
+
67
+ if (cachedRows === undefined) {
68
+ const rows: Array<Model> = await this.findBy({
69
+ query: {
70
+ apiKeyId: apiKeyId,
71
+ },
72
+ select: {
73
+ permission: true,
74
+ labels: {
75
+ _id: true,
76
+ },
77
+ isBlockPermission: true,
78
+ },
79
+ limit: LIMIT_MAX,
80
+ skip: 0,
81
+ props: {
82
+ isRoot: true,
83
+ },
84
+ });
85
+
86
+ cachedRows = rows.map((row: Model): CachedApiKeyPermissionRow => {
87
+ return {
88
+ permission: row.permission!,
89
+ labelIds: (row.labels ?? []).map((label: Label) => {
90
+ return label.id!.toString();
91
+ }),
92
+ isBlockPermission: row.isBlockPermission,
93
+ };
94
+ });
95
+
96
+ this.permissionCache.set(cacheKey, cachedRows, PERMISSIONS_TTL_MS);
97
+ }
98
+
99
+ return cachedRows.map(
100
+ (row: CachedApiKeyPermissionRow): ApiKeyPermissionRow => {
101
+ return {
102
+ permission: row.permission,
103
+ labelIds: row.labelIds.map((id: string) => {
104
+ return new ObjectID(id);
105
+ }),
106
+ isBlockPermission: row.isBlockPermission,
107
+ };
108
+ },
109
+ );
110
+ }
111
+
14
112
  @CaptureSpan()
15
113
  protected override async onBeforeCreate(
16
114
  createBy: CreateBy<Model>,
17
115
  ): Promise<OnCreate<Model>> {
116
+ this.clearCache();
117
+
18
118
  if (!createBy.data.apiKeyId) {
19
119
  throw new BadDataException("API Key ID is required to create permission");
20
120
  }
@@ -92,6 +192,12 @@ export class Service extends DatabaseService<Model> {
92
192
  protected override async onBeforeUpdate(
93
193
  updateBy: UpdateBy<Model>,
94
194
  ): Promise<OnUpdate<Model>> {
195
+ /*
196
+ * We don't know which keys are being updated without a query; updates
197
+ * are rare so clearing is cheap.
198
+ */
199
+ this.clearCache();
200
+
95
201
  if (updateBy.data.labels && updateBy.data.labels.length > 0) {
96
202
  const existingPermissions: Array<Model> = await this.findBy({
97
203
  query: updateBy.query,
@@ -153,6 +259,14 @@ export class Service extends DatabaseService<Model> {
153
259
 
154
260
  return { updateBy, carryForward: null };
155
261
  }
262
+
263
+ @CaptureSpan()
264
+ protected override async onBeforeDelete(
265
+ deleteBy: DeleteBy<Model>,
266
+ ): Promise<OnDelete<Model>> {
267
+ this.clearCache();
268
+ return { deleteBy, carryForward: null };
269
+ }
156
270
  }
157
271
 
158
272
  export default new Service();
@@ -34,6 +34,7 @@ import Encryption from "../Utils/Encryption";
34
34
  import PasswordHash from "../Utils/PasswordHash";
35
35
  import PostgresErrorTranslator from "../Utils/Database/PostgresErrorTranslator";
36
36
  import logger, { LogAttributes } from "../Utils/Logger";
37
+ import ConfigLogLevel from "../Types/ConfigLogLevel";
37
38
  import BaseService from "./BaseService";
38
39
  import BaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
39
40
  import { WorkflowRoute } from "../../ServiceRoute";
@@ -2268,6 +2269,14 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
2268
2269
  */
2269
2270
  const affectedItems: Array<TBaseModel> = [];
2270
2271
 
2272
+ /*
2273
+ * The per-item debug payload below is a pretty-printed JSON.stringify
2274
+ * of every matched row; skip building it entirely unless the log level
2275
+ * is DEBUG, since logger.debug() no-ops at any other level.
2276
+ */
2277
+ const isDebugLogEnabled: boolean =
2278
+ logger.getLogLevel() === ConfigLogLevel.DEBUG;
2279
+
2271
2280
  for (const item of items) {
2272
2281
  /*
2273
2282
  * _id must be set AFTER the spread: update data can carry an
@@ -2282,12 +2291,14 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
2282
2291
  _id: item._id!,
2283
2292
  } as any;
2284
2293
 
2285
- logger.debug("Updated Item", {
2286
- projectId: updateBy.props.tenantId?.toString(),
2287
- } as LogAttributes);
2288
- logger.debug(JSON.stringify(updatedItem, null, 2), {
2289
- projectId: updateBy.props.tenantId?.toString(),
2290
- } as LogAttributes);
2294
+ if (isDebugLogEnabled) {
2295
+ logger.debug("Updated Item", {
2296
+ projectId: updateBy.props.tenantId?.toString(),
2297
+ } as LogAttributes);
2298
+ logger.debug(JSON.stringify(updatedItem, null, 2), {
2299
+ projectId: updateBy.props.tenantId?.toString(),
2300
+ } as LogAttributes);
2301
+ }
2291
2302
 
2292
2303
  if (hasRelationUpdates) {
2293
2304
  await this.getRepository().save(updatedItem);
@@ -2875,6 +2886,107 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
2875
2886
  await repository.manager.query(sql, params);
2876
2887
  }
2877
2888
 
2889
+ /*
2890
+ * Add one to a numeric column and return what it became, in a SINGLE
2891
+ * statement.
2892
+ *
2893
+ * This exists for counters that GATE something, where the read and the
2894
+ * write cannot be allowed to come apart. The motivating case is the failed
2895
+ * attempt counter on a notification-channel verification code: read the
2896
+ * count, decide, then write it back, and N requests racing each other all
2897
+ * read the same pre-increment value and all decide they are under the
2898
+ * limit — which is precisely the shape an attacker running a brute-force
2899
+ * loop produces. `atomicAddToColumnsByIdWithoutHooks` closes the
2900
+ * lost-update half of that but cannot answer "and what is it now?", and
2901
+ * `getRepository().increment()` cannot either.
2902
+ *
2903
+ * RETURNING makes the increment and the observation the same operation, so
2904
+ * every concurrent caller gets a distinct value and the k-th attempt is
2905
+ * refused no matter how the requests interleave.
2906
+ *
2907
+ * COALESCE so a NULL counter starts from zero rather than staying NULL.
2908
+ *
2909
+ * The column and table identifiers come from entity metadata, never from
2910
+ * the caller, and the id is bound as a parameter. Hooks, the `version`
2911
+ * bump and access control are all skipped: use ONLY for trusted internal
2912
+ * counter writes.
2913
+ */
2914
+ @CaptureSpan()
2915
+ public async atomicIncrementColumnValueByOneAndGetValue(data: {
2916
+ id: ObjectID;
2917
+ columnName: keyof TBaseModel;
2918
+ }): Promise<number> {
2919
+ if (!data.id) {
2920
+ throw new BadDataException("id is required");
2921
+ }
2922
+
2923
+ const repository: Repository<TBaseModel> = this.getRepository();
2924
+ const metadata: EntityMetadata = repository.metadata;
2925
+
2926
+ const column: ColumnMetadata | undefined =
2927
+ metadata.findColumnWithPropertyName(data.columnName as string);
2928
+
2929
+ if (!column) {
2930
+ throw new BadDataException(
2931
+ `atomicIncrementColumnValueByOneAndGetValue: unknown column "${String(
2932
+ data.columnName,
2933
+ )}" on "${metadata.tableName}"`,
2934
+ );
2935
+ }
2936
+
2937
+ const primaryColumnName: string =
2938
+ metadata.primaryColumns[0]?.databaseName || "_id";
2939
+
2940
+ const quoted: string = `"${column.databaseName}"`;
2941
+
2942
+ const sql: string = `UPDATE "${metadata.tableName}" SET ${quoted} = COALESCE(${quoted}, 0) + 1 WHERE "${primaryColumnName}" = $1 RETURNING ${quoted}`;
2943
+
2944
+ const result: unknown = await repository.manager.query(sql, [
2945
+ data.id.toString(),
2946
+ ]);
2947
+
2948
+ /*
2949
+ * TypeORM's Postgres driver returns `[rows, affectedCount]` for an UPDATE
2950
+ * and a bare row array for everything else, so both shapes are unwrapped
2951
+ * rather than one being assumed.
2952
+ */
2953
+ const rows: Array<unknown> = Array.isArray(result)
2954
+ ? Array.isArray(result[0])
2955
+ ? (result[0] as Array<unknown>)
2956
+ : (result as Array<unknown>)
2957
+ : [];
2958
+
2959
+ const row: unknown = rows[0];
2960
+
2961
+ if (!row || typeof row !== "object" || Array.isArray(row)) {
2962
+ /*
2963
+ * Nothing came back, so the row does not exist — deleted underneath us,
2964
+ * or never there. Callers gate on the returned count, so this must be an
2965
+ * error and not a zero, which would read as a fresh allowance.
2966
+ */
2967
+ throw new BadDataException(
2968
+ `Item with ID ${data.id.toString()} not found`,
2969
+ );
2970
+ }
2971
+
2972
+ const value: unknown = (row as Record<string, unknown>)[
2973
+ column.databaseName
2974
+ ];
2975
+
2976
+ const parsed: number =
2977
+ typeof value === "number" ? value : parseInt(String(value), 10);
2978
+
2979
+ if (!Number.isFinite(parsed)) {
2980
+ throw new BadDataException(
2981
+ `atomicIncrementColumnValueByOneAndGetValue: "${String(
2982
+ data.columnName,
2983
+ )}" did not return a number`,
2984
+ );
2985
+ }
2986
+
2987
+ return parsed;
2988
+ }
2989
+
2878
2990
  @CaptureSpan()
2879
2991
  protected async atomicIncrementColumnValueByOne(data: {
2880
2992
  id: ObjectID;
@@ -10,6 +10,10 @@ import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName
10
10
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
11
11
  import { DbJSONResponse, Results } from "./AnalyticsDatabaseService";
12
12
  import ServiceType from "../../Types/Telemetry/ServiceType";
13
+ import {
14
+ appendResourceScopeFilters,
15
+ ResourceEntityScope,
16
+ } from "../Utils/Telemetry/ResourceEntityFilter";
13
17
 
14
18
  export interface HistogramBucket {
15
19
  time: string;
@@ -27,6 +31,15 @@ export interface HistogramRequest {
27
31
  bucketSizeInMinutes: number;
28
32
  serviceIds?: Array<ObjectID> | undefined;
29
33
  entityKeys?: Array<string> | undefined;
34
+ /*
35
+ * Resource-facet selections (Kubernetes cluster / host / docker host /
36
+ * podman host) already resolved to their entity keys. One scope per
37
+ * facet: the branches inside a scope OR (a row proves membership either
38
+ * by being primary-keyed on the resource or by carrying its entity key),
39
+ * and the scopes AND with each other so two facets intersect. See
40
+ * ResourceEntityFilter.
41
+ */
42
+ resourceScopes?: Array<ResourceEntityScope> | undefined;
30
43
  severityTexts?: Array<string> | undefined;
31
44
  bodySearchText?: string | undefined;
32
45
  traceIds?: Array<string> | undefined;
@@ -49,6 +62,15 @@ export interface FacetRequest {
49
62
  limit?: number | undefined;
50
63
  serviceIds?: Array<ObjectID> | undefined;
51
64
  entityKeys?: Array<string> | undefined;
65
+ /*
66
+ * Resource-facet selections (Kubernetes cluster / host / docker host /
67
+ * podman host) already resolved to their entity keys. One scope per
68
+ * facet: the branches inside a scope OR (a row proves membership either
69
+ * by being primary-keyed on the resource or by carrying its entity key),
70
+ * and the scopes AND with each other so two facets intersect. See
71
+ * ResourceEntityFilter.
72
+ */
73
+ resourceScopes?: Array<ResourceEntityScope> | undefined;
52
74
  severityTexts?: Array<string> | undefined;
53
75
  bodySearchText?: string | undefined;
54
76
  traceIds?: Array<string> | undefined;
@@ -70,6 +92,15 @@ export interface AnalyticsRequest {
70
92
  aggregation: AnalyticsAggregation;
71
93
  aggregationField?: string | undefined;
72
94
  serviceIds?: Array<ObjectID> | undefined;
95
+ /*
96
+ * Resource-facet selections (Kubernetes cluster / host / docker host /
97
+ * podman host) already resolved to their entity keys. One scope per
98
+ * facet: the branches inside a scope OR (a row proves membership either
99
+ * by being primary-keyed on the resource or by carrying its entity key),
100
+ * and the scopes AND with each other so two facets intersect. See
101
+ * ResourceEntityFilter.
102
+ */
103
+ resourceScopes?: Array<ResourceEntityScope> | undefined;
73
104
  severityTexts?: Array<string> | undefined;
74
105
  bodySearchText?: string | undefined;
75
106
  traceIds?: Array<string> | undefined;
@@ -251,6 +282,7 @@ export class LogAggregationService {
251
282
  getQuerySettings({
252
283
  maxExecutionTimeInSeconds: 45,
253
284
  timeoutOverflowMode: "break",
285
+ boundScanMemory: true,
254
286
  additionalSettings: { optimize_use_projections: 1 },
255
287
  }),
256
288
  );
@@ -361,6 +393,7 @@ export class LogAggregationService {
361
393
  getQuerySettings({
362
394
  maxExecutionTimeInSeconds: 45,
363
395
  timeoutOverflowMode: "break",
396
+ boundScanMemory: true,
364
397
  }),
365
398
  );
366
399
 
@@ -603,6 +636,7 @@ export class LogAggregationService {
603
636
  getQuerySettings({
604
637
  maxExecutionTimeInSeconds: 45,
605
638
  timeoutOverflowMode: "break",
639
+ boundScanMemory: true,
606
640
  }),
607
641
  );
608
642
 
@@ -683,6 +717,7 @@ export class LogAggregationService {
683
717
  getQuerySettings({
684
718
  maxExecutionTimeInSeconds: 45,
685
719
  timeoutOverflowMode: "break",
720
+ boundScanMemory: true,
686
721
  }),
687
722
  );
688
723
 
@@ -752,6 +787,7 @@ export class LogAggregationService {
752
787
  getQuerySettings({
753
788
  maxExecutionTimeInSeconds: 45,
754
789
  timeoutOverflowMode: "break",
790
+ boundScanMemory: true,
755
791
  }),
756
792
  );
757
793
 
@@ -764,6 +800,7 @@ export class LogAggregationService {
764
800
  HistogramRequest,
765
801
  | "serviceIds"
766
802
  | "entityKeys"
803
+ | "resourceScopes"
767
804
  | "severityTexts"
768
805
  | "bodySearchText"
769
806
  | "traceIds"
@@ -794,6 +831,8 @@ export class LogAggregationService {
794
831
  );
795
832
  }
796
833
 
834
+ appendResourceScopeFilters(statement, request.resourceScopes);
835
+
797
836
  if (request.severityTexts && request.severityTexts.length > 0) {
798
837
  statement.append(
799
838
  SQL` AND severityText IN (${{
@@ -1,11 +1,32 @@
1
1
  import ClickhouseDatabase from "../Infrastructure/ClickhouseDatabase";
2
2
  import AnalyticsDatabaseService from "./AnalyticsDatabaseService";
3
3
  import Log from "../../Models/AnalyticsModels/Log";
4
+ import FindBy from "../Types/AnalyticsDatabase/FindBy";
5
+ import { OnFind } from "../Types/AnalyticsDatabase/Hooks";
6
+ import ResourceEntityFilter from "../Utils/Telemetry/ResourceEntityFilter";
4
7
 
5
8
  export class LogService extends AnalyticsDatabaseService<Log> {
6
9
  public constructor(clickhouseDatabase?: ClickhouseDatabase | undefined) {
7
10
  super({ modelType: Log, database: clickhouseDatabase });
8
11
  }
12
+
13
+ /*
14
+ * Resolve the logs explorer's resource-facet selections (a Kubernetes
15
+ * cluster, a host, ...) before the query is compiled. They arrive as
16
+ * Postgres ids under `resourceFilters`; matching them needs the
17
+ * resource's entity key, which only Postgres can supply. See
18
+ * ResourceEntityFilter.
19
+ */
20
+ protected override async onBeforeFind(
21
+ findBy: FindBy<Log>,
22
+ ): Promise<OnFind<Log>> {
23
+ await ResourceEntityFilter.rewriteAnalyticsQuery({
24
+ query: findBy.query as unknown as Record<string, unknown>,
25
+ projectId: findBy.props?.tenantId,
26
+ });
27
+
28
+ return { findBy, carryForward: null };
29
+ }
9
30
  }
10
31
 
11
32
  export default new LogService();
@@ -849,7 +849,16 @@ export class Service extends DatabaseService<Model> {
849
849
  select: {
850
850
  _id: true,
851
851
  currentMonitorStatusId: true,
852
+ /*
853
+ * All four reachability inputs. isReachable is the one that decides
854
+ * up/down; the other three only size the "polling has stopped
855
+ * entirely" backstop. Selecting lastSeenAt alone silently drops the
856
+ * rollup back to the old freshness rule.
857
+ */
858
+ isReachable: true,
859
+ lastPolledAt: true,
852
860
  lastSeenAt: true,
861
+ pollingIntervalInMinutes: true,
853
862
  },
854
863
  limit: LIMIT_MAX,
855
864
  skip: 0,
@@ -908,7 +917,10 @@ export class Service extends DatabaseService<Model> {
908
917
  monitorStatusPriority: statusId
909
918
  ? priorityByStatusId.get(statusId)
910
919
  : undefined,
920
+ isReachable: device.isReachable,
921
+ lastPolledAt: device.lastPolledAt,
911
922
  lastSeenAt: device.lastSeenAt,
923
+ pollingIntervalInMinutes: device.pollingIntervalInMinutes,
912
924
  };
913
925
  },
914
926
  );