@oneuptime/common 12.0.13 → 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 (376) hide show
  1. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  2. package/Models/DatabaseModels/UserCall.ts +94 -3
  3. package/Models/DatabaseModels/UserEmail.ts +94 -3
  4. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  5. package/Models/DatabaseModels/UserPush.ts +37 -0
  6. package/Models/DatabaseModels/UserSMS.ts +94 -3
  7. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  8. package/Server/API/BaseAPI.ts +79 -14
  9. package/Server/API/UserCallAPI.ts +53 -45
  10. package/Server/API/UserEmailAPI.ts +53 -44
  11. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  12. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  13. package/Server/API/UserPushAPI.ts +126 -2
  14. package/Server/API/UserSmsAPI.ts +53 -44
  15. package/Server/API/UserWhatsAppAPI.ts +53 -50
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  21. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  22. package/Server/Services/DatabaseService.ts +101 -0
  23. package/Server/Services/LogAggregationService.ts +5 -0
  24. package/Server/Services/PushNotificationService.ts +127 -12
  25. package/Server/Services/TeamMemberService.ts +53 -13
  26. package/Server/Services/UserCallService.ts +55 -24
  27. package/Server/Services/UserEmailService.ts +83 -17
  28. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  29. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  30. package/Server/Services/UserNotificationRuleService.ts +26 -0
  31. package/Server/Services/UserPushService.ts +89 -0
  32. package/Server/Services/UserSmsService.ts +50 -17
  33. package/Server/Services/UserWhatsAppService.ts +48 -15
  34. package/Server/Types/Database/QueryHelper.ts +30 -0
  35. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  36. package/Server/Utils/ChannelVerification.ts +510 -0
  37. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  38. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  39. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  40. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  41. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  42. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  43. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  44. package/Server/Utils/TotpAuth.ts +137 -9
  45. package/Server/Utils/UserRegistrationToken.ts +182 -0
  46. package/Server/Utils/VerificationCode.ts +134 -0
  47. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  48. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  49. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  50. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  51. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  52. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  53. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  54. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  55. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  56. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  57. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  58. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  59. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  60. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  61. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  62. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  63. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  64. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  65. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  66. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  67. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  68. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  69. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  70. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  71. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  72. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  73. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  74. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  75. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  76. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  77. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  78. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  79. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  80. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  81. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  82. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  83. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  84. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  85. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  86. package/Tests/Server/Utils/Browser.test.ts +162 -0
  87. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  88. package/Tests/Server/Utils/Express.test.ts +371 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  90. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  91. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  92. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  93. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  94. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  95. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  96. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  97. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  98. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  99. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  100. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  101. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  102. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  103. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  104. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  105. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  106. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  107. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  108. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  109. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  110. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  111. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  112. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  113. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  114. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  115. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  116. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  117. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  118. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  119. package/Tests/UI/Components/Button.test.tsx +175 -1
  120. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  121. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  122. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  123. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  124. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  125. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  126. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  127. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  128. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  129. package/Tests/UI/Components/List.test.tsx +9 -2
  130. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  131. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  132. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  133. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  134. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  135. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  136. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  137. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  138. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  139. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  140. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  141. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  142. package/Tests/UI/Components/Toast.test.tsx +130 -7
  143. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  144. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  145. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  146. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  147. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  148. package/Tests/Utils/API.test.ts +16 -2
  149. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  150. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  151. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  152. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  153. package/Types/Email/EmailTemplateType.ts +1 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  155. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  156. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  157. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  158. package/Types/Permission.ts +35 -0
  159. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  160. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  161. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  162. package/Types/Service/ServiceLanguage.ts +144 -0
  163. package/Types/Text.ts +111 -19
  164. package/UI/Components/Button/Button.tsx +27 -14
  165. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  166. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  167. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  168. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  169. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  170. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  171. package/UI/Components/CommandPalette/Types.ts +49 -0
  172. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  173. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  174. package/UI/Components/Feed/FeedItem.tsx +1 -1
  175. package/UI/Components/List/List.tsx +37 -5
  176. package/UI/Components/List/ListSkeleton.tsx +54 -0
  177. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  178. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  179. package/UI/Components/Modal/Modal.tsx +2 -2
  180. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  181. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  182. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  183. package/UI/Components/Navbar/NavBar.tsx +14 -1
  184. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  185. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  186. package/UI/Components/SideOver/SideOver.tsx +37 -2
  187. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  188. package/UI/Components/Table/Table.tsx +74 -44
  189. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  190. package/UI/Components/Tabs/Tab.tsx +1 -1
  191. package/UI/Components/Toast/Toast.tsx +118 -53
  192. package/UI/Components/Toast/ToastInit.tsx +82 -32
  193. package/UI/Styles/Theme.css +40 -0
  194. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  195. package/UI/Utils/ModelListCache.ts +188 -0
  196. package/UI/Utils/Project.ts +29 -0
  197. package/Utils/API.ts +6 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  201. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  203. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  205. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  207. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  209. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  211. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  212. package/build/dist/Server/API/BaseAPI.js +69 -13
  213. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  214. package/build/dist/Server/API/UserCallAPI.js +42 -38
  215. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  216. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  217. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  218. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  219. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  220. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  221. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  222. package/build/dist/Server/API/UserPushAPI.js +95 -2
  223. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  224. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  225. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  226. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  227. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  236. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  237. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  239. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  240. package/build/dist/Server/Services/DatabaseService.js +74 -0
  241. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  242. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  243. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  244. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  245. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  246. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  247. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  248. package/build/dist/Server/Services/UserCallService.js +54 -22
  249. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  250. package/build/dist/Server/Services/UserEmailService.js +78 -17
  251. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  252. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  253. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  254. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  255. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  256. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  257. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  258. package/build/dist/Server/Services/UserPushService.js +77 -0
  259. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  260. package/build/dist/Server/Services/UserSmsService.js +50 -17
  261. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  262. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  263. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  264. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  265. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  266. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  267. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  268. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  269. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  270. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  271. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  272. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  273. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  274. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  275. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  276. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  277. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  278. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  279. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  280. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  281. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  282. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  283. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  284. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  285. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  286. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  287. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  288. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  289. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  290. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  291. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  292. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  293. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  294. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  295. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  296. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  297. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  298. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  299. package/build/dist/Types/Permission.js +33 -0
  300. package/build/dist/Types/Permission.js.map +1 -1
  301. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  302. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  303. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  304. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  305. package/build/dist/Types/Text.js +82 -17
  306. package/build/dist/Types/Text.js.map +1 -1
  307. package/build/dist/UI/Components/Button/Button.js +22 -14
  308. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  309. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  310. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  311. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  312. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  313. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  314. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  315. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  316. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  317. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  318. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  319. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  320. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  321. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  322. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  323. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  324. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  325. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  326. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  327. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  328. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  329. package/build/dist/UI/Components/List/List.js +19 -5
  330. package/build/dist/UI/Components/List/List.js.map +1 -1
  331. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  332. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  333. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  334. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  335. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  338. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  340. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  343. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  344. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  345. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  346. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  347. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  348. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  349. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  350. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  351. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  352. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  353. package/build/dist/UI/Components/Table/Table.js +35 -24
  354. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  355. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  356. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  357. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  358. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  359. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  360. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  361. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  362. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  363. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  364. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  365. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  366. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  367. package/build/dist/UI/Utils/Project.js +24 -1
  368. package/build/dist/UI/Utils/Project.js.map +1 -1
  369. package/build/dist/Utils/API.js +6 -1
  370. package/build/dist/Utils/API.js.map +1 -1
  371. package/jest.config.json +1 -1
  372. package/package.json +2 -3
  373. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  374. package/Tests/__mocks__/otpauth.js +0 -30
  375. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  376. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,362 @@
1
+ import { describe, expect, it } from "@jest/globals";
2
+ import UrlScrubber from "../../../Utils/Rum/UrlScrubber";
3
+
4
+ /*
5
+ * The parent UrlScrubber.test.ts drives the whole pipeline through the
6
+ * public scrub()/getScrubbedPathname() facade. This suite pins the two
7
+ * segment-level primitives directly — scrubPath() and scrubQuery() — so
8
+ * that the branch behaviour each one owns (every redaction pattern and its
9
+ * length boundary, the decode-before-match step, the empty/"/" short
10
+ * circuits, and the allowlist rules) is exercised in isolation rather than
11
+ * only as an emergent property of a full URL round-trip.
12
+ *
13
+ * Everything here is a pure function of its arguments: no network, no clock,
14
+ * no randomness. scrubQuery takes a plain URLSearchParams built inline.
15
+ */
16
+
17
+ const REDACTED: string = "[redacted]";
18
+
19
+ describe("UrlScrubber segment primitives", () => {
20
+ describe("scrubPath", () => {
21
+ describe("empty and boundary inputs", () => {
22
+ it("normalises an empty path to a single slash", () => {
23
+ /*
24
+ * The `pathname || "/"` fallback: an empty string is not passed
25
+ * through as-is, it is turned into the root path.
26
+ */
27
+ expect(UrlScrubber.scrubPath("")).toBe("/");
28
+ });
29
+
30
+ it("returns the root path unchanged", () => {
31
+ expect(UrlScrubber.scrubPath("/")).toBe("/");
32
+ });
33
+
34
+ it("keeps a path whose segments are all ordinary route words", () => {
35
+ expect(UrlScrubber.scrubPath("/blog/how-we-scaled-clickhouse")).toBe(
36
+ "/blog/how-we-scaled-clickhouse",
37
+ );
38
+ });
39
+
40
+ it("preserves the leading empty segment produced by the leading slash", () => {
41
+ /*
42
+ * "/orders/2".split("/") is ["", "orders", "2"]; the empty first
43
+ * element must survive the map so the result stays absolute.
44
+ */
45
+ const scrubbed: string = UrlScrubber.scrubPath("/orders/2");
46
+
47
+ expect(scrubbed).toBe("/orders/2");
48
+ expect(scrubbed.startsWith("/")).toBe(true);
49
+ });
50
+
51
+ it("preserves a trailing slash and collapsed empty segments", () => {
52
+ expect(UrlScrubber.scrubPath("/a//b/")).toBe("/a//b/");
53
+ });
54
+
55
+ it("handles a path that is a single identifier segment", () => {
56
+ expect(
57
+ UrlScrubber.scrubPath("/3f1a9c7e-5b2d-4801-96a3-c9e7b1d5028f"),
58
+ ).toBe(`/${REDACTED}`);
59
+ });
60
+ });
61
+
62
+ describe("uuid segments", () => {
63
+ it("redacts a canonical lowercase uuid while keeping the route shape", () => {
64
+ expect(
65
+ UrlScrubber.scrubPath(
66
+ "/orders/3f1a9c7e-5b2d-4801-96a3-c9e7b1d5028f/items",
67
+ ),
68
+ ).toBe(`/orders/${REDACTED}/items`);
69
+ });
70
+
71
+ it("redacts a uuid case-insensitively", () => {
72
+ expect(
73
+ UrlScrubber.scrubPath("/orders/3F1A9C7E-5B2D-4801-96A3-C9E7B1D5028F"),
74
+ ).toBe(`/orders/${REDACTED}`);
75
+ });
76
+
77
+ it("does not treat a uuid-shaped-but-wrong-length string as a uuid", () => {
78
+ /*
79
+ * A truncated uuid (30 chars): it fails the anchored uuid pattern
80
+ * and, being under the 32-char opaque-token threshold, escapes that
81
+ * rule too, so it survives as ordinary route structure.
82
+ */
83
+ const almost: string = "3f1a9c7e-5b2d-4801-96a3-c9e7b1";
84
+
85
+ expect(almost.length).toBeLessThan(32);
86
+ expect(UrlScrubber.scrubPath(`/x/${almost}`)).toBe(`/x/${almost}`);
87
+ });
88
+ });
89
+
90
+ describe("object id segments", () => {
91
+ it("redacts a 24-character Mongo/BSON object id", () => {
92
+ expect(UrlScrubber.scrubPath("/users/6512f3a9b7c4d2e108f5a3b9")).toBe(
93
+ `/users/${REDACTED}`,
94
+ );
95
+ });
96
+
97
+ it("keeps a 23-character hex string, one short of an object id", () => {
98
+ const shortHex: string = "6512f3a9b7c4d2e108f5a3b";
99
+
100
+ expect(UrlScrubber.scrubPath(`/users/${shortHex}`)).toBe(
101
+ `/users/${shortHex}`,
102
+ );
103
+ });
104
+ });
105
+
106
+ describe("email segments", () => {
107
+ it("redacts a plain email segment", () => {
108
+ expect(UrlScrubber.scrubPath("/u/someone@example.com/profile")).toBe(
109
+ `/u/${REDACTED}/profile`,
110
+ );
111
+ });
112
+
113
+ it("redacts a percent-encoded email by decoding before matching", () => {
114
+ /*
115
+ * name%40example.com decodes to name@example.com; the decode step
116
+ * is what lets the email pattern see it.
117
+ */
118
+ const scrubbed: string = UrlScrubber.scrubPath(
119
+ "/u/someone%40example.com",
120
+ );
121
+
122
+ expect(scrubbed).toBe(`/u/${REDACTED}`);
123
+ expect(scrubbed).not.toContain("%40");
124
+ expect(scrubbed).not.toContain("someone");
125
+ });
126
+
127
+ it("keeps a segment that merely contains an at-sign but is not an address", () => {
128
+ /*
129
+ * A handle like "@acme" has no domain part, so the anchored email
130
+ * pattern rejects it and it is treated as route structure.
131
+ */
132
+ expect(UrlScrubber.scrubPath("/team/@acme")).toBe("/team/@acme");
133
+ });
134
+ });
135
+
136
+ describe("long digit-run segments", () => {
137
+ it("redacts a run of 9 or more digits (card / phone / SSN shaped)", () => {
138
+ expect(UrlScrubber.scrubPath("/account/4111111111111111")).toBe(
139
+ `/account/${REDACTED}`,
140
+ );
141
+ });
142
+
143
+ it("redacts at the 9-digit boundary", () => {
144
+ expect(UrlScrubber.scrubPath("/n/123456789")).toBe(`/n/${REDACTED}`);
145
+ });
146
+
147
+ it("keeps an 8-digit run just under the boundary", () => {
148
+ expect(UrlScrubber.scrubPath("/n/12345678")).toBe("/n/12345678");
149
+ });
150
+
151
+ it("keeps a short numeric id, which is route structure not PII", () => {
152
+ expect(UrlScrubber.scrubPath("/page/2")).toBe("/page/2");
153
+ });
154
+ });
155
+
156
+ describe("opaque token segments", () => {
157
+ it("redacts a 32-or-longer high-entropy token", () => {
158
+ expect(
159
+ UrlScrubber.scrubPath(
160
+ "/s/aVeryLongOpaqueSessionTokenValue1234567890",
161
+ ),
162
+ ).toBe(`/s/${REDACTED}`);
163
+ });
164
+
165
+ it("redacts exactly at the 32-character boundary", () => {
166
+ const token: string = "a".repeat(32);
167
+
168
+ expect(UrlScrubber.scrubPath(`/s/${token}`)).toBe(`/s/${REDACTED}`);
169
+ });
170
+
171
+ it("keeps a 31-character string just under the boundary", () => {
172
+ const slug: string = "a".repeat(31);
173
+
174
+ expect(UrlScrubber.scrubPath(`/s/${slug}`)).toBe(`/s/${slug}`);
175
+ });
176
+
177
+ it("keeps a long slug that carries a dot outside the token charset", () => {
178
+ /*
179
+ * The opaque-token charset is [A-Za-z0-9_-]; a dot disqualifies the
180
+ * whole segment even when it is well over 32 characters, so a
181
+ * dotted asset name survives.
182
+ */
183
+ const dotted: string = "this-is-a-fairly-long-report-name.2024.final";
184
+
185
+ expect(UrlScrubber.scrubPath(`/files/${dotted}`)).toBe(
186
+ `/files/${dotted}`,
187
+ );
188
+ });
189
+ });
190
+
191
+ describe("decode fallback and structure preservation", () => {
192
+ it("never throws and leaves a malformed percent-escape segment intact", () => {
193
+ /*
194
+ * decodeURIComponent("%E0%A4%A") throws; the catch falls back to
195
+ * matching the raw segment, which matches nothing, so the segment
196
+ * is returned exactly as given rather than crashing the mapper.
197
+ */
198
+ const malformed: string = "%E0%A4%A";
199
+
200
+ let scrubbed: string = "";
201
+
202
+ expect((): void => {
203
+ scrubbed = UrlScrubber.scrubPath(`/x/${malformed}`);
204
+ }).not.toThrow();
205
+
206
+ expect(scrubbed).toBe(`/x/${malformed}`);
207
+ });
208
+
209
+ it("returns the raw (still-encoded) form for a non-PII encoded segment", () => {
210
+ /*
211
+ * A kept segment is returned in its original encoded form, not the
212
+ * decoded one: "caf%C3%A9" decodes to "café", matches no pattern,
213
+ * and comes back byte-for-byte as it went in.
214
+ */
215
+ expect(UrlScrubber.scrubPath("/menu/caf%C3%A9")).toBe(
216
+ "/menu/caf%C3%A9",
217
+ );
218
+ });
219
+
220
+ it("redacts only the identifier segments in a mixed path", () => {
221
+ const mixed: string =
222
+ "/org/acme/users/6512f3a9b7c4d2e108f5a3b9/orders/2/token/" +
223
+ "aVeryLongOpaqueSessionTokenValue1234567890";
224
+
225
+ expect(UrlScrubber.scrubPath(mixed)).toBe(
226
+ `/org/acme/users/${REDACTED}/orders/2/token/${REDACTED}`,
227
+ );
228
+ });
229
+
230
+ it("redacts every identifier segment when a path is nothing but ids", () => {
231
+ expect(
232
+ UrlScrubber.scrubPath(
233
+ "/6512f3a9b7c4d2e108f5a3b9/someone@example.com/123456789",
234
+ ),
235
+ ).toBe(`/${REDACTED}/${REDACTED}/${REDACTED}`);
236
+ });
237
+ });
238
+ });
239
+
240
+ describe("scrubQuery", () => {
241
+ describe("empty / missing allowlist drops everything", () => {
242
+ it("returns an empty string when the allowlist is undefined", () => {
243
+ const params: URLSearchParams = new URLSearchParams(
244
+ "plan=growth&coupon=SECRET50",
245
+ );
246
+
247
+ expect(UrlScrubber.scrubQuery(params)).toBe("");
248
+ });
249
+
250
+ it("returns an empty string when the allowlist is empty", () => {
251
+ const params: URLSearchParams = new URLSearchParams("plan=growth");
252
+
253
+ expect(UrlScrubber.scrubQuery(params, [])).toBe("");
254
+ });
255
+
256
+ it("returns an empty string when no parameter matches the allowlist", () => {
257
+ const params: URLSearchParams = new URLSearchParams(
258
+ "coupon=SECRET50&ref=twitter",
259
+ );
260
+
261
+ expect(UrlScrubber.scrubQuery(params, ["plan"])).toBe("");
262
+ });
263
+
264
+ it("returns an empty string for a query with no parameters at all", () => {
265
+ expect(UrlScrubber.scrubQuery(new URLSearchParams(""), ["plan"])).toBe(
266
+ "",
267
+ );
268
+ });
269
+ });
270
+
271
+ describe("allowlisted names are kept with redacted values", () => {
272
+ it("keeps the name and redacts the value of an allowlisted parameter", () => {
273
+ const params: URLSearchParams = new URLSearchParams(
274
+ "plan=growth&coupon=SECRET50",
275
+ );
276
+
277
+ const scrubbed: string = UrlScrubber.scrubQuery(params, ["plan"]);
278
+
279
+ expect(scrubbed).toBe(`plan=${REDACTED}`);
280
+ expect(scrubbed).not.toContain("growth");
281
+ expect(scrubbed).not.toContain("SECRET50");
282
+ expect(scrubbed).not.toContain("coupon");
283
+ });
284
+
285
+ it("redacts the value regardless of how sensitive it looks", () => {
286
+ const params: URLSearchParams = new URLSearchParams();
287
+ params.append("token", "eyJhbGciOiJIUzI1NiJ9.payload.signature");
288
+
289
+ const scrubbed: string = UrlScrubber.scrubQuery(params, ["token"]);
290
+
291
+ expect(scrubbed).toBe(`token=${REDACTED}`);
292
+ expect(scrubbed).not.toContain("eyJ");
293
+ });
294
+
295
+ it("keeps several allowlisted parameters joined by ampersands", () => {
296
+ const params: URLSearchParams = new URLSearchParams(
297
+ "plan=growth&ref=twitter&step=2",
298
+ );
299
+
300
+ expect(UrlScrubber.scrubQuery(params, ["plan", "step"])).toBe(
301
+ `plan=${REDACTED}&step=${REDACTED}`,
302
+ );
303
+ });
304
+
305
+ it("preserves the original query order of the kept parameters", () => {
306
+ const params: URLSearchParams = new URLSearchParams(
307
+ "step=2&plan=growth",
308
+ );
309
+
310
+ expect(UrlScrubber.scrubQuery(params, ["plan", "step"])).toBe(
311
+ `step=${REDACTED}&plan=${REDACTED}`,
312
+ );
313
+ });
314
+ });
315
+
316
+ describe("case-insensitive matching", () => {
317
+ it("matches an allowlist entry against a differently-cased parameter name", () => {
318
+ const params: URLSearchParams = new URLSearchParams("Plan=growth");
319
+
320
+ /*
321
+ * The comparison lowercases both sides, but the emitted name keeps
322
+ * the parameter's original casing.
323
+ */
324
+ expect(UrlScrubber.scrubQuery(params, ["plan"])).toBe(
325
+ `Plan=${REDACTED}`,
326
+ );
327
+ });
328
+
329
+ it("matches when the allowlist entry itself is upper-cased", () => {
330
+ const params: URLSearchParams = new URLSearchParams("plan=growth");
331
+
332
+ expect(UrlScrubber.scrubQuery(params, ["PLAN"])).toBe(
333
+ `plan=${REDACTED}`,
334
+ );
335
+ });
336
+ });
337
+
338
+ describe("edge cases in parameter names", () => {
339
+ it("emits one redacted entry per repeated occurrence of a key", () => {
340
+ /*
341
+ * URLSearchParams keeps duplicate keys, so forEach visits each one;
342
+ * both are kept, and because the value is redacted the two entries
343
+ * are identical.
344
+ */
345
+ const params: URLSearchParams = new URLSearchParams("a=1&a=2&b=3");
346
+
347
+ expect(UrlScrubber.scrubQuery(params, ["a"])).toBe(
348
+ `a=${REDACTED}&a=${REDACTED}`,
349
+ );
350
+ });
351
+
352
+ it("percent-encodes an allowlisted key that contains a space", () => {
353
+ const params: URLSearchParams = new URLSearchParams();
354
+ params.append("user name", "jane");
355
+
356
+ expect(UrlScrubber.scrubQuery(params, ["user name"])).toBe(
357
+ `user%20name=${REDACTED}`,
358
+ );
359
+ });
360
+ });
361
+ });
362
+ });
@@ -3,6 +3,7 @@ enum EmailTemplateType {
3
3
  ForgotPassword = "ForgotPassword.hbs",
4
4
  ProbeOffline = "ProbeOffline.hbs",
5
5
  SignupWelcomeEmail = "SignupWelcomeEmail.hbs",
6
+ CompleteRegistration = "CompleteRegistration.hbs",
6
7
  ProbeConnectionStatusChange = "ProbeConnectionStatusChange.hbs",
7
8
  AIAgentConnectionStatusChange = "AIAgentConnectionStatusChange.hbs",
8
9
  AIAgentOwnerAdded = "AIAgentOwnerAdded.hbs",
@@ -44,6 +44,19 @@ export interface MonitorCriteriaInstanceType {
44
44
  }
45
45
 
46
46
  export default class MonitorCriteriaInstance extends DatabaseProperty {
47
+ /*
48
+ * Keyword the out-of-the-box criteria for the two incoming monitor types
49
+ * (Incoming Request and Incoming Email) look for in the payload body.
50
+ *
51
+ * These monitors are driven by whatever the sender pushes, so the default
52
+ * that is useful to the most people is "the sender told us something broke":
53
+ * a body carrying this keyword takes the monitor offline and opens an
54
+ * incident, a body without it puts the monitor back online. Users who want
55
+ * a dead-man's-switch instead can still add an Incoming Request /
56
+ * Email Received criteria by hand.
57
+ */
58
+ public static readonly DEFAULT_INCOMING_BODY_ERROR_KEYWORD: string = "error";
59
+
47
60
  public data: MonitorCriteriaInstanceType | undefined = undefined;
48
61
 
49
62
  public constructor() {
@@ -88,9 +101,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
88
101
  filterCondition: FilterCondition.All,
89
102
  filters: [
90
103
  {
91
- checkOn: CheckOn.IncomingRequest,
92
- filterType: FilterType.RecievedInMinutes,
93
- value: 30,
104
+ checkOn: CheckOn.RequestBody,
105
+ filterType: FilterType.NotContains,
106
+ value: MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD,
94
107
  },
95
108
  ],
96
109
  incidents: [],
@@ -99,7 +112,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
99
112
  changeMonitorStatus: true,
100
113
  createIncidents: false,
101
114
  name: `Check if ${arg.monitorName} is online`,
102
- description: `This criteria checks if the ${arg.monitorName} is online`,
115
+ description: `This criteria checks if the request body of ${arg.monitorName} does not contain "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}"`,
103
116
  };
104
117
 
105
118
  return monitorCriteriaInstance;
@@ -115,9 +128,9 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
115
128
  filterCondition: FilterCondition.All,
116
129
  filters: [
117
130
  {
118
- checkOn: CheckOn.EmailReceivedAt,
119
- filterType: FilterType.RecievedInMinutes,
120
- value: 30,
131
+ checkOn: CheckOn.EmailBody,
132
+ filterType: FilterType.NotContains,
133
+ value: MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD,
121
134
  },
122
135
  ],
123
136
  incidents: [],
@@ -126,7 +139,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
126
139
  changeMonitorStatus: true,
127
140
  createIncidents: false,
128
141
  name: `Check if ${arg.monitorName} is online`,
129
- description: `This criteria checks if the ${arg.monitorName} is online`,
142
+ description: `This criteria checks if the email body of ${arg.monitorName} does not contain "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}"`,
130
143
  };
131
144
 
132
145
  return monitorCriteriaInstance;
@@ -1198,15 +1211,19 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1198
1211
  filterCondition: FilterCondition.Any,
1199
1212
  filters: [
1200
1213
  {
1201
- checkOn: CheckOn.IncomingRequest,
1202
- filterType: FilterType.NotRecievedInMinutes,
1203
- value: 30, // if the request is not recieved in 30 minutes, then the monitor is offline
1214
+ /*
1215
+ * If the sender reports an error in the request body, the monitor
1216
+ * is offline.
1217
+ */
1218
+ checkOn: CheckOn.RequestBody,
1219
+ filterType: FilterType.Contains,
1220
+ value: MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD,
1204
1221
  },
1205
1222
  ],
1206
1223
  alerts: [
1207
1224
  {
1208
1225
  title: `${arg.monitorName} is offline`,
1209
- description: `${arg.monitorName} is currently offline.`,
1226
+ description: `${arg.monitorName} is currently offline. The request body contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}".`,
1210
1227
  alertSeverityId: arg.alertSeverityId,
1211
1228
  autoResolveAlert: true,
1212
1229
  id: ObjectID.generate().toString(),
@@ -1217,7 +1234,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1217
1234
  incidents: [
1218
1235
  {
1219
1236
  title: `${arg.monitorName} is offline`,
1220
- description: `${arg.monitorName} is currently offline.`,
1237
+ description: `${arg.monitorName} is currently offline. The request body contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}".`,
1221
1238
  incidentSeverityId: arg.incidentSeverityId,
1222
1239
  autoResolveIncident: true,
1223
1240
  id: ObjectID.generate().toString(),
@@ -1227,7 +1244,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1227
1244
  changeMonitorStatus: true,
1228
1245
  createIncidents: true,
1229
1246
  name: `Check if ${arg.monitorName} is offline`,
1230
- description: `This criteria checks if the ${arg.monitorName} is offline`,
1247
+ description: `This criteria checks if the request body of ${arg.monitorName} contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}"`,
1231
1248
  };
1232
1249
  }
1233
1250
 
@@ -1238,15 +1255,19 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1238
1255
  filterCondition: FilterCondition.Any,
1239
1256
  filters: [
1240
1257
  {
1241
- checkOn: CheckOn.EmailReceivedAt,
1242
- filterType: FilterType.NotRecievedInMinutes,
1243
- value: 30, // if email is not received in 30 minutes, then the monitor is offline
1258
+ /*
1259
+ * If the received email reports an error in its body, the monitor
1260
+ * is offline.
1261
+ */
1262
+ checkOn: CheckOn.EmailBody,
1263
+ filterType: FilterType.Contains,
1264
+ value: MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD,
1244
1265
  },
1245
1266
  ],
1246
1267
  alerts: [
1247
1268
  {
1248
1269
  title: `${arg.monitorName} is offline`,
1249
- description: `${arg.monitorName} is currently offline. No email received.`,
1270
+ description: `${arg.monitorName} is currently offline. The email body contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}".`,
1250
1271
  alertSeverityId: arg.alertSeverityId,
1251
1272
  autoResolveAlert: true,
1252
1273
  id: ObjectID.generate().toString(),
@@ -1257,7 +1278,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1257
1278
  incidents: [
1258
1279
  {
1259
1280
  title: `${arg.monitorName} is offline`,
1260
- description: `${arg.monitorName} is currently offline. No email received.`,
1281
+ description: `${arg.monitorName} is currently offline. The email body contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}".`,
1261
1282
  incidentSeverityId: arg.incidentSeverityId,
1262
1283
  autoResolveIncident: true,
1263
1284
  id: ObjectID.generate().toString(),
@@ -1267,7 +1288,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty {
1267
1288
  changeMonitorStatus: true,
1268
1289
  createIncidents: true,
1269
1290
  name: `Check if ${arg.monitorName} is offline`,
1270
- description: `This criteria checks if the ${arg.monitorName} is offline`,
1291
+ description: `This criteria checks if the email body of ${arg.monitorName} contains "${MonitorCriteriaInstance.DEFAULT_INCOMING_BODY_ERROR_KEYWORD}"`,
1271
1292
  };
1272
1293
  }
1273
1294