@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,421 @@
1
+ import LogAggregationService, {
2
+ AnalyticsRequest,
3
+ FacetRequest,
4
+ HistogramRequest,
5
+ } from "../../../Server/Services/LogAggregationService";
6
+ import LogDatabaseService from "../../../Server/Services/LogService";
7
+ import { Statement } from "../../../Server/Utils/AnalyticsDatabase/Statement";
8
+ import {
9
+ AGGREGATION_SCAN_MAX_BLOCK_SIZE,
10
+ AGGREGATION_SCAN_MAX_THREADS,
11
+ AGGREGATION_SCAN_PREFERRED_BLOCK_SIZE_IN_BYTES,
12
+ DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY_IN_BYTES,
13
+ DEFAULT_MAX_MEMORY_USAGE_IN_BYTES,
14
+ getQuerySettings,
15
+ } from "../../../Server/Utils/AnalyticsDatabase/QuerySettingsHelper";
16
+ import ObjectID from "../../../Types/ObjectID";
17
+ import { describe, expect, test } from "@jest/globals";
18
+
19
+ /*
20
+ * Scan-side memory bounds for the Logs aggregations.
21
+ *
22
+ * Reported from production alongside the `_id` sort regression, but a
23
+ * genuinely separate defect: six Logs queries aborted with Code 241 (3 GiB
24
+ * max_memory_usage exceeded). These are the facet counts and the severity
25
+ * histogram, which never enter toFindStatement at all — they are hand-built
26
+ * statements in LogAggregationService executed through executeQuery, so the
27
+ * sort fix does not touch them.
28
+ *
29
+ * The field report labelled these "aggregation memory". Measured, that label
30
+ * is wrong for the common case and the distinction decides the fix. The group
31
+ * keys are small (severityText has ~10 distinct values; the histogram's inner
32
+ * key is (minute, severityText) — ~14k groups over 24h), so the hash table is
33
+ * not the problem. The memory is SCAN-side: a GROUP BY over a log window must
34
+ * visit every matching row, and a filter on `attributes` (a fat
35
+ * Map(String, String)) or `body` forces those wide columns to be read for the
36
+ * whole window. Peak memory is roughly threads x block rows x bytes per row,
37
+ * and the default 65536-row block is what pushes it over.
38
+ *
39
+ * Measured on ClickHouse 26.7, 3M rows shaped like LogItemV3, one facet query
40
+ * filtered on an attribute value:
41
+ *
42
+ * default 695 MiB peak
43
+ * max_block_size alone 88 MiB peak (and faster)
44
+ * + preferred_block_size_bytes, max_threads 40 MiB peak
45
+ *
46
+ * Same shape on the histogram once a non-projection filter drops it off the
47
+ * proj_severity_histogram projection: 591 MiB -> 39 MiB.
48
+ *
49
+ * These are execution-strategy settings, so they cannot change the result set
50
+ * — verified against a real server, and pinned below by asserting the bound
51
+ * settings are ADDITIVE to each statement rather than replacing anything.
52
+ *
53
+ * What this does NOT fix, deliberately: a facet on a genuinely
54
+ * high-cardinality attribute builds a large GROUP BY hash table no matter how
55
+ * the scan is bounded. That case is already covered by
56
+ * max_bytes_before_external_group_by spilling to disk, which every read here
57
+ * carries.
58
+ */
59
+
60
+ const PROJECT_ID: ObjectID = ObjectID.generate();
61
+ const START_TIME: Date = new Date("2026-03-01T00:00:00.000Z");
62
+ const END_TIME: Date = new Date("2026-03-12T00:00:00.000Z");
63
+
64
+ const BOUND_SETTINGS: Array<string> = [
65
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
66
+ `preferred_block_size_bytes = ${AGGREGATION_SCAN_PREFERRED_BLOCK_SIZE_IN_BYTES}`,
67
+ `max_threads = ${AGGREGATION_SCAN_MAX_THREADS}`,
68
+ ];
69
+
70
+ const facetRequest: FacetRequest = {
71
+ projectId: PROJECT_ID,
72
+ startTime: START_TIME,
73
+ endTime: END_TIME,
74
+ facetKey: "severityText",
75
+ limit: 15,
76
+ };
77
+
78
+ const histogramRequest: HistogramRequest = {
79
+ projectId: PROJECT_ID,
80
+ startTime: START_TIME,
81
+ endTime: END_TIME,
82
+ bucketSizeInMinutes: 15,
83
+ } as HistogramRequest;
84
+
85
+ const analyticsRequest: AnalyticsRequest = {
86
+ projectId: PROJECT_ID,
87
+ startTime: START_TIME,
88
+ endTime: END_TIME,
89
+ } as AnalyticsRequest;
90
+
91
+ /* The top-list and table builders read request.groupBy[0]. */
92
+ const analyticsGroupedRequest: AnalyticsRequest = {
93
+ ...analyticsRequest,
94
+ groupBy: ["severityText"],
95
+ } as AnalyticsRequest;
96
+
97
+ /*
98
+ * The builders are private; the suite exercises them the same way the
99
+ * existing LogAggregationService suite does.
100
+ */
101
+ function build(builder: string, request: unknown): Statement {
102
+ return (
103
+ LogAggregationService as unknown as Record<
104
+ string,
105
+ (arg: unknown) => Statement
106
+ >
107
+ )[builder]!(request);
108
+ }
109
+
110
+ /* Every statement that must carry the bound, and the request it takes. */
111
+ const BOUNDED_BUILDERS: Array<[string, unknown]> = [
112
+ ["buildFacetStatement", facetRequest],
113
+ ["buildHistogramStatement", histogramRequest],
114
+ ["buildAnalyticsTimeseriesStatement", analyticsRequest],
115
+ ["buildAnalyticsTopListStatement", analyticsGroupedRequest],
116
+ ["buildAnalyticsTableStatement", analyticsGroupedRequest],
117
+ ];
118
+
119
+ describe("getQuerySettings scan memory bound", () => {
120
+ test("emits nothing extra when the bound is not requested", () => {
121
+ const settings: string = getQuerySettings({});
122
+
123
+ for (const setting of BOUND_SETTINGS) {
124
+ expect(settings).not.toContain(setting.split(" =")[0]!);
125
+ }
126
+ });
127
+
128
+ test("boundScanMemory: false is treated as not requested", () => {
129
+ expect(getQuerySettings({ boundScanMemory: false })).toBe(
130
+ getQuerySettings({}),
131
+ );
132
+ });
133
+
134
+ test("emits all three bound settings when requested", () => {
135
+ const settings: string = getQuerySettings({ boundScanMemory: true });
136
+
137
+ for (const setting of BOUND_SETTINGS) {
138
+ expect(settings).toContain(setting);
139
+ }
140
+ });
141
+
142
+ /*
143
+ * The bound must be ADDITIVE. If it ever replaced the memory ceiling or the
144
+ * spill thresholds, a bounded query would lose its abort guard entirely.
145
+ */
146
+ test("the bound does not displace the memory ceiling or spill thresholds", () => {
147
+ const settings: string = getQuerySettings({ boundScanMemory: true });
148
+
149
+ expect(settings).toContain(
150
+ `max_memory_usage = ${DEFAULT_MAX_MEMORY_USAGE_IN_BYTES}`,
151
+ );
152
+ expect(settings).toContain(
153
+ `max_bytes_before_external_group_by = ${DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY_IN_BYTES}`,
154
+ );
155
+ });
156
+
157
+ test("the bound is purely additive to the unbounded setting list", () => {
158
+ const unbounded: Array<string> = getQuerySettings({})
159
+ .replace(" SETTINGS ", "")
160
+ .split(", ");
161
+ const bounded: Array<string> = getQuerySettings({ boundScanMemory: true })
162
+ .replace(" SETTINGS ", "")
163
+ .split(", ");
164
+
165
+ expect(bounded).toStrictEqual([...unbounded, ...BOUND_SETTINGS]);
166
+ });
167
+
168
+ test("composes with execution-time settings without reordering them", () => {
169
+ const settings: string = getQuerySettings({
170
+ maxExecutionTimeInSeconds: 45,
171
+ timeoutOverflowMode: "break",
172
+ boundScanMemory: true,
173
+ });
174
+
175
+ expect(settings.indexOf("max_execution_time")).toBeLessThan(
176
+ settings.indexOf("max_memory_usage"),
177
+ );
178
+ expect(settings.indexOf("max_memory_usage")).toBeLessThan(
179
+ settings.indexOf("max_block_size"),
180
+ );
181
+ });
182
+
183
+ /*
184
+ * The histogram passes optimize_use_projections through additionalSettings.
185
+ * Emitting the bound first means an explicit additional setting still wins
186
+ * on a duplicate key, since ClickHouse takes the last occurrence.
187
+ */
188
+ test("additional settings are emitted after the bound so they can override it", () => {
189
+ const settings: string = getQuerySettings({
190
+ boundScanMemory: true,
191
+ additionalSettings: { max_threads: 16 },
192
+ });
193
+
194
+ expect(
195
+ settings.indexOf(`max_threads = ${AGGREGATION_SCAN_MAX_THREADS}`),
196
+ ).toBeLessThan(settings.lastIndexOf("max_threads = 16"));
197
+ });
198
+
199
+ test("keeps the projection hint alongside the bound", () => {
200
+ const settings: string = getQuerySettings({
201
+ boundScanMemory: true,
202
+ additionalSettings: { optimize_use_projections: 1 },
203
+ });
204
+
205
+ expect(settings).toContain("optimize_use_projections = 1");
206
+ expect(settings).toContain(
207
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
208
+ );
209
+ });
210
+
211
+ /*
212
+ * A block size at or above the ClickHouse default would make the setting a
213
+ * no-op and silently un-fix the bug.
214
+ */
215
+ test("the block size is meaningfully below the ClickHouse default of 65536", () => {
216
+ expect(AGGREGATION_SCAN_MAX_BLOCK_SIZE).toBeLessThan(65536);
217
+ expect(AGGREGATION_SCAN_MAX_BLOCK_SIZE).toBeGreaterThan(0);
218
+ });
219
+
220
+ test("the thread cap is positive and bounded", () => {
221
+ expect(AGGREGATION_SCAN_MAX_THREADS).toBeGreaterThan(0);
222
+ expect(AGGREGATION_SCAN_MAX_THREADS).toBeLessThanOrEqual(8);
223
+ });
224
+ });
225
+
226
+ describe("LogAggregationService scan memory bound", () => {
227
+ test.each(BOUNDED_BUILDERS)(
228
+ "%s bounds its scan",
229
+ (builder: string, request: unknown) => {
230
+ const query: string = build(builder, request).query;
231
+
232
+ for (const setting of BOUND_SETTINGS) {
233
+ expect(query).toContain(setting);
234
+ }
235
+ },
236
+ );
237
+
238
+ test.each(BOUNDED_BUILDERS)(
239
+ "%s keeps its 3 GiB abort guard and spill thresholds",
240
+ (builder: string, request: unknown) => {
241
+ const query: string = build(builder, request).query;
242
+
243
+ expect(query).toContain(
244
+ `max_memory_usage = ${DEFAULT_MAX_MEMORY_USAGE_IN_BYTES}`,
245
+ );
246
+ expect(query).toContain(
247
+ `max_bytes_before_external_group_by = ${DEFAULT_MAX_BYTES_BEFORE_EXTERNAL_GROUP_BY_IN_BYTES}`,
248
+ );
249
+ },
250
+ );
251
+
252
+ test.each(BOUNDED_BUILDERS)(
253
+ "%s keeps its execution-time cap in break mode",
254
+ (builder: string, request: unknown) => {
255
+ const query: string = build(builder, request).query;
256
+
257
+ expect(query).toContain("max_execution_time = 45");
258
+ expect(query).toContain("timeout_overflow_mode = 'break'");
259
+ },
260
+ );
261
+
262
+ /*
263
+ * The bound is a SETTINGS-clause change only. If it ever leaked into the
264
+ * query body it could change results, which is the one thing it must not do.
265
+ */
266
+ test.each(BOUNDED_BUILDERS)(
267
+ "%s confines the bound to the SETTINGS clause",
268
+ (builder: string, request: unknown) => {
269
+ const query: string = build(builder, request).query;
270
+ const body: string = query.split(" SETTINGS ")[0]!;
271
+
272
+ expect(body).not.toContain("max_block_size");
273
+ expect(body).not.toContain("preferred_block_size_bytes");
274
+ expect(body).not.toContain("max_threads");
275
+ },
276
+ );
277
+
278
+ test.each(BOUNDED_BUILDERS)(
279
+ "%s emits exactly one SETTINGS clause",
280
+ (builder: string, request: unknown) => {
281
+ const query: string = build(builder, request).query;
282
+
283
+ expect(query.split(" SETTINGS ").length - 1).toBe(1);
284
+ },
285
+ );
286
+
287
+ /*
288
+ * The bound must not disturb parameter binding — it emits trusted literals
289
+ * only, never a bound parameter.
290
+ */
291
+ test.each(BOUNDED_BUILDERS)(
292
+ "%s binds no parameter for the bound settings",
293
+ (builder: string, request: unknown) => {
294
+ const statement: Statement = build(builder, request);
295
+ const values: Array<unknown> = Object.values(statement.query_params);
296
+
297
+ expect(values).not.toContain(AGGREGATION_SCAN_MAX_BLOCK_SIZE);
298
+ expect(values).not.toContain(
299
+ AGGREGATION_SCAN_PREFERRED_BLOCK_SIZE_IN_BYTES,
300
+ );
301
+ expect(statement.query.split(" SETTINGS ")[1]!.includes("{p")).toBe(
302
+ false,
303
+ );
304
+ },
305
+ );
306
+
307
+ /*
308
+ * The histogram is written to hit the proj_severity_histogram aggregate
309
+ * projection, and the bound must not cost it that plan.
310
+ */
311
+ test("the histogram keeps its projection hint", () => {
312
+ const query: string = build(
313
+ "buildHistogramStatement",
314
+ histogramRequest,
315
+ ).query;
316
+
317
+ expect(query).toContain("optimize_use_projections = 1");
318
+ });
319
+
320
+ /*
321
+ * The expensive filters are the reason this bug exists: an attribute or
322
+ * body predicate forces the fat columns to be read across the whole window.
323
+ * Those are exactly the statements that must carry the bound.
324
+ */
325
+ test("a facet filtered on an attribute is bounded", () => {
326
+ const query: string = build("buildFacetStatement", {
327
+ ...facetRequest,
328
+ attributes: { "k8s.namespace": "production" },
329
+ }).query;
330
+
331
+ expect(query).toContain("arrayExists");
332
+ expect(query).toContain(
333
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
334
+ );
335
+ });
336
+
337
+ test("a facet filtered on body text is bounded", () => {
338
+ const query: string = build("buildFacetStatement", {
339
+ ...facetRequest,
340
+ bodySearchText: "timeout",
341
+ }).query;
342
+
343
+ expect(query).toContain("body ILIKE");
344
+ expect(query).toContain(
345
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
346
+ );
347
+ });
348
+
349
+ /*
350
+ * A histogram carrying a non-projection filter falls back to a base-table
351
+ * scan of the window. That fallback is the histogram's blowup case, so it
352
+ * must be bounded.
353
+ */
354
+ test("a histogram that falls off its projection is bounded", () => {
355
+ const query: string = build("buildHistogramStatement", {
356
+ ...histogramRequest,
357
+ attributes: { "k8s.namespace": "production" },
358
+ }).query;
359
+
360
+ expect(query).toContain("arrayExists");
361
+ expect(query).toContain(
362
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
363
+ );
364
+ });
365
+
366
+ test("an attribute-value facet is bounded", () => {
367
+ const query: string = build("buildFacetStatement", {
368
+ ...facetRequest,
369
+ facetKey: "k8s.pod.name",
370
+ }).query;
371
+
372
+ expect(query).toContain("attributes[");
373
+ expect(query).toContain(
374
+ `max_block_size = ${AGGREGATION_SCAN_MAX_BLOCK_SIZE}`,
375
+ );
376
+ });
377
+
378
+ /*
379
+ * getExportLogs is deliberately NOT bounded: it reads rows rather than
380
+ * aggregating, and its `ORDER BY time DESC LIMIT n` is a sorting-key prefix
381
+ * that lets ClickHouse early-exit, so its scan is already bounded by the
382
+ * LIMIT. Capping its threads would only slow a user-facing download. This
383
+ * pins that decision so it is revisited deliberately rather than by
384
+ * accident.
385
+ */
386
+ test("the row export is left unbounded", async () => {
387
+ let captured: Statement | null = null;
388
+ const original: unknown = LogDatabaseService.executeQuery;
389
+
390
+ (
391
+ LogDatabaseService as unknown as {
392
+ executeQuery: (statement: Statement) => Promise<unknown>;
393
+ }
394
+ ).executeQuery = (statement: Statement): Promise<unknown> => {
395
+ captured = statement;
396
+ return Promise.resolve({
397
+ json: () => {
398
+ return Promise.resolve({ data: [] });
399
+ },
400
+ });
401
+ };
402
+
403
+ try {
404
+ await LogAggregationService.getExportLogs({
405
+ projectId: PROJECT_ID,
406
+ startTime: START_TIME,
407
+ endTime: END_TIME,
408
+ limit: 100,
409
+ });
410
+ } finally {
411
+ LogDatabaseService.executeQuery = original as never;
412
+ }
413
+
414
+ expect(captured).not.toBeNull();
415
+ expect(captured!.query).not.toContain("max_block_size");
416
+ /* It still carries the shared abort guard. */
417
+ expect(captured!.query).toContain(
418
+ `max_memory_usage = ${DEFAULT_MAX_MEMORY_USAGE_IN_BYTES}`,
419
+ );
420
+ });
421
+ });
@@ -36,7 +36,7 @@ describe("LogAggregationService", () => {
36
36
  });
37
37
 
38
38
  expect(statement.query).toBe(
39
- "SELECT toString({p0:Identifier}) AS val, count() AS cnt FROM {p1:Identifier} WHERE projectId = {p2:String} AND time >= {p3:DateTime} AND time <= {p4:DateTime} AND retentionDate >= now() GROUP BY val ORDER BY cnt DESC LIMIT {p5:Int32} SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break', max_memory_usage = 3221225472, max_bytes_before_external_group_by = 1610612736, max_bytes_before_external_sort = 1610612736",
39
+ "SELECT toString({p0:Identifier}) AS val, count() AS cnt FROM {p1:Identifier} WHERE projectId = {p2:String} AND time >= {p3:DateTime} AND time <= {p4:DateTime} AND retentionDate >= now() GROUP BY val ORDER BY cnt DESC LIMIT {p5:Int32} SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break', max_memory_usage = 3221225472, max_bytes_before_external_group_by = 1610612736, max_bytes_before_external_sort = 1610612736, max_block_size = 8192, preferred_block_size_bytes = 1048576, max_threads = 4",
40
40
  );
41
41
 
42
42
  expect(statement.query_params).toStrictEqual({
@@ -61,7 +61,7 @@ describe("LogAggregationService", () => {
61
61
  * throws ILLEGAL_TYPE_OF_ARGUMENT (Code 43) against Map columns.
62
62
  */
63
63
  expect(statement.query).toBe(
64
- "SELECT attributes[{p0:String}] AS val, count() AS cnt FROM {p1:Identifier} WHERE projectId = {p2:String} AND time >= {p3:DateTime} AND time <= {p4:DateTime} AND mapContains(attributes, {p5:String}) AND retentionDate >= now() GROUP BY val ORDER BY cnt DESC LIMIT {p6:Int32} SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break', max_memory_usage = 3221225472, max_bytes_before_external_group_by = 1610612736, max_bytes_before_external_sort = 1610612736",
64
+ "SELECT attributes[{p0:String}] AS val, count() AS cnt FROM {p1:Identifier} WHERE projectId = {p2:String} AND time >= {p3:DateTime} AND time <= {p4:DateTime} AND mapContains(attributes, {p5:String}) AND retentionDate >= now() GROUP BY val ORDER BY cnt DESC LIMIT {p6:Int32} SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break', max_memory_usage = 3221225472, max_bytes_before_external_group_by = 1610612736, max_bytes_before_external_sort = 1610612736, max_block_size = 8192, preferred_block_size_bytes = 1048576, max_threads = 4",
65
65
  );
66
66
 
67
67
  expect(statement.query_params).toStrictEqual({