@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
@@ -58,6 +58,32 @@ export type DbTypes =
58
58
  | JSONArray
59
59
  | Buffer;
60
60
 
61
+ /*
62
+ * Metadata-only vanilla instances used by toJSONObject to read table-column
63
+ * metadata. Frozen and never exported, so they can never be mutated or escape
64
+ * this file. _fromJSON must never use this cache — it mutates and returns the
65
+ * instance it constructs.
66
+ */
67
+ const vanillaModelCache: WeakMap<
68
+ { new (): DatabaseBaseModel },
69
+ DatabaseBaseModel
70
+ > = new WeakMap();
71
+
72
+ function getVanillaModel(modelType: {
73
+ new (): DatabaseBaseModel;
74
+ }): DatabaseBaseModel {
75
+ let vanillaModel: DatabaseBaseModel | undefined =
76
+ vanillaModelCache.get(modelType);
77
+
78
+ if (!vanillaModel) {
79
+ vanillaModel = new modelType();
80
+ Object.freeze(vanillaModel);
81
+ vanillaModelCache.set(modelType, vanillaModel);
82
+ }
83
+
84
+ return vanillaModel;
85
+ }
86
+
61
87
  export default class DatabaseBaseModel extends BaseEntity {
62
88
  @TableColumn({
63
89
  title: "ID",
@@ -252,8 +278,7 @@ export default class DatabaseBaseModel extends BaseEntity {
252
278
  }
253
279
 
254
280
  public getTableColumnMetadata(columnName: string): TableColumnMetadata {
255
- const dictionary: Dictionary<TableColumnMetadata> = getTableColumns(this);
256
- return dictionary[columnName] as TableColumnMetadata;
281
+ return getTableColumn(this, columnName);
257
282
  }
258
283
 
259
284
  public hasColumn(columnName: string): boolean {
@@ -275,8 +300,10 @@ export default class DatabaseBaseModel extends BaseEntity {
275
300
  }
276
301
 
277
302
  public getColumnAccessControlForAllColumns(): Dictionary<ColumnAccessControl> {
278
- const dictionary: Dictionary<ColumnAccessControl> =
279
- getColumnAccessControlForAllColumns(this);
303
+ // Copy: the helper's dictionary is cached per class and must stay pristine.
304
+ const dictionary: Dictionary<ColumnAccessControl> = {
305
+ ...getColumnAccessControlForAllColumns(this),
306
+ };
280
307
 
281
308
  const defaultColumns: Array<string> = [
282
309
  "_id",
@@ -613,7 +640,7 @@ export default class DatabaseBaseModel extends BaseEntity {
613
640
  ): JSONObject {
614
641
  const json: JSONObject = {};
615
642
 
616
- const vanillaModel: DatabaseBaseModel = new modelType();
643
+ const vanillaModel: DatabaseBaseModel = getVanillaModel(modelType);
617
644
 
618
645
  for (const key of vanillaModel.getTableColumns().columns) {
619
646
  if ((model as any)[key] === undefined) {
@@ -1942,6 +1942,70 @@ export default class NetworkDevice extends BaseModel {
1942
1942
  })
1943
1943
  public lastSeenAt?: Date = undefined;
1944
1944
 
1945
+ @ColumnAccessControl({
1946
+ create: [],
1947
+ read: [
1948
+ Permission.ProjectOwner,
1949
+ Permission.ProjectAdmin,
1950
+ Permission.ProjectMember,
1951
+ Permission.Viewer,
1952
+ Permission.SettingsAdmin,
1953
+ Permission.SettingsMember,
1954
+ Permission.SettingsViewer,
1955
+ Permission.ReadNetworkDevice,
1956
+ ],
1957
+ update: [
1958
+ Permission.ProjectOwner,
1959
+ Permission.ProjectAdmin,
1960
+ Permission.EditNetworkDevice,
1961
+ ],
1962
+ })
1963
+ @TableColumn({
1964
+ required: false,
1965
+ type: TableColumnType.Date,
1966
+ canReadOnRelationQuery: true,
1967
+ title: "Last Polled At",
1968
+ description:
1969
+ 'When the assigned probe last ATTEMPTED an SNMP walk of this device, whether or not the device answered. Paired with lastSeenAt (which only moves on a successful walk) this is what separates "the device did not answer" from "we have not asked recently". Managed by the probe.',
1970
+ })
1971
+ @Column({
1972
+ nullable: true,
1973
+ type: ColumnType.Date,
1974
+ })
1975
+ public lastPolledAt?: Date = undefined;
1976
+
1977
+ @ColumnAccessControl({
1978
+ create: [],
1979
+ read: [
1980
+ Permission.ProjectOwner,
1981
+ Permission.ProjectAdmin,
1982
+ Permission.ProjectMember,
1983
+ Permission.Viewer,
1984
+ Permission.SettingsAdmin,
1985
+ Permission.SettingsMember,
1986
+ Permission.SettingsViewer,
1987
+ Permission.ReadNetworkDevice,
1988
+ ],
1989
+ update: [
1990
+ Permission.ProjectOwner,
1991
+ Permission.ProjectAdmin,
1992
+ Permission.EditNetworkDevice,
1993
+ ],
1994
+ })
1995
+ @TableColumn({
1996
+ required: false,
1997
+ type: TableColumnType.Boolean,
1998
+ canReadOnRelationQuery: true,
1999
+ title: "Is Reachable",
2000
+ description:
2001
+ "Whether the most recent SNMP walk reached this device. NULL means it has never been polled. This — not the age of lastSeenAt — is what the device list, the topology graph and the site rollup read, so a device whose last poll succeeded is never shown as down just because the probe is behind schedule. Managed by the probe.",
2002
+ })
2003
+ @Column({
2004
+ nullable: true,
2005
+ type: ColumnType.Boolean,
2006
+ })
2007
+ public isReachable?: boolean = undefined;
2008
+
1945
2009
  @ColumnAccessControl({
1946
2010
  create: [],
1947
2011
  read: [
@@ -588,6 +588,20 @@ export default class OnCallDutyPolicySchedule extends BaseModel {
588
588
  })
589
589
  @TableColumn({
590
590
  type: TableColumnType.ObjectID,
591
+ /*
592
+ * Read through a relation, alongside `name`, so a joined schedule row can
593
+ * say whether it would page anybody right now. An escalation rule lists
594
+ * schedules by name and has to mark the ones that are currently uncovered;
595
+ * that is one join away from the rule, and without this flag
596
+ * QueryPermission rejects the whole select rather than dropping the column
597
+ * - the escalation rule page fails to load at all.
598
+ *
599
+ * The disclosure is a user id belonging to the same project as the
600
+ * schedule, to a caller who is already reading the schedule's name off the
601
+ * same joined row. It is not an @OwnerOnlyColumn: who is on call is
602
+ * operational state the team is meant to see, not a personal credential.
603
+ */
604
+ canReadOnRelationQuery: true,
591
605
  title: "Current User ID On Roster",
592
606
  description: "User ID who is currently on roster",
593
607
  example: "c3d4e5f6-a7b8-9012-cdef-123456789012",
@@ -317,6 +317,65 @@ export default class StatusPage extends BaseModel {
317
317
  })
318
318
  public pageDescription?: string = undefined;
319
319
 
320
+ /*
321
+ * Search engine indexing opt-out. Indexing stays on unless the owner turns
322
+ * it off, so this defaults to true and every pre-existing status page keeps
323
+ * being indexed exactly as it is today.
324
+ *
325
+ * Turning it off is served two ways, both of which a crawler honours before
326
+ * it decides to index: a <meta name="robots" content="noindex, nofollow">
327
+ * in the server-rendered index.ejs (so it is there before the JS bundle
328
+ * loads) and an X-Robots-Tag response header (so it also covers the RSS
329
+ * feed and llms.txt, which are not HTML).
330
+ *
331
+ * Deliberately NOT wired into robots.txt: Disallow blocks the crawl, and a
332
+ * crawler that never fetches the page never sees the noindex, so the URL can
333
+ * still surface in results. Letting crawlers in and telling them not to
334
+ * index is what actually removes the page.
335
+ */
336
+ @ColumnAccessControl({
337
+ create: [
338
+ Permission.ProjectOwner,
339
+ Permission.ProjectAdmin,
340
+ Permission.ProjectMember,
341
+ Permission.StatusPageAdmin,
342
+ Permission.StatusPageMember,
343
+ Permission.CreateProjectStatusPage,
344
+ ],
345
+ read: [
346
+ Permission.ProjectOwner,
347
+ Permission.ProjectAdmin,
348
+ Permission.ProjectMember,
349
+ Permission.Viewer,
350
+ Permission.StatusPageAdmin,
351
+ Permission.StatusPageMember,
352
+ Permission.StatusPageViewer,
353
+ Permission.ReadProjectStatusPage,
354
+ ],
355
+ update: [
356
+ Permission.ProjectOwner,
357
+ Permission.ProjectAdmin,
358
+ Permission.ProjectMember,
359
+ Permission.StatusPageAdmin,
360
+ Permission.StatusPageMember,
361
+ Permission.EditProjectStatusPage,
362
+ ],
363
+ })
364
+ @TableColumn({
365
+ isDefaultValueColumn: true,
366
+ type: TableColumnType.Boolean,
367
+ title: "Enable Search Engine Indexing",
368
+ description:
369
+ "Should search engines like Google and Bing be allowed to index this status page? Turn this off to keep the page reachable by link but out of search results.",
370
+ defaultValue: true,
371
+ })
372
+ @Column({
373
+ type: ColumnType.Boolean,
374
+ default: true,
375
+ nullable: false,
376
+ })
377
+ public enableSearchEngineIndexing?: boolean = undefined;
378
+
320
379
  @ColumnAccessControl({
321
380
  create: [
322
381
  Permission.ProjectOwner,
@@ -14,6 +14,7 @@ import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
14
14
  import ColumnLength from "../../Types/Database/ColumnLength";
15
15
  import ColumnType from "../../Types/Database/ColumnType";
16
16
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
17
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
17
18
  import TableColumn from "../../Types/Database/TableColumn";
18
19
  import TableColumnType from "../../Types/Database/TableColumnType";
19
20
  import TableMetadata from "../../Types/Database/TableMetadata";
@@ -24,6 +25,7 @@ import ObjectID from "../../Types/ObjectID";
24
25
  import Permission from "../../Types/Permission";
25
26
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
26
27
 
28
+ @EnableDocumentation()
27
29
  @CanAccessIfCanReadOn("statusPage")
28
30
  @TableEditionAccessControl({
29
31
  requiresEnterprise: true,
@@ -315,15 +315,27 @@ class UserCall extends BaseModel {
315
315
  @OwnerOnlyColumn()
316
316
  @TableColumn({
317
317
  title: "Verification Code",
318
- description: "Temporary Verification Code",
318
+ description:
319
+ "Keyed digest of the temporary verification code — never the code itself",
319
320
  isDefaultValueColumn: true,
320
321
  computed: true,
321
322
  required: true,
322
323
  type: TableColumnType.ShortText,
324
+ /*
325
+ * A row is born with NO usable code on it: a 64-character random
326
+ * placeholder that no six-digit code can ever hash to. The real code is
327
+ * generated, hashed and sent by this channel's service once the row
328
+ * exists — the row id is part of the hashed message, so the digest cannot
329
+ * be computed before the insert has assigned one.
330
+ *
331
+ * This stays a forced default rather than moving wholly into the service
332
+ * hook because the column is NOT NULL and must be satisfied on every
333
+ * create path, including those that pass props.ignoreHooks.
334
+ */
323
335
  forceGetDefaultValueOnCreate: () => {
324
- return Text.generateRandomNumber(6);
336
+ return Text.generateRandomText(64);
325
337
  },
326
- example: "123456",
338
+ example: "9f2c1b4a7d3e6058c1f0a9b8d7e6f5c4b3a291807f6e5d4c3b2a19081726354",
327
339
  })
328
340
  @Column({
329
341
  type: ColumnType.ShortText,
@@ -331,6 +343,85 @@ class UserCall extends BaseModel {
331
343
  length: ColumnLength.ShortText,
332
344
  })
333
345
  public verificationCode?: string = undefined;
346
+
347
+ @ColumnAccessControl({
348
+ create: [],
349
+ read: [],
350
+ update: [],
351
+ })
352
+ /*
353
+ * When the code currently on this row stops being accepted.
354
+ *
355
+ * NULL means there is no live code: none was ever issued, or the last one
356
+ * was used, or it was burned by the attempt limit — or the row predates
357
+ * this column, which is read the same conservative way. Without an expiry
358
+ * the six-digit code space stood open indefinitely, which is what made
359
+ * walking it worthwhile.
360
+ */
361
+ @TableColumn({
362
+ title: "Verification Code Expires At",
363
+ description: "When the verification code on this row stops being accepted",
364
+ computed: true,
365
+ type: TableColumnType.Date,
366
+ })
367
+ @Column({
368
+ type: ColumnType.Date,
369
+ nullable: true,
370
+ })
371
+ public verificationCodeExpiresAt?: Date = undefined;
372
+
373
+ @ColumnAccessControl({
374
+ create: [],
375
+ read: [],
376
+ update: [],
377
+ })
378
+ /*
379
+ * Wrong guesses made against the code currently on this row, reset to zero
380
+ * each time a code is issued.
381
+ *
382
+ * This is the counter that stops /verify being an unlimited oracle over a
383
+ * space small enough to walk in minutes. It is incremented with a single
384
+ * atomic UPDATE ... RETURNING rather than a read-modify-write, because
385
+ * requests racing each other are the normal shape of the attack.
386
+ */
387
+ @TableColumn({
388
+ title: "Verification Failed Attempts",
389
+ description:
390
+ "Incorrect verification attempts made against the current verification code",
391
+ computed: true,
392
+ type: TableColumnType.Number,
393
+ })
394
+ @Column({
395
+ type: ColumnType.Number,
396
+ nullable: false,
397
+ default: 0,
398
+ })
399
+ public verificationFailedAttempts?: number = undefined;
400
+
401
+ @ColumnAccessControl({
402
+ create: [],
403
+ read: [],
404
+ update: [],
405
+ })
406
+ /*
407
+ * When a verification code was last sent for this row.
408
+ *
409
+ * Drives the resend cooldown. Without it, "spend the five attempts, ask for
410
+ * a fresh code, repeat" costs an attacker nothing — and the resend control
411
+ * doubles as a way to send somebody unsolicited messages at whatever rate
412
+ * the network allows, at the project's expense.
413
+ */
414
+ @TableColumn({
415
+ title: "Verification Code Sent At",
416
+ description: "When a verification code was last sent for this row",
417
+ computed: true,
418
+ type: TableColumnType.Date,
419
+ })
420
+ @Column({
421
+ type: ColumnType.Date,
422
+ nullable: true,
423
+ })
424
+ public verificationCodeSentAt?: Date = undefined;
334
425
  }
335
426
 
336
427
  export default UserCall;
@@ -318,15 +318,27 @@ class UserEmail extends BaseModel {
318
318
  @OwnerOnlyColumn()
319
319
  @TableColumn({
320
320
  title: "Verification Code",
321
- description: "Temporary Verification Code",
321
+ description:
322
+ "Keyed digest of the temporary verification code — never the code itself",
322
323
  isDefaultValueColumn: true,
323
324
  computed: true,
324
325
  required: true,
325
326
  type: TableColumnType.ShortText,
327
+ /*
328
+ * A row is born with NO usable code on it: a 64-character random
329
+ * placeholder that no six-digit code can ever hash to. The real code is
330
+ * generated, hashed and sent by this channel's service once the row
331
+ * exists — the row id is part of the hashed message, so the digest cannot
332
+ * be computed before the insert has assigned one.
333
+ *
334
+ * This stays a forced default rather than moving wholly into the service
335
+ * hook because the column is NOT NULL and must be satisfied on every
336
+ * create path, including those that pass props.ignoreHooks.
337
+ */
326
338
  forceGetDefaultValueOnCreate: () => {
327
- return Text.generateRandomNumber(6);
339
+ return Text.generateRandomText(64);
328
340
  },
329
- example: "123456",
341
+ example: "9f2c1b4a7d3e6058c1f0a9b8d7e6f5c4b3a291807f6e5d4c3b2a19081726354",
330
342
  })
331
343
  @Column({
332
344
  type: ColumnType.ShortText,
@@ -334,6 +346,85 @@ class UserEmail extends BaseModel {
334
346
  length: ColumnLength.ShortText,
335
347
  })
336
348
  public verificationCode?: string = undefined;
349
+
350
+ @ColumnAccessControl({
351
+ create: [],
352
+ read: [],
353
+ update: [],
354
+ })
355
+ /*
356
+ * When the code currently on this row stops being accepted.
357
+ *
358
+ * NULL means there is no live code: none was ever issued, or the last one
359
+ * was used, or it was burned by the attempt limit — or the row predates
360
+ * this column, which is read the same conservative way. Without an expiry
361
+ * the six-digit code space stood open indefinitely, which is what made
362
+ * walking it worthwhile.
363
+ */
364
+ @TableColumn({
365
+ title: "Verification Code Expires At",
366
+ description: "When the verification code on this row stops being accepted",
367
+ computed: true,
368
+ type: TableColumnType.Date,
369
+ })
370
+ @Column({
371
+ type: ColumnType.Date,
372
+ nullable: true,
373
+ })
374
+ public verificationCodeExpiresAt?: Date = undefined;
375
+
376
+ @ColumnAccessControl({
377
+ create: [],
378
+ read: [],
379
+ update: [],
380
+ })
381
+ /*
382
+ * Wrong guesses made against the code currently on this row, reset to zero
383
+ * each time a code is issued.
384
+ *
385
+ * This is the counter that stops /verify being an unlimited oracle over a
386
+ * space small enough to walk in minutes. It is incremented with a single
387
+ * atomic UPDATE ... RETURNING rather than a read-modify-write, because
388
+ * requests racing each other are the normal shape of the attack.
389
+ */
390
+ @TableColumn({
391
+ title: "Verification Failed Attempts",
392
+ description:
393
+ "Incorrect verification attempts made against the current verification code",
394
+ computed: true,
395
+ type: TableColumnType.Number,
396
+ })
397
+ @Column({
398
+ type: ColumnType.Number,
399
+ nullable: false,
400
+ default: 0,
401
+ })
402
+ public verificationFailedAttempts?: number = undefined;
403
+
404
+ @ColumnAccessControl({
405
+ create: [],
406
+ read: [],
407
+ update: [],
408
+ })
409
+ /*
410
+ * When a verification code was last sent for this row.
411
+ *
412
+ * Drives the resend cooldown. Without it, "spend the five attempts, ask for
413
+ * a fresh code, repeat" costs an attacker nothing — and the resend control
414
+ * doubles as a way to send somebody unsolicited messages at whatever rate
415
+ * the network allows, at the project's expense.
416
+ */
417
+ @TableColumn({
418
+ title: "Verification Code Sent At",
419
+ description: "When a verification code was last sent for this row",
420
+ computed: true,
421
+ type: TableColumnType.Date,
422
+ })
423
+ @Column({
424
+ type: ColumnType.Date,
425
+ nullable: true,
426
+ })
427
+ public verificationCodeSentAt?: Date = undefined;
337
428
  }
338
429
 
339
430
  export default UserEmail;
@@ -275,15 +275,27 @@ class UserIncomingCallNumber extends BaseModel {
275
275
  })
276
276
  @TableColumn({
277
277
  title: "Verification Code",
278
- description: "Temporary Verification Code",
278
+ description:
279
+ "Keyed digest of the temporary verification code — never the code itself",
279
280
  isDefaultValueColumn: true,
280
281
  computed: true,
281
282
  required: true,
282
283
  type: TableColumnType.ShortText,
284
+ /*
285
+ * A row is born with NO usable code on it: a 64-character random
286
+ * placeholder that no six-digit code can ever hash to. The real code is
287
+ * generated, hashed and sent by this channel's service once the row
288
+ * exists — the row id is part of the hashed message, so the digest cannot
289
+ * be computed before the insert has assigned one.
290
+ *
291
+ * This stays a forced default rather than moving wholly into the service
292
+ * hook because the column is NOT NULL and must be satisfied on every
293
+ * create path, including those that pass props.ignoreHooks.
294
+ */
283
295
  forceGetDefaultValueOnCreate: () => {
284
- return Text.generateRandomNumber(6);
296
+ return Text.generateRandomText(64);
285
297
  },
286
- example: "123456",
298
+ example: "9f2c1b4a7d3e6058c1f0a9b8d7e6f5c4b3a291807f6e5d4c3b2a19081726354",
287
299
  })
288
300
  @Column({
289
301
  type: ColumnType.ShortText,
@@ -291,6 +303,85 @@ class UserIncomingCallNumber extends BaseModel {
291
303
  length: ColumnLength.ShortText,
292
304
  })
293
305
  public verificationCode?: string = undefined;
306
+
307
+ @ColumnAccessControl({
308
+ create: [],
309
+ read: [],
310
+ update: [],
311
+ })
312
+ /*
313
+ * When the code currently on this row stops being accepted.
314
+ *
315
+ * NULL means there is no live code: none was ever issued, or the last one
316
+ * was used, or it was burned by the attempt limit — or the row predates
317
+ * this column, which is read the same conservative way. Without an expiry
318
+ * the six-digit code space stood open indefinitely, which is what made
319
+ * walking it worthwhile.
320
+ */
321
+ @TableColumn({
322
+ title: "Verification Code Expires At",
323
+ description: "When the verification code on this row stops being accepted",
324
+ computed: true,
325
+ type: TableColumnType.Date,
326
+ })
327
+ @Column({
328
+ type: ColumnType.Date,
329
+ nullable: true,
330
+ })
331
+ public verificationCodeExpiresAt?: Date = undefined;
332
+
333
+ @ColumnAccessControl({
334
+ create: [],
335
+ read: [],
336
+ update: [],
337
+ })
338
+ /*
339
+ * Wrong guesses made against the code currently on this row, reset to zero
340
+ * each time a code is issued.
341
+ *
342
+ * This is the counter that stops /verify being an unlimited oracle over a
343
+ * space small enough to walk in minutes. It is incremented with a single
344
+ * atomic UPDATE ... RETURNING rather than a read-modify-write, because
345
+ * requests racing each other are the normal shape of the attack.
346
+ */
347
+ @TableColumn({
348
+ title: "Verification Failed Attempts",
349
+ description:
350
+ "Incorrect verification attempts made against the current verification code",
351
+ computed: true,
352
+ type: TableColumnType.Number,
353
+ })
354
+ @Column({
355
+ type: ColumnType.Number,
356
+ nullable: false,
357
+ default: 0,
358
+ })
359
+ public verificationFailedAttempts?: number = undefined;
360
+
361
+ @ColumnAccessControl({
362
+ create: [],
363
+ read: [],
364
+ update: [],
365
+ })
366
+ /*
367
+ * When a verification code was last sent for this row.
368
+ *
369
+ * Drives the resend cooldown. Without it, "spend the five attempts, ask for
370
+ * a fresh code, repeat" costs an attacker nothing — and the resend control
371
+ * doubles as a way to send somebody unsolicited messages at whatever rate
372
+ * the network allows, at the project's expense.
373
+ */
374
+ @TableColumn({
375
+ title: "Verification Code Sent At",
376
+ description: "When a verification code was last sent for this row",
377
+ computed: true,
378
+ type: TableColumnType.Date,
379
+ })
380
+ @Column({
381
+ type: ColumnType.Date,
382
+ nullable: true,
383
+ })
384
+ public verificationCodeSentAt?: Date = undefined;
294
385
  }
295
386
 
296
387
  export default UserIncomingCallNumber;
@@ -346,6 +346,43 @@ class UserPush extends BaseModel {
346
346
  default: false,
347
347
  })
348
348
  public isVerified?: boolean = undefined;
349
+
350
+ /*
351
+ * Whether this handset should be paged through silent mode and Do Not
352
+ * Disturb when it is on call. Per DEVICE and not per user on purpose: the
353
+ * responder's work phone on the nightstand and their tablet on the sofa are
354
+ * the same person making two different decisions, and only the phone should
355
+ * be allowed to wake the house.
356
+ *
357
+ * Off unless the responder turns it on from that device. It is the one
358
+ * setting in this product that deliberately defeats the switch a person
359
+ * flicked to be left alone, so it is opted into rather than out of, and the
360
+ * app only offers it once the OS has actually granted the capability
361
+ * (the iOS critical-alert entitlement, or Do Not Disturb access on Android).
362
+ *
363
+ * `update` is empty like every other column here: the value is written by
364
+ * UserPushAPI's critical-alerts route, which checks the row belongs to the
365
+ * caller and then writes as root. That keeps "who may change this" in one
366
+ * readable place rather than spread across the generic CRUD surface.
367
+ */
368
+ @ColumnAccessControl({
369
+ create: [Permission.CurrentUser],
370
+ read: [Permission.CurrentUser],
371
+ update: [],
372
+ })
373
+ @TableColumn({
374
+ title: "Critical Alerts Enabled",
375
+ description:
376
+ "Should on-call notifications to this device override silent mode and Do Not Disturb?",
377
+ isDefaultValueColumn: true,
378
+ type: TableColumnType.Boolean,
379
+ defaultValue: false,
380
+ })
381
+ @Column({
382
+ type: ColumnType.Boolean,
383
+ default: false,
384
+ })
385
+ public isCriticalAlertEnabled?: boolean = undefined;
349
386
  }
350
387
 
351
388
  export default UserPush;