@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,439 @@
1
+ import Icon from "../Icon/Icon";
2
+ import KeyboardShortcut, { KeyboardShortcutSize, KeyboardShortcutVariant, } from "../KeyboardShortcut/KeyboardShortcut";
3
+ import KeyboardKey from "../KeyboardShortcut/KeyboardKey";
4
+ import IconProp from "../../../Types/Icon/IconProp";
5
+ import useTranslateValue from "../../Utils/Translation";
6
+ import { lockPageScroll, unlockPageScroll } from "../../Utils/PageScrollLock";
7
+ import { filterPaletteCommands, getPaletteSectionId, normalizePaletteQuery, } from "./PaletteFilter";
8
+ import { readRecentCommandIds, RECENT_COMMANDS_LIMIT, writeRecentCommandId, } from "./RecentCommands";
9
+ import useProviderSearch from "./UseProviderSearch";
10
+ import PaletteRow from "./PaletteRow";
11
+ import React, { useEffect, useMemo, useRef, useState, } from "react";
12
+ import { createPortal } from "react-dom";
13
+ const EMPTY_PROVIDERS = [];
14
+ const hasPendingSection = (sections) => {
15
+ return sections.some((section) => {
16
+ return section.isPending;
17
+ });
18
+ };
19
+ const commandToEntry = (command, idPrefix) => {
20
+ return {
21
+ id: `${idPrefix}${command.id}`,
22
+ title: command.title,
23
+ description: command.description,
24
+ icon: command.icon,
25
+ iconColor: command.iconColor,
26
+ shortcut: command.shortcut,
27
+ recentCommandId: command.id,
28
+ onSelect: command.onSelect,
29
+ };
30
+ };
31
+ const CommandPalettePanel = (props) => {
32
+ const [query, setQuery] = useState("");
33
+ const [activeIndex, setActiveIndex] = useState(0);
34
+ /*
35
+ * The panel mounts in its closed state and is flipped open one frame later
36
+ * so the browser has something to transition from (Modal's pattern).
37
+ */
38
+ const [hasEntered, setHasEntered] = useState(false);
39
+ const inputRef = useRef(null);
40
+ const rowRefs = useRef([]);
41
+ /*
42
+ * Whatever had focus when the palette opened gets it back on close —
43
+ * captured at first render, before the autofocus effect moves focus into
44
+ * the input (Modal's pattern).
45
+ */
46
+ const previouslyFocusedElementRef = useRef(typeof document !== "undefined" &&
47
+ document.activeElement instanceof HTMLElement
48
+ ? document.activeElement
49
+ : null);
50
+ // Kept fresh so the mount-once document listener never calls a stale close.
51
+ const onCloseRef = useRef(props.onClose);
52
+ useEffect(() => {
53
+ onCloseRef.current = props.onClose;
54
+ }, [props.onClose]);
55
+ // Recently run command ids, read once when the palette opens.
56
+ const [recentCommandIds] = useState(() => {
57
+ return props.recentStorageKey
58
+ ? readRecentCommandIds(props.recentStorageKey)
59
+ : [];
60
+ });
61
+ /*
62
+ * Callers hand us plain English literals. Run every user-facing string
63
+ * through the same flat-key lookup the navbar uses so localised deployments
64
+ * render localised chrome.
65
+ */
66
+ const { translateString } = useTranslateValue();
67
+ const tx = (value) => {
68
+ var _a;
69
+ return (_a = translateString(value)) !== null && _a !== void 0 ? _a : value;
70
+ };
71
+ useEffect(() => {
72
+ const open = () => {
73
+ setHasEntered(true);
74
+ };
75
+ const frame = requestAnimationFrame(open);
76
+ /*
77
+ * A hidden or throttled tab never runs an animation frame; the timer is
78
+ * the safety net that skips the transition rather than the palette.
79
+ */
80
+ const fallbackTimer = setTimeout(open, 80);
81
+ return () => {
82
+ cancelAnimationFrame(frame);
83
+ clearTimeout(fallbackTimer);
84
+ };
85
+ }, []);
86
+ // The page behind the palette must not scroll while it is open.
87
+ useEffect(() => {
88
+ lockPageScroll();
89
+ return () => {
90
+ unlockPageScroll();
91
+ };
92
+ }, []);
93
+ useEffect(() => {
94
+ var _a;
95
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
96
+ }, []);
97
+ /*
98
+ * Escape must dismiss the palette even after focus has escaped the dialog
99
+ * subtree (a click on the backdrop scrollbar, a programmatic blur): the
100
+ * React onKeyDown on the dialog root only hears keys fired inside it, so a
101
+ * document-level listener backs it up while the panel is mounted (Modal's
102
+ * pattern). No double-fire: the React handler preventDefaults AND stops
103
+ * propagation, so an Escape it consumed either never reaches document or
104
+ * arrives flagged defaultPrevented — which is also the flag any other
105
+ * dialog above us would set.
106
+ */
107
+ useEffect(() => {
108
+ const handleDocumentKeyDown = (event) => {
109
+ if (event.defaultPrevented || event.key !== "Escape") {
110
+ return;
111
+ }
112
+ // Flag the key consumed for listeners after us (window-level ones too).
113
+ event.preventDefault();
114
+ onCloseRef.current();
115
+ };
116
+ document.addEventListener("keydown", handleDocumentKeyDown);
117
+ return () => {
118
+ document.removeEventListener("keydown", handleDocumentKeyDown);
119
+ };
120
+ }, []);
121
+ // Return focus to where it was before the palette opened (Modal's pattern).
122
+ useEffect(() => {
123
+ return () => {
124
+ var _a;
125
+ if ((_a = previouslyFocusedElementRef.current) === null || _a === void 0 ? void 0 : _a.isConnected) {
126
+ previouslyFocusedElementRef.current.focus();
127
+ }
128
+ };
129
+ }, []);
130
+ const providerSections = useProviderSearch(props.searchProviders, query);
131
+ const normalizedQuery = normalizePaletteQuery(query);
132
+ const sections = useMemo(() => {
133
+ const built = [];
134
+ const pushSection = (id, title, isPending, entries) => {
135
+ built.push({
136
+ id,
137
+ title,
138
+ isPending,
139
+ // flatIndex is stamped in a single pass after all sections exist.
140
+ entries: entries,
141
+ });
142
+ };
143
+ // Group commands by category, preserving first-seen order.
144
+ const groupByCategory = (commands) => {
145
+ const order = [];
146
+ const byCategory = new Map();
147
+ commands.forEach((command) => {
148
+ const category = command.category || "Other";
149
+ if (!byCategory.has(category)) {
150
+ byCategory.set(category, []);
151
+ order.push(category);
152
+ }
153
+ byCategory.get(category).push(command);
154
+ });
155
+ return order.map((category) => {
156
+ return { category, commands: byCategory.get(category) };
157
+ });
158
+ };
159
+ if (!normalizedQuery) {
160
+ // Browsing: "Recent" first (when we have any), then the full catalog.
161
+ if (recentCommandIds.length > 0) {
162
+ const commandById = new Map();
163
+ props.commands.forEach((command) => {
164
+ commandById.set(command.id, command);
165
+ });
166
+ const recentCommands = [];
167
+ recentCommandIds.forEach((commandId) => {
168
+ const command = commandById.get(commandId);
169
+ if (command) {
170
+ recentCommands.push(command);
171
+ }
172
+ });
173
+ if (recentCommands.length > 0) {
174
+ pushSection("recent", "Recent", false, recentCommands
175
+ .slice(0, RECENT_COMMANDS_LIMIT)
176
+ /*
177
+ * Recents repeat commands that also sit in their category
178
+ * section below — prefix the entry id so option test ids and
179
+ * DOM ids stay unique.
180
+ */
181
+ .map((command) => {
182
+ return commandToEntry(command, "recent-");
183
+ }));
184
+ }
185
+ }
186
+ groupByCategory(props.commands).forEach((group) => {
187
+ pushSection(getPaletteSectionId(group.category), group.category, false, group.commands.map((command) => {
188
+ return commandToEntry(command, "");
189
+ }));
190
+ });
191
+ }
192
+ else {
193
+ /*
194
+ * Searching: ranked command matches grouped by category — the ranked
195
+ * order decides both row order within a section and which category
196
+ * surfaces first — then one section per async provider.
197
+ */
198
+ const matches = filterPaletteCommands(props.commands, query);
199
+ groupByCategory(matches.map((match) => {
200
+ return match.command;
201
+ })).forEach((group) => {
202
+ pushSection(getPaletteSectionId(group.category), group.category, false, group.commands.map((command) => {
203
+ return commandToEntry(command, "");
204
+ }));
205
+ });
206
+ providerSections.forEach((providerSection) => {
207
+ // A provider with nothing to show (or that failed) has no section.
208
+ if (!providerSection.isPending &&
209
+ providerSection.results.length === 0) {
210
+ return;
211
+ }
212
+ pushSection(providerSection.provider.id, providerSection.provider.title, providerSection.isPending, providerSection.results.map((result) => {
213
+ return {
214
+ id: `${providerSection.provider.id}-${result.id}`,
215
+ title: result.title,
216
+ description: result.description,
217
+ icon: result.icon,
218
+ iconColor: result.iconColor,
219
+ shortcut: undefined,
220
+ recentCommandId: null,
221
+ onSelect: result.onSelect,
222
+ };
223
+ }));
224
+ });
225
+ }
226
+ // Stamp each entry with its index in the flattened keyboard order.
227
+ let flatIndex = 0;
228
+ built.forEach((section) => {
229
+ section.entries.forEach((entry) => {
230
+ entry.flatIndex = flatIndex;
231
+ flatIndex++;
232
+ });
233
+ });
234
+ return built;
235
+ }, [
236
+ normalizedQuery,
237
+ query,
238
+ props.commands,
239
+ recentCommandIds,
240
+ providerSections,
241
+ ]);
242
+ // Flattened list in render order — the keyboard walks this.
243
+ const flatEntries = useMemo(() => {
244
+ return sections.reduce((accumulator, section) => {
245
+ section.entries.forEach((entry) => {
246
+ accumulator.push(entry);
247
+ });
248
+ return accumulator;
249
+ }, []);
250
+ }, [sections]);
251
+ // A new query snaps the selection back to the best match.
252
+ useEffect(() => {
253
+ setActiveIndex(0);
254
+ }, [query]);
255
+ /*
256
+ * Clamp the selection when async results shrink the list under it. The
257
+ * functional updater matters: on a query change this effect and the reset
258
+ * above run in the same pass, and reading activeIndex from the closure here
259
+ * would clobber the queued reset with a stale clamp.
260
+ */
261
+ useEffect(() => {
262
+ if (flatEntries.length === 0) {
263
+ return;
264
+ }
265
+ setActiveIndex((index) => {
266
+ return index > flatEntries.length - 1 ? flatEntries.length - 1 : index;
267
+ });
268
+ }, [flatEntries.length]);
269
+ // Keep the active row scrolled into view as the selection moves.
270
+ useEffect(() => {
271
+ const row = rowRefs.current[activeIndex] || null;
272
+ if (row && typeof row.scrollIntoView === "function") {
273
+ row.scrollIntoView({ block: "nearest" });
274
+ }
275
+ }, [activeIndex]);
276
+ const runEntry = (entry) => {
277
+ if (entry.recentCommandId && props.recentStorageKey) {
278
+ writeRecentCommandId(props.recentStorageKey, entry.recentCommandId);
279
+ }
280
+ entry.onSelect();
281
+ props.onClose();
282
+ };
283
+ /*
284
+ * One handler on the dialog root: keys fired in the input bubble here, and
285
+ * so do keys fired with focus anywhere else inside the palette. Every
286
+ * handled key calls preventDefault so listeners beneath the palette
287
+ * (page shortcuts, scrolling) can see the key was consumed. Escape goes
288
+ * one step further and also stops propagating: the topmost dialog consumes
289
+ * its dismiss key outright, so document/window Escape listeners underneath
290
+ * (the Ask AI slide-over, page-level shortcuts) never see it at all.
291
+ */
292
+ const handleKeyDown = (event) => {
293
+ if (event.key === "Escape") {
294
+ event.preventDefault();
295
+ event.stopPropagation();
296
+ props.onClose();
297
+ return;
298
+ }
299
+ if (flatEntries.length === 0) {
300
+ return;
301
+ }
302
+ if (event.key === "ArrowDown") {
303
+ event.preventDefault();
304
+ setActiveIndex((index) => {
305
+ return (index + 1) % flatEntries.length;
306
+ });
307
+ }
308
+ else if (event.key === "ArrowUp") {
309
+ event.preventDefault();
310
+ setActiveIndex((index) => {
311
+ return (index - 1 + flatEntries.length) % flatEntries.length;
312
+ });
313
+ }
314
+ else if (event.key === "Home") {
315
+ event.preventDefault();
316
+ setActiveIndex(0);
317
+ }
318
+ else if (event.key === "End") {
319
+ event.preventDefault();
320
+ setActiveIndex(flatEntries.length - 1);
321
+ }
322
+ else if (event.key === "Enter") {
323
+ event.preventDefault();
324
+ const entry = flatEntries[activeIndex];
325
+ if (entry) {
326
+ runEntry(entry);
327
+ }
328
+ }
329
+ };
330
+ /*
331
+ * A mousedown on non-interactive panel chrome (section headers, the hints
332
+ * footer, the empty state) would move focus to the body and kill arrow-key
333
+ * navigation. preventDefault keeps focus in the input. Interactive targets
334
+ * keep their default: the input (caret/selection), option rows, and the
335
+ * scroll container itself — a scrollbar drag starts as a mousedown on it,
336
+ * and preventDefault would cancel the drag.
337
+ */
338
+ const handlePanelMouseDown = (event) => {
339
+ const target = event.target instanceof HTMLElement ? event.target : null;
340
+ if (!target) {
341
+ return;
342
+ }
343
+ if (target.id === "command-palette-listbox") {
344
+ return;
345
+ }
346
+ if (target.closest('input, textarea, select, button, a, [role="option"]')) {
347
+ return;
348
+ }
349
+ event.preventDefault();
350
+ };
351
+ const activeEntry = flatEntries[activeIndex];
352
+ /*
353
+ * Once the panel has settled it carries no transform at all — a lingering
354
+ * scale would make it the containing block for position:fixed descendants
355
+ * (the Modal invariant).
356
+ */
357
+ const panelTransitionClassName = hasEntered
358
+ ? "opacity-100"
359
+ : "scale-[0.98] opacity-0";
360
+ const resultCount = flatEntries.length;
361
+ return (React.createElement("div", { className: "relative z-50", role: "dialog", "aria-modal": "true", "aria-label": tx("Command palette"), "data-testid": "command-palette", onKeyDown: handleKeyDown },
362
+ React.createElement("div", { className: `fixed inset-0 bg-gray-500/25 backdrop-blur-sm transition-opacity duration-150 ease-out motion-reduce:transition-none ${hasEntered ? "opacity-100" : "opacity-0"}`, "data-testid": "command-palette-backdrop", "aria-hidden": "true" }),
363
+ React.createElement("div", { className: "fixed inset-0 z-50 overflow-y-auto", onClick: props.onClose },
364
+ React.createElement("div", { className: "flex min-h-full items-start justify-center p-4 sm:p-6" },
365
+ React.createElement("div", { className: `relative mt-[15vh] flex w-full max-w-xl flex-col overflow-hidden rounded-xl bg-white shadow-2xl ring-1 ring-black/5 transition duration-150 ease-out motion-reduce:transition-none ${panelTransitionClassName}`, "data-testid": "command-palette-panel", onClick: (event) => {
366
+ event.stopPropagation();
367
+ }, onMouseDown: handlePanelMouseDown },
368
+ React.createElement("div", { className: "flex items-center gap-3 border-b border-gray-100 px-4 py-3.5" },
369
+ React.createElement(Icon, { icon: IconProp.Search, className: "h-5 w-5 flex-shrink-0 text-gray-400" }),
370
+ React.createElement("input", { ref: inputRef, "data-testid": "command-palette-input", type: "text", role: "combobox", "aria-expanded": true, "aria-autocomplete": "list", "aria-controls": "command-palette-listbox", "aria-activedescendant": activeEntry
371
+ ? `command-palette-option-${activeEntry.id}`
372
+ : undefined, "aria-label": tx("Search pages, actions…"), autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", spellCheck: false, value: query, onChange: (event) => {
373
+ setQuery(event.target.value);
374
+ }, placeholder: tx("Search pages, actions…"), className: "flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-0" }),
375
+ React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Mod, "K"], size: KeyboardShortcutSize.Small, className: "hidden flex-shrink-0 sm:inline-flex" })),
376
+ React.createElement("p", { "aria-live": "polite", "data-testid": "command-palette-result-count", className: "sr-only" },
377
+ resultCount,
378
+ " ",
379
+ resultCount === 1 ? tx("result") : tx("results")),
380
+ React.createElement("div", { id: "command-palette-listbox", role: "listbox", "aria-label": tx("Commands"), className: "max-h-[55vh] flex-1 overflow-y-auto overscroll-contain p-2" }, flatEntries.length === 0 && !hasPendingSection(sections) ? (React.createElement("div", { "data-testid": "command-palette-empty", className: "flex flex-col items-center justify-center py-14 text-center" },
381
+ React.createElement("div", { className: "mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-gray-50 ring-1 ring-gray-100" },
382
+ React.createElement(Icon, { icon: IconProp.Search, className: "h-4 w-4 text-gray-400" })),
383
+ React.createElement("p", { className: "text-sm font-medium text-gray-900" }, tx("No results found.")),
384
+ query.trim() && (React.createElement("p", { className: "mt-1 text-xs text-gray-500" },
385
+ "\u201C",
386
+ query.trim(),
387
+ "\u201D")))) : (sections.map((section) => {
388
+ return (React.createElement("div", { key: section.id, role: "group", "aria-label": section.title, "data-testid": `command-palette-section-${section.id}`, className: "mb-1 last:mb-0" },
389
+ React.createElement("div", { "aria-hidden": "true", className: "flex items-center gap-2 px-3 pb-1 pt-2.5" },
390
+ React.createElement("h3", { className: "text-xs font-semibold uppercase tracking-wider text-gray-400" }, section.title),
391
+ section.isPending && (React.createElement("span", { "data-testid": `command-palette-section-pending-${section.id}`, className: "animate-pulse text-[10px] font-normal normal-case tracking-normal text-gray-400" }, tx("Searching…")))),
392
+ section.entries.map((entry) => {
393
+ return (React.createElement(PaletteRow, { key: entry.id, item: {
394
+ id: entry.id,
395
+ title: entry.title,
396
+ description: entry.description,
397
+ icon: entry.icon,
398
+ iconColor: entry.iconColor,
399
+ shortcut: entry.shortcut,
400
+ }, query: query, isActive: entry.flatIndex === activeIndex, onActivate: () => {
401
+ setActiveIndex(entry.flatIndex);
402
+ }, onSelect: () => {
403
+ runEntry(entry);
404
+ }, setRowElement: (element) => {
405
+ rowRefs.current[entry.flatIndex] = element;
406
+ } }));
407
+ })));
408
+ }))),
409
+ React.createElement("div", { "data-testid": "command-palette-footer", className: "flex items-center gap-4 border-t border-gray-100 px-4 py-2" },
410
+ React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
411
+ React.createElement(KeyboardShortcut, { keys: [KeyboardKey.ArrowUp, KeyboardKey.ArrowDown], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
412
+ tx("to navigate")),
413
+ React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
414
+ React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Enter], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
415
+ tx("to select")),
416
+ React.createElement("span", { className: "flex items-center gap-1.5 text-[11px] text-gray-400" },
417
+ React.createElement(KeyboardShortcut, { keys: [KeyboardKey.Escape], size: KeyboardShortcutSize.ExtraSmall, variant: KeyboardShortcutVariant.Ghost }),
418
+ tx("to close"))))))));
419
+ };
420
+ /**
421
+ * Generic Linear-style command palette. Knows nothing about routes or models:
422
+ * callers pass a static command catalog (grouped by `category`), optional
423
+ * async search providers for entity results, and control open state.
424
+ *
425
+ * Portals to document.body at the modal z-tier (z-50).
426
+ */
427
+ const CommandPalette = (props) => {
428
+ /*
429
+ * No hooks in this component on purpose: the early return below would
430
+ * otherwise change hook order between renders. The panel handles all state
431
+ * and mounts fresh on every open.
432
+ */
433
+ if (!props.isOpen) {
434
+ return React.createElement(React.Fragment, null);
435
+ }
436
+ return createPortal(React.createElement(CommandPalettePanel, { commands: props.commands, searchProviders: props.searchProviders || EMPTY_PROVIDERS, onClose: props.onClose, recentStorageKey: props.recentStorageKey }), document.body);
437
+ };
438
+ export default CommandPalette;
439
+ //# sourceMappingURL=CommandPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../../../../UI/Components/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /*
2
+ * Pure, React-free filtering and ranking for the command palette. Kept out of
3
+ * the component so the ranking contract can be unit-tested directly and reused
4
+ * by anything that needs "which commands match this text, best first".
5
+ */
6
+ /**
7
+ * How a command matched the query, best match first. The palette sorts by
8
+ * this tier and keeps the caller's original order within a tier, so two
9
+ * commands whose titles both start with the query stay in catalog order.
10
+ */
11
+ export var PaletteMatchRank;
12
+ (function (PaletteMatchRank) {
13
+ PaletteMatchRank[PaletteMatchRank["TitlePrefix"] = 0] = "TitlePrefix";
14
+ PaletteMatchRank[PaletteMatchRank["TitleSubstring"] = 1] = "TitleSubstring";
15
+ PaletteMatchRank[PaletteMatchRank["Keyword"] = 2] = "Keyword";
16
+ PaletteMatchRank[PaletteMatchRank["Category"] = 3] = "Category";
17
+ /** Query characters appear in order in the title, but not adjacently. */
18
+ PaletteMatchRank[PaletteMatchRank["TitleSubsequence"] = 4] = "TitleSubsequence";
19
+ })(PaletteMatchRank || (PaletteMatchRank = {}));
20
+ export const normalizePaletteQuery = (query) => {
21
+ return query.trim().toLowerCase();
22
+ };
23
+ /**
24
+ * True when every character of `needle` appears in `haystack` in order (not
25
+ * necessarily adjacent) — the "mntr" finds "Monitors" fallback. Both inputs
26
+ * are expected to be lowercased already.
27
+ */
28
+ export const isSubsequenceMatch = (needle, haystack) => {
29
+ if (needle.length === 0) {
30
+ return true;
31
+ }
32
+ let needleIndex = 0;
33
+ for (let haystackIndex = 0; haystackIndex < haystack.length && needleIndex < needle.length; haystackIndex++) {
34
+ if (haystack[haystackIndex] === needle[needleIndex]) {
35
+ needleIndex++;
36
+ }
37
+ }
38
+ return needleIndex === needle.length;
39
+ };
40
+ /**
41
+ * Rank one command against an already-normalized query, or null when it does
42
+ * not match at all.
43
+ */
44
+ export const rankPaletteCommand = (command, normalizedQuery) => {
45
+ const title = command.title.toLowerCase();
46
+ if (title.startsWith(normalizedQuery)) {
47
+ return PaletteMatchRank.TitlePrefix;
48
+ }
49
+ if (title.includes(normalizedQuery)) {
50
+ return PaletteMatchRank.TitleSubstring;
51
+ }
52
+ const keywordMatches = (command.keywords || []).some((keyword) => {
53
+ return keyword.toLowerCase().includes(normalizedQuery);
54
+ });
55
+ if (keywordMatches) {
56
+ return PaletteMatchRank.Keyword;
57
+ }
58
+ if (command.category.toLowerCase().includes(normalizedQuery)) {
59
+ return PaletteMatchRank.Category;
60
+ }
61
+ if (isSubsequenceMatch(normalizedQuery, title)) {
62
+ return PaletteMatchRank.TitleSubsequence;
63
+ }
64
+ return null;
65
+ };
66
+ /**
67
+ * Filter commands against free text and return them best-match-first:
68
+ * title-prefix > title-substring > keyword > category > title-subsequence.
69
+ * The sort is stable — within a tier the caller's order is preserved. An
70
+ * empty/whitespace query matches everything in the original order.
71
+ */
72
+ export const filterPaletteCommands = (commands, query) => {
73
+ const normalizedQuery = normalizePaletteQuery(query);
74
+ if (!normalizedQuery) {
75
+ return commands.map((command) => {
76
+ return { command, rank: PaletteMatchRank.TitlePrefix };
77
+ });
78
+ }
79
+ const matches = [];
80
+ commands.forEach((command) => {
81
+ const rank = rankPaletteCommand(command, normalizedQuery);
82
+ if (rank !== null) {
83
+ matches.push({ command, rank });
84
+ }
85
+ });
86
+ // Array.prototype.sort is stable, so equal ranks keep catalog order.
87
+ return matches.sort((a, b) => {
88
+ return a.rank - b.rank;
89
+ });
90
+ };
91
+ /**
92
+ * Split text into segments for <mark> highlighting: every case-insensitive
93
+ * occurrence of the query becomes a match segment. Subsequence-only matches
94
+ * produce no highlight (per-character marks read as noise).
95
+ */
96
+ export const getHighlightSegments = (text, query) => {
97
+ const needle = normalizePaletteQuery(query);
98
+ if (!needle) {
99
+ return [{ text, isMatch: false }];
100
+ }
101
+ const haystack = text.toLowerCase();
102
+ const segments = [];
103
+ let cursor = 0;
104
+ let matchAt = haystack.indexOf(needle);
105
+ while (matchAt !== -1) {
106
+ if (matchAt > cursor) {
107
+ segments.push({ text: text.slice(cursor, matchAt), isMatch: false });
108
+ }
109
+ segments.push({
110
+ text: text.slice(matchAt, matchAt + needle.length),
111
+ isMatch: true,
112
+ });
113
+ cursor = matchAt + needle.length;
114
+ matchAt = haystack.indexOf(needle, cursor);
115
+ }
116
+ if (cursor < text.length) {
117
+ segments.push({ text: text.slice(cursor), isMatch: false });
118
+ }
119
+ if (segments.length === 0) {
120
+ return [{ text, isMatch: false }];
121
+ }
122
+ return segments;
123
+ };
124
+ /**
125
+ * Stable slug for section test ids: "Analytics & Automation" →
126
+ * "analytics-automation". Search-provider sections use the provider's own id
127
+ * instead of this.
128
+ */
129
+ export const getPaletteSectionId = (title) => {
130
+ return title
131
+ .toLowerCase()
132
+ .replace(/[^a-z0-9]+/g, "-")
133
+ .replace(/^-+|-+$/g, "");
134
+ };
135
+ //# sourceMappingURL=PaletteFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteFilter.js","sourceRoot":"","sources":["../../../../../UI/Components/CommandPalette/PaletteFilter.ts"],"names":[],"mappings":"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"}