@oneuptime/common 14.0.0 → 14.0.2

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 (1270) hide show
  1. package/Models/DatabaseModels/AlertEpisodeMember.ts +8 -1
  2. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
  3. package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
  4. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
  5. package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
  6. package/Models/DatabaseModels/Index.ts +4 -0
  7. package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
  8. package/Models/DatabaseModels/Monitor.ts +48 -0
  9. package/Models/DatabaseModels/Runner.ts +5 -4
  10. package/Models/DatabaseModels/RunnerJob.ts +66 -0
  11. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
  12. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  13. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  14. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  15. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  16. package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
  17. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
  18. package/Server/API/AIInvestigationAPI.ts +341 -0
  19. package/Server/API/AutoRemediationAPI.ts +184 -2
  20. package/Server/API/CommonAPI.ts +70 -0
  21. package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
  22. package/Server/API/MicrosoftTeamsAPI.ts +770 -315
  23. package/Server/API/MonitorAPI.ts +140 -0
  24. package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
  25. package/Server/API/SlackAPI.ts +447 -99
  26. package/Server/API/StatusPageAPI.ts +146 -26
  27. package/Server/API/TelemetryAPI.ts +216 -5
  28. package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
  29. package/Server/API/WorkflowVariableAPI.ts +156 -0
  30. package/Server/Infrastructure/GlobalCache.ts +35 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  39. package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
  40. package/Server/Middleware/TelemetryIngest.ts +47 -2
  41. package/Server/Middleware/UserAuthorization.ts +56 -2
  42. package/Server/Services/AIAgentService.ts +1 -0
  43. package/Server/Services/AccessTokenService.ts +121 -48
  44. package/Server/Services/AlertEpisodeMemberService.ts +9 -0
  45. package/Server/Services/AlertEpisodeService.ts +14 -1
  46. package/Server/Services/AlertService.ts +134 -22
  47. package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
  48. package/Server/Services/AutoRemediationRuleService.ts +118 -0
  49. package/Server/Services/BillingService.ts +1 -0
  50. package/Server/Services/DatabaseService.ts +10 -0
  51. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
  52. package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
  53. package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
  54. package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
  55. package/Server/Services/IncidentEpisodeService.ts +14 -1
  56. package/Server/Services/IncidentGroupingEngineService.ts +11 -0
  57. package/Server/Services/IncidentMemberService.ts +21 -0
  58. package/Server/Services/IncidentPublicNoteService.ts +63 -0
  59. package/Server/Services/IncidentService.ts +120 -20
  60. package/Server/Services/IncidentStateTimelineService.ts +15 -0
  61. package/Server/Services/IncidentTemplateService.ts +83 -3
  62. package/Server/Services/Index.ts +4 -0
  63. package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
  64. package/Server/Services/KubernetesClusterService.ts +1570 -1
  65. package/Server/Services/LogAggregationService.ts +14 -6
  66. package/Server/Services/MonitorService.ts +654 -54
  67. package/Server/Services/MonitorStatusTimelineService.ts +639 -2
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
  71. package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
  72. package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
  73. package/Server/Services/OnCallSetupReminderService.ts +1 -0
  74. package/Server/Services/ProbeService.ts +7 -1
  75. package/Server/Services/ProjectService.ts +11 -1
  76. package/Server/Services/RunbookCredentialService.ts +26 -1
  77. package/Server/Services/RunbookSecretService.ts +36 -0
  78. package/Server/Services/RunnerJobService.ts +941 -23
  79. package/Server/Services/RunnerService.ts +439 -6
  80. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
  81. package/Server/Services/ScheduledMaintenanceService.ts +124 -19
  82. package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
  83. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  84. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  85. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  86. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  87. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  88. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  89. package/Server/Services/ServiceLevelObjectiveService.ts +42 -1
  90. package/Server/Services/StatusPagePrivateUserService.ts +1 -0
  91. package/Server/Services/StatusPageService.ts +301 -74
  92. package/Server/Services/StatusPageSubscriberService.ts +4 -0
  93. package/Server/Services/TeamMemberService.ts +309 -7
  94. package/Server/Services/TraceAggregationService.ts +10 -6
  95. package/Server/Services/UserEmailService.ts +1 -0
  96. package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
  97. package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
  98. package/Server/Services/UserNotificationRuleService.ts +4 -0
  99. package/Server/Services/UserService.ts +122 -1
  100. package/Server/Services/WorkflowVariableService.ts +593 -8
  101. package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
  102. package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
  103. package/Server/Types/Database/QueryHelper.ts +22 -0
  104. package/Server/Types/Markdown.ts +502 -27
  105. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  106. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
  107. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
  108. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
  109. package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
  110. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
  111. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
  112. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
  113. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
  114. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
  115. package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
  116. package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
  117. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  118. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
  119. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
  120. package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
  121. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
  122. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
  123. package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
  124. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  125. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  126. package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
  127. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
  128. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
  129. package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
  130. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
  131. package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
  132. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  133. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
  134. package/Server/Utils/PushNotificationUtil.ts +45 -0
  135. package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
  136. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  137. package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
  138. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
  139. package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
  140. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  141. package/Server/Utils/StartServer.ts +4 -3
  142. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
  143. package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
  144. package/Server/Utils/UserPermission/UserPermission.ts +16 -0
  145. package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
  146. package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
  147. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
  148. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
  149. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
  150. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
  151. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
  152. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
  153. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
  154. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
  155. package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
  156. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
  157. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
  158. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
  159. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
  160. package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
  161. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
  162. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
  163. package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
  164. package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
  165. package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
  166. package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  167. package/Server/Utils/Workspace/Workspace.ts +171 -54
  168. package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
  169. package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
  170. package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
  171. package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
  172. package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
  173. package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
  174. package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
  175. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
  176. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
  177. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
  178. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
  179. package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
  180. package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
  181. package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
  182. package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
  183. package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
  184. package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
  185. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +218 -0
  186. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  187. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  188. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  189. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
  190. package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
  191. package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
  192. package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
  193. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
  194. package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
  195. package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
  196. package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
  197. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  198. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +606 -3
  199. package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
  200. package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
  201. package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
  202. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
  203. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
  204. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
  205. package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
  206. package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
  207. package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
  208. package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
  209. package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
  210. package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
  211. package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
  212. package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
  213. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
  214. package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
  215. package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
  216. package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
  217. package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
  218. package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
  219. package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
  220. package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
  221. package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
  222. package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
  223. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
  224. package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
  225. package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
  226. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
  227. package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
  228. package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
  229. package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
  230. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
  231. package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
  232. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  233. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
  234. package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
  235. package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
  236. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
  237. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  238. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  239. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  240. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
  241. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
  242. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
  243. package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
  244. package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
  245. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  246. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
  247. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
  248. package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
  249. package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
  250. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
  251. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
  252. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
  253. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
  254. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
  255. package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
  256. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
  257. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
  258. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
  259. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  260. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  261. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  262. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  263. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  264. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  265. package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
  266. package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
  267. package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
  268. package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
  269. package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
  270. package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
  271. package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
  272. package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
  273. package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
  274. package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
  275. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
  276. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
  277. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
  278. package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
  279. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
  280. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
  281. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
  282. package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
  283. package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
  284. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  285. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  286. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  287. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  288. package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
  289. package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
  290. package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
  291. package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
  292. package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
  293. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
  294. package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
  295. package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
  296. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
  297. package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
  298. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
  299. package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
  300. package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
  301. package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
  302. package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
  303. package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
  304. package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
  305. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
  306. package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
  307. package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
  308. package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
  309. package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
  310. package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
  311. package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
  312. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  313. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
  314. package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
  315. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  316. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  317. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  318. package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
  319. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
  320. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
  321. package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
  322. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
  323. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
  324. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
  325. package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
  326. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
  327. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
  328. package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
  329. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
  330. package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
  331. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
  332. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
  333. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
  334. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  335. package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
  336. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
  337. package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
  338. package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
  339. package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
  340. package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
  341. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
  342. package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
  343. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
  344. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
  345. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
  346. package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
  347. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
  348. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
  349. package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
  350. package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
  351. package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
  352. package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
  353. package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
  354. package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
  355. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
  356. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
  357. package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
  358. package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
  359. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
  360. package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
  361. package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
  362. package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
  363. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
  364. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  365. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
  366. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +39 -1
  367. package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
  368. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
  369. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
  370. package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
  371. package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
  372. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
  373. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
  374. package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
  375. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
  376. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1175 -0
  377. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  378. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  379. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  380. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  381. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  382. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +174 -0
  383. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  384. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
  385. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
  386. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
  387. package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
  388. package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
  389. package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
  390. package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
  391. package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
  392. package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
  393. package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
  394. package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
  395. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
  396. package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
  397. package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
  398. package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
  399. package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
  400. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  401. package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
  402. package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
  403. package/Tests/Server/Types/Markdown.test.ts +1035 -1
  404. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  405. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  406. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
  407. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
  408. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
  409. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
  410. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
  411. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
  412. package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
  413. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
  414. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
  415. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
  416. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
  417. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
  418. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
  419. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
  420. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
  421. package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
  422. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  423. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
  424. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
  425. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
  426. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
  427. package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
  428. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
  429. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  430. package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
  431. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
  432. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
  433. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1156 -0
  434. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  435. package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
  436. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
  437. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
  438. package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
  439. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  440. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
  441. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
  442. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
  443. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  444. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  445. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
  446. package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
  447. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  448. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
  449. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  450. package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
  451. package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
  452. package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
  453. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
  454. package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
  455. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
  456. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
  457. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
  458. package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
  459. package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
  460. package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
  461. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
  462. package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
  463. package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
  464. package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
  465. package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
  466. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
  467. package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
  468. package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
  469. package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
  470. package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
  471. package/Tests/Types/API/Route.test.ts +56 -0
  472. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  473. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
  474. package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
  475. package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
  476. package/Tests/Types/DateUserTimezone.test.ts +177 -4
  477. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
  478. package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
  479. package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
  480. package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
  481. package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
  482. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
  483. package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
  484. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
  485. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
  486. package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
  487. package/Tests/Types/Timezone.test.ts +5 -0
  488. package/Tests/Types/TimezoneAlias.test.ts +1034 -0
  489. package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
  490. package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
  491. package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
  492. package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
  493. package/Tests/Types/Workflow/Templates.test.ts +79 -4
  494. package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
  495. package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
  496. package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
  497. package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
  498. package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
  499. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
  500. package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
  501. package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
  502. package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
  503. package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
  504. package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
  505. package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
  506. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
  507. package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
  508. package/Tests/UI/Components/Dropdown.test.tsx +999 -2
  509. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  510. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  511. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
  512. package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
  513. package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
  514. package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
  515. package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
  516. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
  517. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
  518. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
  519. package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
  520. package/Tests/UI/Components/Icon.test.tsx +26 -0
  521. package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
  522. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
  523. package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
  524. package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
  525. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
  526. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
  527. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
  528. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  529. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
  530. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
  531. package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
  532. package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
  533. package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
  534. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  535. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  536. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
  537. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
  538. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
  539. package/Tests/UI/Utils/Timezone.test.ts +747 -33
  540. package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
  541. package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
  542. package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
  543. package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
  544. package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
  545. package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
  546. package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
  547. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
  548. package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
  549. package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
  550. package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
  551. package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
  552. package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
  553. package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
  554. package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
  555. package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
  556. package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
  557. package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
  558. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
  559. package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
  560. package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
  561. package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
  562. package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
  563. package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
  564. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
  565. package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
  566. package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
  567. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  568. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
  569. package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
  570. package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
  571. package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
  572. package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
  573. package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
  574. package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
  575. package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
  576. package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
  577. package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
  578. package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
  579. package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
  580. package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
  581. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  582. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  583. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  584. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  585. package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
  586. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
  587. package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
  588. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
  589. package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
  590. package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
  591. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
  592. package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
  593. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
  594. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
  595. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
  596. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
  597. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
  598. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
  599. package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
  600. package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
  601. package/Types/API/Route.ts +19 -2
  602. package/Types/API/URL.ts +26 -2
  603. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
  604. package/Types/Date.ts +121 -7
  605. package/Types/Email/EmailMessage.ts +8 -0
  606. package/Types/Email/EmailTemplateType.ts +1 -0
  607. package/Types/Exception/ExceptionMessages.ts +1 -0
  608. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
  609. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
  610. package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
  611. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
  612. package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
  613. package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
  614. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  615. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  616. package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
  617. package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
  618. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
  619. package/Types/Permission.ts +90 -0
  620. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  621. package/Types/Rules/RuleRun.ts +4 -0
  622. package/Types/Rum/SessionReplay.ts +55 -2
  623. package/Types/Rum/SessionReplayApi.ts +44 -1
  624. package/Types/Rum/UserFlow.ts +187 -0
  625. package/Types/Runbook/RunbookStepType.ts +10 -0
  626. package/Types/Runbook/RunnerJobOrigin.ts +15 -0
  627. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
  628. package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
  629. package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
  630. package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
  631. package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
  632. package/Types/Timezone.ts +5 -0
  633. package/Types/TimezoneAlias.ts +385 -0
  634. package/Types/Workflow/Templates.ts +3041 -2
  635. package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
  636. package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
  637. package/Typings/Index.d.ts +24 -0
  638. package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
  639. package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
  640. package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
  641. package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
  642. package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
  643. package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
  644. package/UI/Components/Calendar/Calendar.css +83 -0
  645. package/UI/Components/Calendar/Calendar.tsx +136 -7
  646. package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
  647. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
  648. package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
  649. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
  650. package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
  651. package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
  652. package/UI/Components/Dropdown/Dropdown.tsx +58 -9
  653. package/UI/Components/Feed/FeedOptions.ts +427 -0
  654. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  655. package/UI/Components/Feed/useFeedItems.ts +28 -9
  656. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  657. package/UI/Components/Forms/Fields/FormField.tsx +49 -14
  658. package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
  659. package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
  660. package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
  661. package/UI/Components/Icon/Icon.tsx +1 -1
  662. package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
  663. package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
  664. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
  665. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
  666. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
  667. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
  668. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
  669. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
  670. package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
  671. package/UI/Components/ModelTable/BaseModelTable.tsx +66 -14
  672. package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
  673. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
  674. package/UI/Components/Page/ModelPage.tsx +59 -3
  675. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
  676. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
  677. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
  678. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
  679. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
  680. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
  681. package/UI/Utils/Timezone.ts +69 -28
  682. package/Utils/AI/InvestigationReport.ts +195 -25
  683. package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
  684. package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
  685. package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
  686. package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
  687. package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
  688. package/Utils/LabelRuleImportExport.ts +27 -9
  689. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
  690. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  691. package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
  692. package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
  693. package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
  694. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
  695. package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
  696. package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
  697. package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
  698. package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
  699. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  700. package/Utils/Rum/SessionIdentity.ts +44 -0
  701. package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
  702. package/Utils/Rum/UserFlow.ts +1527 -0
  703. package/Utils/Slo/SloDuration.ts +22 -6
  704. package/Utils/Slo/SloHealth.ts +8 -7
  705. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  706. package/Utils/Slo/SloOverviewText.ts +33 -0
  707. package/Utils/Slo/SloProjection.ts +4 -3
  708. package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
  709. package/Utils/StatusPage/ResourceUptime.ts +99 -0
  710. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
  711. package/Utils/Telemetry/AttributesJSON.ts +367 -0
  712. package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
  713. package/Utils/Uptime/UptimeUtil.ts +122 -38
  714. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
  715. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  716. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  717. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  718. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
  719. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  720. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
  721. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  722. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
  723. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  724. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  725. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  726. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
  727. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  728. package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
  729. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  730. package/build/dist/Models/DatabaseModels/Runner.js +4 -4
  731. package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
  732. package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
  733. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  734. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
  735. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  736. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  737. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  738. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  739. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  740. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  741. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  742. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  743. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  744. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
  745. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  746. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
  747. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  748. package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
  749. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  750. package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
  751. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  752. package/build/dist/Server/API/CommonAPI.js +49 -0
  753. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  754. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
  755. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
  756. package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
  757. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  758. package/build/dist/Server/API/MonitorAPI.js +107 -1
  759. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  760. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
  761. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
  762. package/build/dist/Server/API/SlackAPI.js +322 -78
  763. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  764. package/build/dist/Server/API/StatusPageAPI.js +123 -17
  765. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  766. package/build/dist/Server/API/TelemetryAPI.js +144 -5
  767. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  768. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
  769. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
  770. package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
  771. package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
  772. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  773. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  774. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  775. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  776. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  777. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  778. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
  779. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
  780. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
  781. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
  782. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
  783. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
  784. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
  785. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
  786. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
  787. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
  788. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  789. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  790. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
  791. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  792. package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
  793. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  794. package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
  795. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  796. package/build/dist/Server/Services/AIAgentService.js +1 -0
  797. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  798. package/build/dist/Server/Services/AccessTokenService.js +87 -42
  799. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  800. package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
  801. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
  802. package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
  803. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  804. package/build/dist/Server/Services/AlertService.js +110 -23
  805. package/build/dist/Server/Services/AlertService.js.map +1 -1
  806. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
  807. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  808. package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
  809. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  810. package/build/dist/Server/Services/BillingService.js +1 -0
  811. package/build/dist/Server/Services/BillingService.js.map +1 -1
  812. package/build/dist/Server/Services/DatabaseService.js +7 -0
  813. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  814. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
  815. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  816. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
  817. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  818. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
  819. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  820. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
  821. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
  822. package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
  823. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  824. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
  825. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  826. package/build/dist/Server/Services/IncidentMemberService.js +14 -0
  827. package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
  828. package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
  829. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  830. package/build/dist/Server/Services/IncidentService.js +99 -21
  831. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  832. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  833. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  834. package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
  835. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  836. package/build/dist/Server/Services/Index.js +4 -0
  837. package/build/dist/Server/Services/Index.js.map +1 -1
  838. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
  839. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
  840. package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
  841. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  842. package/build/dist/Server/Services/LogAggregationService.js +14 -6
  843. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  844. package/build/dist/Server/Services/MonitorService.js +490 -50
  845. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  846. package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
  847. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  848. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
  849. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  850. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
  851. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  852. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
  853. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  854. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
  855. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  856. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
  857. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
  858. package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
  859. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
  860. package/build/dist/Server/Services/ProbeService.js +7 -1
  861. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  862. package/build/dist/Server/Services/ProjectService.js +11 -1
  863. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  864. package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
  865. package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
  866. package/build/dist/Server/Services/RunbookSecretService.js +44 -0
  867. package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
  868. package/build/dist/Server/Services/RunnerJobService.js +641 -21
  869. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  870. package/build/dist/Server/Services/RunnerService.js +344 -5
  871. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  872. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
  873. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  874. package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
  875. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  876. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
  877. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  878. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  879. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  880. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  881. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  882. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  883. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  884. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  885. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  886. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  887. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  888. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  889. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  890. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
  891. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  892. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
  893. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  894. package/build/dist/Server/Services/StatusPageService.js +230 -32
  895. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  896. package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
  897. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  898. package/build/dist/Server/Services/TeamMemberService.js +270 -11
  899. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  900. package/build/dist/Server/Services/TraceAggregationService.js +10 -6
  901. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  902. package/build/dist/Server/Services/UserEmailService.js +1 -0
  903. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  904. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
  905. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
  906. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
  907. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
  908. package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
  909. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  910. package/build/dist/Server/Services/UserService.js +107 -1
  911. package/build/dist/Server/Services/UserService.js.map +1 -1
  912. package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
  913. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  914. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
  915. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  916. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
  917. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  918. package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
  919. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  920. package/build/dist/Server/Types/Markdown.js +394 -27
  921. package/build/dist/Server/Types/Markdown.js.map +1 -1
  922. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  923. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  924. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
  925. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
  926. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
  927. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
  928. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
  929. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
  930. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
  931. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
  932. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
  933. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  934. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
  935. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  936. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
  937. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  938. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
  939. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  940. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
  941. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  942. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
  943. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  944. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
  945. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  946. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  947. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  948. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
  949. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  950. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
  951. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  952. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
  953. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
  954. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
  955. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  956. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
  957. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  958. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
  959. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
  960. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  961. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  962. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
  963. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  964. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
  965. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  966. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
  967. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  968. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
  969. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  970. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
  971. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  972. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
  973. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
  974. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  975. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  976. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
  977. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
  978. package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
  979. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  980. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
  981. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  982. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  983. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  984. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
  985. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
  986. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
  987. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  988. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
  989. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
  990. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  991. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  992. package/build/dist/Server/Utils/StartServer.js +4 -3
  993. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  994. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
  995. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
  996. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
  997. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
  998. package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
  999. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  1000. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
  1001. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
  1002. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
  1003. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
  1004. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
  1005. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  1006. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
  1007. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  1008. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
  1009. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  1010. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
  1011. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  1012. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
  1013. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
  1014. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
  1015. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  1016. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
  1017. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  1018. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
  1019. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
  1020. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
  1021. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
  1022. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
  1023. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  1024. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
  1025. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  1026. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
  1027. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  1028. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
  1029. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  1030. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
  1031. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
  1032. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
  1033. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  1034. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
  1035. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  1036. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
  1037. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
  1038. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
  1039. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
  1040. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
  1041. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  1042. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  1043. package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
  1044. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  1045. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
  1046. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
  1047. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
  1048. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  1049. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
  1050. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
  1051. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
  1052. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
  1053. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
  1054. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
  1055. package/build/dist/Types/API/Route.js +18 -2
  1056. package/build/dist/Types/API/Route.js.map +1 -1
  1057. package/build/dist/Types/API/URL.js +23 -2
  1058. package/build/dist/Types/API/URL.js.map +1 -1
  1059. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
  1060. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  1061. package/build/dist/Types/Date.js +97 -7
  1062. package/build/dist/Types/Date.js.map +1 -1
  1063. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  1064. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1065. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  1066. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  1067. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
  1068. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
  1069. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
  1070. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
  1071. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
  1072. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
  1073. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
  1074. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
  1075. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
  1076. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  1077. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
  1078. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
  1079. package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
  1080. package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
  1081. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
  1082. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  1083. package/build/dist/Types/Permission.js +84 -0
  1084. package/build/dist/Types/Permission.js.map +1 -1
  1085. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  1086. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1087. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1088. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1089. package/build/dist/Types/Rum/SessionReplay.js +52 -2
  1090. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  1091. package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
  1092. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  1093. package/build/dist/Types/Rum/UserFlow.js +115 -0
  1094. package/build/dist/Types/Rum/UserFlow.js.map +1 -0
  1095. package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
  1096. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  1097. package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
  1098. package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
  1099. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
  1100. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  1101. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
  1102. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
  1103. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
  1104. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
  1105. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
  1106. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  1107. package/build/dist/Types/Timezone.js +5 -0
  1108. package/build/dist/Types/Timezone.js.map +1 -1
  1109. package/build/dist/Types/TimezoneAlias.js +340 -0
  1110. package/build/dist/Types/TimezoneAlias.js.map +1 -0
  1111. package/build/dist/Types/Workflow/Templates.js +2694 -2
  1112. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  1113. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
  1114. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
  1115. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
  1116. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
  1117. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
  1118. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
  1119. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
  1120. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
  1121. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
  1122. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
  1123. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
  1124. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
  1125. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
  1126. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
  1127. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
  1128. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
  1129. package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
  1130. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  1131. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
  1132. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
  1133. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
  1134. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1135. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
  1136. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
  1137. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
  1138. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
  1139. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
  1140. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
  1141. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
  1142. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
  1143. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
  1144. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  1145. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  1146. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  1147. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  1148. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  1149. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  1150. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  1151. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  1152. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  1153. package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
  1154. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1155. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
  1156. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  1157. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
  1158. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  1159. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
  1160. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  1161. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1162. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
  1163. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1164. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
  1165. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
  1166. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
  1167. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  1168. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
  1169. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  1170. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  1171. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1172. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
  1173. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  1174. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
  1175. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  1176. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
  1177. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  1178. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
  1179. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
  1180. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -8
  1181. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1182. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
  1183. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  1184. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
  1185. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  1186. package/build/dist/UI/Components/Page/ModelPage.js +37 -3
  1187. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  1188. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
  1189. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1190. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
  1191. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  1192. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  1193. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1194. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
  1195. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  1196. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
  1197. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  1198. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
  1199. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
  1200. package/build/dist/UI/Utils/Timezone.js +52 -17
  1201. package/build/dist/UI/Utils/Timezone.js.map +1 -1
  1202. package/build/dist/Utils/AI/InvestigationReport.js +116 -21
  1203. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1204. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
  1205. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
  1206. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
  1207. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
  1208. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
  1209. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
  1210. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
  1211. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
  1212. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
  1213. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
  1214. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  1215. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  1216. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
  1217. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
  1218. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  1219. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
  1220. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
  1221. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
  1222. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
  1223. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
  1224. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
  1225. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
  1226. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
  1227. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
  1228. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
  1229. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
  1230. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
  1231. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
  1232. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
  1233. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
  1234. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
  1235. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  1236. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  1237. package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
  1238. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  1239. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
  1240. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
  1241. package/build/dist/Utils/Rum/UserFlow.js +941 -0
  1242. package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
  1243. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  1244. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  1245. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  1246. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1247. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  1248. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  1249. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  1250. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  1251. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  1252. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
  1253. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
  1254. package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
  1255. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  1256. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  1257. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
  1258. package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
  1259. package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
  1260. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
  1261. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
  1262. package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
  1263. package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
  1264. package/jest.config.json +2 -1
  1265. package/package.json +2 -1
  1266. package/tsconfig.tests.json +36 -0
  1267. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
  1268. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
  1269. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
  1270. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
@@ -0,0 +1,1630 @@
1
+ import "@testing-library/jest-dom";
2
+ import { act, cleanup, render, screen } from "@testing-library/react";
3
+ import React, { ReactElement, useState } from "react";
4
+ import {
5
+ afterEach,
6
+ beforeEach,
7
+ describe,
8
+ expect,
9
+ jest,
10
+ test,
11
+ } from "@jest/globals";
12
+
13
+ /*
14
+ * The three modals a workflow variable's own page opens.
15
+ *
16
+ * They used to live inside the variables table as row actions - "Update
17
+ * Content" on a static variable, "Update Credentials" on an OAuth 2.0 one, and
18
+ * the result of fetching a token. The list is now just a list with a View
19
+ * button, and the variable page mounts these as components of their own. The
20
+ * behaviour the table tests pinned down still matters, so it is pinned down
21
+ * here against the components themselves:
22
+ *
23
+ * - content, a client secret and a refresh token are write-only, so these
24
+ * forms prefill nothing and never fetch;
25
+ * - a failed write stays on screen, with the reason and with what the user
26
+ * typed, instead of looking like a save that worked;
27
+ * - only what was typed is written, and only to the variable that was open;
28
+ * - the token result names what was saved and passes on why a fetch failed,
29
+ * worded the same whoever turned it down - never as the identity provider
30
+ * saying no.
31
+ *
32
+ * BasicFormModal and ConfirmModal are replaced by prop recorders: what is under
33
+ * test is what each modal hands them and what it does when their callbacks
34
+ * fire.
35
+ */
36
+
37
+ const updateById: ReturnType<
38
+ typeof jest.fn<(data: unknown) => Promise<unknown>>
39
+ > = jest.fn<(data: unknown) => Promise<unknown>>();
40
+
41
+ // Anything that reads a variable back. None of these modals may call it.
42
+ const getItem: ReturnType<typeof jest.fn<(data: unknown) => Promise<unknown>>> =
43
+ jest.fn<(data: unknown) => Promise<unknown>>();
44
+
45
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
46
+ return {
47
+ __esModule: true,
48
+ default: {
49
+ updateById: (data: unknown): Promise<unknown> => {
50
+ return updateById(data);
51
+ },
52
+ getItem: (data: unknown): Promise<unknown> => {
53
+ return getItem(data);
54
+ },
55
+ getCommonHeaders: (): Record<string, string> => {
56
+ return { tenantid: "project-header" };
57
+ },
58
+ },
59
+ };
60
+ });
61
+
62
+ const apiPost: ReturnType<typeof jest.fn<(data: unknown) => Promise<unknown>>> =
63
+ jest.fn<(data: unknown) => Promise<unknown>>();
64
+
65
+ jest.mock("../../../UI/Utils/API/API", () => {
66
+ return {
67
+ __esModule: true,
68
+ default: {
69
+ post: (data: unknown): Promise<unknown> => {
70
+ return apiPost(data);
71
+ },
72
+ getFriendlyMessage: (error: unknown): string => {
73
+ return error instanceof Error ? error.message : "Request failed.";
74
+ },
75
+ },
76
+ };
77
+ });
78
+
79
+ type FormFieldEntry = {
80
+ field?: Record<string, unknown> | undefined;
81
+ title?: string | undefined;
82
+ description?: string | undefined;
83
+ fieldType?: string | undefined;
84
+ required?: boolean | undefined;
85
+ placeholder?: string | undefined;
86
+ disableSpellCheck?: boolean | undefined;
87
+ };
88
+
89
+ type CapturedFormModalProps = {
90
+ title: string;
91
+ name?: string | undefined;
92
+ error?: string | undefined;
93
+ isLoading?: boolean | undefined;
94
+ description?: string | undefined;
95
+ submitButtonText?: string | undefined;
96
+ onClose?: (() => void) | undefined;
97
+ onSubmit?:
98
+ | ((data: Record<string, unknown>) => void | Promise<void>)
99
+ | undefined;
100
+ formProps: {
101
+ initialValues?: Record<string, unknown> | undefined;
102
+ fields: Array<FormFieldEntry>;
103
+ };
104
+ };
105
+
106
+ let capturedFormModalProps: CapturedFormModalProps | null = null;
107
+
108
+ jest.mock("../../../UI/Components/FormModal/BasicFormModal", () => {
109
+ return {
110
+ __esModule: true,
111
+ default: (props: CapturedFormModalProps): ReactElement => {
112
+ capturedFormModalProps = props;
113
+ return <div data-testid="form-modal" />;
114
+ },
115
+ };
116
+ });
117
+
118
+ type CapturedConfirmProps = {
119
+ title: string;
120
+ description: string;
121
+ submitButtonText?: string | undefined;
122
+ submitButtonType?: unknown;
123
+ isLoading?: boolean | undefined;
124
+ disableSubmitButton?: boolean | undefined;
125
+ onClose?: (() => void) | undefined;
126
+ onSubmit: () => void;
127
+ };
128
+
129
+ let capturedConfirmProps: CapturedConfirmProps | null = null;
130
+
131
+ jest.mock("../../../UI/Components/Modal/ConfirmModal", () => {
132
+ return {
133
+ __esModule: true,
134
+ default: (props: CapturedConfirmProps): ReactElement => {
135
+ capturedConfirmProps = props;
136
+ return <div data-testid="confirm-modal" />;
137
+ },
138
+ };
139
+ });
140
+
141
+ import UpdateWorkflowVariableContentModal from "../../../../App/FeatureSet/Dashboard/src/Components/Workflow/UpdateWorkflowVariableContentModal";
142
+ import UpdateWorkflowVariableCredentialsModal from "../../../../App/FeatureSet/Dashboard/src/Components/Workflow/UpdateWorkflowVariableCredentialsModal";
143
+ import WorkflowVariableTokenRefreshModal from "../../../../App/FeatureSet/Dashboard/src/Components/Workflow/WorkflowVariableTokenRefreshModal";
144
+ import {
145
+ TokenRefreshOutcome,
146
+ fetchTokenRefreshOutcome,
147
+ } from "../../../../App/FeatureSet/Dashboard/src/Utils/Workflow/WorkflowVariableUtil";
148
+ import WorkflowVariable from "../../../Models/DatabaseModels/WorkflowVariable";
149
+ import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
150
+ import OneUptimeDate from "../../../Types/Date";
151
+ import ObjectID from "../../../Types/ObjectID";
152
+ import {
153
+ OAuth2GrantType,
154
+ WorkflowVariableType,
155
+ } from "../../../Types/Workflow/WorkflowVariableOAuth";
156
+ import { ButtonStyleType } from "../../../UI/Components/Button/Button";
157
+ import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
158
+
159
+ const VARIABLE_ID: ObjectID = new ObjectID(
160
+ "33333333-3333-4333-8333-333333333333",
161
+ );
162
+ const OTHER_VARIABLE_ID: ObjectID = new ObjectID(
163
+ "44444444-4444-4444-8444-444444444444",
164
+ );
165
+
166
+ const EXPIRES_AT: Date = new Date("2030-01-01T10:00:00.000Z");
167
+
168
+ type VoidMock = ReturnType<typeof jest.fn<() => void>>;
169
+ type SavedMock = ReturnType<typeof jest.fn<(savedWhat: string) => void>>;
170
+
171
+ type Deferred = {
172
+ promise: Promise<unknown>;
173
+ resolve: (value: unknown) => void;
174
+ reject: (error: unknown) => void;
175
+ };
176
+
177
+ function deferred(): Deferred {
178
+ let resolve: (value: unknown) => void = (): void => {
179
+ // replaced below
180
+ };
181
+ let reject: (error: unknown) => void = (): void => {
182
+ // replaced below
183
+ };
184
+
185
+ const promise: Promise<unknown> = new Promise<unknown>(
186
+ (
187
+ promiseResolve: (value: unknown) => void,
188
+ promiseReject: (error: unknown) => void,
189
+ ) => {
190
+ resolve = promiseResolve;
191
+ reject = promiseReject;
192
+ },
193
+ );
194
+
195
+ return { promise, resolve, reject };
196
+ }
197
+
198
+ /*
199
+ * A failing request, rejected from a native async function. A plain
200
+ * mockRejectedValue builds its rejection with the zone.js Promise the UI code
201
+ * loads, and zone reports it as unhandled before the component's native
202
+ * await gets to it - noise, not a failure, but it buries real warnings.
203
+ */
204
+ function rejectWith(error: unknown): () => Promise<unknown> {
205
+ return async (): Promise<unknown> => {
206
+ throw error;
207
+ };
208
+ }
209
+
210
+ function staticVariable(data?: {
211
+ id?: ObjectID | null | undefined;
212
+ name?: string | null | undefined;
213
+ }): WorkflowVariable {
214
+ const variable: WorkflowVariable = new WorkflowVariable();
215
+
216
+ if (data?.id !== null) {
217
+ variable._id = (data?.id || VARIABLE_ID).toString();
218
+ }
219
+
220
+ if (data?.name !== null) {
221
+ variable.name = data?.name || "AirflowToken";
222
+ }
223
+
224
+ variable.variableType = WorkflowVariableType.Static;
225
+ return variable;
226
+ }
227
+
228
+ function oauthVariable(data?: {
229
+ id?: ObjectID | null | undefined;
230
+ name?: string | null | undefined;
231
+ grantType?: OAuth2GrantType | null | undefined;
232
+ }): WorkflowVariable {
233
+ const variable: WorkflowVariable = new WorkflowVariable();
234
+
235
+ if (data?.id !== null) {
236
+ variable._id = (data?.id || VARIABLE_ID).toString();
237
+ }
238
+
239
+ if (data?.name !== null) {
240
+ variable.name = data?.name || "API_TOKEN";
241
+ }
242
+
243
+ variable.variableType = WorkflowVariableType.OAuth2;
244
+
245
+ if (data?.grantType !== null) {
246
+ variable.oauthGrantType =
247
+ data?.grantType || OAuth2GrantType.ClientCredentials;
248
+ }
249
+
250
+ return variable;
251
+ }
252
+
253
+ function modal(): CapturedFormModalProps {
254
+ if (!capturedFormModalProps) {
255
+ throw new Error("No form modal is open");
256
+ }
257
+
258
+ return capturedFormModalProps;
259
+ }
260
+
261
+ function confirm(): CapturedConfirmProps {
262
+ if (!capturedConfirmProps) {
263
+ throw new Error("No confirm modal is open");
264
+ }
265
+
266
+ return capturedConfirmProps;
267
+ }
268
+
269
+ function fieldNames(): Array<string | undefined> {
270
+ return modal().formProps.fields.map((field: FormFieldEntry) => {
271
+ return Object.keys(field.field || {})[0];
272
+ });
273
+ }
274
+
275
+ function fieldNamed(name: string): FormFieldEntry {
276
+ const entry: FormFieldEntry | undefined = modal().formProps.fields.find(
277
+ (field: FormFieldEntry) => {
278
+ return Object.keys(field.field || {})[0] === name;
279
+ },
280
+ );
281
+
282
+ if (!entry) {
283
+ throw new Error(`The modal has no "${name}" field`);
284
+ }
285
+
286
+ return entry;
287
+ }
288
+
289
+ function updateCall(callIndex: number = 0): {
290
+ id: ObjectID;
291
+ data: Record<string, unknown>;
292
+ modelType: unknown;
293
+ } {
294
+ return updateById.mock.calls[callIndex]![0] as {
295
+ id: ObjectID;
296
+ data: Record<string, unknown>;
297
+ modelType: unknown;
298
+ };
299
+ }
300
+
301
+ async function submit(data: Record<string, unknown>): Promise<void> {
302
+ await act(async () => {
303
+ await modal().onSubmit?.(data);
304
+ });
305
+ }
306
+
307
+ beforeEach(() => {
308
+ capturedFormModalProps = null;
309
+ capturedConfirmProps = null;
310
+ updateById.mockReset();
311
+ updateById.mockResolvedValue(undefined);
312
+ getItem.mockReset();
313
+ apiPost.mockReset();
314
+ apiPost.mockResolvedValue({
315
+ data: { oauthAccessTokenExpiresAt: EXPIRES_AT.toISOString() },
316
+ });
317
+ });
318
+
319
+ afterEach(() => {
320
+ cleanup();
321
+ });
322
+
323
+ describe("UpdateWorkflowVariableContentModal", () => {
324
+ type ContentHandles = {
325
+ onClose: VoidMock;
326
+ onSuccess: VoidMock;
327
+ rerender: (variable: WorkflowVariable) => void;
328
+ };
329
+
330
+ function renderContentModal(variable?: WorkflowVariable): ContentHandles {
331
+ const onClose: VoidMock = jest.fn<() => void>();
332
+ const onSuccess: VoidMock = jest.fn<() => void>();
333
+
334
+ const element: (item: WorkflowVariable) => ReactElement = (
335
+ item: WorkflowVariable,
336
+ ): ReactElement => {
337
+ return (
338
+ <UpdateWorkflowVariableContentModal
339
+ variable={item}
340
+ onClose={onClose}
341
+ onSuccess={onSuccess}
342
+ />
343
+ );
344
+ };
345
+
346
+ const result: ReturnType<typeof render> = render(
347
+ element(variable || staticVariable()),
348
+ );
349
+
350
+ return {
351
+ onClose,
352
+ onSuccess,
353
+ rerender: (item: WorkflowVariable): void => {
354
+ result.rerender(element(item));
355
+ },
356
+ };
357
+ }
358
+
359
+ describe("when it opens", () => {
360
+ test("is titled for what it does", () => {
361
+ renderContentModal();
362
+
363
+ expect(modal().title).toBe("Update Content");
364
+ expect(modal().submitButtonText).toBe("Update Content");
365
+ expect(modal().isLoading).toBe(false);
366
+ expect(modal().error).toBeUndefined();
367
+ });
368
+
369
+ /*
370
+ * content is write-only - its read list is empty - so there is nothing to
371
+ * prefill, and asking the API for it would be refused outright.
372
+ */
373
+ test("prefills nothing and never reads the variable back", () => {
374
+ renderContentModal();
375
+
376
+ expect(modal().formProps.initialValues).toEqual({});
377
+ expect(getItem).not.toHaveBeenCalled();
378
+ expect(updateById).not.toHaveBeenCalled();
379
+ });
380
+
381
+ test("asks for exactly one field: the content, required, as long text", () => {
382
+ renderContentModal();
383
+
384
+ expect(fieldNames()).toEqual(["content"]);
385
+ expect(fieldNamed("content").title).toBe("Content");
386
+ expect(fieldNamed("content").required).toBe(true);
387
+ expect(fieldNamed("content").fieldType).toBe(
388
+ FormFieldSchemaType.LongText,
389
+ );
390
+ });
391
+
392
+ // Somebody expecting to edit in place should be told why the box is empty.
393
+ test("says the stored content cannot be shown and will be replaced", () => {
394
+ renderContentModal();
395
+
396
+ const description: string = fieldNamed("content").description || "";
397
+
398
+ expect(description).toContain("cannot be retrieved");
399
+ expect(description).toContain("replaces it");
400
+ });
401
+
402
+ test("names the variable whose content is being replaced", () => {
403
+ renderContentModal(staticVariable({ name: "AirflowToken" }));
404
+
405
+ expect(modal().description).toContain('"AirflowToken"');
406
+ expect(modal().description).toContain("next run");
407
+ });
408
+
409
+ test("falls back to 'this variable' when the variable has no name", () => {
410
+ renderContentModal(staticVariable({ name: null }));
411
+
412
+ expect(modal().description).toContain('"this variable"');
413
+ });
414
+ });
415
+
416
+ describe("saving", () => {
417
+ test("writes only the content column, on the variable it was given", async () => {
418
+ renderContentModal();
419
+
420
+ await submit({ content: "rotated-token" });
421
+
422
+ expect(updateById).toHaveBeenCalledTimes(1);
423
+ expect(updateCall().id.toString()).toBe(VARIABLE_ID.toString());
424
+ expect(updateCall().data).toEqual({ content: "rotated-token" });
425
+ expect(updateCall().modelType).toBe(WorkflowVariable);
426
+ });
427
+
428
+ /*
429
+ * The variable page closes this modal from onSuccess and flags that the
430
+ * content was replaced; onClose is for Cancel. Calling the wrong one would
431
+ * close the modal without telling anybody the save worked.
432
+ */
433
+ test("reports success through onSuccess, not onClose", async () => {
434
+ const handles: ContentHandles = renderContentModal();
435
+
436
+ await submit({ content: "rotated-token" });
437
+
438
+ expect(handles.onSuccess).toHaveBeenCalledTimes(1);
439
+ expect(handles.onClose).not.toHaveBeenCalled();
440
+ expect(modal().isLoading).toBe(false);
441
+ expect(modal().error).toBeUndefined();
442
+ });
443
+
444
+ /*
445
+ * The stale-selection class of bug: with one id everywhere, "the variable
446
+ * that is open" cannot be told apart from "whichever was opened first".
447
+ * Rotating a credential onto the wrong variable would be invisible, since
448
+ * content is never read back.
449
+ */
450
+ test("writes the second variable when it is re-rendered for a second one", async () => {
451
+ const handles: ContentHandles = renderContentModal(
452
+ staticVariable({ id: VARIABLE_ID, name: "First" }),
453
+ );
454
+
455
+ handles.rerender(
456
+ staticVariable({ id: OTHER_VARIABLE_ID, name: "Second" }),
457
+ );
458
+
459
+ expect(modal().description).toContain("Second");
460
+
461
+ await submit({ content: "second-token" });
462
+
463
+ expect(updateById).toHaveBeenCalledTimes(1);
464
+ expect(updateCall().id.toString()).toBe(OTHER_VARIABLE_ID.toString());
465
+ });
466
+
467
+ /*
468
+ * BasicFormModal unmounts its form while isLoading is true, which is what
469
+ * stops a double submit while the write is in flight.
470
+ */
471
+ test("is loading while the write is in flight, and stops when it lands", async () => {
472
+ const pending: Deferred = deferred();
473
+ updateById.mockReturnValue(pending.promise);
474
+
475
+ const handles: ContentHandles = renderContentModal();
476
+
477
+ const submission: { current?: void | Promise<void> } = {};
478
+
479
+ act(() => {
480
+ submission.current = modal().onSubmit?.({ content: "rotated-token" });
481
+ });
482
+
483
+ expect(modal().isLoading).toBe(true);
484
+ expect(handles.onSuccess).not.toHaveBeenCalled();
485
+
486
+ await act(async () => {
487
+ pending.resolve(undefined);
488
+ await submission.current;
489
+ });
490
+
491
+ expect(modal().isLoading).toBe(false);
492
+ expect(handles.onSuccess).toHaveBeenCalledTimes(1);
493
+ });
494
+ });
495
+
496
+ describe("when the write fails", () => {
497
+ /*
498
+ * Swallowing this looks exactly like a save that worked. On a credential
499
+ * that is the difference between a rotation and a silent non-rotation.
500
+ */
501
+ test("stays open and says why", async () => {
502
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
503
+
504
+ const handles: ContentHandles = renderContentModal();
505
+
506
+ await submit({ content: "rotated-token" });
507
+
508
+ expect(modal().error).toBe("Not authorized.");
509
+ expect(handles.onSuccess).not.toHaveBeenCalled();
510
+ expect(handles.onClose).not.toHaveBeenCalled();
511
+ expect(screen.queryByTestId("form-modal")).toBeInTheDocument();
512
+ });
513
+
514
+ test("uses the friendly message for an error that is not an Error", async () => {
515
+ updateById.mockImplementation(rejectWith("socket hang up"));
516
+
517
+ renderContentModal();
518
+
519
+ await submit({ content: "rotated-token" });
520
+
521
+ expect(modal().error).toBe("Request failed.");
522
+ });
523
+
524
+ /*
525
+ * BasicFormModal unmounts its form while it is loading, so the form that
526
+ * comes back after a failure is a fresh one. Without the draft it comes
527
+ * back empty, and the person who just pasted a long token has to go and
528
+ * find it again.
529
+ */
530
+ test("keeps what the user typed", async () => {
531
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
532
+
533
+ renderContentModal();
534
+
535
+ expect(modal().formProps.initialValues).toEqual({});
536
+
537
+ await submit({ content: "rotated-token" });
538
+
539
+ expect(modal().formProps.initialValues).toEqual({
540
+ content: "rotated-token",
541
+ });
542
+ });
543
+
544
+ /*
545
+ * A flag left stuck on turns the error state into a modal with a message,
546
+ * no field to retry in, and nothing the user typed.
547
+ */
548
+ test("stops loading", async () => {
549
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
550
+
551
+ renderContentModal();
552
+
553
+ await submit({ content: "rotated-token" });
554
+
555
+ expect(modal().isLoading).toBe(false);
556
+ });
557
+
558
+ test("a retry that works clears the error and the draft", async () => {
559
+ updateById.mockImplementationOnce(
560
+ rejectWith(new Error("Not authorized.")),
561
+ );
562
+
563
+ const handles: ContentHandles = renderContentModal();
564
+
565
+ await submit({ content: "rotated-token" });
566
+
567
+ expect(modal().error).toBe("Not authorized.");
568
+
569
+ await submit({ content: "rotated-token" });
570
+
571
+ expect(updateById).toHaveBeenCalledTimes(2);
572
+ expect(modal().error).toBeUndefined();
573
+ expect(modal().formProps.initialValues).toEqual({});
574
+ expect(modal().isLoading).toBe(false);
575
+ expect(handles.onSuccess).toHaveBeenCalledTimes(1);
576
+ });
577
+ });
578
+
579
+ describe("closing", () => {
580
+ test("clears the error and the draft, then tells the caller", async () => {
581
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
582
+
583
+ const handles: ContentHandles = renderContentModal();
584
+
585
+ await submit({ content: "rotated-token" });
586
+
587
+ expect(modal().error).toBe("Not authorized.");
588
+ expect(modal().formProps.initialValues).toEqual({
589
+ content: "rotated-token",
590
+ });
591
+
592
+ act(() => {
593
+ modal().onClose?.();
594
+ });
595
+
596
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
597
+ expect(handles.onSuccess).not.toHaveBeenCalled();
598
+ expect(modal().error).toBeUndefined();
599
+ expect(modal().formProps.initialValues).toEqual({});
600
+ expect(modal().isLoading).toBe(false);
601
+ });
602
+
603
+ // A draft typed for one variable must never be offered for the next one.
604
+ test("does not carry a draft into the next variable", async () => {
605
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
606
+
607
+ const handles: ContentHandles = renderContentModal(
608
+ staticVariable({ id: VARIABLE_ID, name: "First" }),
609
+ );
610
+
611
+ await submit({ content: "first-token" });
612
+
613
+ act(() => {
614
+ modal().onClose?.();
615
+ });
616
+
617
+ handles.rerender(
618
+ staticVariable({ id: OTHER_VARIABLE_ID, name: "Second" }),
619
+ );
620
+
621
+ expect(modal().formProps.initialValues).toEqual({});
622
+ expect(modal().error).toBeUndefined();
623
+ });
624
+ });
625
+
626
+ /*
627
+ * The guard that replaced a bare non-null assertion on the id. It must fail
628
+ * loudly and leave the modal usable rather than fire a request at an
629
+ * undefined id.
630
+ */
631
+ test("refuses a variable that has no id, without calling the API", async () => {
632
+ const handles: ContentHandles = renderContentModal(
633
+ staticVariable({ id: null }),
634
+ );
635
+
636
+ await submit({ content: "rotated-token" });
637
+
638
+ expect(updateById).not.toHaveBeenCalled();
639
+ expect(modal().error).toContain("no id");
640
+ expect(modal().error).toContain("Refresh the page");
641
+ expect(modal().isLoading).toBe(false);
642
+ expect(handles.onSuccess).not.toHaveBeenCalled();
643
+ expect(handles.onClose).not.toHaveBeenCalled();
644
+ });
645
+
646
+ /*
647
+ * How the variable page mounts it: shown while a flag is set, the flag
648
+ * cleared from onSuccess and from onClose. The recorder only ever gains
649
+ * props, so whether the modal is gone is asked of the DOM.
650
+ */
651
+ describe("mounted the way the variable page mounts it", () => {
652
+ const Host: () => ReactElement = (): ReactElement => {
653
+ const [open, setOpen] = useState<boolean>(true);
654
+ const [updated, setUpdated] = useState<boolean>(false);
655
+
656
+ return (
657
+ <div>
658
+ {updated ? <span data-testid="content-updated" /> : <></>}
659
+ {open ? (
660
+ <UpdateWorkflowVariableContentModal
661
+ variable={staticVariable()}
662
+ onClose={() => {
663
+ setOpen(false);
664
+ }}
665
+ onSuccess={() => {
666
+ setOpen(false);
667
+ setUpdated(true);
668
+ }}
669
+ />
670
+ ) : (
671
+ <></>
672
+ )}
673
+ </div>
674
+ );
675
+ };
676
+
677
+ test("closes on success", async () => {
678
+ render(<Host />);
679
+
680
+ expect(screen.queryByTestId("form-modal")).toBeInTheDocument();
681
+
682
+ await submit({ content: "rotated-token" });
683
+
684
+ expect(screen.queryByTestId("form-modal")).not.toBeInTheDocument();
685
+ expect(screen.queryByTestId("content-updated")).toBeInTheDocument();
686
+ });
687
+
688
+ test("stays open on failure", async () => {
689
+ updateById.mockImplementation(rejectWith(new Error("Not authorized.")));
690
+
691
+ render(<Host />);
692
+
693
+ await submit({ content: "rotated-token" });
694
+
695
+ expect(screen.queryByTestId("form-modal")).toBeInTheDocument();
696
+ expect(screen.queryByTestId("content-updated")).not.toBeInTheDocument();
697
+ });
698
+
699
+ test("closes on Cancel without claiming an update", () => {
700
+ render(<Host />);
701
+
702
+ act(() => {
703
+ modal().onClose?.();
704
+ });
705
+
706
+ expect(screen.queryByTestId("form-modal")).not.toBeInTheDocument();
707
+ expect(screen.queryByTestId("content-updated")).not.toBeInTheDocument();
708
+ expect(updateById).not.toHaveBeenCalled();
709
+ });
710
+ });
711
+ });
712
+
713
+ describe("UpdateWorkflowVariableCredentialsModal", () => {
714
+ type CredentialsHandles = {
715
+ onClose: VoidMock;
716
+ onSaved: SavedMock;
717
+ };
718
+
719
+ function renderCredentialsModal(
720
+ variable?: WorkflowVariable,
721
+ ): CredentialsHandles {
722
+ const onClose: VoidMock = jest.fn<() => void>();
723
+ const onSaved: SavedMock = jest.fn<(savedWhat: string) => void>();
724
+
725
+ render(
726
+ <UpdateWorkflowVariableCredentialsModal
727
+ variable={variable || oauthVariable()}
728
+ onClose={onClose}
729
+ onSaved={onSaved}
730
+ />,
731
+ );
732
+
733
+ return { onClose, onSaved };
734
+ }
735
+
736
+ describe("when it opens", () => {
737
+ test("is titled for what it does, and says a token is fetched on save", () => {
738
+ renderCredentialsModal();
739
+
740
+ expect(modal().title).toBe("Update Credentials");
741
+ expect(modal().submitButtonText).toBe("Save and Refresh Token");
742
+ expect(modal().isLoading).toBe(false);
743
+ expect(modal().error).toBeUndefined();
744
+ });
745
+
746
+ test("names the variable and says an empty field keeps what is saved", () => {
747
+ renderCredentialsModal(oauthVariable({ name: "API_TOKEN" }));
748
+
749
+ expect(modal().description).toContain('"API_TOKEN"');
750
+ expect(modal().description).toContain(
751
+ "Leave a field empty to keep what is saved",
752
+ );
753
+ expect(modal().description).toContain("as soon as you save");
754
+ });
755
+
756
+ test("falls back to 'this variable' when the variable has no name", () => {
757
+ renderCredentialsModal(oauthVariable({ name: null }));
758
+
759
+ expect(modal().description).toContain('"this variable"');
760
+ });
761
+
762
+ // Both credentials are write-only and encrypted: nothing to prefill.
763
+ test("prefills nothing and never reads the variable back", () => {
764
+ renderCredentialsModal(
765
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
766
+ );
767
+
768
+ expect(modal().formProps.initialValues || {}).toEqual({});
769
+ expect(getItem).not.toHaveBeenCalled();
770
+ expect(updateById).not.toHaveBeenCalled();
771
+ });
772
+
773
+ test("asks only for a new client secret on a client credentials variable", () => {
774
+ renderCredentialsModal(
775
+ oauthVariable({ grantType: OAuth2GrantType.ClientCredentials }),
776
+ );
777
+
778
+ expect(fieldNames()).toEqual(["oauthClientSecret"]);
779
+ expect(fieldNamed("oauthClientSecret").title).toBe("New Client Secret");
780
+ });
781
+
782
+ /*
783
+ * The grant type decides the fields, so a variable loaded without it must
784
+ * not be offered a refresh token it has no use for.
785
+ */
786
+ test("asks only for a new client secret when the grant type is unknown", () => {
787
+ renderCredentialsModal(oauthVariable({ grantType: null }));
788
+
789
+ expect(fieldNames()).toEqual(["oauthClientSecret"]);
790
+ });
791
+
792
+ test("also asks for a new refresh token on a refresh token variable", () => {
793
+ renderCredentialsModal(
794
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
795
+ );
796
+
797
+ expect(fieldNames()).toEqual(["oauthClientSecret", "oauthRefreshToken"]);
798
+ expect(fieldNamed("oauthRefreshToken").title).toBe("New Refresh Token");
799
+ expect(fieldNamed("oauthRefreshToken").description).toContain("revoked");
800
+ });
801
+
802
+ /*
803
+ * Empty means "keep what is saved", so neither field may be required; and
804
+ * both are secrets, so they are masked and spell check stays off (a
805
+ * browser's spell checker can send what is typed to a remote service).
806
+ */
807
+ test("makes every field optional, masked and exempt from spell check", () => {
808
+ renderCredentialsModal(
809
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
810
+ );
811
+
812
+ for (const field of modal().formProps.fields) {
813
+ expect(field.required).toBe(false);
814
+ expect(field.fieldType).toBe(FormFieldSchemaType.EncryptedText);
815
+ expect(field.disableSpellCheck).toBe(true);
816
+ expect(field.description).toContain("Leave empty to keep the saved");
817
+ }
818
+ });
819
+ });
820
+
821
+ describe("refusing to save nothing", () => {
822
+ const BLANK_SUBMISSIONS: Array<{
823
+ label: string;
824
+ data: Record<string, unknown>;
825
+ }> = [
826
+ { label: "no fields at all", data: {} },
827
+ { label: "an empty client secret", data: { oauthClientSecret: "" } },
828
+ {
829
+ label: "a client secret of only spaces",
830
+ data: { oauthClientSecret: " " },
831
+ },
832
+ {
833
+ label: "both fields blank",
834
+ data: { oauthClientSecret: " \t", oauthRefreshToken: "\n " },
835
+ },
836
+ ];
837
+
838
+ test.each(BLANK_SUBMISSIONS)(
839
+ "with $label: says so and writes nothing",
840
+ async (entry: { label: string; data: Record<string, unknown> }) => {
841
+ const handles: CredentialsHandles = renderCredentialsModal(
842
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
843
+ );
844
+
845
+ await submit(entry.data);
846
+
847
+ expect(updateById).not.toHaveBeenCalled();
848
+ expect(modal().error).toContain(
849
+ "Enter a new client secret or refresh token",
850
+ );
851
+ expect(modal().isLoading).toBe(false);
852
+ expect(handles.onSaved).not.toHaveBeenCalled();
853
+ expect(handles.onClose).not.toHaveBeenCalled();
854
+ },
855
+ );
856
+
857
+ test("a later submit with a value clears that error", async () => {
858
+ const handles: CredentialsHandles = renderCredentialsModal();
859
+
860
+ await submit({ oauthClientSecret: " " });
861
+
862
+ expect(modal().error).toContain("Enter a new client secret");
863
+
864
+ await submit({ oauthClientSecret: "new-secret" });
865
+
866
+ expect(modal().error).toBeUndefined();
867
+ expect(handles.onSaved).toHaveBeenCalledWith("Client secret");
868
+ });
869
+ });
870
+
871
+ describe("saving", () => {
872
+ /*
873
+ * Only what was typed is sent. An empty field must not reach the API as an
874
+ * empty string - that would be a request to remove the credential.
875
+ */
876
+ test("writes only the refresh token when only that was typed, trimmed", async () => {
877
+ renderCredentialsModal(
878
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
879
+ );
880
+
881
+ await submit({
882
+ oauthClientSecret: "",
883
+ oauthRefreshToken: " new-refresh-token ",
884
+ });
885
+
886
+ expect(updateById).toHaveBeenCalledTimes(1);
887
+ expect(updateCall().id.toString()).toBe(VARIABLE_ID.toString());
888
+ expect(updateCall().data).toEqual({
889
+ oauthRefreshToken: "new-refresh-token",
890
+ });
891
+ expect(updateCall().modelType).toBe(WorkflowVariable);
892
+ });
893
+
894
+ test("writes only the client secret when only that was typed, trimmed", async () => {
895
+ renderCredentialsModal(
896
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
897
+ );
898
+
899
+ await submit({
900
+ oauthClientSecret: "\tnew-secret\n",
901
+ oauthRefreshToken: " ",
902
+ });
903
+
904
+ expect(updateCall().data).toEqual({ oauthClientSecret: "new-secret" });
905
+ });
906
+
907
+ test("writes both when both were typed", async () => {
908
+ renderCredentialsModal(
909
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
910
+ );
911
+
912
+ await submit({
913
+ oauthClientSecret: "new-secret",
914
+ oauthRefreshToken: "new-refresh-token",
915
+ });
916
+
917
+ expect(updateCall().data).toEqual({
918
+ oauthClientSecret: "new-secret",
919
+ oauthRefreshToken: "new-refresh-token",
920
+ });
921
+ });
922
+
923
+ test("writes to the variable it was given", async () => {
924
+ renderCredentialsModal(oauthVariable({ id: OTHER_VARIABLE_ID }));
925
+
926
+ await submit({ oauthClientSecret: "new-secret" });
927
+
928
+ expect(updateCall().id.toString()).toBe(OTHER_VARIABLE_ID.toString());
929
+ });
930
+
931
+ /*
932
+ * The caller fetches a token straight after, and its result opens with
933
+ * "<savedWhat> saved." - so these words are what the user reads.
934
+ */
935
+ const SAVES: Array<{ savedWhat: string; data: Record<string, unknown> }> = [
936
+ { savedWhat: "Client secret", data: { oauthClientSecret: "new-secret" } },
937
+ {
938
+ savedWhat: "Refresh token",
939
+ data: { oauthRefreshToken: "new-refresh-token" },
940
+ },
941
+ {
942
+ savedWhat: "Client secret and refresh token",
943
+ data: {
944
+ oauthClientSecret: "new-secret",
945
+ oauthRefreshToken: "new-refresh-token",
946
+ },
947
+ },
948
+ ];
949
+
950
+ test.each(SAVES)(
951
+ "tells the caller it saved: $savedWhat",
952
+ async (entry: { savedWhat: string; data: Record<string, unknown> }) => {
953
+ const handles: CredentialsHandles = renderCredentialsModal(
954
+ oauthVariable({ grantType: OAuth2GrantType.RefreshToken }),
955
+ );
956
+
957
+ await submit(entry.data);
958
+
959
+ expect(handles.onSaved).toHaveBeenCalledTimes(1);
960
+ expect(handles.onSaved).toHaveBeenCalledWith(entry.savedWhat);
961
+ expect(handles.onClose).not.toHaveBeenCalled();
962
+ expect(modal().isLoading).toBe(false);
963
+ },
964
+ );
965
+
966
+ test("is loading while the write is in flight, and reports only once it lands", async () => {
967
+ const pending: Deferred = deferred();
968
+ updateById.mockReturnValue(pending.promise);
969
+
970
+ const handles: CredentialsHandles = renderCredentialsModal();
971
+
972
+ const submission: { current?: void | Promise<void> } = {};
973
+
974
+ act(() => {
975
+ submission.current = modal().onSubmit?.({
976
+ oauthClientSecret: "new-secret",
977
+ });
978
+ });
979
+
980
+ expect(modal().isLoading).toBe(true);
981
+ expect(handles.onSaved).not.toHaveBeenCalled();
982
+
983
+ await act(async () => {
984
+ pending.resolve(undefined);
985
+ await submission.current;
986
+ });
987
+
988
+ expect(modal().isLoading).toBe(false);
989
+ expect(handles.onSaved).toHaveBeenCalledWith("Client secret");
990
+ });
991
+ });
992
+
993
+ describe("when the write fails", () => {
994
+ /*
995
+ * onSaved is what makes the caller fetch a token. Calling it after a failed
996
+ * save would fetch with the old credentials and report success.
997
+ */
998
+ test("stays open with the reason, stops loading and does not report a save", async () => {
999
+ updateById.mockImplementation(
1000
+ rejectWith(new Error("You do not have permission.")),
1001
+ );
1002
+
1003
+ const handles: CredentialsHandles = renderCredentialsModal();
1004
+
1005
+ await submit({ oauthClientSecret: "new-secret" });
1006
+
1007
+ expect(modal().error).toBe("You do not have permission.");
1008
+ expect(modal().isLoading).toBe(false);
1009
+ expect(handles.onSaved).not.toHaveBeenCalled();
1010
+ expect(handles.onClose).not.toHaveBeenCalled();
1011
+ expect(screen.queryByTestId("form-modal")).toBeInTheDocument();
1012
+ });
1013
+
1014
+ test("a retry that works clears the error and reports the save", async () => {
1015
+ updateById.mockImplementationOnce(
1016
+ rejectWith(new Error("You do not have permission.")),
1017
+ );
1018
+
1019
+ const handles: CredentialsHandles = renderCredentialsModal();
1020
+
1021
+ await submit({ oauthClientSecret: "new-secret" });
1022
+ await submit({ oauthClientSecret: "new-secret" });
1023
+
1024
+ expect(updateById).toHaveBeenCalledTimes(2);
1025
+ expect(modal().error).toBeUndefined();
1026
+ expect(handles.onSaved).toHaveBeenCalledTimes(1);
1027
+ });
1028
+ });
1029
+
1030
+ test("refuses a variable that has no id, without calling the API", async () => {
1031
+ const handles: CredentialsHandles = renderCredentialsModal(
1032
+ oauthVariable({ id: null }),
1033
+ );
1034
+
1035
+ await submit({ oauthClientSecret: "new-secret" });
1036
+
1037
+ expect(updateById).not.toHaveBeenCalled();
1038
+ expect(modal().error).toContain("no id");
1039
+ expect(modal().isLoading).toBe(false);
1040
+ expect(handles.onSaved).not.toHaveBeenCalled();
1041
+ });
1042
+
1043
+ test("closing clears the error and tells the caller", async () => {
1044
+ updateById.mockImplementation(
1045
+ rejectWith(new Error("You do not have permission.")),
1046
+ );
1047
+
1048
+ const handles: CredentialsHandles = renderCredentialsModal();
1049
+
1050
+ await submit({ oauthClientSecret: "new-secret" });
1051
+
1052
+ expect(modal().error).toBe("You do not have permission.");
1053
+
1054
+ act(() => {
1055
+ modal().onClose?.();
1056
+ });
1057
+
1058
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
1059
+ expect(handles.onSaved).not.toHaveBeenCalled();
1060
+ expect(modal().error).toBeUndefined();
1061
+ expect(modal().isLoading).toBe(false);
1062
+ });
1063
+ });
1064
+
1065
+ describe("WorkflowVariableTokenRefreshModal", () => {
1066
+ function renderRefreshModal(
1067
+ outcome: TokenRefreshOutcome | null,
1068
+ variableName?: string,
1069
+ ): { onClose: VoidMock; rerender: (next: TokenRefreshOutcome) => void } {
1070
+ const onClose: VoidMock = jest.fn<() => void>();
1071
+
1072
+ const result: ReturnType<typeof render> = render(
1073
+ <WorkflowVariableTokenRefreshModal
1074
+ variableName={variableName || "API_TOKEN"}
1075
+ outcome={outcome}
1076
+ onClose={onClose}
1077
+ />,
1078
+ );
1079
+
1080
+ return {
1081
+ onClose,
1082
+ rerender: (next: TokenRefreshOutcome): void => {
1083
+ result.rerender(
1084
+ <WorkflowVariableTokenRefreshModal
1085
+ variableName={variableName || "API_TOKEN"}
1086
+ outcome={next}
1087
+ onClose={onClose}
1088
+ />,
1089
+ );
1090
+ },
1091
+ };
1092
+ }
1093
+
1094
+ const validUntil: string = `It is valid until ${OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
1095
+ EXPIRES_AT,
1096
+ )}`;
1097
+
1098
+ /*
1099
+ * A token request can take up to 20 seconds. The modal opens as soon as it
1100
+ * goes out so the page is not silent in the meantime, and nothing on it can
1101
+ * be pressed until the answer replaces it.
1102
+ */
1103
+ describe("while the request is still out", () => {
1104
+ test("says it is fetching, for which variable, with a spinner", () => {
1105
+ renderRefreshModal(null, "API_TOKEN");
1106
+
1107
+ expect(confirm().title).toBe("Fetching an Access Token");
1108
+ expect(confirm().description).toContain('"API_TOKEN"');
1109
+ expect(confirm().description).toContain("identity provider");
1110
+ expect(confirm().isLoading).toBe(true);
1111
+ });
1112
+
1113
+ test("cannot be submitted, and pressing submit does not close it", () => {
1114
+ const handles: { onClose: VoidMock } = renderRefreshModal(null);
1115
+
1116
+ expect(confirm().disableSubmitButton).toBe(true);
1117
+ expect(confirm().submitButtonText).toBe("Close");
1118
+
1119
+ act(() => {
1120
+ confirm().onSubmit();
1121
+ });
1122
+
1123
+ expect(handles.onClose).not.toHaveBeenCalled();
1124
+ expect(screen.queryByTestId("confirm-modal")).toBeInTheDocument();
1125
+ });
1126
+
1127
+ test("is replaced by the answer when it arrives", () => {
1128
+ const handles: {
1129
+ onClose: VoidMock;
1130
+ rerender: (next: TokenRefreshOutcome) => void;
1131
+ } = renderRefreshModal(null);
1132
+
1133
+ handles.rerender({ variableName: "API_TOKEN", expiresAt: EXPIRES_AT });
1134
+
1135
+ expect(confirm().title).toBe("Access Token Fetched");
1136
+ expect(confirm().isLoading).toBeFalsy();
1137
+ expect(confirm().disableSubmitButton).toBeFalsy();
1138
+
1139
+ act(() => {
1140
+ confirm().onSubmit();
1141
+ });
1142
+
1143
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
1144
+ });
1145
+ });
1146
+
1147
+ describe("after a token was fetched", () => {
1148
+ test("says so, for which variable, and until when it is valid", () => {
1149
+ renderRefreshModal({ variableName: "API_TOKEN", expiresAt: EXPIRES_AT });
1150
+
1151
+ expect(confirm().title).toBe("Access Token Fetched");
1152
+ expect(confirm().description).toContain(
1153
+ 'OneUptime fetched a new access token for "API_TOKEN"',
1154
+ );
1155
+ expect(confirm().description).toContain(validUntil);
1156
+ expect(confirm().description).toContain(
1157
+ "a new one is fetched automatically",
1158
+ );
1159
+ expect(confirm().description).not.toContain("said no");
1160
+ });
1161
+
1162
+ const NO_EXPIRY: Array<{
1163
+ label: string;
1164
+ expiresAt: Date | null | undefined;
1165
+ }> = [
1166
+ { label: "null", expiresAt: null },
1167
+ { label: "missing", expiresAt: undefined },
1168
+ ];
1169
+
1170
+ test.each(NO_EXPIRY)(
1171
+ "explains the per-run fetch when the expiry is $label",
1172
+ (entry: { label: string; expiresAt: Date | null | undefined }) => {
1173
+ renderRefreshModal({
1174
+ variableName: "API_TOKEN",
1175
+ expiresAt: entry.expiresAt,
1176
+ });
1177
+
1178
+ expect(confirm().title).toBe("Access Token Fetched");
1179
+ expect(confirm().description).toContain(
1180
+ "The provider did not say when it expires",
1181
+ );
1182
+ expect(confirm().description).toContain(
1183
+ "every workflow run fetches a new one",
1184
+ );
1185
+ expect(confirm().description).not.toContain("valid until");
1186
+ },
1187
+ );
1188
+
1189
+ test("is a plain Close, not a confirmation", () => {
1190
+ renderRefreshModal({ variableName: "API_TOKEN", expiresAt: EXPIRES_AT });
1191
+
1192
+ expect(confirm().submitButtonText).toBe("Close");
1193
+ expect(confirm().submitButtonType).toBe(ButtonStyleType.NORMAL);
1194
+ });
1195
+
1196
+ test("closes when Close is pressed", () => {
1197
+ const handles: { onClose: VoidMock } = renderRefreshModal({
1198
+ variableName: "API_TOKEN",
1199
+ expiresAt: EXPIRES_AT,
1200
+ });
1201
+
1202
+ act(() => {
1203
+ confirm().onSubmit();
1204
+ });
1205
+
1206
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
1207
+ });
1208
+ });
1209
+
1210
+ describe("after the identity provider refused", () => {
1211
+ /*
1212
+ * The provider's own words are the thing somebody needs to read. They
1213
+ * already name the token endpoint, so the modal adds no "it said no" of
1214
+ * its own.
1215
+ */
1216
+ test("says it could not fetch one and passes on the provider's words", () => {
1217
+ renderRefreshModal({
1218
+ variableName: "API_TOKEN",
1219
+ error:
1220
+ "The token endpoint refused the request (HTTP 401): invalid_client.",
1221
+ });
1222
+
1223
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1224
+ expect(confirm().description).toBe(
1225
+ 'OneUptime could not fetch an access token for "API_TOKEN": The token endpoint refused the request (HTTP 401): invalid_client.',
1226
+ );
1227
+ expect(confirm().description).not.toContain("valid until");
1228
+ expect(confirm().description).not.toContain("said no");
1229
+ expect(confirm().description).not.toContain(
1230
+ "asked your identity provider",
1231
+ );
1232
+ });
1233
+
1234
+ // An error wins over a stale expiry: the token was not fetched.
1235
+ test("reports the refusal even when an expiry is also present", () => {
1236
+ renderRefreshModal({
1237
+ variableName: "API_TOKEN",
1238
+ expiresAt: EXPIRES_AT,
1239
+ error: "invalid_grant",
1240
+ });
1241
+
1242
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1243
+ expect(confirm().description).not.toContain("valid until");
1244
+ });
1245
+
1246
+ test("closes when Close is pressed", () => {
1247
+ const handles: { onClose: VoidMock } = renderRefreshModal({
1248
+ variableName: "API_TOKEN",
1249
+ error: "invalid_client",
1250
+ });
1251
+
1252
+ expect(confirm().disableSubmitButton).toBeFalsy();
1253
+
1254
+ act(() => {
1255
+ confirm().onSubmit();
1256
+ });
1257
+
1258
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
1259
+ });
1260
+ });
1261
+
1262
+ /*
1263
+ * A 401, 403 or 422 from the refresh route: OneUptime turned the request
1264
+ * down, so the identity provider never heard of it. Wording it as the
1265
+ * provider saying no would send somebody off to check a client secret nobody
1266
+ * tried, so it reads like any other failure, with OneUptime's own reason.
1267
+ */
1268
+ describe("after OneUptime itself refused", () => {
1269
+ test("says it could not fetch one, and quotes OneUptime", () => {
1270
+ renderRefreshModal({
1271
+ variableName: "API_TOKEN",
1272
+ error: "You do not have permission to update this variable.",
1273
+ });
1274
+
1275
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1276
+ expect(confirm().description).toBe(
1277
+ 'OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
1278
+ );
1279
+ expect(confirm().description).not.toContain("said no");
1280
+ expect(confirm().description).not.toContain(
1281
+ "asked your identity provider",
1282
+ );
1283
+ expect(confirm().description).not.toContain("valid until");
1284
+ });
1285
+
1286
+ test("leads with what was saved", () => {
1287
+ renderRefreshModal({
1288
+ variableName: "API_TOKEN",
1289
+ savedWhat: "Client secret",
1290
+ error: "You do not have permission to update this variable.",
1291
+ });
1292
+
1293
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1294
+ expect(confirm().description).toBe(
1295
+ 'Client secret saved. OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
1296
+ );
1297
+ });
1298
+
1299
+ test("is a plain Close that closes", () => {
1300
+ const handles: { onClose: VoidMock } = renderRefreshModal({
1301
+ variableName: "API_TOKEN",
1302
+ error: "Not authorized.",
1303
+ });
1304
+
1305
+ expect(confirm().submitButtonText).toBe("Close");
1306
+ expect(confirm().disableSubmitButton).toBeFalsy();
1307
+
1308
+ act(() => {
1309
+ confirm().onSubmit();
1310
+ });
1311
+
1312
+ expect(handles.onClose).toHaveBeenCalledTimes(1);
1313
+ });
1314
+ });
1315
+
1316
+ describe("after credentials were saved", () => {
1317
+ test("leads with what was saved when the token was fetched", () => {
1318
+ renderRefreshModal({
1319
+ variableName: "API_TOKEN",
1320
+ savedWhat: "Client secret",
1321
+ expiresAt: EXPIRES_AT,
1322
+ });
1323
+
1324
+ expect(confirm().description.startsWith("Client secret saved. ")).toBe(
1325
+ true,
1326
+ );
1327
+ expect(confirm().description).toContain(validUntil);
1328
+ });
1329
+
1330
+ /*
1331
+ * A secret the provider refuses was still saved. Saying only "could not
1332
+ * fetch" would leave somebody believing the old secret is still in place.
1333
+ */
1334
+ test("leads with what was saved when the provider then refused", () => {
1335
+ renderRefreshModal({
1336
+ variableName: "API_TOKEN",
1337
+ savedWhat: "Client secret and refresh token",
1338
+ error: "invalid_client",
1339
+ });
1340
+
1341
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1342
+ expect(
1343
+ confirm().description.startsWith(
1344
+ "Client secret and refresh token saved. ",
1345
+ ),
1346
+ ).toBe(true);
1347
+ expect(confirm().description).toBe(
1348
+ 'Client secret and refresh token saved. OneUptime could not fetch an access token for "API_TOKEN": invalid_client',
1349
+ );
1350
+ });
1351
+
1352
+ test("says nothing about a save when nothing was saved", () => {
1353
+ renderRefreshModal({ variableName: "API_TOKEN", expiresAt: EXPIRES_AT });
1354
+
1355
+ expect(confirm().description.startsWith("OneUptime fetched")).toBe(true);
1356
+ expect(confirm().description).not.toContain("saved.");
1357
+ });
1358
+ });
1359
+
1360
+ /*
1361
+ * The page builds the outcome with fetchTokenRefreshOutcome and hands it to
1362
+ * this modal. Run end to end against a mocked API.post so the wording is
1363
+ * checked on the path it really takes.
1364
+ */
1365
+ describe("fed by fetchTokenRefreshOutcome", () => {
1366
+ test("posts to the variable's refresh route with the project header", async () => {
1367
+ await fetchTokenRefreshOutcome({ variable: oauthVariable() });
1368
+
1369
+ expect(apiPost).toHaveBeenCalledTimes(1);
1370
+
1371
+ const call: { url: unknown; headers: Record<string, string> } = apiPost
1372
+ .mock.calls[0]![0] as { url: unknown; headers: Record<string, string> };
1373
+
1374
+ expect(String(call.url)).toContain(
1375
+ `/workflow-variable/${VARIABLE_ID.toString()}/refresh-oauth-token`,
1376
+ );
1377
+ expect(call.headers).toEqual({ tenantid: "project-header" });
1378
+ });
1379
+
1380
+ test("a fetched token is reported with its expiry", async () => {
1381
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1382
+ variable: oauthVariable(),
1383
+ });
1384
+
1385
+ renderRefreshModal(outcome);
1386
+
1387
+ expect(confirm().title).toBe("Access Token Fetched");
1388
+ expect(confirm().description).toContain(validUntil);
1389
+ });
1390
+
1391
+ test("a secret the provider then refused is reported as saved and refused", async () => {
1392
+ apiPost.mockImplementation(rejectWith(new Error("invalid_client")));
1393
+
1394
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1395
+ variable: oauthVariable(),
1396
+ savedWhat: "Client secret",
1397
+ });
1398
+
1399
+ renderRefreshModal(outcome);
1400
+
1401
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1402
+ expect(confirm().description).toContain("Client secret saved.");
1403
+ expect(confirm().description).toContain("invalid_client");
1404
+ });
1405
+
1406
+ /*
1407
+ * The real route answers a caller who may not update the variable with
1408
+ * NotAuthorizedException, a 422 error response. The identity provider was
1409
+ * never asked, so nothing may read as it saying no. (API.getFriendlyMessage
1410
+ * is mocked in this file and words anything that is not an Error as
1411
+ * "Request failed.".)
1412
+ */
1413
+ test("a 422 is worded like any other failure, not as the provider saying no", async () => {
1414
+ apiPost.mockResolvedValue(
1415
+ new HTTPErrorResponse(
1416
+ 422,
1417
+ { message: "You do not have permission to update this variable." },
1418
+ {},
1419
+ ),
1420
+ );
1421
+
1422
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1423
+ variable: oauthVariable(),
1424
+ savedWhat: "Client secret",
1425
+ });
1426
+
1427
+ renderRefreshModal(outcome);
1428
+
1429
+ expect(apiPost).toHaveBeenCalledTimes(1);
1430
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1431
+ expect(confirm().description).toBe(
1432
+ 'Client secret saved. OneUptime could not fetch an access token for "API_TOKEN": Request failed.',
1433
+ );
1434
+ expect(confirm().description).not.toContain("said no");
1435
+ });
1436
+
1437
+ // A 400 is the route passing on the provider's refusal: worded the same.
1438
+ test("a 400 is worded the same way", async () => {
1439
+ apiPost.mockResolvedValue(
1440
+ new HTTPErrorResponse(400, { message: "invalid_client" }, {}),
1441
+ );
1442
+
1443
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1444
+ variable: oauthVariable(),
1445
+ });
1446
+
1447
+ renderRefreshModal(outcome);
1448
+
1449
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1450
+ expect(confirm().description).toBe(
1451
+ 'OneUptime could not fetch an access token for "API_TOKEN": Request failed.',
1452
+ );
1453
+ expect(confirm().description).not.toContain(
1454
+ "asked your identity provider",
1455
+ );
1456
+ });
1457
+
1458
+ test("a variable with no id is refused without a request", async () => {
1459
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1460
+ variable: oauthVariable({ id: null }),
1461
+ });
1462
+
1463
+ renderRefreshModal(outcome);
1464
+
1465
+ expect(apiPost).not.toHaveBeenCalled();
1466
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1467
+ expect(confirm().description).toContain("no id");
1468
+ });
1469
+
1470
+ /*
1471
+ * Every way a fetch can fail, before and after a save, as the page shows
1472
+ * it. Some never reach the identity provider and the one that does
1473
+ * already names the token endpoint in its reason, so none may read as the
1474
+ * provider being asked, or saying no.
1475
+ */
1476
+ describe("never words a failure as the identity provider saying no", () => {
1477
+ type FailureCase = {
1478
+ label: string;
1479
+ // Sets up API.post; a variable with no id sends no request at all.
1480
+ arrange: () => void;
1481
+ variable: () => WorkflowVariable;
1482
+ // What this file's API.getFriendlyMessage mock makes of the failure.
1483
+ reason: string;
1484
+ };
1485
+
1486
+ const FAILURES: Array<FailureCase> = [
1487
+ {
1488
+ label: "a token endpoint's refusal (400)",
1489
+ arrange: (): void => {
1490
+ apiPost.mockResolvedValue(
1491
+ new HTTPErrorResponse(
1492
+ 400,
1493
+ {
1494
+ message:
1495
+ "The token endpoint refused the request (HTTP 400): invalid_grant - The refresh token has expired.",
1496
+ },
1497
+ {},
1498
+ ),
1499
+ );
1500
+ },
1501
+ variable: (): WorkflowVariable => {
1502
+ return oauthVariable();
1503
+ },
1504
+ reason: "Request failed.",
1505
+ },
1506
+ {
1507
+ label: "OneUptime's permission refusal (422)",
1508
+ arrange: (): void => {
1509
+ apiPost.mockResolvedValue(
1510
+ new HTTPErrorResponse(
1511
+ 422,
1512
+ {
1513
+ message:
1514
+ "You do not have permission to update this variable.",
1515
+ },
1516
+ {},
1517
+ ),
1518
+ );
1519
+ },
1520
+ variable: (): WorkflowVariable => {
1521
+ return oauthVariable();
1522
+ },
1523
+ reason: "Request failed.",
1524
+ },
1525
+ {
1526
+ label: "a variable that no longer exists (400)",
1527
+ arrange: (): void => {
1528
+ apiPost.mockResolvedValue(
1529
+ new HTTPErrorResponse(
1530
+ 400,
1531
+ {
1532
+ message:
1533
+ "Workflow variable not found, or you do not have access to it.",
1534
+ },
1535
+ {},
1536
+ ),
1537
+ );
1538
+ },
1539
+ variable: (): WorkflowVariable => {
1540
+ return oauthVariable();
1541
+ },
1542
+ reason: "Request failed.",
1543
+ },
1544
+ {
1545
+ label: "a server error (500)",
1546
+ arrange: (): void => {
1547
+ apiPost.mockResolvedValue(
1548
+ new HTTPErrorResponse(
1549
+ 500,
1550
+ { message: "Internal server error." },
1551
+ {},
1552
+ ),
1553
+ );
1554
+ },
1555
+ variable: (): WorkflowVariable => {
1556
+ return oauthVariable();
1557
+ },
1558
+ reason: "Request failed.",
1559
+ },
1560
+ {
1561
+ label: "a network error",
1562
+ arrange: (): void => {
1563
+ apiPost.mockImplementation(
1564
+ rejectWith(new Error("Network request failed.")),
1565
+ );
1566
+ },
1567
+ variable: (): WorkflowVariable => {
1568
+ return oauthVariable();
1569
+ },
1570
+ reason: "Network request failed.",
1571
+ },
1572
+ {
1573
+ label: "a variable with no id",
1574
+ arrange: (): void => {
1575
+ // Nothing to arrange: no request goes out.
1576
+ },
1577
+ variable: (): WorkflowVariable => {
1578
+ return oauthVariable({ id: null });
1579
+ },
1580
+ reason: "This variable has no id. Refresh the page and try again.",
1581
+ },
1582
+ ];
1583
+
1584
+ type FailureAfterSave = FailureCase & {
1585
+ savedWhat: string | undefined;
1586
+ saved: string;
1587
+ };
1588
+
1589
+ const FAILURES_WITH_AND_WITHOUT_A_SAVE: Array<FailureAfterSave> =
1590
+ FAILURES.flatMap((failure: FailureCase): Array<FailureAfterSave> => {
1591
+ return [
1592
+ { ...failure, savedWhat: undefined, saved: "nothing saved" },
1593
+ {
1594
+ ...failure,
1595
+ savedWhat: "Client secret",
1596
+ saved: "client secret saved",
1597
+ },
1598
+ ];
1599
+ });
1600
+
1601
+ test.each(FAILURES_WITH_AND_WITHOUT_A_SAVE)(
1602
+ "$label, $saved",
1603
+ async (entry: FailureAfterSave) => {
1604
+ entry.arrange();
1605
+
1606
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1607
+ variable: entry.variable(),
1608
+ savedWhat: entry.savedWhat,
1609
+ });
1610
+
1611
+ renderRefreshModal(outcome);
1612
+
1613
+ const prefix: string = entry.savedWhat
1614
+ ? `${entry.savedWhat} saved. `
1615
+ : "";
1616
+
1617
+ expect(confirm().title).toBe("Could Not Fetch an Access Token");
1618
+ expect(confirm().description).toBe(
1619
+ `${prefix}OneUptime could not fetch an access token for "API_TOKEN": ${entry.reason}`,
1620
+ );
1621
+ expect(confirm().description).not.toContain("said no");
1622
+ expect(confirm().description).not.toContain(
1623
+ "asked your identity provider",
1624
+ );
1625
+ expect(confirm().description).not.toContain("did not ask");
1626
+ },
1627
+ );
1628
+ });
1629
+ });
1630
+ });