@oneuptime/common 14.0.1 → 14.0.3

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 (1241) hide show
  1. package/Models/DatabaseModels/AlertEpisodeMember.ts +8 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +2 -0
  3. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
  4. package/Models/DatabaseModels/IncidentAlert.ts +540 -0
  5. package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
  7. package/Models/DatabaseModels/IncidentFeed.ts +2 -0
  8. package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
  9. package/Models/DatabaseModels/Index.ts +2 -0
  10. package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
  11. package/Models/DatabaseModels/Monitor.ts +48 -0
  12. package/Models/DatabaseModels/Project.ts +60 -0
  13. package/Models/DatabaseModels/RumApplication.ts +52 -1
  14. package/Models/DatabaseModels/Runner.ts +5 -4
  15. package/Models/DatabaseModels/RunnerJob.ts +66 -0
  16. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
  17. package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
  18. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
  19. package/Server/API/AIInvestigationAPI.ts +341 -0
  20. package/Server/API/AutoRemediationAPI.ts +184 -2
  21. package/Server/API/CommonAPI.ts +70 -0
  22. package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
  23. package/Server/API/MicrosoftTeamsAPI.ts +770 -315
  24. package/Server/API/MonitorAPI.ts +140 -0
  25. package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
  26. package/Server/API/SlackAPI.ts +447 -99
  27. package/Server/API/StatusPageAPI.ts +146 -26
  28. package/Server/API/TelemetryAPI.ts +216 -5
  29. package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
  30. package/Server/API/WorkflowVariableAPI.ts +156 -0
  31. package/Server/Infrastructure/GlobalCache.ts +35 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.ts +28 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.ts +89 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  40. package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
  41. package/Server/Middleware/TelemetryIngest.ts +47 -2
  42. package/Server/Middleware/UserAuthorization.ts +56 -2
  43. package/Server/Services/AIAgentService.ts +1 -0
  44. package/Server/Services/AccessTokenService.ts +121 -48
  45. package/Server/Services/AlertEpisodeMemberService.ts +9 -0
  46. package/Server/Services/AlertEpisodeService.ts +14 -1
  47. package/Server/Services/AlertService.ts +134 -22
  48. package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
  49. package/Server/Services/AutoRemediationRuleService.ts +118 -0
  50. package/Server/Services/BillingService.ts +1 -0
  51. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
  52. package/Server/Services/IncidentAlertService.ts +1811 -0
  53. package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
  54. package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
  55. package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
  56. package/Server/Services/IncidentEpisodeService.ts +14 -1
  57. package/Server/Services/IncidentGroupingEngineService.ts +11 -0
  58. package/Server/Services/IncidentMemberService.ts +21 -0
  59. package/Server/Services/IncidentPublicNoteService.ts +63 -0
  60. package/Server/Services/IncidentService.ts +330 -30
  61. package/Server/Services/IncidentStateTimelineService.ts +39 -0
  62. package/Server/Services/IncidentTemplateService.ts +83 -3
  63. package/Server/Services/Index.ts +2 -0
  64. package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
  65. package/Server/Services/KubernetesClusterService.ts +1570 -1
  66. package/Server/Services/LogAggregationService.ts +14 -6
  67. package/Server/Services/MonitorService.ts +651 -52
  68. package/Server/Services/MonitorStatusTimelineService.ts +639 -2
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
  71. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
  72. package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
  73. package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
  74. package/Server/Services/OnCallSetupReminderService.ts +1 -0
  75. package/Server/Services/ProbeService.ts +7 -1
  76. package/Server/Services/ProjectService.ts +11 -1
  77. package/Server/Services/RunbookCredentialService.ts +26 -1
  78. package/Server/Services/RunbookSecretService.ts +36 -0
  79. package/Server/Services/RunnerJobService.ts +941 -23
  80. package/Server/Services/RunnerService.ts +439 -6
  81. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
  82. package/Server/Services/ScheduledMaintenanceService.ts +124 -19
  83. package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
  84. package/Server/Services/ServiceLevelObjectiveService.ts +14 -1
  85. package/Server/Services/StatusPagePrivateUserService.ts +1 -0
  86. package/Server/Services/StatusPageService.ts +301 -74
  87. package/Server/Services/StatusPageSubscriberService.ts +4 -0
  88. package/Server/Services/TeamMemberService.ts +309 -7
  89. package/Server/Services/TraceAggregationService.ts +10 -6
  90. package/Server/Services/UserEmailService.ts +1 -0
  91. package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
  92. package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
  93. package/Server/Services/UserNotificationRuleService.ts +4 -0
  94. package/Server/Services/UserService.ts +122 -1
  95. package/Server/Services/WorkflowVariableService.ts +593 -8
  96. package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
  97. package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
  98. package/Server/Types/Database/QueryHelper.ts +22 -0
  99. package/Server/Types/Markdown.ts +502 -27
  100. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
  101. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
  102. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
  103. package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
  104. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
  105. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
  106. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
  107. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
  108. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
  109. package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
  110. package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
  111. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
  112. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
  113. package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
  114. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
  115. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
  116. package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
  117. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
  118. package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
  119. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
  120. package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
  121. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
  122. package/Server/Utils/PushNotificationUtil.ts +45 -0
  123. package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
  124. package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
  125. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +24 -2
  126. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
  127. package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
  128. package/Server/Utils/StartServer.ts +4 -3
  129. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
  130. package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
  131. package/Server/Utils/UserPermission/UserPermission.ts +16 -0
  132. package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
  133. package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
  134. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
  135. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
  136. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
  137. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
  138. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
  139. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
  140. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
  141. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
  142. package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
  143. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
  144. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
  145. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
  146. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
  147. package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
  148. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
  149. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
  150. package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
  151. package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
  152. package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
  153. package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  154. package/Server/Utils/Workspace/Workspace.ts +171 -54
  155. package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
  156. package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
  157. package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
  158. package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
  159. package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
  160. package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
  161. package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
  162. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
  163. package/Tests/App/Dashboard/BulkIncidentLinkActions.test.tsx +869 -0
  164. package/Tests/App/Dashboard/CephMetricTooltips.test.tsx +1777 -0
  165. package/Tests/App/Dashboard/CloudFleetSummary.test.ts +8 -0
  166. package/Tests/App/Dashboard/CloudMetricTooltips.test.tsx +887 -0
  167. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
  168. package/Tests/App/Dashboard/ContainerHostMetricTooltips.test.tsx +1309 -0
  169. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
  170. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
  171. package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
  172. package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
  173. package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
  174. package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +39 -0
  175. package/Tests/App/Dashboard/DockerSwarmClustersListTooltips.test.tsx +414 -0
  176. package/Tests/App/Dashboard/DockerSwarmMetricTooltips.test.ts +796 -0
  177. package/Tests/App/Dashboard/DockerSwarmOverviewTooltips.test.tsx +747 -0
  178. package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
  179. package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
  180. package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
  181. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +238 -0
  182. package/Tests/App/Dashboard/HostDetailViewTooltips.test.tsx +725 -0
  183. package/Tests/App/Dashboard/HostListColumnTooltips.test.tsx +472 -0
  184. package/Tests/App/Dashboard/HostMetricTooltips.test.ts +709 -0
  185. package/Tests/App/Dashboard/HostOverviewTooltips.test.tsx +698 -0
  186. package/Tests/App/Dashboard/HostTooltipHarness.ts +124 -0
  187. package/Tests/App/Dashboard/HostsListTooltips.test.tsx +395 -0
  188. package/Tests/App/Dashboard/IncidentAlertLinkDialog.test.tsx +691 -0
  189. package/Tests/App/Dashboard/IncidentAlertLinkHelpers.test.ts +458 -0
  190. package/Tests/App/Dashboard/IncidentAlertLinkPages.test.tsx +828 -0
  191. package/Tests/App/Dashboard/IncidentAlertLinkSideMenus.test.tsx +231 -0
  192. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
  193. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +689 -0
  194. package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
  195. package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
  196. package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
  197. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
  198. package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
  199. package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
  200. package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
  201. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +12 -0
  202. package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
  203. package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
  204. package/Tests/App/Dashboard/IoTMetricTooltips.test.tsx +1123 -0
  205. package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
  206. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
  207. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
  208. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
  209. package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +837 -0
  210. package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +699 -0
  211. package/Tests/App/Dashboard/KubernetesContainersTabTooltips.test.tsx +320 -0
  212. package/Tests/App/Dashboard/KubernetesCostTooltips.test.tsx +502 -0
  213. package/Tests/App/Dashboard/KubernetesInsightsTooltips.test.tsx +222 -0
  214. package/Tests/App/Dashboard/KubernetesResourceMetricTooltips.test.ts +561 -0
  215. package/Tests/App/Dashboard/KubernetesResourcePagesTooltips.test.tsx +1168 -0
  216. package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
  217. package/Tests/App/Dashboard/LinkIncidentAlertModal.test.tsx +154 -0
  218. package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
  219. package/Tests/App/Dashboard/MetricDescriptionRules.ts +170 -0
  220. package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +206 -0
  221. package/Tests/App/Dashboard/MetricDescriptionsConsistency.test.ts +275 -0
  222. package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
  223. package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
  224. package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
  225. package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
  226. package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
  227. package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
  228. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
  229. package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
  230. package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
  231. package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
  232. package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
  233. package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
  234. package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
  235. package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
  236. package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
  237. package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
  238. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
  239. package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
  240. package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
  241. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
  242. package/Tests/App/Dashboard/NetworkDeviceTooltips.test.tsx +852 -0
  243. package/Tests/App/Dashboard/NetworkDiagnosticsTooltips.test.tsx +556 -0
  244. package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +1348 -0
  245. package/Tests/App/Dashboard/NetworkSiteTooltips.test.tsx +679 -0
  246. package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
  247. package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
  248. package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
  249. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
  250. package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
  251. package/Tests/App/Dashboard/ProxmoxMetricTooltips.test.ts +592 -0
  252. package/Tests/App/Dashboard/ProxmoxOverviewTooltips.test.tsx +1002 -0
  253. package/Tests/App/Dashboard/ProxmoxResourcePageTooltips.test.tsx +923 -0
  254. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
  255. package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
  256. package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
  257. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
  258. package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +1066 -0
  259. package/Tests/App/Dashboard/RumOverviewPage.test.tsx +1195 -0
  260. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
  261. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
  262. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
  263. package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
  264. package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
  265. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
  266. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
  267. package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
  268. package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
  269. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
  270. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
  271. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
  272. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
  273. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
  274. package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
  275. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
  276. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
  277. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
  278. package/Tests/App/Dashboard/ServerlessMetricTooltips.test.tsx +474 -0
  279. package/Tests/App/Dashboard/ServiceMetricTooltips.test.tsx +772 -0
  280. package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +56 -1
  281. package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
  282. package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
  283. package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +1207 -0
  284. package/Tests/App/Dashboard/TelemetryResourceTabTooltips.test.tsx +437 -0
  285. package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
  286. package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
  287. package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
  288. package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
  289. package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
  290. package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +801 -0
  291. package/Tests/App/Dashboard/VMwareOverviewTooltips.test.tsx +601 -0
  292. package/Tests/App/Dashboard/VMwareResourcePagesTooltips.test.tsx +646 -0
  293. package/Tests/App/Dashboard/VMwareTooltipHarness.ts +145 -0
  294. package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
  295. package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
  296. package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
  297. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
  298. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
  299. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
  300. package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
  301. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
  302. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
  303. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
  304. package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +554 -0
  305. package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
  306. package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
  307. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +117 -0
  308. package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
  309. package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
  310. package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
  311. package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
  312. package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
  313. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
  314. package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
  315. package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
  316. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
  317. package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
  318. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
  319. package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
  320. package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
  321. package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
  322. package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
  323. package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
  324. package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
  325. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
  326. package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
  327. package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
  328. package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
  329. package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
  330. package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
  331. package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
  332. package/Tests/Server/Infrastructure/Postgres/AddIncidentAlertMigration.test.ts +341 -0
  333. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
  334. package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
  335. package/Tests/Server/Infrastructure/Postgres/AddSessionReplaySameOriginTracePropagationMigration.test.ts +247 -0
  336. package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
  337. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
  338. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
  339. package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
  340. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
  341. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
  342. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
  343. package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
  344. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
  345. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
  346. package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
  347. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
  348. package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
  349. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
  350. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
  351. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
  352. package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
  353. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
  354. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +903 -0
  355. package/Tests/Server/Services/IncidentAlertRegistration.test.ts +96 -0
  356. package/Tests/Server/Services/IncidentAlertService.test.ts +2225 -0
  357. package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +970 -0
  358. package/Tests/Server/Services/IncidentCreateFromAlerts.test.ts +1284 -0
  359. package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
  360. package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
  361. package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
  362. package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
  363. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
  364. package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
  365. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
  366. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
  367. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
  368. package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
  369. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
  370. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
  371. package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
  372. package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
  373. package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
  374. package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
  375. package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
  376. package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
  377. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
  378. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
  379. package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
  380. package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
  381. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
  382. package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
  383. package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
  384. package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
  385. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
  386. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
  387. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +9 -1
  388. package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
  389. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
  390. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
  391. package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
  392. package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
  393. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
  394. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
  395. package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
  396. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
  397. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +5 -0
  398. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +12 -0
  399. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
  400. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
  401. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
  402. package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
  403. package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
  404. package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
  405. package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
  406. package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
  407. package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
  408. package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
  409. package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
  410. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
  411. package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
  412. package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
  413. package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
  414. package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
  415. package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
  416. package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
  417. package/Tests/Server/Types/Markdown.test.ts +1033 -0
  418. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
  419. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
  420. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
  421. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
  422. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
  423. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
  424. package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
  425. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
  426. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
  427. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
  428. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
  429. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
  430. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
  431. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
  432. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
  433. package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
  434. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
  435. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
  436. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
  437. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
  438. package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
  439. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
  440. package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
  441. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
  442. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +55 -0
  443. package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
  444. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
  445. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
  446. package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
  447. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
  448. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
  449. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
  450. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +103 -0
  451. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
  452. package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
  453. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
  454. package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
  455. package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
  456. package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
  457. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
  458. package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
  459. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
  460. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
  461. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
  462. package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
  463. package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
  464. package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
  465. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
  466. package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
  467. package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
  468. package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
  469. package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
  470. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
  471. package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
  472. package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
  473. package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
  474. package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
  475. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
  476. package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
  477. package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
  478. package/Tests/Types/DateUserTimezone.test.ts +177 -4
  479. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
  480. package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
  481. package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
  482. package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
  483. package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
  484. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
  485. package/Tests/Types/Rum/WebVitals.test.ts +173 -0
  486. package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
  487. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
  488. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
  489. package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
  490. package/Tests/Types/Timezone.test.ts +5 -0
  491. package/Tests/Types/TimezoneAlias.test.ts +1034 -0
  492. package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
  493. package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
  494. package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
  495. package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
  496. package/Tests/Types/Workflow/Templates.test.ts +79 -4
  497. package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
  498. package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
  499. package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
  500. package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
  501. package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
  502. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
  503. package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
  504. package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
  505. package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
  506. package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
  507. package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
  508. package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
  509. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
  510. package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
  511. package/Tests/UI/Components/Dropdown.test.tsx +999 -2
  512. package/Tests/UI/Components/FieldLabelInfoCardTooltip.test.tsx +413 -0
  513. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
  514. package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
  515. package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
  516. package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
  517. package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
  518. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
  519. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
  520. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
  521. package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
  522. package/Tests/UI/Components/InfoTooltip.test.tsx +242 -0
  523. package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
  524. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
  525. package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
  526. package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
  527. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +207 -3
  528. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDeleteVerb.test.tsx +367 -0
  529. package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +275 -0
  530. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
  531. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
  532. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
  533. package/Tests/UI/Components/TableHeaderTooltip.test.tsx +662 -0
  534. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
  535. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
  536. package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
  537. package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
  538. package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
  539. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
  540. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +166 -9
  541. package/Tests/UI/Rum/RecordingHealthTooltips.test.tsx +447 -0
  542. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +164 -0
  543. package/Tests/UI/Rum/ReplayFrameCapture.test.ts +6750 -0
  544. package/Tests/UI/Rum/ReplayRail.test.tsx +723 -12
  545. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +86 -0
  546. package/Tests/UI/Rum/ReplayScreenshot.test.ts +2124 -0
  547. package/Tests/UI/Rum/ReplayScreenshotActions.test.tsx +3288 -0
  548. package/Tests/UI/Rum/ReplayStage.test.tsx +62 -0
  549. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +983 -2
  550. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +149 -0
  551. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +107 -6
  552. package/Tests/UI/Rum/SessionReplayUsersTableTooltips.test.tsx +330 -0
  553. package/Tests/UI/Rum/UserFlowTooltips.test.tsx +886 -0
  554. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
  555. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  556. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  557. package/Tests/UI/Utils/PermissionGate.test.ts +76 -0
  558. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
  559. package/Tests/UI/Utils/Timezone.test.ts +747 -33
  560. package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
  561. package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
  562. package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
  563. package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
  564. package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
  565. package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
  566. package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
  567. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
  568. package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
  569. package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
  570. package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
  571. package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
  572. package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
  573. package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
  574. package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
  575. package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
  576. package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
  577. package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
  578. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
  579. package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
  580. package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
  581. package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
  582. package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
  583. package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
  584. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
  585. package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
  586. package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
  587. package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +696 -0
  588. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
  589. package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
  590. package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
  591. package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
  592. package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
  593. package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
  594. package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
  595. package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
  596. package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
  597. package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
  598. package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
  599. package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
  600. package/Tests/Utils/Rum/SessionTraceState.test.ts +239 -0
  601. package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
  602. package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
  603. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
  604. package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
  605. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
  606. package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
  607. package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
  608. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
  609. package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
  610. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
  611. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
  612. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
  613. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
  614. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
  615. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
  616. package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
  617. package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
  618. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
  619. package/Types/Date.ts +121 -7
  620. package/Types/Email/EmailMessage.ts +8 -0
  621. package/Types/Email/EmailTemplateType.ts +1 -0
  622. package/Types/Exception/ExceptionMessages.ts +1 -0
  623. package/Types/Incident/IncidentAlertLink.ts +38 -0
  624. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
  625. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
  626. package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
  627. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
  628. package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
  629. package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
  630. package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
  631. package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
  632. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
  633. package/Types/Permission.ts +48 -0
  634. package/Types/Rum/SessionReplay.ts +80 -8
  635. package/Types/Rum/SessionReplayApi.ts +44 -1
  636. package/Types/Rum/UserFlow.ts +187 -0
  637. package/Types/Rum/WebVitals.ts +52 -0
  638. package/Types/Runbook/RunbookStepType.ts +10 -0
  639. package/Types/Runbook/RunnerJobOrigin.ts +15 -0
  640. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
  641. package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
  642. package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
  643. package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
  644. package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
  645. package/Types/Timezone.ts +5 -0
  646. package/Types/TimezoneAlias.ts +385 -0
  647. package/Types/Workflow/Templates.ts +3041 -2
  648. package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
  649. package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
  650. package/Typings/Index.d.ts +24 -0
  651. package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
  652. package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
  653. package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
  654. package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
  655. package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
  656. package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
  657. package/UI/Components/Calendar/Calendar.css +83 -0
  658. package/UI/Components/Calendar/Calendar.tsx +136 -7
  659. package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
  660. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
  661. package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
  662. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
  663. package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
  664. package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
  665. package/UI/Components/Detail/FieldLabel.tsx +8 -0
  666. package/UI/Components/Dropdown/Dropdown.tsx +58 -9
  667. package/UI/Components/Forms/Fields/FormField.tsx +49 -14
  668. package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
  669. package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
  670. package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
  671. package/UI/Components/InfoCard/InfoCard.tsx +47 -1
  672. package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
  673. package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
  674. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
  675. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
  676. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
  677. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
  678. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
  679. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
  680. package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
  681. package/UI/Components/ModelTable/BaseModelTable.tsx +161 -31
  682. package/UI/Components/ModelTable/Column.ts +5 -0
  683. package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
  684. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
  685. package/UI/Components/Page/ModelPage.tsx +59 -3
  686. package/UI/Components/Table/TableHeader.tsx +47 -2
  687. package/UI/Components/Table/Types/Column.ts +7 -0
  688. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
  689. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
  690. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
  691. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
  692. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
  693. package/UI/Components/Tooltip/InfoTooltip.tsx +78 -0
  694. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
  695. package/UI/Utils/PermissionGate.ts +11 -2
  696. package/UI/Utils/Timezone.ts +69 -28
  697. package/Utils/AI/InvestigationReport.ts +195 -25
  698. package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
  699. package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
  700. package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
  701. package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
  702. package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
  703. package/Utils/Incident/IncidentFromAlerts.ts +516 -0
  704. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
  705. package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
  706. package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
  707. package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
  708. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
  709. package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
  710. package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
  711. package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
  712. package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
  713. package/Utils/Rum/SessionIdentity.ts +44 -0
  714. package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
  715. package/Utils/Rum/SessionTraceState.ts +212 -0
  716. package/Utils/Rum/UserFlow.ts +1527 -0
  717. package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
  718. package/Utils/StatusPage/ResourceUptime.ts +99 -0
  719. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
  720. package/Utils/Telemetry/AttributesJSON.ts +367 -0
  721. package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
  722. package/Utils/Uptime/UptimeUtil.ts +122 -38
  723. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
  724. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  725. package/build/dist/Models/DatabaseModels/AlertFeed.js +2 -0
  726. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  727. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  728. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  729. package/build/dist/Models/DatabaseModels/IncidentAlert.js +553 -0
  730. package/build/dist/Models/DatabaseModels/IncidentAlert.js.map +1 -0
  731. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
  732. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  733. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
  734. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  735. package/build/dist/Models/DatabaseModels/IncidentFeed.js +2 -0
  736. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  737. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
  738. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  739. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  740. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  741. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
  742. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  743. package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
  744. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  745. package/build/dist/Models/DatabaseModels/Project.js +62 -0
  746. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  747. package/build/dist/Models/DatabaseModels/RumApplication.js +53 -1
  748. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  749. package/build/dist/Models/DatabaseModels/Runner.js +4 -4
  750. package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
  751. package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
  752. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  753. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
  754. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  755. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
  756. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  757. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
  758. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  759. package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
  760. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  761. package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
  762. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  763. package/build/dist/Server/API/CommonAPI.js +49 -0
  764. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  765. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
  766. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
  767. package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
  768. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  769. package/build/dist/Server/API/MonitorAPI.js +107 -1
  770. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  771. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
  772. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
  773. package/build/dist/Server/API/SlackAPI.js +322 -78
  774. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  775. package/build/dist/Server/API/StatusPageAPI.js +123 -17
  776. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  777. package/build/dist/Server/API/TelemetryAPI.js +144 -5
  778. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  779. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
  780. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
  781. package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
  782. package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
  783. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  784. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  785. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
  786. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
  787. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
  788. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
  789. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
  790. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
  791. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
  792. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
  793. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
  794. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
  795. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js +20 -0
  796. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794800000000-AddSessionReplaySameOriginTracePropagation.js.map +1 -0
  797. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js +42 -0
  798. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794900000000-AddIncidentAlert.js.map +1 -0
  799. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  800. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  801. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
  802. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  803. package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
  804. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  805. package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
  806. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  807. package/build/dist/Server/Services/AIAgentService.js +1 -0
  808. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  809. package/build/dist/Server/Services/AccessTokenService.js +87 -42
  810. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  811. package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
  812. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
  813. package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
  814. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  815. package/build/dist/Server/Services/AlertService.js +110 -23
  816. package/build/dist/Server/Services/AlertService.js.map +1 -1
  817. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
  818. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  819. package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
  820. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  821. package/build/dist/Server/Services/BillingService.js +1 -0
  822. package/build/dist/Server/Services/BillingService.js.map +1 -1
  823. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
  824. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  825. package/build/dist/Server/Services/IncidentAlertService.js +1370 -0
  826. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -0
  827. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
  828. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  829. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
  830. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  831. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
  832. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
  833. package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
  834. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  835. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
  836. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  837. package/build/dist/Server/Services/IncidentMemberService.js +14 -0
  838. package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
  839. package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
  840. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  841. package/build/dist/Server/Services/IncidentService.js +263 -33
  842. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  843. package/build/dist/Server/Services/IncidentStateTimelineService.js +33 -0
  844. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  845. package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
  846. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  847. package/build/dist/Server/Services/Index.js +2 -0
  848. package/build/dist/Server/Services/Index.js.map +1 -1
  849. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
  850. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
  851. package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
  852. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  853. package/build/dist/Server/Services/LogAggregationService.js +14 -6
  854. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  855. package/build/dist/Server/Services/MonitorService.js +487 -48
  856. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  857. package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
  858. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  859. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
  860. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  861. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
  862. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  863. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
  864. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  865. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
  866. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  867. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
  868. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
  869. package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
  870. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
  871. package/build/dist/Server/Services/ProbeService.js +7 -1
  872. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  873. package/build/dist/Server/Services/ProjectService.js +11 -1
  874. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  875. package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
  876. package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
  877. package/build/dist/Server/Services/RunbookSecretService.js +44 -0
  878. package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
  879. package/build/dist/Server/Services/RunnerJobService.js +641 -21
  880. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  881. package/build/dist/Server/Services/RunnerService.js +344 -5
  882. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  883. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
  884. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  885. package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
  886. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  887. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
  888. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  889. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +12 -1
  890. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  891. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
  892. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  893. package/build/dist/Server/Services/StatusPageService.js +230 -32
  894. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  895. package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
  896. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  897. package/build/dist/Server/Services/TeamMemberService.js +270 -11
  898. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  899. package/build/dist/Server/Services/TraceAggregationService.js +10 -6
  900. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  901. package/build/dist/Server/Services/UserEmailService.js +1 -0
  902. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  903. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
  904. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
  905. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
  906. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
  907. package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
  908. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  909. package/build/dist/Server/Services/UserService.js +107 -1
  910. package/build/dist/Server/Services/UserService.js.map +1 -1
  911. package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
  912. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  913. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
  914. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  915. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
  916. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  917. package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
  918. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  919. package/build/dist/Server/Types/Markdown.js +394 -27
  920. package/build/dist/Server/Types/Markdown.js.map +1 -1
  921. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
  922. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
  923. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
  924. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
  925. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
  926. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
  927. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
  928. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
  929. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
  930. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  931. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
  932. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  933. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
  934. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  935. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
  936. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  937. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
  938. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  939. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
  940. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  941. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
  942. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  943. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
  944. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  945. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
  946. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  947. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
  948. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
  949. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
  950. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  951. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
  952. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  953. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
  954. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  955. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
  956. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  957. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
  958. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  959. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
  960. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  961. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
  962. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
  963. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
  964. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
  965. package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
  966. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  967. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
  968. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  969. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
  970. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
  971. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +8 -0
  972. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  973. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
  974. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  975. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
  976. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
  977. package/build/dist/Server/Utils/StartServer.js +4 -3
  978. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  979. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
  980. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
  981. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
  982. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
  983. package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
  984. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  985. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
  986. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
  987. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
  988. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
  989. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
  990. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  991. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
  992. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  993. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
  994. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  995. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
  996. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  997. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
  998. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
  999. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
  1000. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  1001. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
  1002. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  1003. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
  1004. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
  1005. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
  1006. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
  1007. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
  1008. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  1009. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
  1010. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  1011. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
  1012. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  1013. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
  1014. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  1015. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
  1016. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
  1017. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
  1018. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  1019. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
  1020. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  1021. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
  1022. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
  1023. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
  1024. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
  1025. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
  1026. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  1027. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  1028. package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
  1029. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  1030. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
  1031. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
  1032. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
  1033. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  1034. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
  1035. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
  1036. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
  1037. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
  1038. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
  1039. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
  1040. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
  1041. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  1042. package/build/dist/Types/Date.js +97 -7
  1043. package/build/dist/Types/Date.js.map +1 -1
  1044. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  1045. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1046. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  1047. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  1048. package/build/dist/Types/Incident/IncidentAlertLink.js +34 -0
  1049. package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -0
  1050. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
  1051. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
  1052. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
  1053. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
  1054. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
  1055. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
  1056. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
  1057. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
  1058. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
  1059. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  1060. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
  1061. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
  1062. package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
  1063. package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
  1064. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
  1065. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  1066. package/build/dist/Types/Permission.js +42 -0
  1067. package/build/dist/Types/Permission.js.map +1 -1
  1068. package/build/dist/Types/Rum/SessionReplay.js +52 -2
  1069. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  1070. package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
  1071. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  1072. package/build/dist/Types/Rum/UserFlow.js +115 -0
  1073. package/build/dist/Types/Rum/UserFlow.js.map +1 -0
  1074. package/build/dist/Types/Rum/WebVitals.js +25 -0
  1075. package/build/dist/Types/Rum/WebVitals.js.map +1 -1
  1076. package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
  1077. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  1078. package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
  1079. package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
  1080. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
  1081. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  1082. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
  1083. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
  1084. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
  1085. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
  1086. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
  1087. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  1088. package/build/dist/Types/Timezone.js +5 -0
  1089. package/build/dist/Types/Timezone.js.map +1 -1
  1090. package/build/dist/Types/TimezoneAlias.js +340 -0
  1091. package/build/dist/Types/TimezoneAlias.js.map +1 -0
  1092. package/build/dist/Types/Workflow/Templates.js +2694 -2
  1093. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  1094. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
  1095. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
  1096. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
  1097. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
  1098. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
  1099. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
  1100. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
  1101. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
  1102. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
  1103. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
  1104. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
  1105. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
  1106. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
  1107. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
  1108. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
  1109. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
  1110. package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
  1111. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  1112. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
  1113. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
  1114. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
  1115. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1116. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
  1117. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
  1118. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
  1119. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
  1120. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
  1121. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
  1122. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
  1123. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
  1124. package/build/dist/UI/Components/Detail/FieldLabel.js +2 -0
  1125. package/build/dist/UI/Components/Detail/FieldLabel.js.map +1 -1
  1126. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
  1127. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  1128. package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
  1129. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1130. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
  1131. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  1132. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
  1133. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  1134. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
  1135. package/build/dist/UI/Components/InfoCard/InfoCard.js +22 -1
  1136. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  1137. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
  1138. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1139. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
  1140. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
  1141. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
  1142. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  1143. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
  1144. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  1145. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  1146. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1147. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
  1148. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  1149. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
  1150. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  1151. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
  1152. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  1153. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
  1154. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
  1155. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +89 -22
  1156. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1157. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
  1158. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  1159. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
  1160. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  1161. package/build/dist/UI/Components/Page/ModelPage.js +37 -3
  1162. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  1163. package/build/dist/UI/Components/Table/TableHeader.js +18 -2
  1164. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  1165. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
  1166. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1167. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
  1168. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  1169. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  1170. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1171. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
  1172. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  1173. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
  1174. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  1175. package/build/dist/UI/Components/Tooltip/InfoTooltip.js +28 -0
  1176. package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -0
  1177. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
  1178. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
  1179. package/build/dist/UI/Utils/PermissionGate.js +4 -2
  1180. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  1181. package/build/dist/UI/Utils/Timezone.js +52 -17
  1182. package/build/dist/UI/Utils/Timezone.js.map +1 -1
  1183. package/build/dist/Utils/AI/InvestigationReport.js +116 -21
  1184. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1185. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
  1186. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
  1187. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
  1188. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
  1189. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
  1190. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
  1191. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
  1192. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
  1193. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
  1194. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
  1195. package/build/dist/Utils/Incident/IncidentFromAlerts.js +306 -0
  1196. package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -0
  1197. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
  1198. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
  1199. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
  1200. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
  1201. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
  1202. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
  1203. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
  1204. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
  1205. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
  1206. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
  1207. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
  1208. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
  1209. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
  1210. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
  1211. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
  1212. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
  1213. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
  1214. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
  1215. package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
  1216. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  1217. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
  1218. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
  1219. package/build/dist/Utils/Rum/SessionTraceState.js +154 -0
  1220. package/build/dist/Utils/Rum/SessionTraceState.js.map +1 -0
  1221. package/build/dist/Utils/Rum/UserFlow.js +941 -0
  1222. package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
  1223. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
  1224. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
  1225. package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
  1226. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  1227. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  1228. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
  1229. package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
  1230. package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
  1231. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
  1232. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
  1233. package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
  1234. package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
  1235. package/jest.config.json +2 -1
  1236. package/package.json +2 -1
  1237. package/tsconfig.tests.json +36 -0
  1238. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
  1239. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
  1240. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
  1241. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
@@ -0,0 +1,1724 @@
1
+ /*
2
+ * Redacts credential-looking material from kubectl output before it reaches
3
+ * a language model or is stored next to an AI run.
4
+ *
5
+ * Pure and dependency-free on purpose, like KubectlPolicy: the same code can
6
+ * run on the server (KubectlJobRunner, the one output path investigations
7
+ * and remediation share) and, if ever needed, inside the Runner before the
8
+ * bytes leave the cluster.
9
+ *
10
+ * What it understands — all deterministic and line-oriented, so output the
11
+ * Runner truncated is handled exactly like complete output:
12
+ * 1. The `data:` / `stringData:` / `binaryData:` blocks of Kubernetes
13
+ * objects, in YAML or pretty-printed JSON, single objects or Lists. For
14
+ * a Secret — or whenever the object's kind cannot be determined — every
15
+ * value in the block is masked (keys stay, so the model still knows
16
+ * which keys exist). For any other kind (a ConfigMap) only the values
17
+ * whose key looks credential-like are masked, so configuration stays
18
+ * readable. `kubectl describe configmap` prints the same data as
19
+ * "KEY:", a "----" rule and the value on the lines below; a
20
+ * credential-like key loses that whole value.
21
+ * 2. Container env entries (`- name: X` / `value: Y`, YAML or JSON) whose
22
+ * name looks credential-like: the value is masked; a valueFrom
23
+ * reference is kept because it holds no material.
24
+ * 3. Any `key: value` or `key=value` whose key looks credential-like,
25
+ * wherever it appears: describe output, kubeconfig-like text, container
26
+ * logs, command-line flags, one-line JSON (`{"password":"…"}`, as
27
+ * jsonpath and structured logs print it). A masked block scalar
28
+ * (`tls.key: |`) drops its whole block.
29
+ * 4. A credential flag whose value is the NEXT argv element rather than
30
+ * `=`-joined: `- --db-password` / `- value` in YAML, the same pair in a
31
+ * JSON array or describe's Args block, and `--requirepass value` inside
32
+ * one line. A tool's short password flag (`mysql -pX`, `redis-cli -a X`)
33
+ * only where the command names that tool.
34
+ * 5. The `kubectl.kubernetes.io/last-applied-configuration` annotation —
35
+ * the entire applied object, Secret data included, as one JSON string —
36
+ * is replaced wholesale.
37
+ * 6. Inline material regardless of structure: `scheme://user:password@`,
38
+ * `Bearer …` / `Basic …` tokens, JWTs, PEM private keys, one-line JSON
39
+ * `"data":{…}` objects and `"name":"…","value":"…"` env pairs, and
40
+ * base64 runs that are padded or long.
41
+ *
42
+ * Over-masking is accepted; under-masking is not. When the structure is
43
+ * ambiguous (no kind in sight, unexpected nesting inside a data block) the
44
+ * value is masked.
45
+ */
46
+
47
+ export interface KubectlOutputRedaction {
48
+ text: string;
49
+ // How many values, blocks or tokens were masked.
50
+ redactionCount: number;
51
+ }
52
+
53
+ export const KUBECTL_REDACTED_MARKER: string = "[redacted]";
54
+
55
+ // Every marker this module writes starts with it: "[redacted-jwt]" too.
56
+ const REDACTED_PREFIX: string = "[redacted";
57
+
58
+ const DATA_BLOCK_KEYS: Set<string> = new Set<string>([
59
+ "data",
60
+ "stringData",
61
+ "binaryData",
62
+ ]);
63
+
64
+ const LAST_APPLIED_CONFIGURATION_ANNOTATION: string =
65
+ "kubectl.kubernetes.io/last-applied-configuration";
66
+
67
+ /*
68
+ * A key or env name that names credential material. Deliberately broad:
69
+ * `auth` also catches "authorization-mode", which is harmless to hide,
70
+ * while a narrow list would miss "DB_PASSWORD". A bare `key` is NOT
71
+ * credential-like (taints, tolerations and secretKeyRef all have one), but
72
+ * `tls.key`, `KEY_ID`, `api_key` and `private-key-file` are.
73
+ *
74
+ * `pass`, `pw` and `creds` count as a whole segment only — DB_PASS,
75
+ * RABBITMQ_DEFAULT_PASS, LDAP_BIND_PW, DB_CREDS, `--pass` — so "bypass",
76
+ * "compass", "passed", "MAX_PASSES" and "ssl-passthrough" stay readable,
77
+ * and "pass-through" is spelled out as not a credential. A few names glue
78
+ * a prefix on instead: Redis's `requirepass`, "dbpass", "smtppass".
79
+ */
80
+ const CREDENTIAL_NAME_REGEX: RegExp =
81
+ /passw(?:or)?d|passwd|pwd|passphrase|passcode|(?:^|[-_./])pass(?:$|[-_.](?!through))|(?:require|db|user|admin|root|smtp|mail|redis|ldap|bind|sasl|ftp)pass(?![a-z])|(?:^|[-_./])(?:pw|creds?)(?:$|[-_.])|secret|token|credential|auth|cert|bearer|cookie|dockerconfig|dockercfg|webhook|(?:api|access|private|priv|encryption|signing|client|ssh|master|license|service|account|session|app|consumer|shared)[-_.]?key|(?:^|[-_./])key[-_.]|[-_./]key$|(?:^|[-_./])(?:dsn|salt|otp)(?:[-_.]|$)|\.(?:crt|cer|pem|p12|pfx|jks)$/i;
82
+
83
+ /*
84
+ * Keys that match the pattern above but only ever REFER to a credential —
85
+ * the name of a Secret a volume mounts, whether a token is automounted —
86
+ * and that an on-call engineer needs when a pod cannot start. Compared
87
+ * lowercase, with leading dashes stripped so flag names match too.
88
+ */
89
+ const REFERENCE_ONLY_KEYS: Set<string> = new Set<string>([
90
+ "secretname",
91
+ "secretnamespace",
92
+ "secretproviderclass",
93
+ "secretkeyref",
94
+ "secretref",
95
+ "configmapkeyref",
96
+ "tokenexpirationseconds",
97
+ "expirationseconds",
98
+ "serviceaccounttoken",
99
+ "automountserviceaccounttoken",
100
+ "imagepullsecrets",
101
+ "image pull secrets",
102
+ "mountable secrets",
103
+ "tokens",
104
+ "audience",
105
+ "authorization-mode",
106
+ "anonymous-auth",
107
+ "tls-min-version",
108
+ "tls-cipher-suites",
109
+ "cert-manager.io/cluster-issuer",
110
+ "cert-manager.io/issuer",
111
+ ]);
112
+
113
+ /*
114
+ * Values that carry no material and read better untouched: an absent
115
+ * value, and describe's own "<set to the key 'x' in secret 'y'>" reference
116
+ * for an env entry that comes from a Secret.
117
+ */
118
+ const EXEMPT_VALUES: Set<string> = new Set<string>([
119
+ "",
120
+ '""',
121
+ "''",
122
+ "null",
123
+ "~",
124
+ "{}",
125
+ "[]",
126
+ "{",
127
+ "[",
128
+ "<none>",
129
+ "<nil>",
130
+ "<unset>",
131
+ "<invalid>",
132
+ "<empty>",
133
+ ]);
134
+
135
+ const EXEMPT_VALUE_PREFIX: string = "<set to the key ";
136
+
137
+ // YAML block scalar indicators: |, |-, |+, >, >-, >2 ...
138
+ const BLOCK_SCALAR_REGEX: RegExp = /^[|>][+-]?[0-9]*$/;
139
+
140
+ /*
141
+ * `key: value`, `key:` and `"key": value,` at the start of a line's content.
142
+ * Unquoted keys may contain spaces (describe prints "Image ID:") but never
143
+ * a colon, so "2026-09-22T10:00:00Z" and "http://…" are not keys. The colon
144
+ * must be followed by whitespace or end the line for the same reason.
145
+ */
146
+ const KEY_VALUE_LINE_REGEX: RegExp =
147
+ /^(?:"([^"]*)"|'([^']*)'|([^\s"'#:{}[\],][^:"']*?))[ \t]*:(?:[ \t]+|$)/;
148
+
149
+ /*
150
+ * An unquoted key with whitespace or `=` in it may be free text rather than
151
+ * a name: "connecting DB_PASSWORD=hunter2 host: db" parses as the key
152
+ * "connecting DB_PASSWORD=hunter2 host". Such a key is scanned for inline
153
+ * material too.
154
+ */
155
+ const FREE_TEXT_KEY_REGEX: RegExp = /[\s=]/;
156
+
157
+ const LIST_ITEM_PREFIX_REGEX: RegExp = /^-(?:[ \t]+|$)/;
158
+
159
+ const LEADING_WHITESPACE_REGEX: RegExp = /^[ \t]*/;
160
+
161
+ /*
162
+ * scheme://user:password@host — the password only; an empty user still
163
+ * counts. The match starts at "://" and the scheme is checked by a
164
+ * lookbehind, so the scan stays linear: a pattern that STARTS with the
165
+ * scheme retries `[a-z][a-z0-9+.-]*` from every word boundary of a long
166
+ * dotted run ("eyJ.eyJ.eyJ…", "a.b.c.…") and backtracks through the whole
167
+ * run each time — 200 KB of pod log took over 30 seconds on one thread.
168
+ */
169
+ const URL_CREDENTIAL_REGEX: RegExp =
170
+ /:\/\/(?<=\b[a-z][a-z0-9+.-]*:\/\/)([^\s/:@"']*):([^\s/@"']+)@/gi;
171
+
172
+ const BEARER_TOKEN_REGEX: RegExp = /\b(Bearer)[ \t]+([A-Za-z0-9._~+/-]{8,}=*)/g;
173
+
174
+ // Prose ("Basic configuration", "Bearer authentication") is lowercase letters only.
175
+ const LOWERCASE_WORD_REGEX: RegExp = /^[a-z]+$/;
176
+
177
+ const BASIC_TOKEN_REGEX: RegExp =
178
+ /\b(Basic)[ \t]+([A-Za-z0-9+/]{8,}={0,2})(?![A-Za-z0-9+/=])/g;
179
+
180
+ const JWT_REGEX: RegExp =
181
+ /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}/g;
182
+
183
+ /*
184
+ * PEM private key blocks. A block whose END line was truncated away is
185
+ * masked to the end of the output rather than left standing.
186
+ */
187
+ const PRIVATE_KEY_BLOCK_REGEX: RegExp =
188
+ /-----BEGIN (?:[A-Z0-9]+ )*PRIVATE KEY-----[\s\S]*?(?:-----END (?:[A-Z0-9]+ )*PRIVATE KEY-----|$)/g;
189
+
190
+ /*
191
+ * Compact JSON, as in a one-line `"data":{...}` — the quote may be escaped
192
+ * when the JSON itself sits inside a JSON string.
193
+ */
194
+ const INLINE_JSON_DATA_OBJECT_REGEX: RegExp =
195
+ /("|\\")(?:data|stringData|binaryData)(?:"|\\")\s*:\s*\{/g;
196
+
197
+ /*
198
+ * A JSON string body: anything but an unescaped quote. Two spellings, for
199
+ * plain JSON and for JSON escaped inside another JSON string.
200
+ */
201
+ const JSON_STRING_BODY: string = '(?:[^"\\\\]|\\\\.)*';
202
+ const ESCAPED_JSON_STRING_BODY: string = '(?:[^"\\\\]|\\\\[^"])*';
203
+ const JSON_QUOTE: string = '"';
204
+ const ESCAPED_JSON_QUOTE: string = '\\\\"';
205
+
206
+ function buildJsonEnvPairRegexes(isEscaped: boolean): {
207
+ nameFirst: RegExp;
208
+ valueFirst: RegExp;
209
+ } {
210
+ const body: string = isEscaped ? ESCAPED_JSON_STRING_BODY : JSON_STRING_BODY;
211
+ const q: string = isEscaped ? ESCAPED_JSON_QUOTE : JSON_QUOTE;
212
+
213
+ return {
214
+ nameFirst: new RegExp(
215
+ `(${q}name${q}\\s*:\\s*${q}(${body})${q}\\s*,\\s*${q}value${q}\\s*:\\s*${q})(${body})(${q})`,
216
+ "g",
217
+ ),
218
+ valueFirst: new RegExp(
219
+ `(${q}value${q}\\s*:\\s*${q})(${body})(${q}\\s*,\\s*${q}name${q}\\s*:\\s*${q}(${body})${q})`,
220
+ "g",
221
+ ),
222
+ };
223
+ }
224
+
225
+ const JSON_ENV_PAIR_REGEXES: Array<{ nameFirst: RegExp; valueFirst: RegExp }> =
226
+ [buildJsonEnvPairRegexes(false), buildJsonEnvPairRegexes(true)];
227
+
228
+ /*
229
+ * `"key":"value"` / `"key":123` in one-line JSON — jsonpath's `{.data}`, a
230
+ * structured log line. The key is judged by isCredentialKey. It never
231
+ * contains a quote, a backslash or a line break, which keeps the scan
232
+ * linear on a long escaped line. A string the output truncated before its
233
+ * closing quote runs to the end of the text; an object or array value is
234
+ * left for its own pairs. The only bare value JSON has that can hold
235
+ * material is a number, so prose such as `volume "certs" : secret "x"` is
236
+ * not read as a pair.
237
+ */
238
+ interface JsonCredentialPairRule {
239
+ quote: string;
240
+ regex: RegExp;
241
+ }
242
+
243
+ function buildJsonCredentialPairRule(
244
+ isEscaped: boolean,
245
+ ): JsonCredentialPairRule {
246
+ const body: string = isEscaped ? ESCAPED_JSON_STRING_BODY : JSON_STRING_BODY;
247
+ const q: string = isEscaped ? ESCAPED_JSON_QUOTE : JSON_QUOTE;
248
+
249
+ return {
250
+ quote: isEscaped ? '\\"' : '"',
251
+ regex: new RegExp(
252
+ `(${q}([^"\\\\\\n]{1,256})${q}\\s*:\\s*)(?:(${q})(${body})(${q}|$)|(-?[0-9][0-9.eE+-]*))`,
253
+ "g",
254
+ ),
255
+ };
256
+ }
257
+
258
+ const JSON_CREDENTIAL_PAIR_RULES: Array<JsonCredentialPairRule> = [
259
+ buildJsonCredentialPairRule(false),
260
+ buildJsonCredentialPairRule(true),
261
+ ];
262
+
263
+ /*
264
+ * `key=value` / `key: value` / `key:value` anywhere in a line — logs, args,
265
+ * Go-formatted maps (`map[password:cGFz…]`). The key is judged by
266
+ * isCredentialKey, so this never touches "timeout=1s" or "op=Exists". A
267
+ * JSON-escaped line break (`…\npassword: x\nuser: bob` inside a log
268
+ * message) separates pairs like a real one.
269
+ */
270
+ const INLINE_PAIR_REGEX: RegExp =
271
+ /(^|[\s[,{("']|\\[nrt])([A-Za-z0-9_./-]+)([ \t]*[:=][ \t]*)("(?:[^"\\]|\\.)*"|'[^']*'|(?:[^\s,;&\]})"'\\]|\\(?![nrt]))+)/g;
272
+
273
+ /*
274
+ * An image reference — `registry.example.com/auth:1.2.3`,
275
+ * `ghcr.io/org/secret-service:2.0` — has the shape of an inline pair whose
276
+ * key is a path and whose separator is a bare colon with no whitespace
277
+ * after it. A real pair with a path-shaped key (an annotation in describe
278
+ * output, `vault.hashicorp.com/agent-inject-token: abc123`) always has the
279
+ * space. The tag is what an on-call engineer needs most, so it stays.
280
+ */
281
+ function isImageReferencePair(key: string, separator: string): boolean {
282
+ return key.includes("/") && separator === ":";
283
+ }
284
+
285
+ /*
286
+ * A command-line flag standing alone as one argv element: "--db-password",
287
+ * "-password". A credential flag's value is then the NEXT element, which
288
+ * the pair rules above never see.
289
+ */
290
+ const FLAG_TOKEN_REGEX: RegExp = /^-{1,2}[A-Za-z][A-Za-z0-9_.-]*$/;
291
+
292
+ /*
293
+ * A flag's value inside one line: a quoted string, or a bare word that is
294
+ * neither the next flag ("-…") nor a marker this module already wrote.
295
+ */
296
+ const INLINE_FLAG_VALUE_PATTERN: RegExp =
297
+ /("(?:[^"\\]|\\.)*"|'[^']*'|[^\s"'[\-,;&|`\])}][^\s"',;&|`\])}]*)/;
298
+ const INLINE_FLAG_VALUE_SOURCE: string = INLINE_FLAG_VALUE_PATTERN.source;
299
+
300
+ // Where a flag can start inside a line.
301
+ const INLINE_FLAG_BOUNDARY_PATTERN: RegExp = /(^|[\s"'[(,;&|`])/;
302
+ const INLINE_FLAG_BOUNDARY_SOURCE: string = INLINE_FLAG_BOUNDARY_PATTERN.source;
303
+
304
+ /*
305
+ * `--requirepass value` / `-password value` in one line: a command in a
306
+ * log, describe's probe line, an `sh -c` script. The flag is judged by
307
+ * isCredentialKey, so "--port 8080" and "--tail 100" stay.
308
+ */
309
+ const INLINE_SPLIT_FLAG_REGEX: RegExp = new RegExp(
310
+ `${INLINE_FLAG_BOUNDARY_SOURCE}(--?[A-Za-z][A-Za-z0-9_.-]*)([ \\t]+)${INLINE_FLAG_VALUE_SOURCE}`,
311
+ "g",
312
+ );
313
+
314
+ /*
315
+ * `"--db-password","value"` — a flag and its value as neighbouring JSON
316
+ * array strings (jsonpath `{.spec.containers[*].args}`), plain, escaped
317
+ * inside another JSON string, or single-quoted as a Python list prints it.
318
+ */
319
+ function buildQuotedFlagPairRegex(quote: string, body: string): RegExp {
320
+ return new RegExp(
321
+ `(${quote}(--?[A-Za-z][A-Za-z0-9_.-]*)${quote}\\s*,\\s*${quote})(${body})(${quote})`,
322
+ "g",
323
+ );
324
+ }
325
+
326
+ const QUOTED_FLAG_PAIR_REGEXES: Array<RegExp> = [
327
+ buildQuotedFlagPairRegex(JSON_QUOTE, JSON_STRING_BODY),
328
+ buildQuotedFlagPairRegex(ESCAPED_JSON_QUOTE, ESCAPED_JSON_STRING_BODY),
329
+ buildQuotedFlagPairRegex("'", "[^']*"),
330
+ ];
331
+
332
+ /*
333
+ * Tools whose single-letter flag carries a password: `mysql -pS3cret`,
334
+ * `mongosh -p S3cret`, `sshpass -p S3cret`, `redis-cli -a S3cret`. The
335
+ * same letters mean something else everywhere else — `-p` is a port for
336
+ * ssh, psql and redis-cli and "make parents" for mkdir — so a short flag
337
+ * is judged only where the command names one of these tools: earlier on
338
+ * the same line, or earlier in the same one-element-per-line argv list.
339
+ */
340
+ const SHORT_PASSWORD_FLAG_BY_TOOL: Map<string, string> = new Map<
341
+ string,
342
+ string
343
+ >([
344
+ ["mysql", "p"],
345
+ ["mysqladmin", "p"],
346
+ ["mysqldump", "p"],
347
+ ["mysqlcheck", "p"],
348
+ ["mysqlimport", "p"],
349
+ ["mysqlshow", "p"],
350
+ ["mysqlpump", "p"],
351
+ ["mysqlsh", "p"],
352
+ ["mariadb", "p"],
353
+ ["mariadb-admin", "p"],
354
+ ["mariadb-dump", "p"],
355
+ ["mariadb-check", "p"],
356
+ ["mariadb-import", "p"],
357
+ ["mongo", "p"],
358
+ ["mongosh", "p"],
359
+ ["mongodump", "p"],
360
+ ["mongorestore", "p"],
361
+ ["mongoexport", "p"],
362
+ ["mongoimport", "p"],
363
+ ["mongostat", "p"],
364
+ ["mongotop", "p"],
365
+ ["sshpass", "p"],
366
+ ["redis-cli", "a"],
367
+ ["keydb-cli", "a"],
368
+ ["valkey-cli", "a"],
369
+ ]);
370
+
371
+ // One of those tools named inside a line, a path in front of it allowed.
372
+ const TOOL_NAME_REGEX: RegExp = new RegExp(
373
+ `(^|[\\s/"'[(,;&|=\`])(${Array.from(SHORT_PASSWORD_FLAG_BY_TOOL.keys()).join("|")})(?=$|[\\s"'\\]),;&|\`\\\\])`,
374
+ "g",
375
+ );
376
+
377
+ // Where the command a tool starts ends inside a line.
378
+ const COMMAND_END_REGEX: RegExp = /[\];|&)`]/;
379
+
380
+ interface ShortPasswordFlagRegexes {
381
+ // "-pS3cret"
382
+ attached: RegExp;
383
+ // "-p S3cret", and "-p","S3cret" in a JSON array.
384
+ separated: RegExp;
385
+ }
386
+
387
+ // The password glued to a short flag ("-pS3cret"): a bare word.
388
+ const SHORT_PASSWORD_ATTACHED_VALUE_PATTERN: RegExp =
389
+ /([^\s"'[\-,;&|`\])}][^\s"',;&|`\])}]*)/;
390
+
391
+ // What separates a short flag from its password: blanks, or a list's ",".
392
+ const SHORT_PASSWORD_SEPARATOR_PATTERN: RegExp =
393
+ /([ \t]+|"\s*,\s*"|\\"\s*,\s*\\"|'\s*,\s*')/;
394
+
395
+ function buildShortPasswordFlagRegexes(
396
+ letter: string,
397
+ ): ShortPasswordFlagRegexes {
398
+ return {
399
+ attached: new RegExp(
400
+ `${INLINE_FLAG_BOUNDARY_SOURCE}(-${letter})${SHORT_PASSWORD_ATTACHED_VALUE_PATTERN.source}`,
401
+ "g",
402
+ ),
403
+ separated: new RegExp(
404
+ `${INLINE_FLAG_BOUNDARY_SOURCE}(-${letter})${SHORT_PASSWORD_SEPARATOR_PATTERN.source}${INLINE_FLAG_VALUE_SOURCE}`,
405
+ "g",
406
+ ),
407
+ };
408
+ }
409
+
410
+ const SHORT_PASSWORD_FLAG_REGEXES: Map<string, ShortPasswordFlagRegexes> =
411
+ new Map<string, ShortPasswordFlagRegexes>(
412
+ Array.from(new Set<string>(SHORT_PASSWORD_FLAG_BY_TOOL.values())).map(
413
+ (letter: string): [string, ShortPasswordFlagRegexes] => {
414
+ return [letter, buildShortPasswordFlagRegexes(letter)];
415
+ },
416
+ ),
417
+ );
418
+
419
+ /*
420
+ * `kubectl describe configmap` prints each data entry as "KEY:", this rule
421
+ * on the next line, and the value verbatim below it; the entries end with
422
+ * a "BinaryData" heading underlined the same way.
423
+ */
424
+ const DESCRIBE_DATA_ENTRY_RULE: string = "----";
425
+ const DESCRIBE_BINARY_DATA_HEADING: string = "BinaryData";
426
+ const DESCRIBE_SECTION_RULE: string = "====";
427
+
428
+ /*
429
+ * Base64 runs. A padded run of any length is base64 by construction
430
+ * ("cGFzc3dvcmQ=" is "password"); an unpadded run must be long and mixed to
431
+ * count, so identifiers, hashes and hex ids stay legible. The padding must
432
+ * end the token: "--feature-gates=Foo=true" is a flag, not a secret.
433
+ */
434
+ const BASE64_PADDED_REGEX: RegExp =
435
+ /(?<![A-Za-z0-9+/])([A-Za-z0-9+/]{4,})(={1,2})(?![A-Za-z0-9+/=])/g;
436
+
437
+ const BASE64_LONG_REGEX: RegExp =
438
+ /(?<![A-Za-z0-9+/])([A-Za-z0-9+/]{32,})(?![A-Za-z0-9+/=])/g;
439
+
440
+ interface ParsedLine {
441
+ raw: string;
442
+ isBlank: boolean;
443
+ // Width of the leading whitespace.
444
+ indent: number;
445
+ // A YAML sequence entry: "- key: value" or "- value".
446
+ isListItem: boolean;
447
+ // Where the entry's own content starts: after the "- " of a list item.
448
+ contentIndent: number;
449
+ // The key of a "key: value" line, without quotes; absent otherwise.
450
+ key?: string | undefined;
451
+ // An unquoted key with whitespace or "=" in it, which may be free text.
452
+ keyIsFreeText?: boolean | undefined;
453
+ // Everything after the colon, trimmed; "" for "key:".
454
+ value?: string | undefined;
455
+ // Column in `raw` where the value text begins.
456
+ valueStart?: number | undefined;
457
+ }
458
+
459
+ interface RedactedLines {
460
+ lines: Array<string>;
461
+ // Index of the first line NOT consumed.
462
+ next: number;
463
+ count: number;
464
+ }
465
+
466
+ // What the up-front passes decided about lines the main pass reaches later.
467
+ interface LineMasks {
468
+ // `value:` lines of env entries whose name looks credential-like.
469
+ envValueLines: Set<number>;
470
+ // Argv elements that are a credential flag's value, with their masked text.
471
+ argvValueLines: Map<number, string>;
472
+ }
473
+
474
+ // A one-element-per-line argv list as findArgvValueLines walks it.
475
+ interface ArgvList {
476
+ indent: number;
477
+ isListItem: boolean;
478
+ // The short password flag of a tool named earlier in the list ("p", "a").
479
+ shortPasswordFlag: string | undefined;
480
+ // The previous element was a credential flag: this one is its value.
481
+ expectsValue: boolean;
482
+ }
483
+
484
+ function parseLine(raw: string): ParsedLine {
485
+ const whitespaceMatch: RegExpExecArray | null =
486
+ LEADING_WHITESPACE_REGEX.exec(raw);
487
+ const indent: number = whitespaceMatch ? whitespaceMatch[0].length : 0;
488
+ let content: string = raw.slice(indent);
489
+
490
+ if (content.trim() === "") {
491
+ return { raw, isBlank: true, indent, isListItem: false, contentIndent: 0 };
492
+ }
493
+
494
+ let isListItem: boolean = false;
495
+ let contentIndent: number = indent;
496
+
497
+ const listMatch: RegExpExecArray | null =
498
+ LIST_ITEM_PREFIX_REGEX.exec(content);
499
+ if (listMatch) {
500
+ isListItem = true;
501
+ contentIndent = indent + listMatch[0].length;
502
+ content = content.slice(listMatch[0].length);
503
+ }
504
+
505
+ const keyMatch: RegExpExecArray | null = KEY_VALUE_LINE_REGEX.exec(content);
506
+
507
+ if (!keyMatch) {
508
+ return { raw, isBlank: false, indent, isListItem, contentIndent };
509
+ }
510
+
511
+ const key: string = (keyMatch[1] ?? keyMatch[2] ?? keyMatch[3] ?? "").trim();
512
+ const valueStart: number = contentIndent + keyMatch[0].length;
513
+
514
+ return {
515
+ raw,
516
+ isBlank: false,
517
+ indent,
518
+ isListItem,
519
+ contentIndent,
520
+ key,
521
+ keyIsFreeText:
522
+ keyMatch[3] !== undefined && FREE_TEXT_KEY_REGEX.test(keyMatch[3]),
523
+ value: raw.slice(valueStart).trim(),
524
+ valueStart,
525
+ };
526
+ }
527
+
528
+ // Strip a JSON trailing comma and surrounding quotes from a scalar.
529
+ function unquote(value: string): string {
530
+ let body: string = value.trim();
531
+ if (body.endsWith(",")) {
532
+ body = body.slice(0, -1).trimEnd();
533
+ }
534
+ if (
535
+ body.length >= 2 &&
536
+ ((body.startsWith('"') && body.endsWith('"')) ||
537
+ (body.startsWith("'") && body.endsWith("'")))
538
+ ) {
539
+ body = body.slice(1, -1);
540
+ }
541
+ return body;
542
+ }
543
+
544
+ function isDocumentSeparator(line: ParsedLine): boolean {
545
+ return line.raw.trim() === "---";
546
+ }
547
+
548
+ function isBlockScalar(value: string): boolean {
549
+ return BLOCK_SCALAR_REGEX.test(value);
550
+ }
551
+
552
+ // "data:" or "\"data\": {" — a mapping whose entries follow on later lines.
553
+ function isContainerStart(value: string | undefined): boolean {
554
+ return value === "" || value === "{";
555
+ }
556
+
557
+ // A value with no material in it, including a marker an earlier pass wrote.
558
+ function isExemptValue(value: string): boolean {
559
+ let body: string = value.trim();
560
+ if (body.endsWith(",")) {
561
+ body = body.slice(0, -1).trimEnd();
562
+ }
563
+ return (
564
+ EXEMPT_VALUES.has(body) ||
565
+ body.startsWith(EXEMPT_VALUE_PREFIX) ||
566
+ unquote(body).startsWith(REDACTED_PREFIX)
567
+ );
568
+ }
569
+
570
+ function looksLikeCredentialName(name: string): boolean {
571
+ return CREDENTIAL_NAME_REGEX.test(name.trim());
572
+ }
573
+
574
+ // A key that names credential material, minus the reference-only keys.
575
+ function isCredentialKey(key: string): boolean {
576
+ const normalized: string = key.trim().replace(/^-+/, "").toLowerCase();
577
+ if (REFERENCE_ONLY_KEYS.has(normalized)) {
578
+ return false;
579
+ }
580
+ return looksLikeCredentialName(normalized);
581
+ }
582
+
583
+ /*
584
+ * An argv element that can be a flag's value: not the next flag, not
585
+ * empty, not a marker this module already wrote.
586
+ */
587
+ function isArgvValue(element: string): boolean {
588
+ return !element.startsWith("-") && !isExemptValue(element);
589
+ }
590
+
591
+ // The short password flag of the tool an argv element names, if any.
592
+ function shortPasswordFlagOfTool(element: string): string | undefined {
593
+ return SHORT_PASSWORD_FLAG_BY_TOOL.get(
594
+ element.slice(element.lastIndexOf("/") + 1),
595
+ );
596
+ }
597
+
598
+ /*
599
+ * A scalar replaced by the marker, keeping its quotes, a JSON trailing
600
+ * comma and `keptPrefix` (the "-p" of "-pS3cret").
601
+ */
602
+ function maskScalar(value: string, keptPrefix: string = ""): string {
603
+ const trailingComma: string = value.trimEnd().endsWith(",") ? "," : "";
604
+ const body: string = trailingComma
605
+ ? value.trimEnd().slice(0, -1).trimEnd()
606
+ : value.trim();
607
+
608
+ if (body.startsWith('"')) {
609
+ return `"${keptPrefix}${KUBECTL_REDACTED_MARKER}"${trailingComma}`;
610
+ }
611
+ if (body.startsWith("'")) {
612
+ return `'${keptPrefix}${KUBECTL_REDACTED_MARKER}'${trailingComma}`;
613
+ }
614
+ return `${keptPrefix}${KUBECTL_REDACTED_MARKER}${trailingComma}`;
615
+ }
616
+
617
+ /*
618
+ * A bare value found inside a line, replaced by the marker. When the value
619
+ * ends the body of an escaped JSON string (`…=S3cret\"`), the backslash
620
+ * belongs to the closing quote and stays.
621
+ */
622
+ function maskInlineValue(value: string): string {
623
+ if (value.startsWith('"') || value.startsWith("'")) {
624
+ return maskScalar(value);
625
+ }
626
+ return `${KUBECTL_REDACTED_MARKER}${value.endsWith("\\") ? "\\" : ""}`;
627
+ }
628
+
629
+ /*
630
+ * The part of a `key: value` line before its value. A key that may be free
631
+ * text gets the inline rules; an ordinary key is returned as it is.
632
+ */
633
+ function redactKeyPrefix(line: ParsedLine): { text: string; count: number } {
634
+ const prefix: string = line.raw.slice(0, line.valueStart ?? 0);
635
+
636
+ if (!line.keyIsFreeText) {
637
+ return { text: prefix, count: 0 };
638
+ }
639
+
640
+ const inline: { text: string; count: number } = applyInlineRules(
641
+ prefix.slice(line.contentIndent),
642
+ );
643
+
644
+ return {
645
+ text: prefix.slice(0, line.contentIndent) + inline.text,
646
+ count: inline.count,
647
+ };
648
+ }
649
+
650
+ function maskValueInPlace(line: ParsedLine): { text: string; count: number } {
651
+ if (line.valueStart === undefined || line.value === undefined) {
652
+ return {
653
+ text: " ".repeat(line.indent) + KUBECTL_REDACTED_MARKER,
654
+ count: 1,
655
+ };
656
+ }
657
+
658
+ const prefix: { text: string; count: number } = redactKeyPrefix(line);
659
+
660
+ return {
661
+ text: prefix.text + maskScalar(line.value),
662
+ count: prefix.count + 1,
663
+ };
664
+ }
665
+
666
+ // The first line at or above `indent` — the end of a nested block.
667
+ function skipDeeperLines(
668
+ parsed: Array<ParsedLine>,
669
+ from: number,
670
+ indent: number,
671
+ ): number {
672
+ let index: number = from;
673
+ while (index < parsed.length) {
674
+ const line: ParsedLine = parsed[index]!;
675
+ if (!line.isBlank && line.indent <= indent) {
676
+ break;
677
+ }
678
+ index++;
679
+ }
680
+ return index;
681
+ }
682
+
683
+ const UPPERCASE_REGEX: RegExp = /[A-Z]/;
684
+ const LOWERCASE_REGEX: RegExp = /[a-z]/;
685
+ const DIGIT_REGEX: RegExp = /[0-9]/;
686
+
687
+ function hasUpperAndLower(text: string): boolean {
688
+ return UPPERCASE_REGEX.test(text) && LOWERCASE_REGEX.test(text);
689
+ }
690
+
691
+ function hasDigit(text: string): boolean {
692
+ return DIGIT_REGEX.test(text);
693
+ }
694
+
695
+ // `Bearer …` / `Basic …`: the token after the scheme, unless it is prose.
696
+ function maskAuthorizationTokens(
697
+ text: string,
698
+ regex: RegExp,
699
+ ): { text: string; count: number } {
700
+ let count: number = 0;
701
+
702
+ const result: string = text.replace(
703
+ regex,
704
+ (match: string, scheme: string, token: string): string => {
705
+ if (LOWERCASE_WORD_REGEX.test(token)) {
706
+ return match;
707
+ }
708
+ count++;
709
+ return `${scheme} ${KUBECTL_REDACTED_MARKER}`;
710
+ },
711
+ );
712
+
713
+ return { text: result, count };
714
+ }
715
+
716
+ /*
717
+ * One-line JSON env pairs, `"name":"X","value":"Y"` in either order: the
718
+ * value is masked when the name looks credential-like and the value holds
719
+ * something (an empty value, or one already masked, stays as it is).
720
+ */
721
+ function maskJsonEnvPairs(
722
+ text: string,
723
+ regexes: { nameFirst: RegExp; valueFirst: RegExp },
724
+ ): { text: string; count: number } {
725
+ let count: number = 0;
726
+
727
+ let result: string = text.replace(
728
+ regexes.nameFirst,
729
+ (
730
+ match: string,
731
+ prefix: string,
732
+ name: string,
733
+ value: string,
734
+ closingQuote: string,
735
+ ): string => {
736
+ if (!looksLikeCredentialName(name) || isExemptValue(value)) {
737
+ return match;
738
+ }
739
+ count++;
740
+ return `${prefix}${KUBECTL_REDACTED_MARKER}${closingQuote}`;
741
+ },
742
+ );
743
+
744
+ result = result.replace(
745
+ regexes.valueFirst,
746
+ (
747
+ match: string,
748
+ prefix: string,
749
+ value: string,
750
+ suffix: string,
751
+ name: string,
752
+ ): string => {
753
+ if (!looksLikeCredentialName(name) || isExemptValue(value)) {
754
+ return match;
755
+ }
756
+ count++;
757
+ return `${prefix}${KUBECTL_REDACTED_MARKER}${suffix}`;
758
+ },
759
+ );
760
+
761
+ return { text: result, count };
762
+ }
763
+
764
+ /*
765
+ * One-line JSON `"key":"value"` pairs whose key looks credential-like, and
766
+ * the last-applied-configuration annotation as jsonpath prints it. The
767
+ * quotes stay, so the JSON still parses; a bare number becomes a string.
768
+ */
769
+ function maskJsonCredentialPairs(
770
+ text: string,
771
+ rule: JsonCredentialPairRule,
772
+ ): { text: string; count: number } {
773
+ let count: number = 0;
774
+
775
+ const result: string = text.replace(
776
+ rule.regex,
777
+ (
778
+ match: string,
779
+ prefix: string,
780
+ key: string,
781
+ openingQuote: string | undefined,
782
+ body: string | undefined,
783
+ closingQuote: string | undefined,
784
+ bare: string | undefined,
785
+ ): string => {
786
+ if (
787
+ key !== LAST_APPLIED_CONFIGURATION_ANNOTATION &&
788
+ !isCredentialKey(key)
789
+ ) {
790
+ return match;
791
+ }
792
+
793
+ if (openingQuote !== undefined) {
794
+ if (isExemptValue(body ?? "")) {
795
+ return match;
796
+ }
797
+ count++;
798
+ return `${prefix}${openingQuote}${KUBECTL_REDACTED_MARKER}${closingQuote ?? ""}`;
799
+ }
800
+
801
+ if (bare === undefined) {
802
+ return match;
803
+ }
804
+ count++;
805
+ return `${prefix}${rule.quote}${KUBECTL_REDACTED_MARKER}${rule.quote}`;
806
+ },
807
+ );
808
+
809
+ return { text: result, count };
810
+ }
811
+
812
+ // `"--db-password","value"` in a one-line array: the value is masked.
813
+ function maskQuotedFlagPairs(
814
+ text: string,
815
+ regex: RegExp,
816
+ ): { text: string; count: number } {
817
+ let count: number = 0;
818
+
819
+ const result: string = text.replace(
820
+ regex,
821
+ (
822
+ match: string,
823
+ prefix: string,
824
+ flag: string,
825
+ value: string,
826
+ closingQuote: string,
827
+ ): string => {
828
+ if (!isCredentialKey(flag) || !isArgvValue(value)) {
829
+ return match;
830
+ }
831
+ count++;
832
+ return `${prefix}${KUBECTL_REDACTED_MARKER}${closingQuote}`;
833
+ },
834
+ );
835
+
836
+ return { text: result, count };
837
+ }
838
+
839
+ // `--requirepass value` inside one line: the value is masked.
840
+ function maskInlineSplitFlags(text: string): { text: string; count: number } {
841
+ let count: number = 0;
842
+
843
+ const result: string = text.replace(
844
+ INLINE_SPLIT_FLAG_REGEX,
845
+ (
846
+ match: string,
847
+ boundary: string,
848
+ flag: string,
849
+ separator: string,
850
+ value: string,
851
+ ): string => {
852
+ if (!isCredentialKey(flag) || !isArgvValue(unquote(value))) {
853
+ return match;
854
+ }
855
+ count++;
856
+ return `${boundary}${flag}${separator}${maskInlineValue(value)}`;
857
+ },
858
+ );
859
+
860
+ return { text: result, count };
861
+ }
862
+
863
+ // A tool's short password flag within the stretch of a line that is its command.
864
+ function maskShortPasswordFlag(
865
+ text: string,
866
+ letter: string,
867
+ ): { text: string; count: number } {
868
+ const regexes: ShortPasswordFlagRegexes | undefined =
869
+ SHORT_PASSWORD_FLAG_REGEXES.get(letter);
870
+ if (!regexes) {
871
+ return { text, count: 0 };
872
+ }
873
+
874
+ let count: number = 0;
875
+
876
+ let result: string = text.replace(
877
+ regexes.separated,
878
+ (
879
+ match: string,
880
+ boundary: string,
881
+ flag: string,
882
+ separator: string,
883
+ value: string,
884
+ ): string => {
885
+ if (!isArgvValue(unquote(value))) {
886
+ return match;
887
+ }
888
+ count++;
889
+ return `${boundary}${flag}${separator}${maskInlineValue(value)}`;
890
+ },
891
+ );
892
+
893
+ result = result.replace(
894
+ regexes.attached,
895
+ (_match: string, boundary: string, flag: string, value: string): string => {
896
+ count++;
897
+ return `${boundary}${flag}${maskInlineValue(value)}`;
898
+ },
899
+ );
900
+
901
+ return { text: result, count };
902
+ }
903
+
904
+ /*
905
+ * `mysql -pS3cret`, `mongosh -p S3cret`, `redis-cli -a S3cret`: a tool's
906
+ * short password flag, judged only in the stretch of the line from the
907
+ * tool's name to the next tool or the end of its command (`]`, `)`, `;`,
908
+ * `|`, `&`, a backtick).
909
+ */
910
+ function maskToolPasswordFlags(text: string): { text: string; count: number } {
911
+ const tools: Array<{ start: number; end: number; letter: string }> = [];
912
+
913
+ TOOL_NAME_REGEX.lastIndex = 0;
914
+ let match: RegExpExecArray | null = TOOL_NAME_REGEX.exec(text);
915
+ while (match) {
916
+ const start: number = match.index + (match[1] ?? "").length;
917
+ const name: string = match[2] ?? "";
918
+ tools.push({
919
+ start,
920
+ end: start + name.length,
921
+ letter: SHORT_PASSWORD_FLAG_BY_TOOL.get(name) ?? "",
922
+ });
923
+ match = TOOL_NAME_REGEX.exec(text);
924
+ }
925
+ TOOL_NAME_REGEX.lastIndex = 0;
926
+
927
+ if (tools.length === 0) {
928
+ return { text, count: 0 };
929
+ }
930
+
931
+ let result: string = "";
932
+ let count: number = 0;
933
+ let cursor: number = 0;
934
+
935
+ tools.forEach(
936
+ (
937
+ tool: { start: number; end: number; letter: string },
938
+ toolIndex: number,
939
+ ): void => {
940
+ /*
941
+ * Only the stretch up to the next tool is searched for the command's
942
+ * end, so a line naming a tool many times is still scanned once.
943
+ */
944
+ const nextTool: { start: number } | undefined = tools[toolIndex + 1];
945
+ const stretch: string = text.slice(
946
+ tool.end,
947
+ nextTool ? nextTool.start : text.length,
948
+ );
949
+ const commandEnd: number = stretch.search(COMMAND_END_REGEX);
950
+ const command: string =
951
+ commandEnd === -1 ? stretch : stretch.slice(0, commandEnd);
952
+
953
+ result += text.slice(cursor, tool.end);
954
+ const masked: { text: string; count: number } = maskShortPasswordFlag(
955
+ command,
956
+ tool.letter,
957
+ );
958
+ result += masked.text;
959
+ count += masked.count;
960
+ cursor = tool.end + command.length;
961
+ },
962
+ );
963
+
964
+ result += text.slice(cursor);
965
+
966
+ return { text: result, count };
967
+ }
968
+
969
+ /*
970
+ * Mask the body of every one-line `"data":{…}` object. Braces are matched
971
+ * by depth; an object the line truncated away is masked to the end.
972
+ */
973
+ function maskInlineJsonDataObjects(text: string): {
974
+ text: string;
975
+ count: number;
976
+ } {
977
+ let result: string = text;
978
+ let count: number = 0;
979
+ let searchFrom: number = 0;
980
+
981
+ while (searchFrom < result.length) {
982
+ INLINE_JSON_DATA_OBJECT_REGEX.lastIndex = searchFrom;
983
+ const match: RegExpExecArray | null =
984
+ INLINE_JSON_DATA_OBJECT_REGEX.exec(result);
985
+ if (!match) {
986
+ break;
987
+ }
988
+
989
+ const quote: string = match[1] ?? '"';
990
+ const bodyStart: number = match.index + match[0].length;
991
+ let depth: number = 1;
992
+ let position: number = bodyStart;
993
+
994
+ while (position < result.length && depth > 0) {
995
+ const character: string = result[position]!;
996
+ if (character === "{") {
997
+ depth++;
998
+ } else if (character === "}") {
999
+ depth--;
1000
+ }
1001
+ position++;
1002
+ }
1003
+
1004
+ // `position` is just past the closing brace, or the end of the text.
1005
+ const bodyEnd: number = depth === 0 ? position - 1 : result.length;
1006
+
1007
+ if (result.slice(bodyStart, bodyEnd).trim() === "") {
1008
+ searchFrom = position;
1009
+ continue;
1010
+ }
1011
+
1012
+ const replacement: string = `${quote}${KUBECTL_REDACTED_MARKER}${quote}:${quote}${KUBECTL_REDACTED_MARKER}${quote}`;
1013
+ result = result.slice(0, bodyStart) + replacement + result.slice(bodyEnd);
1014
+ count++;
1015
+ searchFrom = bodyStart + replacement.length;
1016
+ }
1017
+
1018
+ INLINE_JSON_DATA_OBJECT_REGEX.lastIndex = 0;
1019
+
1020
+ return { text: result, count };
1021
+ }
1022
+
1023
+ // The rules that apply to any line regardless of its YAML/JSON structure.
1024
+ function applyInlineRules(text: string): { text: string; count: number } {
1025
+ let count: number = 0;
1026
+ let result: string = text;
1027
+
1028
+ const apply: (masked: { text: string; count: number }) => void = (masked: {
1029
+ text: string;
1030
+ count: number;
1031
+ }): void => {
1032
+ result = masked.text;
1033
+ count += masked.count;
1034
+ };
1035
+
1036
+ result = result.replace(
1037
+ URL_CREDENTIAL_REGEX,
1038
+ (_match: string, user: string): string => {
1039
+ count++;
1040
+ return `://${user}:${KUBECTL_REDACTED_MARKER}@`;
1041
+ },
1042
+ );
1043
+
1044
+ for (const tokenRegex of [BEARER_TOKEN_REGEX, BASIC_TOKEN_REGEX]) {
1045
+ apply(maskAuthorizationTokens(result, tokenRegex));
1046
+ }
1047
+
1048
+ result = result.replace(JWT_REGEX, (): string => {
1049
+ count++;
1050
+ return "[redacted-jwt]";
1051
+ });
1052
+
1053
+ apply(maskInlineJsonDataObjects(result));
1054
+
1055
+ for (const pair of JSON_ENV_PAIR_REGEXES) {
1056
+ apply(maskJsonEnvPairs(result, pair));
1057
+ }
1058
+
1059
+ for (const rule of JSON_CREDENTIAL_PAIR_RULES) {
1060
+ apply(maskJsonCredentialPairs(result, rule));
1061
+ }
1062
+
1063
+ for (const regex of QUOTED_FLAG_PAIR_REGEXES) {
1064
+ apply(maskQuotedFlagPairs(result, regex));
1065
+ }
1066
+
1067
+ result = result.replace(
1068
+ INLINE_PAIR_REGEX,
1069
+ (
1070
+ match: string,
1071
+ boundary: string,
1072
+ key: string,
1073
+ separator: string,
1074
+ value: string,
1075
+ ): string => {
1076
+ if (
1077
+ isImageReferencePair(key, separator) ||
1078
+ !isCredentialKey(key) ||
1079
+ isExemptValue(value)
1080
+ ) {
1081
+ return match;
1082
+ }
1083
+ count++;
1084
+ return `${boundary}${key}${separator}${KUBECTL_REDACTED_MARKER}${value.endsWith("\\") ? "\\" : ""}`;
1085
+ },
1086
+ );
1087
+
1088
+ apply(maskInlineSplitFlags(result));
1089
+
1090
+ apply(maskToolPasswordFlags(result));
1091
+
1092
+ result = result.replace(
1093
+ BASE64_PADDED_REGEX,
1094
+ (match: string, run: string): string => {
1095
+ if (!hasUpperAndLower(run) && !hasDigit(run)) {
1096
+ return match;
1097
+ }
1098
+ count++;
1099
+ return "[redacted-base64]";
1100
+ },
1101
+ );
1102
+
1103
+ result = result.replace(
1104
+ BASE64_LONG_REGEX,
1105
+ (match: string, run: string): string => {
1106
+ if (!hasUpperAndLower(run) || !hasDigit(run)) {
1107
+ return match;
1108
+ }
1109
+ count++;
1110
+ return "[redacted-base64]";
1111
+ },
1112
+ );
1113
+
1114
+ return { text: result, count };
1115
+ }
1116
+
1117
+ /*
1118
+ * The inline rules over one line. A line that already parsed as
1119
+ * `key: value` has its value examined, and its key only when the key may
1120
+ * be free text: its key was judged by isCredentialKey (and possibly
1121
+ * exempted), and re-reading "Image pull secrets:" as the pair "secrets:
1122
+ * <none>" must not undo that.
1123
+ */
1124
+ function applyInlineRulesToLine(line: ParsedLine): {
1125
+ text: string;
1126
+ count: number;
1127
+ } {
1128
+ if (line.valueStart === undefined || line.value === undefined) {
1129
+ return applyInlineRules(line.raw);
1130
+ }
1131
+
1132
+ const prefix: { text: string; count: number } = redactKeyPrefix(line);
1133
+ const inline: { text: string; count: number } = applyInlineRules(
1134
+ line.raw.slice(line.valueStart),
1135
+ );
1136
+
1137
+ return {
1138
+ text: prefix.text + inline.text,
1139
+ count: prefix.count + inline.count,
1140
+ };
1141
+ }
1142
+
1143
+ export default class KubectlOutputRedactor {
1144
+ public static redact(output: string): KubectlOutputRedaction {
1145
+ if (!output) {
1146
+ return { text: "", redactionCount: 0 };
1147
+ }
1148
+
1149
+ const parsed: Array<ParsedLine> = output
1150
+ .replace(/\r\n?/g, "\n")
1151
+ .split("\n")
1152
+ .map(parseLine);
1153
+
1154
+ const masks: LineMasks = {
1155
+ envValueLines: KubectlOutputRedactor.findCredentialEnvValueLines(parsed),
1156
+ argvValueLines: KubectlOutputRedactor.findArgvValueLines(parsed),
1157
+ };
1158
+
1159
+ const out: Array<string> = [];
1160
+ let count: number = 0;
1161
+ let index: number = 0;
1162
+
1163
+ while (index < parsed.length) {
1164
+ const line: ParsedLine = parsed[index]!;
1165
+
1166
+ let step: RedactedLines;
1167
+ if (
1168
+ KubectlOutputRedactor.isDescribeDataEntry(parsed, index) &&
1169
+ isCredentialKey(line.key ?? "")
1170
+ ) {
1171
+ step = KubectlOutputRedactor.redactDescribeDataEntry(parsed, index);
1172
+ } else if (
1173
+ !line.isBlank &&
1174
+ line.key !== undefined &&
1175
+ DATA_BLOCK_KEYS.has(line.key) &&
1176
+ isContainerStart(line.value)
1177
+ ) {
1178
+ step = KubectlOutputRedactor.redactDataBlock(parsed, index, masks);
1179
+ } else {
1180
+ step = KubectlOutputRedactor.redactStandaloneLine(parsed, index, masks);
1181
+ }
1182
+
1183
+ out.push(...step.lines);
1184
+ count += step.count;
1185
+ index = step.next;
1186
+ }
1187
+
1188
+ let text: string = out.join("\n");
1189
+
1190
+ text = text.replace(PRIVATE_KEY_BLOCK_REGEX, (): string => {
1191
+ count++;
1192
+ return "[redacted-private-key]";
1193
+ });
1194
+
1195
+ return { text, redactionCount: count };
1196
+ }
1197
+
1198
+ /*
1199
+ * Which `value:` lines belong to an env entry whose `name:` looks
1200
+ * credential-like. Found up front because the value may precede the name
1201
+ * inside its entry, and the main pass only ever moves forward.
1202
+ */
1203
+ private static findCredentialEnvValueLines(
1204
+ parsed: Array<ParsedLine>,
1205
+ ): Set<number> {
1206
+ const valueLines: Set<number> = new Set<number>();
1207
+
1208
+ for (let index: number = 0; index < parsed.length; index++) {
1209
+ const line: ParsedLine = parsed[index]!;
1210
+
1211
+ if (line.isBlank || line.key !== "name" || line.value === undefined) {
1212
+ continue;
1213
+ }
1214
+
1215
+ const name: string = unquote(line.value);
1216
+ if (!name || !looksLikeCredentialName(name)) {
1217
+ continue;
1218
+ }
1219
+
1220
+ const valueLine: number | undefined =
1221
+ KubectlOutputRedactor.findSiblingValueLine(parsed, index);
1222
+ if (valueLine !== undefined) {
1223
+ valueLines.add(valueLine);
1224
+ }
1225
+ }
1226
+
1227
+ return valueLines;
1228
+ }
1229
+
1230
+ /*
1231
+ * Argv printed one element per line — `- --db-password` / `- value` in
1232
+ * YAML, `"--db-password",` / `"value"` in pretty JSON, describe's Command
1233
+ * and Args blocks — and the elements that are the value of a credential
1234
+ * flag before them, each with its masked text. A list's elements are
1235
+ * consecutive lines at the same indent and of the same shape; a
1236
+ * `key: value` line ends it (describe prints an argument that contains
1237
+ * ": " as is, so a flag's value may look like one). A tool's short
1238
+ * password flag counts only once the list has named the tool.
1239
+ */
1240
+ private static findArgvValueLines(
1241
+ parsed: Array<ParsedLine>,
1242
+ ): Map<number, string> {
1243
+ const masked: Map<number, string> = new Map<number, string>();
1244
+ let list: ArgvList | undefined = undefined;
1245
+
1246
+ for (let index: number = 0; index < parsed.length; index++) {
1247
+ const line: ParsedLine = parsed[index]!;
1248
+
1249
+ if (line.isBlank) {
1250
+ continue;
1251
+ }
1252
+
1253
+ // "- key: value" is a mapping entry, never an argv element.
1254
+ if (line.isListItem && line.key !== undefined) {
1255
+ list = undefined;
1256
+ continue;
1257
+ }
1258
+
1259
+ if (
1260
+ list === undefined ||
1261
+ list.indent !== line.indent ||
1262
+ list.isListItem !== line.isListItem
1263
+ ) {
1264
+ list = {
1265
+ indent: line.indent,
1266
+ isListItem: line.isListItem,
1267
+ shortPasswordFlag: undefined,
1268
+ expectsValue: false,
1269
+ };
1270
+ }
1271
+
1272
+ const indentText: string = line.raw.slice(0, line.contentIndent);
1273
+ const content: string = line.raw.slice(line.contentIndent);
1274
+ const element: string = unquote(content);
1275
+
1276
+ if (list.expectsValue) {
1277
+ list.expectsValue = false;
1278
+ if (isArgvValue(element)) {
1279
+ masked.set(index, indentText + maskScalar(content));
1280
+ continue;
1281
+ }
1282
+ }
1283
+
1284
+ if (line.key !== undefined) {
1285
+ list = undefined;
1286
+ continue;
1287
+ }
1288
+
1289
+ const shortFlag: string | undefined =
1290
+ list.shortPasswordFlag !== undefined
1291
+ ? `-${list.shortPasswordFlag}`
1292
+ : undefined;
1293
+
1294
+ if (shortFlag !== undefined && element.startsWith(shortFlag)) {
1295
+ const attached: string = element.slice(shortFlag.length);
1296
+ if (attached === "") {
1297
+ list.expectsValue = true;
1298
+ } else if (isArgvValue(attached)) {
1299
+ masked.set(index, indentText + maskScalar(content, shortFlag));
1300
+ }
1301
+ continue;
1302
+ }
1303
+
1304
+ if (FLAG_TOKEN_REGEX.test(element) && isCredentialKey(element)) {
1305
+ list.expectsValue = true;
1306
+ continue;
1307
+ }
1308
+
1309
+ const toolFlag: string | undefined = shortPasswordFlagOfTool(element);
1310
+ if (toolFlag !== undefined) {
1311
+ list.shortPasswordFlag = toolFlag;
1312
+ }
1313
+ }
1314
+
1315
+ return masked;
1316
+ }
1317
+
1318
+ /*
1319
+ * The `value:` sibling of a `name:` line inside the same list entry (YAML)
1320
+ * or object (JSON). Siblings share the name line's content indent; a
1321
+ * shallower line ends the entry, a deeper one is nested under a sibling.
1322
+ */
1323
+ private static findSiblingValueLine(
1324
+ parsed: Array<ParsedLine>,
1325
+ nameIndex: number,
1326
+ ): number | undefined {
1327
+ const nameLine: ParsedLine = parsed[nameIndex]!;
1328
+ const indent: number = nameLine.contentIndent;
1329
+
1330
+ for (let index: number = nameIndex + 1; index < parsed.length; index++) {
1331
+ const line: ParsedLine = parsed[index]!;
1332
+ if (line.isBlank) {
1333
+ continue;
1334
+ }
1335
+ if (line.indent < indent) {
1336
+ break;
1337
+ }
1338
+ if (line.indent > indent || line.isListItem) {
1339
+ continue;
1340
+ }
1341
+ if (line.key === "value") {
1342
+ return index;
1343
+ }
1344
+ }
1345
+
1346
+ // "- name: X" is its entry's first line: nothing above it is a sibling.
1347
+ if (nameLine.isListItem) {
1348
+ return undefined;
1349
+ }
1350
+
1351
+ for (let index: number = nameIndex - 1; index >= 0; index--) {
1352
+ const line: ParsedLine = parsed[index]!;
1353
+ if (line.isBlank) {
1354
+ continue;
1355
+ }
1356
+ if (line.isListItem && line.contentIndent === indent) {
1357
+ // The entry's own "- …" line — a sibling, and the entry's start.
1358
+ return line.key === "value" ? index : undefined;
1359
+ }
1360
+ if (line.indent < indent) {
1361
+ break;
1362
+ }
1363
+ if (line.indent > indent || line.isListItem) {
1364
+ continue;
1365
+ }
1366
+ if (line.key === "value") {
1367
+ return index;
1368
+ }
1369
+ }
1370
+
1371
+ return undefined;
1372
+ }
1373
+
1374
+ /*
1375
+ * The `kind:` sibling of a data block: same indent, same object, on
1376
+ * either side of the block. Undefined when the output does not say — a
1377
+ * truncated object, or not a Kubernetes object at all.
1378
+ */
1379
+ private static findSiblingKind(
1380
+ parsed: Array<ParsedLine>,
1381
+ blockIndex: number,
1382
+ ): string | undefined {
1383
+ const indent: number = parsed[blockIndex]!.contentIndent;
1384
+
1385
+ for (let index: number = blockIndex - 1; index >= 0; index--) {
1386
+ const line: ParsedLine = parsed[index]!;
1387
+ if (line.isBlank) {
1388
+ continue;
1389
+ }
1390
+ if (isDocumentSeparator(line)) {
1391
+ break;
1392
+ }
1393
+ if (line.indent > indent) {
1394
+ continue;
1395
+ }
1396
+ if (line.isListItem && line.contentIndent === indent) {
1397
+ // The entry's own "- …" line: its first key, and the entry's start.
1398
+ if (line.key === "kind" && line.value !== undefined) {
1399
+ return unquote(line.value);
1400
+ }
1401
+ break;
1402
+ }
1403
+ if (line.indent < indent) {
1404
+ break;
1405
+ }
1406
+ if (line.isListItem) {
1407
+ continue;
1408
+ }
1409
+ if (line.key === "kind" && line.value !== undefined) {
1410
+ return unquote(line.value);
1411
+ }
1412
+ }
1413
+
1414
+ for (let index: number = blockIndex + 1; index < parsed.length; index++) {
1415
+ const line: ParsedLine = parsed[index]!;
1416
+ if (line.isBlank) {
1417
+ continue;
1418
+ }
1419
+ if (isDocumentSeparator(line)) {
1420
+ break;
1421
+ }
1422
+ if (line.indent > indent) {
1423
+ continue;
1424
+ }
1425
+ if (line.indent < indent) {
1426
+ break;
1427
+ }
1428
+ if (line.isListItem) {
1429
+ continue;
1430
+ }
1431
+ if (line.key === "kind" && line.value !== undefined) {
1432
+ return unquote(line.value);
1433
+ }
1434
+ }
1435
+
1436
+ return undefined;
1437
+ }
1438
+
1439
+ /*
1440
+ * A `kubectl describe configmap` data entry: "KEY:" with nothing after
1441
+ * the colon, then the "----" rule at the same indent on the next line.
1442
+ */
1443
+ private static isDescribeDataEntry(
1444
+ parsed: Array<ParsedLine>,
1445
+ index: number,
1446
+ ): boolean {
1447
+ const line: ParsedLine | undefined = parsed[index];
1448
+ const rule: ParsedLine | undefined = parsed[index + 1];
1449
+
1450
+ return (
1451
+ line !== undefined &&
1452
+ rule !== undefined &&
1453
+ !line.isBlank &&
1454
+ !line.isListItem &&
1455
+ line.key !== undefined &&
1456
+ line.value === "" &&
1457
+ !rule.isBlank &&
1458
+ rule.indent === line.indent &&
1459
+ rule.raw.trim() === DESCRIBE_DATA_ENTRY_RULE
1460
+ );
1461
+ }
1462
+
1463
+ /*
1464
+ * Where a describe data entry's value ends: at the next entry or the
1465
+ * "BinaryData" heading after the last one — each follows a blank line at
1466
+ * the entry's indent — or at the end of the output.
1467
+ */
1468
+ private static isDescribeDataValueEnd(
1469
+ parsed: Array<ParsedLine>,
1470
+ index: number,
1471
+ indent: number,
1472
+ ): boolean {
1473
+ const line: ParsedLine = parsed[index]!;
1474
+ const previous: ParsedLine | undefined = parsed[index - 1];
1475
+ const next: ParsedLine | undefined = parsed[index + 1];
1476
+
1477
+ if (line.isBlank || line.indent !== indent || !previous?.isBlank) {
1478
+ return false;
1479
+ }
1480
+
1481
+ if (KubectlOutputRedactor.isDescribeDataEntry(parsed, index)) {
1482
+ return true;
1483
+ }
1484
+
1485
+ return (
1486
+ line.raw.trim() === DESCRIBE_BINARY_DATA_HEADING &&
1487
+ next !== undefined &&
1488
+ next.raw.trim() === DESCRIBE_SECTION_RULE
1489
+ );
1490
+ }
1491
+
1492
+ /*
1493
+ * A credential-like describe data entry. The key and the rule stay; the
1494
+ * whole value — every line of it, blank lines included, since a
1495
+ * properties file or a PEM block has them — becomes one marker, and the
1496
+ * blank lines that close the entry stay. A value the Runner truncated
1497
+ * is masked to the end of the output.
1498
+ */
1499
+ private static redactDescribeDataEntry(
1500
+ parsed: Array<ParsedLine>,
1501
+ headerIndex: number,
1502
+ ): RedactedLines {
1503
+ const header: ParsedLine = parsed[headerIndex]!;
1504
+ const valueStart: number = headerIndex + 2;
1505
+
1506
+ let end: number = valueStart;
1507
+ while (
1508
+ end < parsed.length &&
1509
+ !KubectlOutputRedactor.isDescribeDataValueEnd(parsed, end, header.indent)
1510
+ ) {
1511
+ end++;
1512
+ }
1513
+
1514
+ let lastValueLine: number = valueStart - 1;
1515
+ for (let index: number = valueStart; index < end; index++) {
1516
+ if (!parsed[index]!.isBlank) {
1517
+ lastValueLine = index;
1518
+ }
1519
+ }
1520
+
1521
+ const lines: Array<string> = [header.raw, parsed[headerIndex + 1]!.raw];
1522
+ let count: number = 0;
1523
+
1524
+ if (lastValueLine >= valueStart) {
1525
+ const valueLines: Array<ParsedLine> = parsed.slice(
1526
+ valueStart,
1527
+ lastValueLine + 1,
1528
+ );
1529
+ const isAlreadyMasked: boolean = valueLines.every(
1530
+ (line: ParsedLine): boolean => {
1531
+ return line.isBlank || line.raw.trim() === KUBECTL_REDACTED_MARKER;
1532
+ },
1533
+ );
1534
+
1535
+ if (isAlreadyMasked) {
1536
+ lines.push(
1537
+ ...valueLines.map((line: ParsedLine): string => {
1538
+ return line.raw;
1539
+ }),
1540
+ );
1541
+ } else {
1542
+ lines.push(" ".repeat(header.indent) + KUBECTL_REDACTED_MARKER);
1543
+ count++;
1544
+ }
1545
+ }
1546
+
1547
+ for (let index: number = lastValueLine + 1; index < end; index++) {
1548
+ lines.push(parsed[index]!.raw);
1549
+ }
1550
+
1551
+ return { lines, next: end, count };
1552
+ }
1553
+
1554
+ /*
1555
+ * A `data:` / `stringData:` / `binaryData:` block. Every value is masked
1556
+ * for a Secret or an object of unknown kind; only credential-like keys
1557
+ * are masked for anything else. Keys are kept either way.
1558
+ */
1559
+ private static redactDataBlock(
1560
+ parsed: Array<ParsedLine>,
1561
+ blockIndex: number,
1562
+ masks: LineMasks,
1563
+ ): RedactedLines {
1564
+ const block: ParsedLine = parsed[blockIndex]!;
1565
+ const kind: string | undefined = KubectlOutputRedactor.findSiblingKind(
1566
+ parsed,
1567
+ blockIndex,
1568
+ );
1569
+ const maskEveryValue: boolean =
1570
+ kind === undefined || kind.toLowerCase() === "secret";
1571
+
1572
+ const lines: Array<string> = [block.raw];
1573
+ let count: number = 0;
1574
+ let index: number = blockIndex + 1;
1575
+ let entryIndent: number | undefined = undefined;
1576
+ let entryMasked: boolean = false;
1577
+
1578
+ while (index < parsed.length) {
1579
+ const line: ParsedLine = parsed[index]!;
1580
+
1581
+ if (line.isBlank) {
1582
+ if (!entryMasked) {
1583
+ lines.push(line.raw);
1584
+ }
1585
+ index++;
1586
+ continue;
1587
+ }
1588
+
1589
+ if (line.indent <= block.contentIndent) {
1590
+ break;
1591
+ }
1592
+
1593
+ if (entryIndent === undefined) {
1594
+ entryIndent = line.indent;
1595
+ }
1596
+
1597
+ // Deeper than an entry: a block scalar body or nested structure.
1598
+ if (line.indent > entryIndent) {
1599
+ if (maskEveryValue || entryMasked) {
1600
+ index++;
1601
+ continue;
1602
+ }
1603
+ const nested: RedactedLines =
1604
+ KubectlOutputRedactor.redactStandaloneLine(parsed, index, masks);
1605
+ lines.push(...nested.lines);
1606
+ count += nested.count;
1607
+ index = nested.next;
1608
+ continue;
1609
+ }
1610
+
1611
+ if (line.key === undefined) {
1612
+ // Not "key: value" — an unexpected shape inside a data block.
1613
+ if (maskEveryValue) {
1614
+ lines.push(" ".repeat(line.indent) + KUBECTL_REDACTED_MARKER);
1615
+ count++;
1616
+ entryMasked = true;
1617
+ } else {
1618
+ const inline: { text: string; count: number } = applyInlineRules(
1619
+ line.raw,
1620
+ );
1621
+ lines.push(inline.text);
1622
+ count += inline.count;
1623
+ entryMasked = false;
1624
+ }
1625
+ index++;
1626
+ continue;
1627
+ }
1628
+
1629
+ if (maskEveryValue || isCredentialKey(line.key)) {
1630
+ if (line.value !== undefined && !isExemptValue(line.value)) {
1631
+ const masked: { text: string; count: number } =
1632
+ maskValueInPlace(line);
1633
+ lines.push(masked.text);
1634
+ count += masked.count;
1635
+ } else {
1636
+ lines.push(line.raw);
1637
+ }
1638
+ entryMasked = true;
1639
+ index++;
1640
+ continue;
1641
+ }
1642
+
1643
+ const inline: { text: string; count: number } =
1644
+ applyInlineRulesToLine(line);
1645
+ lines.push(inline.text);
1646
+ count += inline.count;
1647
+ entryMasked = false;
1648
+ index++;
1649
+ }
1650
+
1651
+ return { lines, next: index, count };
1652
+ }
1653
+
1654
+ /*
1655
+ * One line outside a data block: env value, argv value, credential-like
1656
+ * key, inline rules.
1657
+ */
1658
+ private static redactStandaloneLine(
1659
+ parsed: Array<ParsedLine>,
1660
+ index: number,
1661
+ masks: LineMasks,
1662
+ ): RedactedLines {
1663
+ const line: ParsedLine = parsed[index]!;
1664
+
1665
+ if (line.isBlank) {
1666
+ return { lines: [line.raw], next: index + 1, count: 0 };
1667
+ }
1668
+
1669
+ if (masks.envValueLines.has(index) && line.value !== undefined) {
1670
+ if (isBlockScalar(line.value)) {
1671
+ const masked: { text: string; count: number } = maskValueInPlace(line);
1672
+ return {
1673
+ lines: [masked.text],
1674
+ next: skipDeeperLines(parsed, index + 1, line.contentIndent),
1675
+ count: masked.count,
1676
+ };
1677
+ }
1678
+ if (!isExemptValue(line.value)) {
1679
+ const masked: { text: string; count: number } = maskValueInPlace(line);
1680
+ return { lines: [masked.text], next: index + 1, count: masked.count };
1681
+ }
1682
+ }
1683
+
1684
+ const argvValue: string | undefined = masks.argvValueLines.get(index);
1685
+ if (argvValue !== undefined) {
1686
+ return { lines: [argvValue], next: index + 1, count: 1 };
1687
+ }
1688
+
1689
+ if (
1690
+ line.key !== undefined &&
1691
+ line.value !== undefined &&
1692
+ (line.key === LAST_APPLIED_CONFIGURATION_ANNOTATION ||
1693
+ isCredentialKey(line.key))
1694
+ ) {
1695
+ if (isBlockScalar(line.value)) {
1696
+ const masked: { text: string; count: number } = maskValueInPlace(line);
1697
+ return {
1698
+ lines: [masked.text],
1699
+ next: skipDeeperLines(parsed, index + 1, line.contentIndent),
1700
+ count: masked.count,
1701
+ };
1702
+ }
1703
+ if (!isExemptValue(line.value)) {
1704
+ const masked: { text: string; count: number } = maskValueInPlace(line);
1705
+ return { lines: [masked.text], next: index + 1, count: masked.count };
1706
+ }
1707
+ /*
1708
+ * A credential-like key with nothing to hide on this line: its
1709
+ * children are judged on their own, and describe's "<set to the key
1710
+ * …>" reference must not be chewed up by the inline pair rule.
1711
+ */
1712
+ const prefix: { text: string; count: number } = redactKeyPrefix(line);
1713
+ return {
1714
+ lines: [prefix.text + line.raw.slice(line.valueStart ?? 0)],
1715
+ next: index + 1,
1716
+ count: prefix.count,
1717
+ };
1718
+ }
1719
+
1720
+ const inline: { text: string; count: number } =
1721
+ applyInlineRulesToLine(line);
1722
+ return { lines: [inline.text], next: index + 1, count: inline.count };
1723
+ }
1724
+ }