@oneuptime/common 14.0.1 → 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 (1090) 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/KubernetesCluster.ts +429 -0
  7. package/Models/DatabaseModels/Monitor.ts +48 -0
  8. package/Models/DatabaseModels/Runner.ts +5 -4
  9. package/Models/DatabaseModels/RunnerJob.ts +66 -0
  10. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
  11. package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
  12. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
  13. package/Server/API/AIInvestigationAPI.ts +341 -0
  14. package/Server/API/AutoRemediationAPI.ts +184 -2
  15. package/Server/API/CommonAPI.ts +70 -0
  16. package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
  17. package/Server/API/MicrosoftTeamsAPI.ts +770 -315
  18. package/Server/API/MonitorAPI.ts +140 -0
  19. package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
  20. package/Server/API/SlackAPI.ts +447 -99
  21. package/Server/API/StatusPageAPI.ts +146 -26
  22. package/Server/API/TelemetryAPI.ts +216 -5
  23. package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
  24. package/Server/API/WorkflowVariableAPI.ts +156 -0
  25. package/Server/Infrastructure/GlobalCache.ts +35 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  32. package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
  33. package/Server/Middleware/TelemetryIngest.ts +47 -2
  34. package/Server/Middleware/UserAuthorization.ts +56 -2
  35. package/Server/Services/AIAgentService.ts +1 -0
  36. package/Server/Services/AccessTokenService.ts +121 -48
  37. package/Server/Services/AlertEpisodeMemberService.ts +9 -0
  38. package/Server/Services/AlertEpisodeService.ts +14 -1
  39. package/Server/Services/AlertService.ts +134 -22
  40. package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
  41. package/Server/Services/AutoRemediationRuleService.ts +118 -0
  42. package/Server/Services/BillingService.ts +1 -0
  43. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
  44. package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
  45. package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
  46. package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
  47. package/Server/Services/IncidentEpisodeService.ts +14 -1
  48. package/Server/Services/IncidentGroupingEngineService.ts +11 -0
  49. package/Server/Services/IncidentMemberService.ts +21 -0
  50. package/Server/Services/IncidentPublicNoteService.ts +63 -0
  51. package/Server/Services/IncidentService.ts +120 -20
  52. package/Server/Services/IncidentStateTimelineService.ts +15 -0
  53. package/Server/Services/IncidentTemplateService.ts +83 -3
  54. package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
  55. package/Server/Services/KubernetesClusterService.ts +1570 -1
  56. package/Server/Services/LogAggregationService.ts +14 -6
  57. package/Server/Services/MonitorService.ts +651 -52
  58. package/Server/Services/MonitorStatusTimelineService.ts +639 -2
  59. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
  60. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
  61. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
  62. package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
  63. package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
  64. package/Server/Services/OnCallSetupReminderService.ts +1 -0
  65. package/Server/Services/ProbeService.ts +7 -1
  66. package/Server/Services/ProjectService.ts +11 -1
  67. package/Server/Services/RunbookCredentialService.ts +26 -1
  68. package/Server/Services/RunbookSecretService.ts +36 -0
  69. package/Server/Services/RunnerJobService.ts +941 -23
  70. package/Server/Services/RunnerService.ts +439 -6
  71. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
  72. package/Server/Services/ScheduledMaintenanceService.ts +124 -19
  73. package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
  74. package/Server/Services/ServiceLevelObjectiveService.ts +14 -1
  75. package/Server/Services/StatusPagePrivateUserService.ts +1 -0
  76. package/Server/Services/StatusPageService.ts +301 -74
  77. package/Server/Services/StatusPageSubscriberService.ts +4 -0
  78. package/Server/Services/TeamMemberService.ts +309 -7
  79. package/Server/Services/TraceAggregationService.ts +10 -6
  80. package/Server/Services/UserEmailService.ts +1 -0
  81. package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
  82. package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
  83. package/Server/Services/UserNotificationRuleService.ts +4 -0
  84. package/Server/Services/UserService.ts +122 -1
  85. package/Server/Services/WorkflowVariableService.ts +593 -8
  86. package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
  87. package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
  88. package/Server/Types/Database/QueryHelper.ts +22 -0
  89. package/Server/Types/Markdown.ts +502 -27
  90. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
  91. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
  92. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
  93. package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
  94. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
  95. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
  96. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
  97. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
  98. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
  99. package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
  100. package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
  101. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
  102. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
  103. package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
  104. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
  105. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
  106. package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
  107. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
  108. package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
  109. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
  110. package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
  111. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
  112. package/Server/Utils/PushNotificationUtil.ts +45 -0
  113. package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
  114. package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
  115. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
  116. package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
  117. package/Server/Utils/StartServer.ts +4 -3
  118. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
  119. package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
  120. package/Server/Utils/UserPermission/UserPermission.ts +16 -0
  121. package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
  122. package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
  123. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
  124. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
  125. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
  126. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
  127. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
  128. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
  129. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
  130. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
  131. package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
  132. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
  133. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
  134. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
  135. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
  136. package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
  137. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
  138. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
  139. package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
  140. package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
  141. package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
  142. package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  143. package/Server/Utils/Workspace/Workspace.ts +171 -54
  144. package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
  145. package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
  146. package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
  147. package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
  148. package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
  149. package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
  150. package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
  151. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
  152. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
  153. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
  154. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
  155. package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
  156. package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
  157. package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
  158. package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
  159. package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
  160. package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
  161. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +218 -0
  162. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
  163. package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
  164. package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
  165. package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
  166. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
  167. package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
  168. package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
  169. package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
  170. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +12 -0
  171. package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
  172. package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
  173. package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
  174. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
  175. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
  176. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
  177. package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
  178. package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
  179. package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
  180. package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
  181. package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
  182. package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
  183. package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
  184. package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
  185. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
  186. package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
  187. package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
  188. package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
  189. package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
  190. package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
  191. package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
  192. package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
  193. package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
  194. package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
  195. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
  196. package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
  197. package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
  198. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
  199. package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
  200. package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
  201. package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
  202. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
  203. package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
  204. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
  205. package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
  206. package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
  207. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
  208. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
  209. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
  210. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
  211. package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
  212. package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
  213. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
  214. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
  215. package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
  216. package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
  217. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
  218. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
  219. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
  220. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
  221. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
  222. package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
  223. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
  224. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
  225. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
  226. package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
  227. package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
  228. package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
  229. package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
  230. package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
  231. package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
  232. package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
  233. package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
  234. package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
  235. package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
  236. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
  237. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
  238. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
  239. package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
  240. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
  241. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
  242. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
  243. package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
  244. package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
  245. package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
  246. package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
  247. package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
  248. package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
  249. package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
  250. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
  251. package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
  252. package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
  253. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
  254. package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
  255. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
  256. package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
  257. package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
  258. package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
  259. package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
  260. package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
  261. package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
  262. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
  263. package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
  264. package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
  265. package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
  266. package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
  267. package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
  268. package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
  269. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
  270. package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
  271. package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
  272. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
  273. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
  274. package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
  275. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
  276. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
  277. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
  278. package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
  279. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
  280. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
  281. package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
  282. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
  283. package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
  284. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
  285. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
  286. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
  287. package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
  288. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
  289. package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
  290. package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
  291. package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
  292. package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
  293. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
  294. package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
  295. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
  296. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
  297. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
  298. package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
  299. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
  300. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
  301. package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
  302. package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
  303. package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
  304. package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
  305. package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
  306. package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
  307. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
  308. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
  309. package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
  310. package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
  311. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
  312. package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
  313. package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
  314. package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
  315. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
  316. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
  317. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +9 -1
  318. package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
  319. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
  320. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
  321. package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
  322. package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
  323. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
  324. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
  325. package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
  326. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
  327. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +5 -0
  328. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +12 -0
  329. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
  330. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
  331. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
  332. package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
  333. package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
  334. package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
  335. package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
  336. package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
  337. package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
  338. package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
  339. package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
  340. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
  341. package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
  342. package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
  343. package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
  344. package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
  345. package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
  346. package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
  347. package/Tests/Server/Types/Markdown.test.ts +1033 -0
  348. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
  349. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
  350. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
  351. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
  352. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
  353. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
  354. package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
  355. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
  356. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
  357. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
  358. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
  359. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
  360. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
  361. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
  362. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
  363. package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
  364. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
  365. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
  366. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
  367. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
  368. package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
  369. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
  370. package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
  371. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
  372. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +55 -0
  373. package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
  374. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
  375. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
  376. package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
  377. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
  378. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
  379. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
  380. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
  381. package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
  382. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
  383. package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
  384. package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
  385. package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
  386. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
  387. package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
  388. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
  389. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
  390. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
  391. package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
  392. package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
  393. package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
  394. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
  395. package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
  396. package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
  397. package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
  398. package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
  399. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
  400. package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
  401. package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
  402. package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
  403. package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
  404. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
  405. package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
  406. package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
  407. package/Tests/Types/DateUserTimezone.test.ts +177 -4
  408. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
  409. package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
  410. package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
  411. package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
  412. package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
  413. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
  414. package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
  415. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
  416. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
  417. package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
  418. package/Tests/Types/Timezone.test.ts +5 -0
  419. package/Tests/Types/TimezoneAlias.test.ts +1034 -0
  420. package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
  421. package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
  422. package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
  423. package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
  424. package/Tests/Types/Workflow/Templates.test.ts +79 -4
  425. package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
  426. package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
  427. package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
  428. package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
  429. package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
  430. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
  431. package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
  432. package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
  433. package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
  434. package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
  435. package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
  436. package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
  437. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
  438. package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
  439. package/Tests/UI/Components/Dropdown.test.tsx +999 -2
  440. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
  441. package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
  442. package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
  443. package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
  444. package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
  445. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
  446. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
  447. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
  448. package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
  449. package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
  450. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
  451. package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
  452. package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
  453. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
  454. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
  455. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
  456. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
  457. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
  458. package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
  459. package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
  460. package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
  461. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
  462. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
  463. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
  464. package/Tests/UI/Utils/Timezone.test.ts +747 -33
  465. package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
  466. package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
  467. package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
  468. package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
  469. package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
  470. package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
  471. package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
  472. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
  473. package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
  474. package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
  475. package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
  476. package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
  477. package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
  478. package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
  479. package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
  480. package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
  481. package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
  482. package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
  483. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
  484. package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
  485. package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
  486. package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
  487. package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
  488. package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
  489. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
  490. package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
  491. package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
  492. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
  493. package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
  494. package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
  495. package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
  496. package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
  497. package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
  498. package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
  499. package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
  500. package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
  501. package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
  502. package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
  503. package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
  504. package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
  505. package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
  506. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
  507. package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
  508. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
  509. package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
  510. package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
  511. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
  512. package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
  513. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
  514. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
  515. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
  516. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
  517. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
  518. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
  519. package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
  520. package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
  521. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
  522. package/Types/Date.ts +121 -7
  523. package/Types/Email/EmailMessage.ts +8 -0
  524. package/Types/Email/EmailTemplateType.ts +1 -0
  525. package/Types/Exception/ExceptionMessages.ts +1 -0
  526. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
  527. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
  528. package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
  529. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
  530. package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
  531. package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
  532. package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
  533. package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
  534. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
  535. package/Types/Rum/SessionReplay.ts +55 -2
  536. package/Types/Rum/SessionReplayApi.ts +44 -1
  537. package/Types/Rum/UserFlow.ts +187 -0
  538. package/Types/Runbook/RunbookStepType.ts +10 -0
  539. package/Types/Runbook/RunnerJobOrigin.ts +15 -0
  540. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
  541. package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
  542. package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
  543. package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
  544. package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
  545. package/Types/Timezone.ts +5 -0
  546. package/Types/TimezoneAlias.ts +385 -0
  547. package/Types/Workflow/Templates.ts +3041 -2
  548. package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
  549. package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
  550. package/Typings/Index.d.ts +24 -0
  551. package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
  552. package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
  553. package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
  554. package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
  555. package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
  556. package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
  557. package/UI/Components/Calendar/Calendar.css +83 -0
  558. package/UI/Components/Calendar/Calendar.tsx +136 -7
  559. package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
  560. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
  561. package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
  562. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
  563. package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
  564. package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
  565. package/UI/Components/Dropdown/Dropdown.tsx +58 -9
  566. package/UI/Components/Forms/Fields/FormField.tsx +49 -14
  567. package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
  568. package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
  569. package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
  570. package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
  571. package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
  572. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
  573. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
  574. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
  575. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
  576. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
  577. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
  578. package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
  579. package/UI/Components/ModelTable/BaseModelTable.tsx +66 -14
  580. package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
  581. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
  582. package/UI/Components/Page/ModelPage.tsx +59 -3
  583. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
  584. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
  585. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
  586. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
  587. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
  588. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
  589. package/UI/Utils/Timezone.ts +69 -28
  590. package/Utils/AI/InvestigationReport.ts +195 -25
  591. package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
  592. package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
  593. package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
  594. package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
  595. package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
  596. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
  597. package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
  598. package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
  599. package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
  600. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
  601. package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
  602. package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
  603. package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
  604. package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
  605. package/Utils/Rum/SessionIdentity.ts +44 -0
  606. package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
  607. package/Utils/Rum/UserFlow.ts +1527 -0
  608. package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
  609. package/Utils/StatusPage/ResourceUptime.ts +99 -0
  610. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
  611. package/Utils/Telemetry/AttributesJSON.ts +367 -0
  612. package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
  613. package/Utils/Uptime/UptimeUtil.ts +122 -38
  614. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
  615. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  616. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  617. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  618. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
  619. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  620. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
  621. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  622. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
  623. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  624. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
  625. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  626. package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
  627. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  628. package/build/dist/Models/DatabaseModels/Runner.js +4 -4
  629. package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
  630. package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
  631. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  632. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
  633. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  634. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
  635. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  636. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
  637. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  638. package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
  639. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  640. package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
  641. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  642. package/build/dist/Server/API/CommonAPI.js +49 -0
  643. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  644. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
  645. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
  646. package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
  647. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  648. package/build/dist/Server/API/MonitorAPI.js +107 -1
  649. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  650. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
  651. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
  652. package/build/dist/Server/API/SlackAPI.js +322 -78
  653. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  654. package/build/dist/Server/API/StatusPageAPI.js +123 -17
  655. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  656. package/build/dist/Server/API/TelemetryAPI.js +144 -5
  657. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  658. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
  659. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
  660. package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
  661. package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
  662. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  663. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  664. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
  665. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
  666. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
  667. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
  668. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
  669. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
  670. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
  671. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
  672. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
  673. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
  674. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  675. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  676. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
  677. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  678. package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
  679. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  680. package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
  681. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  682. package/build/dist/Server/Services/AIAgentService.js +1 -0
  683. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  684. package/build/dist/Server/Services/AccessTokenService.js +87 -42
  685. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  686. package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
  687. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
  688. package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
  689. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  690. package/build/dist/Server/Services/AlertService.js +110 -23
  691. package/build/dist/Server/Services/AlertService.js.map +1 -1
  692. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
  693. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  694. package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
  695. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  696. package/build/dist/Server/Services/BillingService.js +1 -0
  697. package/build/dist/Server/Services/BillingService.js.map +1 -1
  698. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
  699. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  700. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
  701. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  702. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
  703. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  704. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
  705. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
  706. package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
  707. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  708. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
  709. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  710. package/build/dist/Server/Services/IncidentMemberService.js +14 -0
  711. package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
  712. package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
  713. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  714. package/build/dist/Server/Services/IncidentService.js +99 -21
  715. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  716. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  717. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  718. package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
  719. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  720. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
  721. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
  722. package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
  723. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  724. package/build/dist/Server/Services/LogAggregationService.js +14 -6
  725. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  726. package/build/dist/Server/Services/MonitorService.js +487 -48
  727. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  728. package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
  729. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  730. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
  731. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  732. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
  733. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  734. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
  735. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  736. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
  737. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  738. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
  739. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
  740. package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
  741. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
  742. package/build/dist/Server/Services/ProbeService.js +7 -1
  743. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  744. package/build/dist/Server/Services/ProjectService.js +11 -1
  745. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  746. package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
  747. package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
  748. package/build/dist/Server/Services/RunbookSecretService.js +44 -0
  749. package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
  750. package/build/dist/Server/Services/RunnerJobService.js +641 -21
  751. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  752. package/build/dist/Server/Services/RunnerService.js +344 -5
  753. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  754. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
  755. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  756. package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
  757. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  758. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
  759. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  760. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +12 -1
  761. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  762. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
  763. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  764. package/build/dist/Server/Services/StatusPageService.js +230 -32
  765. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  766. package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
  767. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  768. package/build/dist/Server/Services/TeamMemberService.js +270 -11
  769. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  770. package/build/dist/Server/Services/TraceAggregationService.js +10 -6
  771. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  772. package/build/dist/Server/Services/UserEmailService.js +1 -0
  773. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  774. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
  775. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
  776. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
  777. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
  778. package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
  779. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  780. package/build/dist/Server/Services/UserService.js +107 -1
  781. package/build/dist/Server/Services/UserService.js.map +1 -1
  782. package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
  783. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  784. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
  785. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  786. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
  787. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  788. package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
  789. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  790. package/build/dist/Server/Types/Markdown.js +394 -27
  791. package/build/dist/Server/Types/Markdown.js.map +1 -1
  792. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
  793. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
  794. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
  795. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
  796. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
  797. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
  798. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
  799. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
  800. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
  801. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  802. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
  803. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  804. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
  805. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  806. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
  807. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  808. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
  809. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  810. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
  811. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  812. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
  813. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  814. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
  815. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  816. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
  817. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  818. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
  819. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
  820. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
  821. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  822. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
  823. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  824. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
  825. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  826. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
  827. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  828. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
  829. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  830. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
  831. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  832. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
  833. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
  834. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
  835. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
  836. package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
  837. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  838. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
  839. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  840. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
  841. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
  842. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
  843. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  844. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
  845. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
  846. package/build/dist/Server/Utils/StartServer.js +4 -3
  847. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  848. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
  849. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
  850. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
  851. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
  852. package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
  853. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  854. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
  855. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
  856. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
  857. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
  858. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
  859. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  860. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
  861. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  862. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
  863. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  864. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
  865. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  866. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
  867. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
  868. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
  869. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  870. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
  871. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  872. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
  873. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
  874. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
  875. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
  876. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
  877. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  878. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
  879. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  880. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
  881. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  882. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
  883. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  884. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
  885. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
  886. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
  887. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  888. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
  889. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  890. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
  891. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
  892. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
  893. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
  894. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
  895. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  896. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  897. package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
  898. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  899. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
  900. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
  901. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
  902. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  903. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
  904. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
  905. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
  906. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
  907. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
  908. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
  909. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
  910. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  911. package/build/dist/Types/Date.js +97 -7
  912. package/build/dist/Types/Date.js.map +1 -1
  913. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  914. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  915. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  916. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  917. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
  918. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
  919. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
  920. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
  921. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
  922. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
  923. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
  924. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
  925. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
  926. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  927. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
  928. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
  929. package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
  930. package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
  931. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
  932. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  933. package/build/dist/Types/Rum/SessionReplay.js +52 -2
  934. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  935. package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
  936. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  937. package/build/dist/Types/Rum/UserFlow.js +115 -0
  938. package/build/dist/Types/Rum/UserFlow.js.map +1 -0
  939. package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
  940. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  941. package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
  942. package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
  943. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
  944. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  945. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
  946. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
  947. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
  948. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
  949. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
  950. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  951. package/build/dist/Types/Timezone.js +5 -0
  952. package/build/dist/Types/Timezone.js.map +1 -1
  953. package/build/dist/Types/TimezoneAlias.js +340 -0
  954. package/build/dist/Types/TimezoneAlias.js.map +1 -0
  955. package/build/dist/Types/Workflow/Templates.js +2694 -2
  956. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  957. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
  958. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
  959. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
  960. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
  961. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
  962. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
  963. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
  964. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
  965. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
  966. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
  967. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
  968. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
  969. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
  970. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
  971. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
  972. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
  973. package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
  974. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  975. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
  976. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
  977. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
  978. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  979. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
  980. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
  981. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
  982. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
  983. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
  984. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
  985. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
  986. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
  987. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
  988. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  989. package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
  990. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  991. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
  992. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  993. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
  994. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  995. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
  996. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
  997. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  998. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
  999. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
  1000. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
  1001. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  1002. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
  1003. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  1004. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  1005. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1006. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
  1007. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  1008. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
  1009. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  1010. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
  1011. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  1012. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
  1013. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
  1014. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -8
  1015. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1016. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
  1017. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  1018. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
  1019. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  1020. package/build/dist/UI/Components/Page/ModelPage.js +37 -3
  1021. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  1022. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
  1023. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1024. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
  1025. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  1026. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  1027. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1028. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
  1029. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  1030. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
  1031. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  1032. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
  1033. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
  1034. package/build/dist/UI/Utils/Timezone.js +52 -17
  1035. package/build/dist/UI/Utils/Timezone.js.map +1 -1
  1036. package/build/dist/Utils/AI/InvestigationReport.js +116 -21
  1037. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1038. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
  1039. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
  1040. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
  1041. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
  1042. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
  1043. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
  1044. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
  1045. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
  1046. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
  1047. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
  1048. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
  1049. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
  1050. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
  1051. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
  1052. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
  1053. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
  1054. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
  1055. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
  1056. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
  1057. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
  1058. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
  1059. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
  1060. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
  1061. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
  1062. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
  1063. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
  1064. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
  1065. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
  1066. package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
  1067. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  1068. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
  1069. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
  1070. package/build/dist/Utils/Rum/UserFlow.js +941 -0
  1071. package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
  1072. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
  1073. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
  1074. package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
  1075. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  1076. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  1077. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
  1078. package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
  1079. package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
  1080. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
  1081. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
  1082. package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
  1083. package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
  1084. package/jest.config.json +2 -1
  1085. package/package.json +2 -1
  1086. package/tsconfig.tests.json +36 -0
  1087. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
  1088. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
  1089. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
  1090. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
@@ -0,0 +1,1543 @@
1
+ import {
2
+ afterEach,
3
+ beforeEach,
4
+ describe,
5
+ expect,
6
+ jest,
7
+ test,
8
+ } from "@jest/globals";
9
+
10
+ /*
11
+ * The pure half of the workflow variables pages: where the list and a
12
+ * variable's own page live, how a workflow refers to a variable, the two create
13
+ * forms (the Create button's static-only form and the More menu's OAuth 2.0
14
+ * form), the OAuth settings the variable page edits in place, and the token
15
+ * refresh call with the words its result is shown in.
16
+ *
17
+ * Nothing here renders. The project id is pinned through ProjectUtil, the
18
+ * refresh endpoint through API.post and the tenant header through
19
+ * ModelAPI.getCommonHeaders; API.getFriendlyMessage stays real so an identity
20
+ * provider's error reads exactly the way the dashboard would show it.
21
+ */
22
+
23
+ const PROJECT_ID_STRING: string = "8f2a1b3c-4d5e-4f60-9a7b-1c2d3e4f5a6b";
24
+
25
+ jest.mock("../../../UI/Utils/Project", () => {
26
+ return {
27
+ __esModule: true,
28
+ default: {
29
+ getCurrentProjectId: (): unknown => {
30
+ return PROJECT_ID;
31
+ },
32
+ },
33
+ };
34
+ });
35
+
36
+ const COMMON_HEADERS: Record<string, string> = {
37
+ tenantid: PROJECT_ID_STRING,
38
+ "x-test-header": "common",
39
+ };
40
+
41
+ const getCommonHeaders: ReturnType<
42
+ typeof jest.fn<() => Record<string, string>>
43
+ > = jest.fn<() => Record<string, string>>();
44
+
45
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
46
+ return {
47
+ __esModule: true,
48
+ default: {
49
+ getCommonHeaders: (): Record<string, string> => {
50
+ return getCommonHeaders();
51
+ },
52
+ },
53
+ };
54
+ });
55
+
56
+ const apiPost: ReturnType<
57
+ typeof jest.fn<(options: unknown) => Promise<unknown>>
58
+ > = jest.fn<(options: unknown) => Promise<unknown>>();
59
+
60
+ jest.mock("../../../UI/Utils/API/API", () => {
61
+ const actual: { default: { getFriendlyMessage: (err: unknown) => string } } =
62
+ jest.requireActual("../../../UI/Utils/API/API") as {
63
+ default: { getFriendlyMessage: (err: unknown) => string };
64
+ };
65
+
66
+ return {
67
+ __esModule: true,
68
+ default: {
69
+ post: (options: unknown): Promise<unknown> => {
70
+ return apiPost(options);
71
+ },
72
+ getFriendlyMessage: (err: unknown): string => {
73
+ return actual.default.getFriendlyMessage(err);
74
+ },
75
+ },
76
+ };
77
+ });
78
+
79
+ import {
80
+ CLIENT_AUTHENTICATION_DROPDOWN_OPTIONS,
81
+ GRANT_TYPE_DROPDOWN_OPTIONS,
82
+ OAUTH_VARIABLE_FORM_STEPS,
83
+ OAuthTokenRefreshResult,
84
+ SECRET_TOGGLE_DESCRIPTION,
85
+ TokenRefreshOutcome,
86
+ fetchTokenRefreshOutcome,
87
+ getClientAuthenticationLabel,
88
+ getOAuthSettingsFormFields,
89
+ getOAuthVariableCreateFormFields,
90
+ getStaticVariableCreateFormFields,
91
+ getTokenRefreshDescription,
92
+ getTokenRefreshTitle,
93
+ getVariableTypeLabel,
94
+ getWorkflowVariableReference,
95
+ getWorkflowVariableViewRoute,
96
+ getWorkflowVariablesListRoute,
97
+ refreshWorkflowVariableOAuthToken,
98
+ } from "../../../../App/FeatureSet/Dashboard/src/Utils/Workflow/WorkflowVariableUtil";
99
+ import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
100
+ import RouteMap from "../../../../App/FeatureSet/Dashboard/src/Utils/RouteMap";
101
+ import WorkflowVariable from "../../../Models/DatabaseModels/WorkflowVariable";
102
+ import HTTPErrorResponse from "../../../Types/API/HTTPErrorResponse";
103
+ import HTTPResponse from "../../../Types/API/HTTPResponse";
104
+ import Route from "../../../Types/API/Route";
105
+ import URL from "../../../Types/API/URL";
106
+ import OneUptimeDate from "../../../Types/Date";
107
+ import { JSONObject } from "../../../Types/JSON";
108
+ import ObjectID from "../../../Types/ObjectID";
109
+ import {
110
+ OAuth2ClientAuthenticationMethod,
111
+ OAuth2GrantType,
112
+ WorkflowVariableType,
113
+ } from "../../../Types/Workflow/WorkflowVariableOAuth";
114
+ import { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
115
+ import { ModelField } from "../../../UI/Components/Forms/ModelForm";
116
+ import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
117
+ import { FormStep } from "../../../UI/Components/Forms/Types/FormStep";
118
+ import FormValues from "../../../UI/Components/Forms/Types/FormValues";
119
+ import { APP_API_URL } from "../../../UI/Config";
120
+
121
+ const PROJECT_ID: ObjectID = new ObjectID(PROJECT_ID_STRING);
122
+ const WORKFLOW_ID: ObjectID = new ObjectID(
123
+ "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
124
+ );
125
+ const VARIABLE_ID: ObjectID = new ObjectID(
126
+ "9c4a2b1e-7d3f-4e8a-9b6c-1f2e3d4c5b6a",
127
+ );
128
+ const EXPIRES_AT_ISO: string = "2026-10-01T10:30:00.000Z";
129
+
130
+ type CapturedPost = {
131
+ url: URL;
132
+ headers?: Record<string, string> | undefined;
133
+ data?: unknown;
134
+ };
135
+
136
+ type FieldList = Array<ModelField<WorkflowVariable>>;
137
+
138
+ // The one column a form field writes, e.g. "oauthClientSecret".
139
+ function keyOf(field: ModelField<WorkflowVariable>): string {
140
+ return Object.keys(field.field || {})[0] || "";
141
+ }
142
+
143
+ function keysOf(fields: FieldList): Array<string> {
144
+ return fields.map((field: ModelField<WorkflowVariable>): string => {
145
+ return keyOf(field);
146
+ });
147
+ }
148
+
149
+ function fieldFor(
150
+ fields: FieldList,
151
+ key: string,
152
+ ): ModelField<WorkflowVariable> {
153
+ const found: ModelField<WorkflowVariable> | undefined = fields.find(
154
+ (field: ModelField<WorkflowVariable>): boolean => {
155
+ return keyOf(field) === key;
156
+ },
157
+ );
158
+
159
+ if (!found) {
160
+ throw new Error(
161
+ `No form field writes "${key}". Fields: ${keysOf(fields).join(", ")}`,
162
+ );
163
+ }
164
+
165
+ return found;
166
+ }
167
+
168
+ function formValues(values: JSONObject): FormValues<WorkflowVariable> {
169
+ return values as unknown as FormValues<WorkflowVariable>;
170
+ }
171
+
172
+ function isRequired(
173
+ field: ModelField<WorkflowVariable>,
174
+ values: JSONObject,
175
+ ): boolean {
176
+ if (typeof field.required === "function") {
177
+ return field.required(formValues(values));
178
+ }
179
+
180
+ return Boolean(field.required);
181
+ }
182
+
183
+ function makeVariable(data: {
184
+ id?: ObjectID | undefined;
185
+ name?: string | undefined;
186
+ variableType?: WorkflowVariableType | undefined;
187
+ }): WorkflowVariable {
188
+ const variable: WorkflowVariable = new WorkflowVariable();
189
+
190
+ if (data.id) {
191
+ variable.id = data.id;
192
+ }
193
+
194
+ if (data.name !== undefined) {
195
+ variable.name = data.name;
196
+ }
197
+
198
+ if (data.variableType) {
199
+ variable.variableType = data.variableType;
200
+ }
201
+
202
+ return variable;
203
+ }
204
+
205
+ function lastPost(): CapturedPost {
206
+ const call: Array<unknown> | undefined =
207
+ apiPost.mock.calls[apiPost.mock.calls.length - 1];
208
+
209
+ if (!call) {
210
+ throw new Error("API.post was not called.");
211
+ }
212
+
213
+ return call[0] as CapturedPost;
214
+ }
215
+
216
+ function expectedRefreshUrl(variableId: ObjectID): string {
217
+ return URL.fromURL(APP_API_URL)
218
+ .addRoute(`/workflow-variable/${variableId.toString()}/refresh-oauth-token`)
219
+ .toString();
220
+ }
221
+
222
+ function succeedWith(data: JSONObject): void {
223
+ apiPost.mockResolvedValue(new HTTPResponse<JSONObject>(200, data, {}));
224
+ }
225
+
226
+ function failWith(statusCode: number, data: JSONObject): void {
227
+ apiPost.mockResolvedValue(new HTTPErrorResponse(statusCode, data, {}));
228
+ }
229
+
230
+ beforeEach(() => {
231
+ apiPost.mockReset();
232
+ getCommonHeaders.mockReset();
233
+ getCommonHeaders.mockReturnValue(COMMON_HEADERS);
234
+ });
235
+
236
+ afterEach(() => {
237
+ jest.clearAllMocks();
238
+ });
239
+
240
+ describe("getWorkflowVariableReference", () => {
241
+ test("refers to a global variable under `global`", () => {
242
+ expect(
243
+ getWorkflowVariableReference({ name: "API_KEY", isGlobal: true }),
244
+ ).toBe("{{global.variables.API_KEY}}");
245
+ });
246
+
247
+ test("refers to a workflow's own variable under `local`", () => {
248
+ expect(
249
+ getWorkflowVariableReference({ name: "API_KEY", isGlobal: false }),
250
+ ).toBe("{{local.variables.API_KEY}}");
251
+ });
252
+
253
+ test("keeps the name exactly as typed", () => {
254
+ expect(
255
+ getWorkflowVariableReference({ name: "Api_Key_2", isGlobal: true }),
256
+ ).toBe("{{global.variables.Api_Key_2}}");
257
+ });
258
+ });
259
+
260
+ describe("getVariableTypeLabel", () => {
261
+ test("labels an OAuth 2.0 variable", () => {
262
+ expect(
263
+ getVariableTypeLabel(
264
+ makeVariable({ variableType: WorkflowVariableType.OAuth2 }),
265
+ ),
266
+ ).toBe("OAuth 2.0");
267
+ });
268
+
269
+ test("labels a static variable", () => {
270
+ expect(
271
+ getVariableTypeLabel(
272
+ makeVariable({ variableType: WorkflowVariableType.Static }),
273
+ ),
274
+ ).toBe("Static");
275
+ });
276
+
277
+ // Rows saved before OAuth 2.0 variables existed carry no type at all.
278
+ test("treats a variable without a type as static", () => {
279
+ expect(getVariableTypeLabel(makeVariable({}))).toBe("Static");
280
+ });
281
+ });
282
+
283
+ describe("getWorkflowVariablesListRoute", () => {
284
+ test("a global variable belongs on Workflows > Global Variables", () => {
285
+ expect(getWorkflowVariablesListRoute().toString()).toBe(
286
+ `/dashboard/${PROJECT_ID_STRING}/workflows/variables`,
287
+ );
288
+ });
289
+
290
+ test("an undefined workflow id also means the global list", () => {
291
+ expect(getWorkflowVariablesListRoute(undefined).toString()).toBe(
292
+ `/dashboard/${PROJECT_ID_STRING}/workflows/variables`,
293
+ );
294
+ });
295
+
296
+ test("a local variable belongs on its workflow's Variables page", () => {
297
+ expect(getWorkflowVariablesListRoute(WORKFLOW_ID).toString()).toBe(
298
+ `/dashboard/${PROJECT_ID_STRING}/workflows/${WORKFLOW_ID.toString()}/variables`,
299
+ );
300
+ });
301
+
302
+ // populateRouteParams must copy the pattern, not fill it in place.
303
+ test("leaves the shared route patterns untouched", () => {
304
+ getWorkflowVariablesListRoute(WORKFLOW_ID);
305
+ getWorkflowVariablesListRoute();
306
+
307
+ expect(RouteMap[PageMap.WORKFLOW_VARIABLES]?.toString()).toBe(
308
+ "/dashboard/:projectId/workflows/:id/variables",
309
+ );
310
+ expect(RouteMap[PageMap.WORKFLOWS_VARIABLES]?.toString()).toBe(
311
+ "/dashboard/:projectId/workflows/variables",
312
+ );
313
+ });
314
+ });
315
+
316
+ describe("getWorkflowVariableViewRoute", () => {
317
+ test("a global variable's page sits under Workflows > Global Variables", () => {
318
+ const route: Route = getWorkflowVariableViewRoute({
319
+ variableId: VARIABLE_ID,
320
+ });
321
+
322
+ expect(route.toString()).toBe(
323
+ `/dashboard/${PROJECT_ID_STRING}/workflows/variables/${VARIABLE_ID.toString()}`,
324
+ );
325
+ });
326
+
327
+ test("a local variable's page sits under the workflow it belongs to", () => {
328
+ const route: Route = getWorkflowVariableViewRoute({
329
+ variableId: VARIABLE_ID,
330
+ workflowId: WORKFLOW_ID,
331
+ });
332
+
333
+ expect(route.toString()).toBe(
334
+ `/dashboard/${PROJECT_ID_STRING}/workflows/${WORKFLOW_ID.toString()}/variables/${VARIABLE_ID.toString()}`,
335
+ );
336
+ });
337
+
338
+ /*
339
+ * The local route has two ids. Swapping them would open a workflow that does
340
+ * not exist and a variable that is not on it.
341
+ */
342
+ test("puts the workflow id before the variable id on a local page", () => {
343
+ const segments: Array<string> = getWorkflowVariableViewRoute({
344
+ variableId: VARIABLE_ID,
345
+ workflowId: WORKFLOW_ID,
346
+ })
347
+ .toString()
348
+ .split("/");
349
+
350
+ expect(segments.indexOf(WORKFLOW_ID.toString())).toBe(4);
351
+ expect(segments.indexOf(VARIABLE_ID.toString())).toBe(6);
352
+ expect(segments[5]).toBe("variables");
353
+ });
354
+
355
+ test("never leaves a route placeholder behind", () => {
356
+ const routes: Array<string> = [
357
+ getWorkflowVariableViewRoute({ variableId: VARIABLE_ID }).toString(),
358
+ getWorkflowVariableViewRoute({
359
+ variableId: VARIABLE_ID,
360
+ workflowId: WORKFLOW_ID,
361
+ }).toString(),
362
+ getWorkflowVariablesListRoute().toString(),
363
+ getWorkflowVariablesListRoute(WORKFLOW_ID).toString(),
364
+ ];
365
+
366
+ routes.forEach((route: string) => {
367
+ expect(route).not.toContain(":");
368
+ });
369
+ });
370
+
371
+ test("leaves the shared route patterns untouched", () => {
372
+ getWorkflowVariableViewRoute({ variableId: VARIABLE_ID });
373
+ getWorkflowVariableViewRoute({
374
+ variableId: VARIABLE_ID,
375
+ workflowId: WORKFLOW_ID,
376
+ });
377
+
378
+ expect(RouteMap[PageMap.WORKFLOWS_VARIABLE_VIEW]?.toString()).toBe(
379
+ "/dashboard/:projectId/workflows/variables/:id",
380
+ );
381
+ expect(RouteMap[PageMap.WORKFLOW_VARIABLE_VIEW]?.toString()).toBe(
382
+ "/dashboard/:projectId/workflows/:id/variables/:subModelId",
383
+ );
384
+ });
385
+ });
386
+
387
+ describe("getTokenRefreshTitle", () => {
388
+ test("says the token was fetched when there is no error", () => {
389
+ expect(
390
+ getTokenRefreshTitle({
391
+ variableName: "API_TOKEN",
392
+ expiresAt: new Date(EXPIRES_AT_ISO),
393
+ }),
394
+ ).toBe("Access Token Fetched");
395
+ });
396
+
397
+ test("says it could not fetch one when the provider refused", () => {
398
+ expect(
399
+ getTokenRefreshTitle({
400
+ variableName: "API_TOKEN",
401
+ error: "invalid_client",
402
+ }),
403
+ ).toBe("Could Not Fetch an Access Token");
404
+ });
405
+
406
+ // A pending outcome for a save that also failed still leads with the failure.
407
+ test("leads with the failure even after a save", () => {
408
+ expect(
409
+ getTokenRefreshTitle({
410
+ variableName: "API_TOKEN",
411
+ savedWhat: "Client secret",
412
+ error: "invalid_client",
413
+ }),
414
+ ).toBe("Could Not Fetch an Access Token");
415
+ });
416
+
417
+ /*
418
+ * Whoever turned the request down - OneUptime or the identity provider - no
419
+ * token was fetched, so the title is the same.
420
+ */
421
+ test("says it could not fetch one when OneUptime refused", () => {
422
+ expect(
423
+ getTokenRefreshTitle({
424
+ variableName: "API_TOKEN",
425
+ error: "You do not have permission to update this variable.",
426
+ }),
427
+ ).toBe("Could Not Fetch an Access Token");
428
+ expect(
429
+ getTokenRefreshTitle({
430
+ variableName: "API_TOKEN",
431
+ savedWhat: "Client secret",
432
+ error: "You do not have permission to update this variable.",
433
+ }),
434
+ ).toBe("Could Not Fetch an Access Token");
435
+ });
436
+ });
437
+
438
+ describe("getTokenRefreshDescription", () => {
439
+ test("says until when a fetched token is valid", () => {
440
+ const expiresAt: Date = new Date(EXPIRES_AT_ISO);
441
+
442
+ expect(
443
+ getTokenRefreshDescription({ variableName: "API_TOKEN", expiresAt }),
444
+ ).toBe(
445
+ `OneUptime fetched a new access token for "API_TOKEN" from your identity provider. It is valid until ${OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
446
+ expiresAt,
447
+ )}, and a new one is fetched automatically whenever a workflow is about to use it after that.`,
448
+ );
449
+ });
450
+
451
+ test("explains what happens when the provider gave no expiry", () => {
452
+ const expected: string =
453
+ 'OneUptime fetched a new access token for "API_TOKEN" from your identity provider. The provider did not say when it expires, so every workflow run fetches a new one.';
454
+
455
+ expect(
456
+ getTokenRefreshDescription({
457
+ variableName: "API_TOKEN",
458
+ expiresAt: null,
459
+ }),
460
+ ).toBe(expected);
461
+ expect(getTokenRefreshDescription({ variableName: "API_TOKEN" })).toBe(
462
+ expected,
463
+ );
464
+ });
465
+
466
+ test("passes on why the fetch failed", () => {
467
+ expect(
468
+ getTokenRefreshDescription({
469
+ variableName: "API_TOKEN",
470
+ error: "invalid_client: The client secret is wrong.",
471
+ }),
472
+ ).toBe(
473
+ 'OneUptime could not fetch an access token for "API_TOKEN": invalid_client: The client secret is wrong.',
474
+ );
475
+ });
476
+
477
+ test("says what was saved before a successful refresh", () => {
478
+ const description: string = getTokenRefreshDescription({
479
+ variableName: "API_TOKEN",
480
+ savedWhat: "Client secret",
481
+ expiresAt: null,
482
+ });
483
+
484
+ expect(
485
+ description.startsWith("Client secret saved. OneUptime fetched"),
486
+ ).toBe(true);
487
+ });
488
+
489
+ // The save went through even though the token did not: say both.
490
+ test("says what was saved before a failed refresh", () => {
491
+ expect(
492
+ getTokenRefreshDescription({
493
+ variableName: "API_TOKEN",
494
+ savedWhat: "Refresh token",
495
+ error: "invalid_grant",
496
+ }),
497
+ ).toBe(
498
+ 'Refresh token saved. OneUptime could not fetch an access token for "API_TOKEN": invalid_grant',
499
+ );
500
+ });
501
+
502
+ test("adds no prefix when nothing was saved", () => {
503
+ const description: string = getTokenRefreshDescription({
504
+ variableName: "API_TOKEN",
505
+ error: "invalid_grant",
506
+ });
507
+
508
+ expect(description).not.toContain("saved.");
509
+ expect(description.startsWith("OneUptime could not fetch")).toBe(true);
510
+ });
511
+
512
+ /*
513
+ * Many failures never reach the identity provider (no permission, a deleted
514
+ * variable, a network error), and the ones that do already name the token
515
+ * endpoint in their reason. So a failure is worded the same way whoever
516
+ * turned the request down, and never as the provider saying no.
517
+ */
518
+ describe("whoever turned the request down", () => {
519
+ test("words OneUptime's own refusal like any other failure", () => {
520
+ expect(
521
+ getTokenRefreshDescription({
522
+ variableName: "API_TOKEN",
523
+ error: "You do not have permission to update this variable.",
524
+ }),
525
+ ).toBe(
526
+ 'OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
527
+ );
528
+ });
529
+
530
+ // The save still went through; only the follow-up refresh was refused.
531
+ test("says what was saved first", () => {
532
+ expect(
533
+ getTokenRefreshDescription({
534
+ variableName: "API_TOKEN",
535
+ savedWhat: "Client secret",
536
+ error: "You do not have permission to update this variable.",
537
+ }),
538
+ ).toBe(
539
+ 'Client secret saved. OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
540
+ );
541
+ });
542
+
543
+ // The token endpoint's refusal already says who refused; nothing is added.
544
+ test("passes on a token endpoint's refusal as it is", () => {
545
+ expect(
546
+ getTokenRefreshDescription({
547
+ variableName: "API_TOKEN",
548
+ error:
549
+ "The token endpoint refused the request (HTTP 400): invalid_grant - The refresh token has expired.",
550
+ }),
551
+ ).toBe(
552
+ 'OneUptime could not fetch an access token for "API_TOKEN": The token endpoint refused the request (HTTP 400): invalid_grant - The refresh token has expired.',
553
+ );
554
+ });
555
+
556
+ test("never says the provider was asked or said no", () => {
557
+ const descriptions: Array<string> = [
558
+ getTokenRefreshDescription({
559
+ variableName: "API_TOKEN",
560
+ error: "Not authorized.",
561
+ }),
562
+ getTokenRefreshDescription({
563
+ variableName: "API_TOKEN",
564
+ savedWhat: "Refresh token",
565
+ error: "Not authorized.",
566
+ }),
567
+ getTokenRefreshDescription({
568
+ variableName: "API_TOKEN",
569
+ error: "invalid_client",
570
+ }),
571
+ getTokenRefreshDescription({
572
+ variableName: "API_TOKEN",
573
+ savedWhat: "Client secret",
574
+ error: "invalid_client",
575
+ }),
576
+ ];
577
+
578
+ descriptions.forEach((description: string) => {
579
+ expect(description).not.toContain("said no");
580
+ expect(description).not.toContain("asked your identity provider");
581
+ expect(description).not.toContain("did not ask");
582
+ });
583
+ });
584
+
585
+ // An error never borrows the success wording, nor a success the failure's.
586
+ test("keeps the success wording for a fetched token", () => {
587
+ const description: string = getTokenRefreshDescription({
588
+ variableName: "API_TOKEN",
589
+ expiresAt: null,
590
+ });
591
+
592
+ expect(
593
+ description.startsWith("OneUptime fetched a new access token"),
594
+ ).toBe(true);
595
+ expect(description).not.toContain("could not fetch");
596
+ });
597
+ });
598
+ });
599
+
600
+ describe("refreshWorkflowVariableOAuthToken", () => {
601
+ test("posts to the variable's refresh-oauth-token route", async () => {
602
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
603
+
604
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
605
+
606
+ expect(apiPost).toHaveBeenCalledTimes(1);
607
+ const post: CapturedPost = lastPost();
608
+ expect(post.url.toString()).toBe(expectedRefreshUrl(VARIABLE_ID));
609
+ expect(post.url.toString()).toMatch(
610
+ new RegExp(
611
+ `/workflow-variable/${VARIABLE_ID.toString()}/refresh-oauth-token$`,
612
+ ),
613
+ );
614
+ expect(post.data).toEqual({});
615
+ });
616
+
617
+ /*
618
+ * A raw API.post carries no tenant header of its own; the route scopes the
619
+ * request by it, so without ModelAPI's common headers every refresh is
620
+ * refused as belonging to no project.
621
+ */
622
+ test("sends ModelAPI's common headers, including the tenant id", async () => {
623
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
624
+
625
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
626
+
627
+ expect(getCommonHeaders).toHaveBeenCalled();
628
+ expect(lastPost().headers).toEqual(COMMON_HEADERS);
629
+ expect(lastPost().headers?.["tenantid"]).toBe(PROJECT_ID_STRING);
630
+ });
631
+
632
+ test("returns when the new token expires", async () => {
633
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
634
+
635
+ const result: OAuthTokenRefreshResult =
636
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
637
+
638
+ expect(result.expiresAt).toBeInstanceOf(Date);
639
+ expect(result.expiresAt?.toISOString()).toBe(EXPIRES_AT_ISO);
640
+ });
641
+
642
+ test("returns a null expiry when the provider gave none", async () => {
643
+ succeedWith({ oauthAccessTokenExpiresAt: null });
644
+
645
+ const result: OAuthTokenRefreshResult =
646
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
647
+
648
+ expect(result.expiresAt).toBeNull();
649
+ });
650
+
651
+ test("returns a null expiry for a value that is not a date", async () => {
652
+ succeedWith({ oauthAccessTokenExpiresAt: "not-a-date" });
653
+
654
+ const result: OAuthTokenRefreshResult =
655
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
656
+
657
+ expect(result.expiresAt).toBeNull();
658
+ });
659
+
660
+ // The answer never carries the token, and the dashboard never keeps one.
661
+ test("hands back only the expiry, whatever else the response holds", async () => {
662
+ succeedWith({
663
+ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO,
664
+ oauthLastRefreshedAt: "2026-10-01T09:30:00.000Z",
665
+ oauthAccessToken: "should-never-be-read",
666
+ });
667
+
668
+ const result: OAuthTokenRefreshResult =
669
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
670
+
671
+ expect(Object.keys(result)).toEqual(["expiresAt"]);
672
+ });
673
+
674
+ test("throws the error response when the refresh is refused", async () => {
675
+ const refusal: HTTPErrorResponse = new HTTPErrorResponse(
676
+ 400,
677
+ { message: "invalid_client" },
678
+ {},
679
+ );
680
+ apiPost.mockResolvedValue(refusal);
681
+
682
+ await expect(refreshWorkflowVariableOAuthToken(VARIABLE_ID)).rejects.toBe(
683
+ refusal,
684
+ );
685
+ });
686
+
687
+ /*
688
+ * URL.addRoute mutates. Building the request URL on APP_API_URL itself would
689
+ * append the route again on every refresh.
690
+ */
691
+ test("does not grow the shared API URL across refreshes", async () => {
692
+ const apiUrlBefore: string = APP_API_URL.toString();
693
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
694
+
695
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
696
+ const firstUrl: string = lastPost().url.toString();
697
+ await refreshWorkflowVariableOAuthToken(VARIABLE_ID);
698
+ const secondUrl: string = lastPost().url.toString();
699
+
700
+ expect(secondUrl).toBe(firstUrl);
701
+ expect(APP_API_URL.toString()).toBe(apiUrlBefore);
702
+ });
703
+
704
+ test("addresses each variable by its own id", async () => {
705
+ const otherId: ObjectID = new ObjectID(
706
+ "0f1e2d3c-4b5a-4968-8776-655443322110",
707
+ );
708
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
709
+
710
+ await refreshWorkflowVariableOAuthToken(otherId);
711
+
712
+ expect(lastPost().url.toString()).toBe(expectedRefreshUrl(otherId));
713
+ });
714
+ });
715
+
716
+ describe("fetchTokenRefreshOutcome", () => {
717
+ test("describes a successful refresh with its expiry", async () => {
718
+ succeedWith({ oauthAccessTokenExpiresAt: EXPIRES_AT_ISO });
719
+
720
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
721
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
722
+ });
723
+
724
+ expect(outcome.variableName).toBe("API_TOKEN");
725
+ expect(outcome.expiresAt?.toISOString()).toBe(EXPIRES_AT_ISO);
726
+ expect(outcome.error).toBeUndefined();
727
+ expect(outcome.savedWhat).toBeUndefined();
728
+ expect(getTokenRefreshTitle(outcome)).toBe("Access Token Fetched");
729
+ expect(lastPost().url.toString()).toBe(expectedRefreshUrl(VARIABLE_ID));
730
+ });
731
+
732
+ test("carries what was saved through to the outcome", async () => {
733
+ succeedWith({ oauthAccessTokenExpiresAt: null });
734
+
735
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
736
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
737
+ savedWhat: "Client secret",
738
+ });
739
+
740
+ expect(outcome.savedWhat).toBe("Client secret");
741
+ expect(outcome.expiresAt).toBeNull();
742
+ expect(getTokenRefreshDescription(outcome)).toContain(
743
+ "Client secret saved. OneUptime fetched a new access token",
744
+ );
745
+ });
746
+
747
+ test("reports a refused refresh with its reason instead of throwing", async () => {
748
+ failWith(400, {
749
+ message: "invalid_client: The client secret supplied is incorrect.",
750
+ });
751
+
752
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
753
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
754
+ savedWhat: "Client secret",
755
+ });
756
+
757
+ expect(outcome.error).toBe(
758
+ "invalid_client: The client secret supplied is incorrect.",
759
+ );
760
+ expect(outcome.expiresAt).toBeUndefined();
761
+ expect(outcome.savedWhat).toBe("Client secret");
762
+ expect(getTokenRefreshTitle(outcome)).toBe(
763
+ "Could Not Fetch an Access Token",
764
+ );
765
+ expect(getTokenRefreshDescription(outcome)).toBe(
766
+ 'Client secret saved. OneUptime could not fetch an access token for "API_TOKEN": invalid_client: The client secret supplied is incorrect.',
767
+ );
768
+ });
769
+
770
+ /*
771
+ * NotAuthorizedException answers 422. The request never left OneUptime, so
772
+ * the outcome must not be worded as the identity provider saying no - it is
773
+ * worded like every other failure, with OneUptime's own reason.
774
+ */
775
+ test("words a 422 like any other failure, not as the provider saying no", async () => {
776
+ failWith(422, {
777
+ message: "You do not have permission to update this variable.",
778
+ });
779
+
780
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
781
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
782
+ });
783
+
784
+ expect(outcome.error).toBe(
785
+ "You do not have permission to update this variable.",
786
+ );
787
+ expect(outcome.expiresAt).toBeUndefined();
788
+ expect(getTokenRefreshTitle(outcome)).toBe(
789
+ "Could Not Fetch an Access Token",
790
+ );
791
+ expect(getTokenRefreshDescription(outcome)).toBe(
792
+ 'OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
793
+ );
794
+ });
795
+
796
+ test("words a 422 after a save as saved, then not fetched", async () => {
797
+ failWith(422, {
798
+ message: "You do not have permission to update this variable.",
799
+ });
800
+
801
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
802
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
803
+ savedWhat: "Client secret",
804
+ });
805
+
806
+ expect(outcome.savedWhat).toBe("Client secret");
807
+ expect(getTokenRefreshDescription(outcome)).toBe(
808
+ 'Client secret saved. OneUptime could not fetch an access token for "API_TOKEN": You do not have permission to update this variable.',
809
+ );
810
+ });
811
+
812
+ test.each([401, 403])(
813
+ "words an HTTP %s the same way",
814
+ async (statusCode: number) => {
815
+ failWith(statusCode, { message: "Not authorized." });
816
+
817
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
818
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
819
+ });
820
+
821
+ expect(getTokenRefreshDescription(outcome)).toBe(
822
+ 'OneUptime could not fetch an access token for "API_TOKEN": Not authorized.',
823
+ );
824
+ },
825
+ );
826
+
827
+ /*
828
+ * Every way a fetch can fail, before and after a save. Some never reach the
829
+ * identity provider and the one that does already names the token endpoint
830
+ * in its reason, so none may be worded as the provider being asked, or
831
+ * saying no.
832
+ */
833
+ describe("never words a failure as the identity provider saying no", () => {
834
+ type FailureCase = {
835
+ label: string;
836
+ // Sets up API.post; a variable with no id sends no request at all.
837
+ arrange: () => void;
838
+ variable: () => WorkflowVariable;
839
+ // What API.getFriendlyMessage makes of the failure.
840
+ reason: string;
841
+ };
842
+
843
+ const FAILURES: Array<FailureCase> = [
844
+ {
845
+ label: "a token endpoint's refusal (400)",
846
+ arrange: (): void => {
847
+ failWith(400, {
848
+ message:
849
+ "The token endpoint refused the request (HTTP 400): invalid_grant - The refresh token has expired.",
850
+ });
851
+ },
852
+ variable: (): WorkflowVariable => {
853
+ return makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" });
854
+ },
855
+ reason:
856
+ "The token endpoint refused the request (HTTP 400): invalid_grant - The refresh token has expired.",
857
+ },
858
+ {
859
+ label: "OneUptime's permission refusal (422)",
860
+ arrange: (): void => {
861
+ failWith(422, {
862
+ message: "You do not have permission to update this variable.",
863
+ });
864
+ },
865
+ variable: (): WorkflowVariable => {
866
+ return makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" });
867
+ },
868
+ reason: "You do not have permission to update this variable.",
869
+ },
870
+ {
871
+ label: "a variable that no longer exists (400)",
872
+ arrange: (): void => {
873
+ failWith(400, {
874
+ message:
875
+ "Workflow variable not found, or you do not have access to it.",
876
+ });
877
+ },
878
+ variable: (): WorkflowVariable => {
879
+ return makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" });
880
+ },
881
+ reason: "Workflow variable not found, or you do not have access to it.",
882
+ },
883
+ {
884
+ label: "a server error (500)",
885
+ arrange: (): void => {
886
+ failWith(500, { message: "Internal server error." });
887
+ },
888
+ variable: (): WorkflowVariable => {
889
+ return makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" });
890
+ },
891
+ reason: "Internal server error.",
892
+ },
893
+ {
894
+ label: "a network error",
895
+ arrange: (): void => {
896
+ apiPost.mockRejectedValue(new Error("Network request failed."));
897
+ },
898
+ variable: (): WorkflowVariable => {
899
+ return makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" });
900
+ },
901
+ reason: "Network request failed.",
902
+ },
903
+ {
904
+ label: "a variable with no id",
905
+ arrange: (): void => {
906
+ // Nothing to arrange: no request goes out.
907
+ },
908
+ variable: (): WorkflowVariable => {
909
+ return makeVariable({ name: "API_TOKEN" });
910
+ },
911
+ reason: "This variable has no id. Refresh the page and try again.",
912
+ },
913
+ ];
914
+
915
+ type FailureAfterSave = FailureCase & {
916
+ savedWhat: string | undefined;
917
+ saved: string;
918
+ };
919
+
920
+ const FAILURES_WITH_AND_WITHOUT_A_SAVE: Array<FailureAfterSave> =
921
+ FAILURES.flatMap((failure: FailureCase): Array<FailureAfterSave> => {
922
+ return [
923
+ { ...failure, savedWhat: undefined, saved: "nothing saved" },
924
+ {
925
+ ...failure,
926
+ savedWhat: "Client secret",
927
+ saved: "client secret saved",
928
+ },
929
+ ];
930
+ });
931
+
932
+ test.each(FAILURES_WITH_AND_WITHOUT_A_SAVE)(
933
+ "$label, $saved",
934
+ async (entry: FailureAfterSave) => {
935
+ entry.arrange();
936
+
937
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
938
+ variable: entry.variable(),
939
+ savedWhat: entry.savedWhat,
940
+ });
941
+ const description: string = getTokenRefreshDescription(outcome);
942
+ const prefix: string = entry.savedWhat
943
+ ? `${entry.savedWhat} saved. `
944
+ : "";
945
+
946
+ expect(outcome.error).toBe(entry.reason);
947
+ expect(getTokenRefreshTitle(outcome)).toBe(
948
+ "Could Not Fetch an Access Token",
949
+ );
950
+ expect(description).toBe(
951
+ `${prefix}OneUptime could not fetch an access token for "API_TOKEN": ${entry.reason}`,
952
+ );
953
+ expect(description).not.toContain("said no");
954
+ expect(description).not.toContain("asked your identity provider");
955
+ expect(description).not.toContain("did not ask");
956
+ },
957
+ );
958
+ });
959
+
960
+ test("reads the error from the response's `data` field too", async () => {
961
+ failWith(400, { data: "invalid_grant: The refresh token has expired." });
962
+
963
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
964
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
965
+ });
966
+
967
+ expect(outcome.error).toBe("invalid_grant: The refresh token has expired.");
968
+ });
969
+
970
+ // getFriendlyMessage turns a gateway timeout into something actionable.
971
+ test("words a gateway failure the way the rest of the dashboard does", async () => {
972
+ failWith(502, { message: "Bad Gateway" });
973
+
974
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
975
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
976
+ });
977
+
978
+ expect(outcome.error).toBe(
979
+ "Error connecting to server. Please try again in few minutes.",
980
+ );
981
+ });
982
+
983
+ test("reports a request that threw instead of rejecting", async () => {
984
+ apiPost.mockRejectedValue(new Error("Network request failed."));
985
+
986
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
987
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
988
+ });
989
+
990
+ expect(outcome.error).toBe("Network request failed.");
991
+ expect(outcome.variableName).toBe("API_TOKEN");
992
+ });
993
+
994
+ test("reports a failure that threw a plain string", async () => {
995
+ apiPost.mockRejectedValue("Token endpoint unreachable.");
996
+
997
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
998
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
999
+ });
1000
+
1001
+ expect(outcome.error).toBe("Token endpoint unreachable.");
1002
+ });
1003
+
1004
+ test("sends no request for a variable without an id", async () => {
1005
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1006
+ variable: makeVariable({ name: "API_TOKEN" }),
1007
+ savedWhat: "Refresh token",
1008
+ });
1009
+
1010
+ expect(apiPost).not.toHaveBeenCalled();
1011
+ expect(outcome).toEqual({
1012
+ variableName: "API_TOKEN",
1013
+ savedWhat: "Refresh token",
1014
+ error: "This variable has no id. Refresh the page and try again.",
1015
+ });
1016
+ });
1017
+
1018
+ test("names an unnamed variable 'this variable'", async () => {
1019
+ failWith(400, { message: "invalid_client" });
1020
+
1021
+ const outcome: TokenRefreshOutcome = await fetchTokenRefreshOutcome({
1022
+ variable: makeVariable({ id: VARIABLE_ID }),
1023
+ });
1024
+
1025
+ expect(outcome.variableName).toBe("this variable");
1026
+ expect(getTokenRefreshDescription(outcome)).toContain(
1027
+ 'an access token for "this variable"',
1028
+ );
1029
+ });
1030
+
1031
+ test("never throws, whatever the request does", async () => {
1032
+ apiPost.mockImplementation(() => {
1033
+ throw new Error("Synchronous failure.");
1034
+ });
1035
+
1036
+ await expect(
1037
+ fetchTokenRefreshOutcome({
1038
+ variable: makeVariable({ id: VARIABLE_ID, name: "API_TOKEN" }),
1039
+ }),
1040
+ ).resolves.toEqual({
1041
+ variableName: "API_TOKEN",
1042
+ savedWhat: undefined,
1043
+ error: "Synchronous failure.",
1044
+ });
1045
+ });
1046
+ });
1047
+
1048
+ describe("getClientAuthenticationLabel", () => {
1049
+ test("labels HTTP Basic header authentication", () => {
1050
+ expect(
1051
+ getClientAuthenticationLabel(
1052
+ OAuth2ClientAuthenticationMethod.BasicAuthHeader,
1053
+ ),
1054
+ ).toBe("HTTP Basic header (client_secret_basic)");
1055
+ });
1056
+
1057
+ test("labels request body authentication", () => {
1058
+ expect(
1059
+ getClientAuthenticationLabel(
1060
+ OAuth2ClientAuthenticationMethod.RequestBody,
1061
+ ),
1062
+ ).toBe("Request body (client_secret_post)");
1063
+ });
1064
+
1065
+ // An unset method is what the server uses by default: the Basic header.
1066
+ test("shows the default method when none is saved", () => {
1067
+ expect(getClientAuthenticationLabel(undefined)).toBe(
1068
+ "HTTP Basic header (client_secret_basic)",
1069
+ );
1070
+ expect(getClientAuthenticationLabel("")).toBe(
1071
+ "HTTP Basic header (client_secret_basic)",
1072
+ );
1073
+ });
1074
+
1075
+ test("shows an unknown saved value as it is", () => {
1076
+ expect(getClientAuthenticationLabel("Private Key JWT")).toBe(
1077
+ "Private Key JWT",
1078
+ );
1079
+ });
1080
+
1081
+ test("has a label for every client authentication method", () => {
1082
+ Object.values(OAuth2ClientAuthenticationMethod).forEach(
1083
+ (method: OAuth2ClientAuthenticationMethod) => {
1084
+ expect(getClientAuthenticationLabel(method)).not.toBe(method);
1085
+ },
1086
+ );
1087
+ });
1088
+ });
1089
+
1090
+ describe("dropdown options", () => {
1091
+ test("offer both grant types, client credentials first", () => {
1092
+ expect(
1093
+ GRANT_TYPE_DROPDOWN_OPTIONS.map((option: DropdownOption): unknown => {
1094
+ return option.value;
1095
+ }),
1096
+ ).toEqual([
1097
+ OAuth2GrantType.ClientCredentials,
1098
+ OAuth2GrantType.RefreshToken,
1099
+ ]);
1100
+ });
1101
+
1102
+ test("offer every client authentication method", () => {
1103
+ expect(
1104
+ CLIENT_AUTHENTICATION_DROPDOWN_OPTIONS.map(
1105
+ (option: DropdownOption): unknown => {
1106
+ return option.value;
1107
+ },
1108
+ ).sort(),
1109
+ ).toEqual(Object.values(OAuth2ClientAuthenticationMethod).sort());
1110
+ });
1111
+ });
1112
+
1113
+ describe("getStaticVariableCreateFormFields", () => {
1114
+ /*
1115
+ * The user's ask: the Create button makes a static variable and nothing
1116
+ * else. No type picker, no OAuth settings.
1117
+ */
1118
+ test.each([true, false])(
1119
+ "asks for exactly name, description, content and secret (isGlobal: %s)",
1120
+ (isGlobal: boolean) => {
1121
+ expect(keysOf(getStaticVariableCreateFormFields({ isGlobal }))).toEqual([
1122
+ "name",
1123
+ "description",
1124
+ "content",
1125
+ "isSecret",
1126
+ ]);
1127
+ },
1128
+ );
1129
+
1130
+ test.each([true, false])(
1131
+ "never asks for a variable type or an OAuth setting (isGlobal: %s)",
1132
+ (isGlobal: boolean) => {
1133
+ const keys: Array<string> = keysOf(
1134
+ getStaticVariableCreateFormFields({ isGlobal }),
1135
+ );
1136
+
1137
+ expect(keys).not.toContain("variableType");
1138
+ keys.forEach((key: string) => {
1139
+ expect(key.startsWith("oauth")).toBe(false);
1140
+ });
1141
+ },
1142
+ );
1143
+
1144
+ test("has no field that picks between static and OAuth 2.0", () => {
1145
+ getStaticVariableCreateFormFields({ isGlobal: true }).forEach(
1146
+ (field: ModelField<WorkflowVariable>) => {
1147
+ expect(field.fieldType).not.toBe(FormFieldSchemaType.CardSelect);
1148
+ expect(field.fieldType).not.toBe(FormFieldSchemaType.RadioButton);
1149
+ expect(JSON.stringify(field.dropdownOptions || [])).not.toContain(
1150
+ WorkflowVariableType.OAuth2,
1151
+ );
1152
+ },
1153
+ );
1154
+ });
1155
+
1156
+ // A single-page form: a stepId here would hide the field behind a step that does not exist.
1157
+ test("puts no field on a step", () => {
1158
+ getStaticVariableCreateFormFields({ isGlobal: false }).forEach(
1159
+ (field: ModelField<WorkflowVariable>) => {
1160
+ expect(field.stepId).toBeUndefined();
1161
+ },
1162
+ );
1163
+ });
1164
+
1165
+ test("requires a name that works inside a template reference", () => {
1166
+ const name: ModelField<WorkflowVariable> = fieldFor(
1167
+ getStaticVariableCreateFormFields({ isGlobal: true }),
1168
+ "name",
1169
+ );
1170
+
1171
+ expect(name.required).toBe(true);
1172
+ expect(name.fieldType).toBe(FormFieldSchemaType.Text);
1173
+ expect(name.validation).toEqual({
1174
+ minLength: 2,
1175
+ noSpaces: true,
1176
+ noSpecialCharacters: true,
1177
+ });
1178
+ });
1179
+
1180
+ test("shows a global variable's reference syntax on the global list", () => {
1181
+ const name: ModelField<WorkflowVariable> = fieldFor(
1182
+ getStaticVariableCreateFormFields({ isGlobal: true }),
1183
+ "name",
1184
+ );
1185
+
1186
+ expect(name.description).toContain("{{global.variables.THIS_NAME}}");
1187
+ expect(name.description).not.toContain("{{local.");
1188
+ });
1189
+
1190
+ test("shows a local variable's reference syntax on a workflow's list", () => {
1191
+ const name: ModelField<WorkflowVariable> = fieldFor(
1192
+ getStaticVariableCreateFormFields({ isGlobal: false }),
1193
+ "name",
1194
+ );
1195
+
1196
+ expect(name.description).toContain("{{local.variables.THIS_NAME}}");
1197
+ expect(name.description).not.toContain("{{global.");
1198
+ });
1199
+
1200
+ test("warns that renaming does not update existing workflows", () => {
1201
+ expect(
1202
+ fieldFor(getStaticVariableCreateFormFields({ isGlobal: true }), "name")
1203
+ .description,
1204
+ ).toContain("Renaming it does not update workflows");
1205
+ });
1206
+
1207
+ test("keeps the description optional", () => {
1208
+ const description: ModelField<WorkflowVariable> = fieldFor(
1209
+ getStaticVariableCreateFormFields({ isGlobal: true }),
1210
+ "description",
1211
+ );
1212
+
1213
+ expect(description.required).toBe(false);
1214
+ expect(description.fieldType).toBe(FormFieldSchemaType.LongText);
1215
+ });
1216
+
1217
+ test("requires the content", () => {
1218
+ const content: ModelField<WorkflowVariable> = fieldFor(
1219
+ getStaticVariableCreateFormFields({ isGlobal: true }),
1220
+ "content",
1221
+ );
1222
+
1223
+ expect(content.required).toBe(true);
1224
+ expect(content.fieldType).toBe(FormFieldSchemaType.LongText);
1225
+ // Once saved it can only be replaced, and that happens on the variable's page.
1226
+ expect(content.description).toContain("open the variable to replace it");
1227
+ });
1228
+
1229
+ test("offers the secret toggle without claiming encryption", () => {
1230
+ const secret: ModelField<WorkflowVariable> = fieldFor(
1231
+ getStaticVariableCreateFormFields({ isGlobal: true }),
1232
+ "isSecret",
1233
+ );
1234
+
1235
+ expect(secret.fieldType).toBe(FormFieldSchemaType.Toggle);
1236
+ expect(secret.required).toBe(false);
1237
+ expect(secret.description).toBe(SECRET_TOGGLE_DESCRIPTION);
1238
+ expect(SECRET_TOGGLE_DESCRIPTION.toLowerCase()).not.toContain("encrypt");
1239
+ expect(SECRET_TOGGLE_DESCRIPTION).toContain("[REDACTED]");
1240
+ expect(SECRET_TOGGLE_DESCRIPTION).toContain("cannot be turned off");
1241
+ });
1242
+ });
1243
+
1244
+ describe("OAUTH_VARIABLE_FORM_STEPS", () => {
1245
+ test("are the Variable step then the OAuth 2.0 step", () => {
1246
+ expect(
1247
+ OAUTH_VARIABLE_FORM_STEPS.map(
1248
+ (step: FormStep<WorkflowVariable>): { id: string; title: string } => {
1249
+ return { id: step.id, title: step.title };
1250
+ },
1251
+ ),
1252
+ ).toEqual([
1253
+ { id: "variable", title: "Variable" },
1254
+ { id: "oauth", title: "OAuth 2.0" },
1255
+ ]);
1256
+ });
1257
+
1258
+ // The form only ever creates OAuth 2.0 variables, so no step is conditional.
1259
+ test("always shows both steps", () => {
1260
+ OAUTH_VARIABLE_FORM_STEPS.forEach((step: FormStep<WorkflowVariable>) => {
1261
+ expect(step.showIf).toBeUndefined();
1262
+ });
1263
+ });
1264
+ });
1265
+
1266
+ describe("getOAuthVariableCreateFormFields", () => {
1267
+ const OAUTH_CREATE_ORDER: Array<string> = [
1268
+ "name",
1269
+ "description",
1270
+ "oauthGrantType",
1271
+ "oauthTokenUrl",
1272
+ "oauthClientId",
1273
+ "oauthClientSecret",
1274
+ "oauthRefreshToken",
1275
+ "oauthScope",
1276
+ "oauthAdditionalParameters",
1277
+ "oauthClientAuthenticationMethod",
1278
+ ];
1279
+
1280
+ test.each([true, false])(
1281
+ "reads top to bottom in the order a provider's console lists them (isGlobal: %s)",
1282
+ (isGlobal: boolean) => {
1283
+ expect(keysOf(getOAuthVariableCreateFormFields({ isGlobal }))).toEqual(
1284
+ OAUTH_CREATE_ORDER,
1285
+ );
1286
+ },
1287
+ );
1288
+
1289
+ // The modal stamps the type itself; the form never offers a choice.
1290
+ test("does not ask for the variable type", () => {
1291
+ expect(
1292
+ keysOf(getOAuthVariableCreateFormFields({ isGlobal: true })),
1293
+ ).not.toContain("variableType");
1294
+ });
1295
+
1296
+ test("puts name and description on the Variable step", () => {
1297
+ const fields: FieldList = getOAuthVariableCreateFormFields({
1298
+ isGlobal: true,
1299
+ });
1300
+
1301
+ expect(fieldFor(fields, "name").stepId).toBe("variable");
1302
+ expect(fieldFor(fields, "description").stepId).toBe("variable");
1303
+ });
1304
+
1305
+ test("puts every OAuth setting on the OAuth 2.0 step", () => {
1306
+ getOAuthVariableCreateFormFields({ isGlobal: false })
1307
+ .filter((field: ModelField<WorkflowVariable>): boolean => {
1308
+ return keyOf(field).startsWith("oauth");
1309
+ })
1310
+ .forEach((field: ModelField<WorkflowVariable>) => {
1311
+ expect(field.stepId).toBe("oauth");
1312
+ });
1313
+ });
1314
+
1315
+ // A field on an undeclared step would never be shown, so it could never be filled in.
1316
+ test("uses only the declared steps", () => {
1317
+ const stepIds: Array<string> = OAUTH_VARIABLE_FORM_STEPS.map(
1318
+ (step: FormStep<WorkflowVariable>): string => {
1319
+ return step.id;
1320
+ },
1321
+ );
1322
+
1323
+ getOAuthVariableCreateFormFields({ isGlobal: true }).forEach(
1324
+ (field: ModelField<WorkflowVariable>) => {
1325
+ expect(stepIds).toContain(field.stepId);
1326
+ },
1327
+ );
1328
+ });
1329
+
1330
+ test("shows the reference syntax for where the variable is created", () => {
1331
+ expect(
1332
+ fieldFor(getOAuthVariableCreateFormFields({ isGlobal: true }), "name")
1333
+ .description,
1334
+ ).toContain("{{global.variables.THIS_NAME}}");
1335
+ expect(
1336
+ fieldFor(getOAuthVariableCreateFormFields({ isGlobal: false }), "name")
1337
+ .description,
1338
+ ).toContain("{{local.variables.THIS_NAME}}");
1339
+ });
1340
+
1341
+ test("defaults the grant type to client credentials", () => {
1342
+ const grantType: ModelField<WorkflowVariable> = fieldFor(
1343
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1344
+ "oauthGrantType",
1345
+ );
1346
+
1347
+ expect(grantType.fieldType).toBe(FormFieldSchemaType.Dropdown);
1348
+ expect(grantType.required).toBe(true);
1349
+ expect(grantType.defaultValue).toBe(OAuth2GrantType.ClientCredentials);
1350
+ expect(grantType.dropdownOptions).toBe(GRANT_TYPE_DROPDOWN_OPTIONS);
1351
+ });
1352
+
1353
+ test("requires the token URL and client ID", () => {
1354
+ const fields: FieldList = getOAuthVariableCreateFormFields({
1355
+ isGlobal: true,
1356
+ });
1357
+
1358
+ expect(fieldFor(fields, "oauthTokenUrl").required).toBe(true);
1359
+ expect(fieldFor(fields, "oauthTokenUrl").fieldType).toBe(
1360
+ FormFieldSchemaType.URL,
1361
+ );
1362
+ expect(fieldFor(fields, "oauthClientId").required).toBe(true);
1363
+ });
1364
+
1365
+ test("encrypts the client secret and refresh token", () => {
1366
+ const fields: FieldList = getOAuthVariableCreateFormFields({
1367
+ isGlobal: true,
1368
+ });
1369
+
1370
+ expect(fieldFor(fields, "oauthClientSecret").fieldType).toBe(
1371
+ FormFieldSchemaType.EncryptedText,
1372
+ );
1373
+ expect(fieldFor(fields, "oauthRefreshToken").fieldType).toBe(
1374
+ FormFieldSchemaType.EncryptedText,
1375
+ );
1376
+ });
1377
+
1378
+ test("points to Update Credentials on the variable's page to replace the secret", () => {
1379
+ expect(
1380
+ fieldFor(
1381
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1382
+ "oauthClientSecret",
1383
+ ).description,
1384
+ ).toContain("open the variable and use Update Credentials");
1385
+ });
1386
+
1387
+ test("requires the client secret except for a public refresh-token client", () => {
1388
+ const secret: ModelField<WorkflowVariable> = fieldFor(
1389
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1390
+ "oauthClientSecret",
1391
+ );
1392
+
1393
+ expect(
1394
+ isRequired(secret, { oauthGrantType: OAuth2GrantType.ClientCredentials }),
1395
+ ).toBe(true);
1396
+ expect(isRequired(secret, {})).toBe(true);
1397
+ expect(
1398
+ isRequired(secret, { oauthGrantType: OAuth2GrantType.RefreshToken }),
1399
+ ).toBe(false);
1400
+ });
1401
+
1402
+ test("asks for a refresh token only for the refresh-token grant", () => {
1403
+ const refreshToken: ModelField<WorkflowVariable> = fieldFor(
1404
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1405
+ "oauthRefreshToken",
1406
+ );
1407
+
1408
+ expect(refreshToken.required).toBe(true);
1409
+ expect(
1410
+ refreshToken.showIf?.(
1411
+ formValues({ oauthGrantType: OAuth2GrantType.RefreshToken }),
1412
+ ),
1413
+ ).toBe(true);
1414
+ expect(
1415
+ refreshToken.showIf?.(
1416
+ formValues({ oauthGrantType: OAuth2GrantType.ClientCredentials }),
1417
+ ),
1418
+ ).toBe(false);
1419
+ expect(refreshToken.showIf?.(formValues({}))).toBe(false);
1420
+ });
1421
+
1422
+ test("keeps scope, additional parameters and authentication optional", () => {
1423
+ const fields: FieldList = getOAuthVariableCreateFormFields({
1424
+ isGlobal: true,
1425
+ });
1426
+
1427
+ expect(fieldFor(fields, "oauthScope").required).toBe(false);
1428
+ expect(fieldFor(fields, "oauthAdditionalParameters").required).toBe(false);
1429
+ expect(fieldFor(fields, "oauthClientAuthenticationMethod").required).toBe(
1430
+ false,
1431
+ );
1432
+ });
1433
+
1434
+ test("defaults client authentication to the HTTP Basic header", () => {
1435
+ const method: ModelField<WorkflowVariable> = fieldFor(
1436
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1437
+ "oauthClientAuthenticationMethod",
1438
+ );
1439
+
1440
+ expect(method.defaultValue).toBe(
1441
+ OAuth2ClientAuthenticationMethod.BasicAuthHeader,
1442
+ );
1443
+ expect(method.dropdownOptions).toBe(CLIENT_AUTHENTICATION_DROPDOWN_OPTIONS);
1444
+ });
1445
+
1446
+ test("refuses an additional parameter that would overwrite a credential", () => {
1447
+ const parameters: ModelField<WorkflowVariable> = fieldFor(
1448
+ getOAuthVariableCreateFormFields({ isGlobal: true }),
1449
+ "oauthAdditionalParameters",
1450
+ );
1451
+
1452
+ expect(
1453
+ parameters.customValidation?.(
1454
+ formValues({ oauthAdditionalParameters: { client_secret: "x" } }),
1455
+ ),
1456
+ ).toContain('"client_secret" cannot be set as an additional parameter');
1457
+ expect(
1458
+ parameters.customValidation?.(
1459
+ formValues({ oauthAdditionalParameters: { audience: "api" } }),
1460
+ ),
1461
+ ).toBeNull();
1462
+ expect(parameters.customValidation?.(formValues({}))).toBeNull();
1463
+ });
1464
+
1465
+ // The create form and the variable page's edit form must describe the same settings the same way.
1466
+ test("uses the variable page's settings fields for the shared settings", () => {
1467
+ const createFields: FieldList = getOAuthVariableCreateFormFields({
1468
+ isGlobal: true,
1469
+ });
1470
+
1471
+ getOAuthSettingsFormFields().forEach(
1472
+ (setting: ModelField<WorkflowVariable>) => {
1473
+ const onCreate: ModelField<WorkflowVariable> = fieldFor(
1474
+ createFields,
1475
+ keyOf(setting),
1476
+ );
1477
+
1478
+ expect(onCreate.title).toBe(setting.title);
1479
+ expect(onCreate.fieldType).toBe(setting.fieldType);
1480
+ expect(onCreate.required).toBe(setting.required);
1481
+ expect(onCreate.description).toBe(setting.description);
1482
+ },
1483
+ );
1484
+ });
1485
+ });
1486
+
1487
+ describe("getOAuthSettingsFormFields", () => {
1488
+ test("edits exactly the five readable settings", () => {
1489
+ expect(keysOf(getOAuthSettingsFormFields())).toEqual([
1490
+ "oauthTokenUrl",
1491
+ "oauthClientId",
1492
+ "oauthScope",
1493
+ "oauthAdditionalParameters",
1494
+ "oauthClientAuthenticationMethod",
1495
+ ]);
1496
+ });
1497
+
1498
+ /*
1499
+ * Anyone who can read the variable reads these back into the edit form. The
1500
+ * client secret and refresh token are write-only and have their own modal.
1501
+ */
1502
+ test("never includes a write-only credential", () => {
1503
+ const fields: FieldList = getOAuthSettingsFormFields();
1504
+ const keys: Array<string> = keysOf(fields);
1505
+
1506
+ expect(keys).not.toContain("oauthClientSecret");
1507
+ expect(keys).not.toContain("oauthRefreshToken");
1508
+ fields.forEach((field: ModelField<WorkflowVariable>) => {
1509
+ expect(field.fieldType).not.toBe(FormFieldSchemaType.EncryptedText);
1510
+ });
1511
+ });
1512
+
1513
+ // The grant type is fixed once saved, and the type never changes.
1514
+ test("does not offer the grant type or the variable type", () => {
1515
+ const keys: Array<string> = keysOf(getOAuthSettingsFormFields());
1516
+
1517
+ expect(keys).not.toContain("oauthGrantType");
1518
+ expect(keys).not.toContain("variableType");
1519
+ });
1520
+
1521
+ test("puts no field on a step by default", () => {
1522
+ getOAuthSettingsFormFields().forEach(
1523
+ (field: ModelField<WorkflowVariable>) => {
1524
+ expect(field.stepId).toBeUndefined();
1525
+ },
1526
+ );
1527
+ });
1528
+
1529
+ test("puts every field on the step it is given", () => {
1530
+ getOAuthSettingsFormFields({ stepId: "oauth" }).forEach(
1531
+ (field: ModelField<WorkflowVariable>) => {
1532
+ expect(field.stepId).toBe("oauth");
1533
+ },
1534
+ );
1535
+ });
1536
+
1537
+ test("warns that additional parameters are readable", () => {
1538
+ expect(
1539
+ fieldFor(getOAuthSettingsFormFields(), "oauthAdditionalParameters")
1540
+ .description,
1541
+ ).toContain("do not put secrets here");
1542
+ });
1543
+ });