@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
@@ -317,15 +317,27 @@ class UserSMS extends BaseModel {
317
317
  @OwnerOnlyColumn()
318
318
  @TableColumn({
319
319
  title: "Verification Code",
320
- description: "Temporary Verification Code",
320
+ description:
321
+ "Keyed digest of the temporary verification code — never the code itself",
321
322
  isDefaultValueColumn: true,
322
323
  computed: true,
323
324
  required: true,
324
325
  type: TableColumnType.ShortText,
326
+ /*
327
+ * A row is born with NO usable code on it: a 64-character random
328
+ * placeholder that no six-digit code can ever hash to. The real code is
329
+ * generated, hashed and sent by this channel's service once the row
330
+ * exists — the row id is part of the hashed message, so the digest cannot
331
+ * be computed before the insert has assigned one.
332
+ *
333
+ * This stays a forced default rather than moving wholly into the service
334
+ * hook because the column is NOT NULL and must be satisfied on every
335
+ * create path, including those that pass props.ignoreHooks.
336
+ */
325
337
  forceGetDefaultValueOnCreate: () => {
326
- return Text.generateRandomNumber(6);
338
+ return Text.generateRandomText(64);
327
339
  },
328
- example: "123456",
340
+ example: "9f2c1b4a7d3e6058c1f0a9b8d7e6f5c4b3a291807f6e5d4c3b2a19081726354",
329
341
  })
330
342
  @Column({
331
343
  type: ColumnType.ShortText,
@@ -333,6 +345,85 @@ class UserSMS extends BaseModel {
333
345
  length: ColumnLength.ShortText,
334
346
  })
335
347
  public verificationCode?: string = undefined;
348
+
349
+ @ColumnAccessControl({
350
+ create: [],
351
+ read: [],
352
+ update: [],
353
+ })
354
+ /*
355
+ * When the code currently on this row stops being accepted.
356
+ *
357
+ * NULL means there is no live code: none was ever issued, or the last one
358
+ * was used, or it was burned by the attempt limit — or the row predates
359
+ * this column, which is read the same conservative way. Without an expiry
360
+ * the six-digit code space stood open indefinitely, which is what made
361
+ * walking it worthwhile.
362
+ */
363
+ @TableColumn({
364
+ title: "Verification Code Expires At",
365
+ description: "When the verification code on this row stops being accepted",
366
+ computed: true,
367
+ type: TableColumnType.Date,
368
+ })
369
+ @Column({
370
+ type: ColumnType.Date,
371
+ nullable: true,
372
+ })
373
+ public verificationCodeExpiresAt?: Date = undefined;
374
+
375
+ @ColumnAccessControl({
376
+ create: [],
377
+ read: [],
378
+ update: [],
379
+ })
380
+ /*
381
+ * Wrong guesses made against the code currently on this row, reset to zero
382
+ * each time a code is issued.
383
+ *
384
+ * This is the counter that stops /verify being an unlimited oracle over a
385
+ * space small enough to walk in minutes. It is incremented with a single
386
+ * atomic UPDATE ... RETURNING rather than a read-modify-write, because
387
+ * requests racing each other are the normal shape of the attack.
388
+ */
389
+ @TableColumn({
390
+ title: "Verification Failed Attempts",
391
+ description:
392
+ "Incorrect verification attempts made against the current verification code",
393
+ computed: true,
394
+ type: TableColumnType.Number,
395
+ })
396
+ @Column({
397
+ type: ColumnType.Number,
398
+ nullable: false,
399
+ default: 0,
400
+ })
401
+ public verificationFailedAttempts?: number = undefined;
402
+
403
+ @ColumnAccessControl({
404
+ create: [],
405
+ read: [],
406
+ update: [],
407
+ })
408
+ /*
409
+ * When a verification code was last sent for this row.
410
+ *
411
+ * Drives the resend cooldown. Without it, "spend the five attempts, ask for
412
+ * a fresh code, repeat" costs an attacker nothing — and the resend control
413
+ * doubles as a way to send somebody unsolicited messages at whatever rate
414
+ * the network allows, at the project's expense.
415
+ */
416
+ @TableColumn({
417
+ title: "Verification Code Sent At",
418
+ description: "When a verification code was last sent for this row",
419
+ computed: true,
420
+ type: TableColumnType.Date,
421
+ })
422
+ @Column({
423
+ type: ColumnType.Date,
424
+ nullable: true,
425
+ })
426
+ public verificationCodeSentAt?: Date = undefined;
336
427
  }
337
428
 
338
429
  export default UserSMS;
@@ -309,13 +309,25 @@ class UserWhatsApp extends BaseModel {
309
309
  @OwnerOnlyColumn()
310
310
  @TableColumn({
311
311
  title: "Verification Code",
312
- description: "Temporary Verification Code",
312
+ description:
313
+ "Keyed digest of the temporary verification code — never the code itself",
313
314
  isDefaultValueColumn: true,
314
315
  computed: true,
315
316
  required: true,
316
317
  type: TableColumnType.ShortText,
318
+ /*
319
+ * A row is born with NO usable code on it: a 64-character random
320
+ * placeholder that no six-digit code can ever hash to. The real code is
321
+ * generated, hashed and sent by this channel's service once the row
322
+ * exists — the row id is part of the hashed message, so the digest cannot
323
+ * be computed before the insert has assigned one.
324
+ *
325
+ * This stays a forced default rather than moving wholly into the service
326
+ * hook because the column is NOT NULL and must be satisfied on every
327
+ * create path, including those that pass props.ignoreHooks.
328
+ */
317
329
  forceGetDefaultValueOnCreate: () => {
318
- return Text.generateRandomNumber(6);
330
+ return Text.generateRandomText(64);
319
331
  },
320
332
  })
321
333
  @Column({
@@ -324,6 +336,85 @@ class UserWhatsApp extends BaseModel {
324
336
  length: ColumnLength.ShortText,
325
337
  })
326
338
  public verificationCode?: string = undefined;
339
+
340
+ @ColumnAccessControl({
341
+ create: [],
342
+ read: [],
343
+ update: [],
344
+ })
345
+ /*
346
+ * When the code currently on this row stops being accepted.
347
+ *
348
+ * NULL means there is no live code: none was ever issued, or the last one
349
+ * was used, or it was burned by the attempt limit — or the row predates
350
+ * this column, which is read the same conservative way. Without an expiry
351
+ * the six-digit code space stood open indefinitely, which is what made
352
+ * walking it worthwhile.
353
+ */
354
+ @TableColumn({
355
+ title: "Verification Code Expires At",
356
+ description: "When the verification code on this row stops being accepted",
357
+ computed: true,
358
+ type: TableColumnType.Date,
359
+ })
360
+ @Column({
361
+ type: ColumnType.Date,
362
+ nullable: true,
363
+ })
364
+ public verificationCodeExpiresAt?: Date = undefined;
365
+
366
+ @ColumnAccessControl({
367
+ create: [],
368
+ read: [],
369
+ update: [],
370
+ })
371
+ /*
372
+ * Wrong guesses made against the code currently on this row, reset to zero
373
+ * each time a code is issued.
374
+ *
375
+ * This is the counter that stops /verify being an unlimited oracle over a
376
+ * space small enough to walk in minutes. It is incremented with a single
377
+ * atomic UPDATE ... RETURNING rather than a read-modify-write, because
378
+ * requests racing each other are the normal shape of the attack.
379
+ */
380
+ @TableColumn({
381
+ title: "Verification Failed Attempts",
382
+ description:
383
+ "Incorrect verification attempts made against the current verification code",
384
+ computed: true,
385
+ type: TableColumnType.Number,
386
+ })
387
+ @Column({
388
+ type: ColumnType.Number,
389
+ nullable: false,
390
+ default: 0,
391
+ })
392
+ public verificationFailedAttempts?: number = undefined;
393
+
394
+ @ColumnAccessControl({
395
+ create: [],
396
+ read: [],
397
+ update: [],
398
+ })
399
+ /*
400
+ * When a verification code was last sent for this row.
401
+ *
402
+ * Drives the resend cooldown. Without it, "spend the five attempts, ask for
403
+ * a fresh code, repeat" costs an attacker nothing — and the resend control
404
+ * doubles as a way to send somebody unsolicited messages at whatever rate
405
+ * the network allows, at the project's expense.
406
+ */
407
+ @TableColumn({
408
+ title: "Verification Code Sent At",
409
+ description: "When a verification code was last sent for this row",
410
+ computed: true,
411
+ type: TableColumnType.Date,
412
+ })
413
+ @Column({
414
+ type: ColumnType.Date,
415
+ nullable: true,
416
+ })
417
+ public verificationCodeSentAt?: Date = undefined;
327
418
  }
328
419
 
329
420
  export default UserWhatsApp;
@@ -45,9 +45,26 @@ export interface MicrosoftTeamsChat {
45
45
  * roster member of. Listing a team is therefore NOT evidence that we can post
46
46
  * to it — this record is, which is why channel sends check it before calling
47
47
  * the Bot Framework.
48
+ *
49
+ * A Teams team has TWO ids and they are not interchangeable. Bot activities
50
+ * carry the thread id (channelData.team.id, "19:...@thread.tacv2"); Graph — and
51
+ * therefore every team picker, notification rule and channel URL in OneUptime —
52
+ * uses the AAD group id (a GUID, channelData.team.aadGroupId). Records used to
53
+ * be keyed by the thread id and looked up by the group id, so the lookup could
54
+ * never hit. Both are stored explicitly now so neither side has to guess which
55
+ * one it holds.
48
56
  */
49
57
  export interface MicrosoftTeamsInstalledTeam {
50
- id: string; // Teams team (group) id.
58
+ /*
59
+ * Map key. The Graph team id when we could resolve it, otherwise the Teams
60
+ * thread id — a record written before this shipped, or one whose group id
61
+ * could not be resolved, keeps the thread id here so uninstall still matches.
62
+ * Read it through MicrosoftTeamsUtil.indexInstalledTeamsByGraphTeamId rather
63
+ * than assuming which id space it is in.
64
+ */
65
+ id: string;
66
+ graphTeamId?: string | undefined; // AAD group id — what Graph and notification rules use. Absent on unresolved records.
67
+ teamsThreadId?: string | undefined; // channelData.team.id ("19:...@thread.tacv2") — what bot activities carry.
51
68
  name?: string | undefined;
52
69
  serviceUrl?: string | undefined; // Bot Framework service URL captured on install. Required for GCC/DoD.
53
70
  addedAt?: string | undefined;
@@ -79,7 +96,7 @@ export interface MicrosoftTeamsMiscData extends MiscData {
79
96
  availableTeams?: Record<string, MicrosoftTeamsTeam>; // keyed by team id. Every team Graph can see in the tenant.
80
97
  appAccessTokenExpiresAt?: string;
81
98
  availableChats?: Record<string, MicrosoftTeamsChat>; // keyed by chat id. Chats the OneUptime app has been added to.
82
- installedTeams?: Record<string, MicrosoftTeamsInstalledTeam>; // keyed by team id. Teams the OneUptime app has been added to.
99
+ installedTeams?: Record<string, MicrosoftTeamsInstalledTeam>; // keyed by MicrosoftTeamsInstalledTeam.id see that type, the key is not always a Graph team id.
83
100
  }
84
101
 
85
102
  export type WorkspaceMiscData = SlackMiscData | MicrosoftTeamsMiscData;
@@ -9,7 +9,6 @@ import Express, {
9
9
  import Response from "../Utils/Response";
10
10
  import BadDataException from "../../Types/Exception/BadDataException";
11
11
  import PaymentRequiredException from "../../Types/Exception/PaymentRequiredException";
12
- import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
13
12
  import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
14
13
  import ObjectID from "../../Types/ObjectID";
15
14
  import OneUptimeDate from "../../Types/Date";
@@ -89,18 +88,16 @@ router.post(
89
88
  const props: DatabaseCommonInteractionProps =
90
89
  await CommonAPI.getDatabaseCommonInteractionProps(req);
91
90
 
92
- if (!props.userId) {
93
- throw new NotAuthorizedException(
94
- "AI chat requires a logged-in user session.",
95
- );
96
- }
97
-
98
- if (!props.tenantId) {
99
- throw new BadDataException("Project ID is required (tenantid header).");
100
- }
101
-
102
- const projectId: ObjectID = props.tenantId;
103
- const userId: ObjectID = props.userId;
91
+ /*
92
+ * Membership, not just a session. getUserMiddleware admits an
93
+ * unauthenticated request as "public" and reads the tenant id straight
94
+ * out of the caller-supplied `tenantid` header, so the pair of checks
95
+ * this replaces proved only that SOMEBODY was logged in and had named
96
+ * SOME project - never that they belonged to the project they named.
97
+ */
98
+ const projectId: ObjectID =
99
+ CommonAPI.assertAuthenticatedProjectMember(props);
100
+ const userId: ObjectID = props.userId!;
104
101
 
105
102
  const content: string = (req.body["content"] as string) || "";
106
103
 
@@ -502,17 +499,30 @@ router.post(
502
499
  const props: DatabaseCommonInteractionProps =
503
500
  await CommonAPI.getDatabaseCommonInteractionProps(req);
504
501
 
505
- if (!props.userId) {
506
- throw new NotAuthorizedException(
507
- "AI chat requires a logged-in user session.",
508
- );
509
- }
510
-
511
- if (!props.tenantId) {
512
- throw new BadDataException("Project ID is required (tenantid header).");
513
- }
502
+ /*
503
+ * Membership, not just a session - see the note on send-message. This
504
+ * route is where that distinction was load-bearing: it took the project
505
+ * id straight from the header and handed it to root-privileged reads,
506
+ * so any logged-in user could name ANY project's UUID and be told which
507
+ * LLM providers that project has - their names, descriptions, types and
508
+ * models (GHSA-hm7m-9qjj-xj5x).
509
+ */
510
+ const projectId: ObjectID =
511
+ CommonAPI.assertAuthenticatedProjectMember(props);
514
512
 
515
- const projectId: ObjectID = props.tenantId;
513
+ /*
514
+ * Membership is still not read authorisation. The very same rows served
515
+ * by a plain GET /llm-provider are gated there by LlmProvider's own read
516
+ * list, and a member whose teams grant none of those permissions has no
517
+ * business reading them through the chat picker instead. Asking the
518
+ * model for that list keeps the two paths from drifting apart.
519
+ */
520
+ CommonAPI.assertPermittedInProject({
521
+ databaseProps: props,
522
+ allowedPermissions: new LlmProvider().getReadPermissions(),
523
+ errorMessage:
524
+ "You do not have permission to read this project's AI providers.",
525
+ });
516
526
 
517
527
  const [providers, defaultProvider]: [
518
528
  Array<LlmProvider>,
@@ -561,18 +571,16 @@ router.post(
561
571
  const props: DatabaseCommonInteractionProps =
562
572
  await CommonAPI.getDatabaseCommonInteractionProps(req);
563
573
 
564
- if (!props.userId) {
565
- throw new NotAuthorizedException(
566
- "AI chat requires a logged-in user session.",
567
- );
568
- }
569
-
570
- if (!props.tenantId) {
571
- throw new BadDataException("Project ID is required (tenantid header).");
572
- }
573
-
574
- const projectId: ObjectID = props.tenantId;
575
- const userId: ObjectID = props.userId;
574
+ /*
575
+ * Membership, not just a session. getUserMiddleware admits an
576
+ * unauthenticated request as "public" and reads the tenant id straight
577
+ * out of the caller-supplied `tenantid` header, so the pair of checks
578
+ * this replaces proved only that SOMEBODY was logged in and had named
579
+ * SOME project - never that they belonged to the project they named.
580
+ */
581
+ const projectId: ObjectID =
582
+ CommonAPI.assertAuthenticatedProjectMember(props);
583
+ const userId: ObjectID = props.userId!;
576
584
 
577
585
  const conversationIdString: string = req.body["conversationId"] as string;
578
586
  const assistantMessageIdString: string = req.body[
@@ -743,18 +751,16 @@ router.post(
743
751
  const props: DatabaseCommonInteractionProps =
744
752
  await CommonAPI.getDatabaseCommonInteractionProps(req);
745
753
 
746
- if (!props.userId) {
747
- throw new NotAuthorizedException(
748
- "AI chat requires a logged-in user session.",
749
- );
750
- }
751
-
752
- if (!props.tenantId) {
753
- throw new BadDataException("Project ID is required (tenantid header).");
754
- }
755
-
756
- const projectId: ObjectID = props.tenantId;
757
- const userId: ObjectID = props.userId;
754
+ /*
755
+ * Membership, not just a session. getUserMiddleware admits an
756
+ * unauthenticated request as "public" and reads the tenant id straight
757
+ * out of the caller-supplied `tenantid` header, so the pair of checks
758
+ * this replaces proved only that SOMEBODY was logged in and had named
759
+ * SOME project - never that they belonged to the project they named.
760
+ */
761
+ const projectId: ObjectID =
762
+ CommonAPI.assertAuthenticatedProjectMember(props);
763
+ const userId: ObjectID = props.userId!;
758
764
 
759
765
  const conversationIdString: string = req.body["conversationId"] as string;
760
766
 
@@ -913,15 +919,8 @@ router.post(
913
919
  const props: DatabaseCommonInteractionProps =
914
920
  await CommonAPI.getDatabaseCommonInteractionProps(req);
915
921
 
916
- if (!props.userId) {
917
- throw new NotAuthorizedException(
918
- "AI chat requires a logged-in user session.",
919
- );
920
- }
921
-
922
- if (!props.tenantId) {
923
- throw new BadDataException("Project ID is required (tenantid header).");
924
- }
922
+ // Membership, not just a session - see the note on send-message.
923
+ CommonAPI.assertAuthenticatedProjectMember(props);
925
924
 
926
925
  const messageIdString: string = req.body["messageId"] as string;
927
926
 
@@ -298,20 +298,85 @@ export default class BaseAPI<
298
298
  const databaseProps: DatabaseCommonInteractionProps =
299
299
  await CommonAPI.getDatabaseCommonInteractionProps(req);
300
300
 
301
- const list: Array<BaseModel> = await this.service.findBy({
302
- query,
303
- select,
304
- skip: skip,
305
- limit: limit,
306
- groupBy: groupBy,
307
- sort: sort,
308
- props: databaseProps,
309
- });
310
-
311
- const count: PositiveNumber = await this.service.countBy({
312
- query,
313
- props: databaseProps,
314
- });
301
+ /*
302
+ * findBy and countBy are independent reads, so run them in parallel to
303
+ * cut list latency where the count is costly. The one thing that makes
304
+ * the sequential order load-bearing is a service-level onBeforeFind
305
+ * override that mutates the shared query/props objects in place (e.g.
306
+ * ProjectService elevates props.isRoot and pins query._id for users with
307
+ * no projects; the incident/alert privacy filters rewrite query keys):
308
+ * countBy historically ran after findBy and inherited those mutations.
309
+ * Services on the stock hook cannot mutate anything (and the permission
310
+ * pipeline copies the query before touching it, ReadPermission.ts:33),
311
+ * so only they run in parallel; hook-overriding services keep the
312
+ * sequential order and its exact semantics.
313
+ */
314
+ const usesStockOnBeforeFindHook: boolean =
315
+ (this.service as unknown as { onBeforeFind: unknown }).onBeforeFind ===
316
+ (DatabaseService.prototype as unknown as { onBeforeFind: unknown })
317
+ .onBeforeFind;
318
+
319
+ let list: Array<BaseModel>;
320
+ let count: PositiveNumber;
321
+
322
+ if (usesStockOnBeforeFindHook) {
323
+ const listPromise: Promise<Array<BaseModel>> = this.service.findBy({
324
+ query,
325
+ select,
326
+ skip: skip,
327
+ limit: limit,
328
+ groupBy: groupBy,
329
+ sort: sort,
330
+ props: databaseProps,
331
+ });
332
+
333
+ /*
334
+ * Shallow copies so a countBy override that rewrites top-level query
335
+ * keys (the established privacy-filter pattern) can never race the
336
+ * concurrent findBy's reads of the shared objects.
337
+ */
338
+ const countPromise: Promise<PositiveNumber> = this.service.countBy({
339
+ query: { ...query },
340
+ props: { ...databaseProps },
341
+ });
342
+
343
+ /*
344
+ * allSettled instead of Promise.all: a findBy rejection must not leave
345
+ * countPromise as an unhandled rejection, and findBy's error keeps
346
+ * priority when both fail - the same failure the sequential code
347
+ * surfaced.
348
+ */
349
+ const [listResult, countResult]: [
350
+ PromiseSettledResult<Array<BaseModel>>,
351
+ PromiseSettledResult<PositiveNumber>,
352
+ ] = await Promise.allSettled([listPromise, countPromise]);
353
+
354
+ if (listResult.status === "rejected") {
355
+ throw listResult.reason;
356
+ }
357
+
358
+ if (countResult.status === "rejected") {
359
+ throw countResult.reason;
360
+ }
361
+
362
+ list = listResult.value;
363
+ count = countResult.value;
364
+ } else {
365
+ list = await this.service.findBy({
366
+ query,
367
+ select,
368
+ skip: skip,
369
+ limit: limit,
370
+ groupBy: groupBy,
371
+ sort: sort,
372
+ props: databaseProps,
373
+ });
374
+
375
+ count = await this.service.countBy({
376
+ query,
377
+ props: databaseProps,
378
+ });
379
+ }
315
380
 
316
381
  return Response.sendEntityArrayResponse(
317
382
  req,
@@ -9,6 +9,14 @@ import SpanUtil from "../Utils/Telemetry/SpanUtil";
9
9
  import ObjectID from "../../Types/ObjectID";
10
10
  import BadDataException from "../../Types/Exception/BadDataException";
11
11
  import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
12
+ import Permission, {
13
+ PermissionHelper,
14
+ PermissionProps,
15
+ UserPermission,
16
+ } from "../../Types/Permission";
17
+ import DatabaseCommonInteractionPropsUtil, {
18
+ PermissionType,
19
+ } from "../../Types/BaseDatabase/DatabaseCommonInteractionPropsUtil";
12
20
 
13
21
  export default class CommonAPI {
14
22
  /*
@@ -132,6 +140,87 @@ export default class CommonAPI {
132
140
  }
133
141
  }
134
142
 
143
+ /*
144
+ * Membership is not read authorisation.
145
+ *
146
+ * assertAuthenticatedProjectMember proves the caller belongs to the project
147
+ * they named in the `tenantid` header; it says nothing about WHICH of that
148
+ * project's data they may see. A custom route that then reads with
149
+ * `isRoot: true` has skipped the permission check the equivalent CRUD read
150
+ * would have run, so the route has to make that check itself - otherwise a
151
+ * member whose teams grant nothing but, say, ReadProjectIncident still reads
152
+ * everything else the route happens to touch.
153
+ *
154
+ * The permissions consulted are the caller's grants in props.tenantId, so
155
+ * this must be called after assertAuthenticatedProjectMember has confirmed
156
+ * that tenant is one the caller actually belongs to.
157
+ *
158
+ * `allowedPermissions` is normally the model's own declared list, e.g.
159
+ * `new LlmProvider().getReadPermissions()`, so the custom route stays in
160
+ * step with the CRUD endpoint for the same data instead of inventing a
161
+ * second, quietly diverging rule.
162
+ *
163
+ * Permissions that are never assigned INSIDE a project are stripped from
164
+ * that list first. This matters: getUserPermissions merges the caller's
165
+ * global permissions in, and every caller - including an anonymous one -
166
+ * carries Permission.Public, which a model's read list very often contains
167
+ * (LlmProvider has it so the shared global providers stay readable). Left
168
+ * in, it would make this guard pass for anyone. What remains is the
169
+ * tenant-assignable subset, which is exactly what a team can grant.
170
+ *
171
+ * Stripping can empty the list, and an empty list denies everyone rather
172
+ * than admitting them - a model whose read access is purely public has no
173
+ * business behind this guard, and failing closed is the safe direction.
174
+ *
175
+ * Master admins bypass, matching every other permission gate in the API.
176
+ */
177
+ public static assertPermittedInProject(data: {
178
+ databaseProps: DatabaseCommonInteractionProps;
179
+ allowedPermissions: Array<Permission>;
180
+ errorMessage?: string | undefined;
181
+ }): void {
182
+ if (data.databaseProps.isMasterAdmin) {
183
+ return;
184
+ }
185
+
186
+ const tenantAssignablePermissions: Array<Permission> =
187
+ PermissionHelper.getTenantPermissionProps().map(
188
+ (permissionProps: PermissionProps) => {
189
+ return permissionProps.permission;
190
+ },
191
+ );
192
+
193
+ const requiredPermissions: Array<Permission> =
194
+ data.allowedPermissions.filter((permission: Permission) => {
195
+ return tenantAssignablePermissions.includes(permission);
196
+ });
197
+
198
+ /*
199
+ * Allow-only: getUserPermissions discriminates grants from denials by
200
+ * isBlockPermission, so a team's explicit BLOCK row for one of these
201
+ * permissions must never be counted as a grant of it.
202
+ */
203
+ const grantedPermissions: Array<Permission> =
204
+ DatabaseCommonInteractionPropsUtil.getUserPermissions(
205
+ data.databaseProps,
206
+ PermissionType.Allow,
207
+ ).map((userPermission: UserPermission) => {
208
+ return userPermission.permission;
209
+ });
210
+
211
+ if (
212
+ !PermissionHelper.doesPermissionsIntersect(
213
+ grantedPermissions,
214
+ requiredPermissions,
215
+ )
216
+ ) {
217
+ throw new NotAuthorizedException(
218
+ data.errorMessage ||
219
+ "You do not have permission to access this project's data.",
220
+ );
221
+ }
222
+ }
223
+
135
224
  @CaptureSpan()
136
225
  public static async getDatabaseCommonInteractionProps(
137
226
  req: ExpressRequest,