@oneuptime/common 14.0.0 → 14.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1270) hide show
  1. package/Models/DatabaseModels/AlertEpisodeMember.ts +8 -1
  2. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
  3. package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
  4. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
  5. package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
  6. package/Models/DatabaseModels/Index.ts +4 -0
  7. package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
  8. package/Models/DatabaseModels/Monitor.ts +48 -0
  9. package/Models/DatabaseModels/Runner.ts +5 -4
  10. package/Models/DatabaseModels/RunnerJob.ts +66 -0
  11. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
  12. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  13. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  14. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  15. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  16. package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
  17. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
  18. package/Server/API/AIInvestigationAPI.ts +341 -0
  19. package/Server/API/AutoRemediationAPI.ts +184 -2
  20. package/Server/API/CommonAPI.ts +70 -0
  21. package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
  22. package/Server/API/MicrosoftTeamsAPI.ts +770 -315
  23. package/Server/API/MonitorAPI.ts +140 -0
  24. package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
  25. package/Server/API/SlackAPI.ts +447 -99
  26. package/Server/API/StatusPageAPI.ts +146 -26
  27. package/Server/API/TelemetryAPI.ts +216 -5
  28. package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
  29. package/Server/API/WorkflowVariableAPI.ts +156 -0
  30. package/Server/Infrastructure/GlobalCache.ts +35 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  39. package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
  40. package/Server/Middleware/TelemetryIngest.ts +47 -2
  41. package/Server/Middleware/UserAuthorization.ts +56 -2
  42. package/Server/Services/AIAgentService.ts +1 -0
  43. package/Server/Services/AccessTokenService.ts +121 -48
  44. package/Server/Services/AlertEpisodeMemberService.ts +9 -0
  45. package/Server/Services/AlertEpisodeService.ts +14 -1
  46. package/Server/Services/AlertService.ts +134 -22
  47. package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
  48. package/Server/Services/AutoRemediationRuleService.ts +118 -0
  49. package/Server/Services/BillingService.ts +1 -0
  50. package/Server/Services/DatabaseService.ts +10 -0
  51. package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
  52. package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
  53. package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
  54. package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
  55. package/Server/Services/IncidentEpisodeService.ts +14 -1
  56. package/Server/Services/IncidentGroupingEngineService.ts +11 -0
  57. package/Server/Services/IncidentMemberService.ts +21 -0
  58. package/Server/Services/IncidentPublicNoteService.ts +63 -0
  59. package/Server/Services/IncidentService.ts +120 -20
  60. package/Server/Services/IncidentStateTimelineService.ts +15 -0
  61. package/Server/Services/IncidentTemplateService.ts +83 -3
  62. package/Server/Services/Index.ts +4 -0
  63. package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
  64. package/Server/Services/KubernetesClusterService.ts +1570 -1
  65. package/Server/Services/LogAggregationService.ts +14 -6
  66. package/Server/Services/MonitorService.ts +654 -54
  67. package/Server/Services/MonitorStatusTimelineService.ts +639 -2
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
  69. package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
  70. package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
  71. package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
  72. package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
  73. package/Server/Services/OnCallSetupReminderService.ts +1 -0
  74. package/Server/Services/ProbeService.ts +7 -1
  75. package/Server/Services/ProjectService.ts +11 -1
  76. package/Server/Services/RunbookCredentialService.ts +26 -1
  77. package/Server/Services/RunbookSecretService.ts +36 -0
  78. package/Server/Services/RunnerJobService.ts +941 -23
  79. package/Server/Services/RunnerService.ts +439 -6
  80. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
  81. package/Server/Services/ScheduledMaintenanceService.ts +124 -19
  82. package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
  83. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  84. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  85. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  86. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  87. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  88. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  89. package/Server/Services/ServiceLevelObjectiveService.ts +42 -1
  90. package/Server/Services/StatusPagePrivateUserService.ts +1 -0
  91. package/Server/Services/StatusPageService.ts +301 -74
  92. package/Server/Services/StatusPageSubscriberService.ts +4 -0
  93. package/Server/Services/TeamMemberService.ts +309 -7
  94. package/Server/Services/TraceAggregationService.ts +10 -6
  95. package/Server/Services/UserEmailService.ts +1 -0
  96. package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
  97. package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
  98. package/Server/Services/UserNotificationRuleService.ts +4 -0
  99. package/Server/Services/UserService.ts +122 -1
  100. package/Server/Services/WorkflowVariableService.ts +593 -8
  101. package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
  102. package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
  103. package/Server/Types/Database/QueryHelper.ts +22 -0
  104. package/Server/Types/Markdown.ts +502 -27
  105. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  106. package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
  107. package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
  108. package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
  109. package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
  110. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
  111. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
  112. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
  113. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
  114. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
  115. package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
  116. package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
  117. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  118. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
  119. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
  120. package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
  121. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
  122. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
  123. package/Server/Utils/Monitor/AffectedResourceList.ts +31 -73
  124. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  125. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  126. package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
  127. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +181 -136
  128. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
  129. package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
  130. package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
  131. package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
  132. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  133. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
  134. package/Server/Utils/PushNotificationUtil.ts +45 -0
  135. package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
  136. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  137. package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
  138. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
  139. package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
  140. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  141. package/Server/Utils/StartServer.ts +4 -3
  142. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
  143. package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
  144. package/Server/Utils/UserPermission/UserPermission.ts +16 -0
  145. package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
  146. package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
  147. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
  148. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
  149. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
  150. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
  151. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
  152. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
  153. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
  154. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
  155. package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
  156. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
  157. package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
  158. package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
  159. package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
  160. package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
  161. package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
  162. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
  163. package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
  164. package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
  165. package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
  166. package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  167. package/Server/Utils/Workspace/Workspace.ts +171 -54
  168. package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
  169. package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
  170. package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
  171. package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
  172. package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
  173. package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
  174. package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
  175. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
  176. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
  177. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
  178. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
  179. package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
  180. package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
  181. package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
  182. package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
  183. package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
  184. package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
  185. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +218 -0
  186. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  187. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  188. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  189. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
  190. package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
  191. package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
  192. package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
  193. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
  194. package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
  195. package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
  196. package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
  197. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  198. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +606 -3
  199. package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
  200. package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
  201. package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
  202. package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
  203. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
  204. package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
  205. package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
  206. package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
  207. package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
  208. package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
  209. package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
  210. package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
  211. package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
  212. package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
  213. package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
  214. package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
  215. package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
  216. package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
  217. package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
  218. package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
  219. package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
  220. package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
  221. package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
  222. package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
  223. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
  224. package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
  225. package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
  226. package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
  227. package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
  228. package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
  229. package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
  230. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
  231. package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
  232. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  233. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
  234. package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
  235. package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
  236. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
  237. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  238. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  239. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  240. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
  241. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
  242. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
  243. package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
  244. package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
  245. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  246. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
  247. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
  248. package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
  249. package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
  250. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
  251. package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
  252. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
  253. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
  254. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
  255. package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
  256. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
  257. package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
  258. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
  259. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  260. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  261. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  262. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  263. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  264. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  265. package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
  266. package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
  267. package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
  268. package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
  269. package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
  270. package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
  271. package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
  272. package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
  273. package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
  274. package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
  275. package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
  276. package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
  277. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
  278. package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
  279. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
  280. package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
  281. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
  282. package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
  283. package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
  284. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  285. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  286. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  287. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  288. package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
  289. package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
  290. package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
  291. package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
  292. package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
  293. package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
  294. package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
  295. package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
  296. package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
  297. package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
  298. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
  299. package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
  300. package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
  301. package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
  302. package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
  303. package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
  304. package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
  305. package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
  306. package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
  307. package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
  308. package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
  309. package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
  310. package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
  311. package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
  312. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  313. package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
  314. package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
  315. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  316. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  317. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  318. package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
  319. package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
  320. package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
  321. package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
  322. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
  323. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
  324. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
  325. package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
  326. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
  327. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
  328. package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
  329. package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
  330. package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
  331. package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
  332. package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
  333. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
  334. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  335. package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
  336. package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
  337. package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
  338. package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
  339. package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
  340. package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
  341. package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
  342. package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
  343. package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
  344. package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
  345. package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
  346. package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
  347. package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
  348. package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
  349. package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
  350. package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
  351. package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
  352. package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
  353. package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
  354. package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
  355. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
  356. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
  357. package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
  358. package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
  359. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
  360. package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
  361. package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
  362. package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
  363. package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
  364. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  365. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
  366. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +39 -1
  367. package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
  368. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
  369. package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
  370. package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
  371. package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
  372. package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
  373. package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
  374. package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
  375. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
  376. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1175 -0
  377. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  378. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  379. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  380. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  381. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  382. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +174 -0
  383. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  384. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
  385. package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
  386. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
  387. package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
  388. package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
  389. package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
  390. package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
  391. package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
  392. package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
  393. package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
  394. package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
  395. package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
  396. package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
  397. package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
  398. package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
  399. package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
  400. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  401. package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
  402. package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
  403. package/Tests/Server/Types/Markdown.test.ts +1035 -1
  404. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  405. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  406. package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
  407. package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
  408. package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
  409. package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
  410. package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
  411. package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
  412. package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
  413. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
  414. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
  415. package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
  416. package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
  417. package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
  418. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
  419. package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
  420. package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
  421. package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
  422. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  423. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
  424. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
  425. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
  426. package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
  427. package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
  428. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
  429. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  430. package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
  431. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
  432. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +405 -0
  433. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1156 -0
  434. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  435. package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
  436. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
  437. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
  438. package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
  439. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  440. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
  441. package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
  442. package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
  443. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  444. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  445. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
  446. package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
  447. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  448. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
  449. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  450. package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
  451. package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
  452. package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
  453. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
  454. package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
  455. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
  456. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
  457. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
  458. package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
  459. package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
  460. package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
  461. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
  462. package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
  463. package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
  464. package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
  465. package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
  466. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
  467. package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
  468. package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
  469. package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
  470. package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
  471. package/Tests/Types/API/Route.test.ts +56 -0
  472. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  473. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
  474. package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
  475. package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
  476. package/Tests/Types/DateUserTimezone.test.ts +177 -4
  477. package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
  478. package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
  479. package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
  480. package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
  481. package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
  482. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
  483. package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
  484. package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
  485. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
  486. package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
  487. package/Tests/Types/Timezone.test.ts +5 -0
  488. package/Tests/Types/TimezoneAlias.test.ts +1034 -0
  489. package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
  490. package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
  491. package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
  492. package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
  493. package/Tests/Types/Workflow/Templates.test.ts +79 -4
  494. package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
  495. package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
  496. package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
  497. package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
  498. package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
  499. package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
  500. package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
  501. package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
  502. package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
  503. package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
  504. package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
  505. package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
  506. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
  507. package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
  508. package/Tests/UI/Components/Dropdown.test.tsx +999 -2
  509. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  510. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  511. package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
  512. package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
  513. package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
  514. package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
  515. package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
  516. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
  517. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
  518. package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
  519. package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
  520. package/Tests/UI/Components/Icon.test.tsx +26 -0
  521. package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
  522. package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
  523. package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
  524. package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
  525. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
  526. package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
  527. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
  528. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  529. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
  530. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
  531. package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
  532. package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
  533. package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
  534. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  535. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  536. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
  537. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
  538. package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
  539. package/Tests/UI/Utils/Timezone.test.ts +747 -33
  540. package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
  541. package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
  542. package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
  543. package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
  544. package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
  545. package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
  546. package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
  547. package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
  548. package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
  549. package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
  550. package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
  551. package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
  552. package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
  553. package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
  554. package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
  555. package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
  556. package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
  557. package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
  558. package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
  559. package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
  560. package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
  561. package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
  562. package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
  563. package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
  564. package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
  565. package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
  566. package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
  567. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  568. package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
  569. package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
  570. package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
  571. package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
  572. package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
  573. package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
  574. package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
  575. package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
  576. package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
  577. package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
  578. package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
  579. package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
  580. package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
  581. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  582. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  583. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  584. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  585. package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
  586. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
  587. package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
  588. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
  589. package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
  590. package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
  591. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
  592. package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
  593. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
  594. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
  595. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
  596. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
  597. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
  598. package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
  599. package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
  600. package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
  601. package/Types/API/Route.ts +19 -2
  602. package/Types/API/URL.ts +26 -2
  603. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
  604. package/Types/Date.ts +121 -7
  605. package/Types/Email/EmailMessage.ts +8 -0
  606. package/Types/Email/EmailTemplateType.ts +1 -0
  607. package/Types/Exception/ExceptionMessages.ts +1 -0
  608. package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
  609. package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
  610. package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
  611. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
  612. package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
  613. package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
  614. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  615. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  616. package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
  617. package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
  618. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
  619. package/Types/Permission.ts +90 -0
  620. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  621. package/Types/Rules/RuleRun.ts +4 -0
  622. package/Types/Rum/SessionReplay.ts +55 -2
  623. package/Types/Rum/SessionReplayApi.ts +44 -1
  624. package/Types/Rum/UserFlow.ts +187 -0
  625. package/Types/Runbook/RunbookStepType.ts +10 -0
  626. package/Types/Runbook/RunnerJobOrigin.ts +15 -0
  627. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
  628. package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
  629. package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
  630. package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
  631. package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
  632. package/Types/Timezone.ts +5 -0
  633. package/Types/TimezoneAlias.ts +385 -0
  634. package/Types/Workflow/Templates.ts +3041 -2
  635. package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
  636. package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
  637. package/Typings/Index.d.ts +24 -0
  638. package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
  639. package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
  640. package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
  641. package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
  642. package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
  643. package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
  644. package/UI/Components/Calendar/Calendar.css +83 -0
  645. package/UI/Components/Calendar/Calendar.tsx +136 -7
  646. package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
  647. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
  648. package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
  649. package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
  650. package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
  651. package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
  652. package/UI/Components/Dropdown/Dropdown.tsx +58 -9
  653. package/UI/Components/Feed/FeedOptions.ts +427 -0
  654. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  655. package/UI/Components/Feed/useFeedItems.ts +28 -9
  656. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  657. package/UI/Components/Forms/Fields/FormField.tsx +49 -14
  658. package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
  659. package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
  660. package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
  661. package/UI/Components/Icon/Icon.tsx +1 -1
  662. package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
  663. package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
  664. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
  665. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
  666. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
  667. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
  668. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
  669. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
  670. package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
  671. package/UI/Components/ModelTable/BaseModelTable.tsx +66 -14
  672. package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
  673. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
  674. package/UI/Components/Page/ModelPage.tsx +59 -3
  675. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
  676. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
  677. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
  678. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
  679. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
  680. package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
  681. package/UI/Utils/Timezone.ts +69 -28
  682. package/Utils/AI/InvestigationReport.ts +195 -25
  683. package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
  684. package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
  685. package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
  686. package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
  687. package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
  688. package/Utils/LabelRuleImportExport.ts +27 -9
  689. package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
  690. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  691. package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
  692. package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
  693. package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
  694. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
  695. package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
  696. package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
  697. package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
  698. package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
  699. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  700. package/Utils/Rum/SessionIdentity.ts +44 -0
  701. package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
  702. package/Utils/Rum/UserFlow.ts +1527 -0
  703. package/Utils/Slo/SloDuration.ts +22 -6
  704. package/Utils/Slo/SloHealth.ts +8 -7
  705. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  706. package/Utils/Slo/SloOverviewText.ts +33 -0
  707. package/Utils/Slo/SloProjection.ts +4 -3
  708. package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
  709. package/Utils/StatusPage/ResourceUptime.ts +99 -0
  710. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
  711. package/Utils/Telemetry/AttributesJSON.ts +367 -0
  712. package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
  713. package/Utils/Uptime/UptimeUtil.ts +122 -38
  714. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
  715. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  716. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  717. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  718. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
  719. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  720. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
  721. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
  722. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
  723. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  724. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  725. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  726. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
  727. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  728. package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
  729. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  730. package/build/dist/Models/DatabaseModels/Runner.js +4 -4
  731. package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
  732. package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
  733. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  734. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
  735. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  736. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  737. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  738. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  739. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  740. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  741. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  742. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  743. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  744. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
  745. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  746. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
  747. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  748. package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
  749. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  750. package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
  751. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  752. package/build/dist/Server/API/CommonAPI.js +49 -0
  753. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  754. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
  755. package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
  756. package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
  757. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  758. package/build/dist/Server/API/MonitorAPI.js +107 -1
  759. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  760. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
  761. package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
  762. package/build/dist/Server/API/SlackAPI.js +322 -78
  763. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  764. package/build/dist/Server/API/StatusPageAPI.js +123 -17
  765. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  766. package/build/dist/Server/API/TelemetryAPI.js +144 -5
  767. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  768. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
  769. package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
  770. package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
  771. package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
  772. package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
  773. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  774. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  775. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  776. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  777. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  778. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
  779. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
  780. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
  781. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
  782. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
  783. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
  784. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
  785. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
  786. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
  787. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
  788. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  789. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  790. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
  791. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  792. package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
  793. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  794. package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
  795. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  796. package/build/dist/Server/Services/AIAgentService.js +1 -0
  797. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  798. package/build/dist/Server/Services/AccessTokenService.js +87 -42
  799. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  800. package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
  801. package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
  802. package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
  803. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  804. package/build/dist/Server/Services/AlertService.js +110 -23
  805. package/build/dist/Server/Services/AlertService.js.map +1 -1
  806. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
  807. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  808. package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
  809. package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
  810. package/build/dist/Server/Services/BillingService.js +1 -0
  811. package/build/dist/Server/Services/BillingService.js.map +1 -1
  812. package/build/dist/Server/Services/DatabaseService.js +7 -0
  813. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  814. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
  815. package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
  816. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
  817. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
  818. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
  819. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  820. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
  821. package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
  822. package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
  823. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  824. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
  825. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  826. package/build/dist/Server/Services/IncidentMemberService.js +14 -0
  827. package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
  828. package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
  829. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  830. package/build/dist/Server/Services/IncidentService.js +99 -21
  831. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  832. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  833. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  834. package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
  835. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  836. package/build/dist/Server/Services/Index.js +4 -0
  837. package/build/dist/Server/Services/Index.js.map +1 -1
  838. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
  839. package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
  840. package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
  841. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  842. package/build/dist/Server/Services/LogAggregationService.js +14 -6
  843. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  844. package/build/dist/Server/Services/MonitorService.js +490 -50
  845. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  846. package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
  847. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  848. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
  849. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  850. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
  851. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
  852. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
  853. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
  854. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
  855. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  856. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
  857. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
  858. package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
  859. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
  860. package/build/dist/Server/Services/ProbeService.js +7 -1
  861. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  862. package/build/dist/Server/Services/ProjectService.js +11 -1
  863. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  864. package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
  865. package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
  866. package/build/dist/Server/Services/RunbookSecretService.js +44 -0
  867. package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
  868. package/build/dist/Server/Services/RunnerJobService.js +641 -21
  869. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  870. package/build/dist/Server/Services/RunnerService.js +344 -5
  871. package/build/dist/Server/Services/RunnerService.js.map +1 -1
  872. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
  873. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  874. package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
  875. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  876. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
  877. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  878. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  879. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  880. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  881. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  882. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  883. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  884. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  885. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  886. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  887. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  888. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  889. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  890. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +33 -1
  891. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  892. package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
  893. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  894. package/build/dist/Server/Services/StatusPageService.js +230 -32
  895. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  896. package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
  897. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  898. package/build/dist/Server/Services/TeamMemberService.js +270 -11
  899. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  900. package/build/dist/Server/Services/TraceAggregationService.js +10 -6
  901. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  902. package/build/dist/Server/Services/UserEmailService.js +1 -0
  903. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  904. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
  905. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
  906. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
  907. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
  908. package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
  909. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  910. package/build/dist/Server/Services/UserService.js +107 -1
  911. package/build/dist/Server/Services/UserService.js.map +1 -1
  912. package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
  913. package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
  914. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
  915. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  916. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
  917. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  918. package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
  919. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  920. package/build/dist/Server/Types/Markdown.js +394 -27
  921. package/build/dist/Server/Types/Markdown.js.map +1 -1
  922. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  923. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  924. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
  925. package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
  926. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
  927. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
  928. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
  929. package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
  930. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
  931. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
  932. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
  933. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  934. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
  935. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  936. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
  937. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  938. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
  939. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  940. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
  941. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  942. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
  943. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  944. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
  945. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  946. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  947. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  948. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
  949. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  950. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
  951. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  952. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
  953. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
  954. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
  955. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  956. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
  957. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  958. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +22 -51
  959. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -1
  960. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  961. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  962. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
  963. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  964. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +139 -109
  965. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  966. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
  967. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  968. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
  969. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  970. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
  971. package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
  972. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
  973. package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
  974. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  975. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  976. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
  977. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
  978. package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
  979. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  980. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
  981. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  982. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  983. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  984. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
  985. package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
  986. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
  987. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  988. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
  989. package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
  990. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  991. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  992. package/build/dist/Server/Utils/StartServer.js +4 -3
  993. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  994. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
  995. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
  996. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
  997. package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
  998. package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
  999. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  1000. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
  1001. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
  1002. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
  1003. package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
  1004. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
  1005. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  1006. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
  1007. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  1008. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
  1009. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  1010. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
  1011. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  1012. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
  1013. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
  1014. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
  1015. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  1016. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
  1017. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  1018. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
  1019. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
  1020. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
  1021. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
  1022. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
  1023. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  1024. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
  1025. package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
  1026. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
  1027. package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
  1028. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
  1029. package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
  1030. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
  1031. package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
  1032. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
  1033. package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
  1034. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
  1035. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
  1036. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
  1037. package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
  1038. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
  1039. package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
  1040. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
  1041. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  1042. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
  1043. package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
  1044. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  1045. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
  1046. package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
  1047. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
  1048. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  1049. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
  1050. package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
  1051. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
  1052. package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
  1053. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
  1054. package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
  1055. package/build/dist/Types/API/Route.js +18 -2
  1056. package/build/dist/Types/API/Route.js.map +1 -1
  1057. package/build/dist/Types/API/URL.js +23 -2
  1058. package/build/dist/Types/API/URL.js.map +1 -1
  1059. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
  1060. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  1061. package/build/dist/Types/Date.js +97 -7
  1062. package/build/dist/Types/Date.js.map +1 -1
  1063. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  1064. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  1065. package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
  1066. package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
  1067. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
  1068. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
  1069. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
  1070. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
  1071. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
  1072. package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
  1073. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
  1074. package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
  1075. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
  1076. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  1077. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
  1078. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
  1079. package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
  1080. package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
  1081. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
  1082. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  1083. package/build/dist/Types/Permission.js +84 -0
  1084. package/build/dist/Types/Permission.js.map +1 -1
  1085. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  1086. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1087. package/build/dist/Types/Rules/RuleRun.js +4 -0
  1088. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  1089. package/build/dist/Types/Rum/SessionReplay.js +52 -2
  1090. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  1091. package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
  1092. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  1093. package/build/dist/Types/Rum/UserFlow.js +115 -0
  1094. package/build/dist/Types/Rum/UserFlow.js.map +1 -0
  1095. package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
  1096. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  1097. package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
  1098. package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
  1099. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
  1100. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
  1101. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
  1102. package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
  1103. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
  1104. package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
  1105. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
  1106. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  1107. package/build/dist/Types/Timezone.js +5 -0
  1108. package/build/dist/Types/Timezone.js.map +1 -1
  1109. package/build/dist/Types/TimezoneAlias.js +340 -0
  1110. package/build/dist/Types/TimezoneAlias.js.map +1 -0
  1111. package/build/dist/Types/Workflow/Templates.js +2694 -2
  1112. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  1113. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
  1114. package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
  1115. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
  1116. package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
  1117. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
  1118. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
  1119. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
  1120. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
  1121. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
  1122. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
  1123. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
  1124. package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
  1125. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
  1126. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
  1127. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
  1128. package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
  1129. package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
  1130. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  1131. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
  1132. package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
  1133. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
  1134. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1135. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
  1136. package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
  1137. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
  1138. package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
  1139. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
  1140. package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
  1141. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
  1142. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
  1143. package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
  1144. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  1145. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  1146. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  1147. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  1148. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  1149. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  1150. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  1151. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  1152. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  1153. package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
  1154. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1155. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
  1156. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  1157. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
  1158. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  1159. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
  1160. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  1161. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1162. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
  1163. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1164. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
  1165. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
  1166. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
  1167. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  1168. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
  1169. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  1170. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  1171. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1172. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
  1173. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  1174. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
  1175. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  1176. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
  1177. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  1178. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
  1179. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
  1180. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -8
  1181. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1182. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
  1183. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  1184. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
  1185. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  1186. package/build/dist/UI/Components/Page/ModelPage.js +37 -3
  1187. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  1188. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
  1189. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1190. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
  1191. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  1192. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  1193. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1194. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
  1195. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  1196. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
  1197. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  1198. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
  1199. package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
  1200. package/build/dist/UI/Utils/Timezone.js +52 -17
  1201. package/build/dist/UI/Utils/Timezone.js.map +1 -1
  1202. package/build/dist/Utils/AI/InvestigationReport.js +116 -21
  1203. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  1204. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
  1205. package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
  1206. package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
  1207. package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
  1208. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
  1209. package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
  1210. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
  1211. package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
  1212. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
  1213. package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
  1214. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  1215. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  1216. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
  1217. package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
  1218. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  1219. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
  1220. package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
  1221. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
  1222. package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
  1223. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
  1224. package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
  1225. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
  1226. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
  1227. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
  1228. package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
  1229. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
  1230. package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
  1231. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
  1232. package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
  1233. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
  1234. package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
  1235. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  1236. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  1237. package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
  1238. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  1239. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
  1240. package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
  1241. package/build/dist/Utils/Rum/UserFlow.js +941 -0
  1242. package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
  1243. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  1244. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  1245. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  1246. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1247. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  1248. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  1249. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  1250. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  1251. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  1252. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
  1253. package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
  1254. package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
  1255. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  1256. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  1257. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
  1258. package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
  1259. package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
  1260. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
  1261. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
  1262. package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
  1263. package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
  1264. package/jest.config.json +2 -1
  1265. package/package.json +2 -1
  1266. package/tsconfig.tests.json +36 -0
  1267. package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
  1268. package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
  1269. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
  1270. package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
@@ -0,0 +1,1964 @@
1
+ import {
2
+ KUBECTL_ALLOW_NODE_OPERATIONS_ENV,
3
+ KUBECTL_WRITE_NAMESPACES_ENV,
4
+ KubectlCommandTier,
5
+ RUNNER_POD_NAMESPACE_ENV,
6
+ } from "../../Types/Kubernetes/KubernetesClusterAiAccess";
7
+ import KubectlPolicy, { normalizeKubectlFlagName } from "./KubectlPolicy";
8
+
9
+ /*
10
+ * Where an AI-composed kubectl WRITE lands, and whether the Runner that
11
+ * runs it lets it land there — the Runner's own bound, independent of RBAC.
12
+ *
13
+ * ONE rule, asked in three places that must never disagree:
14
+ *
15
+ * - the Runner (KubectlExecutor), before it spawns kubectl, with the
16
+ * configuration it was started with — the authoritative check;
17
+ * - the server's enqueue chokepoint (RunnerJobService
18
+ * .getRunnerWriteScopeRefusal), with the posture that Runner reported,
19
+ * so nothing is enqueued or counted by the circuit breaker only to be
20
+ * refused on the Runner;
21
+ * - the remediation toolkit (RemediationCommandToolkit
22
+ * .getRunnerScopeRefusal), at propose and approve time, so nothing is
23
+ * composed or approved only to be refused.
24
+ *
25
+ * All three call getRefusal with the same five inputs (the command, the
26
+ * write namespaces, the pod's namespace, the node switch, and whether
27
+ * kubectl runs through a credential's kubeconfig or the in-cluster
28
+ * ServiceAccount) and word the answer for their own reader. This module is
29
+ * pure: it reads no environment and no Node API; the Runner passes its
30
+ * configuration in, the server passes the posture.
31
+ *
32
+ * RBAC alone is not a namespace bound worth the name: patch/update on a
33
+ * workload's pod template, or create on a job, is running any image as any
34
+ * ServiceAccount of that namespace and mounting its Secrets. So every
35
+ * non-Read argv is refused that
36
+ *
37
+ * - is a node operation while the node switch is off
38
+ * (KUBECTL_ALLOW_NODE_OPERATIONS_ENV, the chart's
39
+ * aiAccess.remediation.nodeOperations) — or might be one: a write whose
40
+ * objects cannot be read for certain;
41
+ * - changes something in the namespace the Runner's pod runs in
42
+ * (RUNNER_POD_NAMESPACE_ENV): a change there could scale the Kubernetes
43
+ * agent — or the Runner, and with it any rollback — away. A namespaced
44
+ * write with no -n runs in the pod's own namespace in-cluster, so a
45
+ * missing -n counts as that namespace; or
46
+ * - changes something outside KUBECTL_WRITE_NAMESPACES_ENV when that list
47
+ * is non-empty (the chart passes the namespaces it bound write RBAC in).
48
+ *
49
+ * What a write changes decides how it is judged, the way kubectl decides
50
+ * it — kubectl ignores -n for an object that lives outside every namespace:
51
+ *
52
+ * - a namespaced object (a pod, a workload, a custom resource) is judged
53
+ * by the namespace it lands in: -n, or the default namespace without it
54
+ * (the pod's own in-cluster, "default" through a credential's
55
+ * kubeconfig, which names none);
56
+ * - a Namespace object is judged by its NAME — `label namespace X` changes
57
+ * namespace X, whatever -n says — so only a namespace the Runner may
58
+ * write in can be changed, never its own;
59
+ * - a Node, and every node verb (cordon, uncordon, drain, taint), is a
60
+ * node operation: not namespace-scoped, but governed by the node
61
+ * switch;
62
+ * - any other cluster-scoped object (a PersistentVolume, a StorageClass,
63
+ * an IngressClass, a ClusterRole, a CRD, ...) is outside every
64
+ * namespace: refused when the write-namespace list is non-empty (the
65
+ * chart's namespaced RoleBindings could not grant it anyway), left to
66
+ * RBAC when it is empty.
67
+ *
68
+ * A write that changes several kinds of object meets every rule that
69
+ * applies to one of them. Reads are never restricted.
70
+ *
71
+ * Only the built-in cluster-scoped kinds are known here — every one the API
72
+ * server serves — by every name kubectl resolves: plural, singular, short
73
+ * name and Kind case, bare or group-qualified the way kubectl qualifies
74
+ * them (its own API group, any prefix of it — "sc.storage", "csr.cert" —
75
+ * or none: "sc.", "storageclasses.v1."; see clusterScopedKindOf). A custom
76
+ * resource is read as namespaced — nobody can run discovery before
77
+ * deciding — so a cluster-scoped custom resource is judged by -n like a
78
+ * namespaced one. On the in-cluster Runner with a write-namespace list its
79
+ * RoleBindings cannot grant one anyway; elsewhere the credential's RBAC
80
+ * bounds it.
81
+ *
82
+ * A flag that replaces the object kubectl builds (--overrides and
83
+ * --override-type, on expose and run) makes what the write changes
84
+ * unreadable: kubectl creates whatever object the flag's value describes.
85
+ * Such a write is uncertain on every verb, whatever the shared policy
86
+ * decides about the flag.
87
+ *
88
+ * The objects and the namespace are read the way kubectl reads the argv:
89
+ * every flag by its arity (the same table the shared policy parses with —
90
+ * a flag this reader does not know makes the objects uncertain, which is
91
+ * refused), -n x, -nx, -n=x, --namespace x, --namespace=x, inside a cluster
92
+ * of boolean short flags such as -An x. Every namespace the argv sets must
93
+ * be allowed, not just the last one kubectl uses; a namespaced write across
94
+ * all namespaces (-A) is never inside a scope. What this reader cannot
95
+ * decide for certain — a namespace flag that the flag before it might
96
+ * swallow as its value, a namespace flag after `--` — is refused rather
97
+ * than guessed, with the unambiguous spelling in the message:
98
+ * `kubectl -n <namespace> ...`.
99
+ */
100
+
101
+ // Verbs whose objects are always nodes: cluster-scoped, not namespaced.
102
+ const NODE_VERBS: Set<string> = new Set<string>([
103
+ "cordon",
104
+ "uncordon",
105
+ "drain",
106
+ "taint",
107
+ ]);
108
+
109
+ /*
110
+ * Verbs whose positionals name objects as "kind name..." or "kind/name...",
111
+ * mirroring the shared policy's OBJECT_VERBS. For rollout and set the
112
+ * objects follow the subcommand.
113
+ */
114
+ const OBJECT_VERBS: Set<string> = new Set<string>([
115
+ "get",
116
+ "describe",
117
+ "delete",
118
+ "label",
119
+ "annotate",
120
+ "patch",
121
+ "scale",
122
+ "autoscale",
123
+ "expose",
124
+ "taint",
125
+ "rollout",
126
+ "set",
127
+ ]);
128
+
129
+ /*
130
+ * Verbs that make a NEW namespaced object from the one they name (a
131
+ * Service, a HorizontalPodAutoscaler) in the namespace -n names, whatever
132
+ * kind the named object is. That holds only without --overrides, which
133
+ * lets expose create any object at all (see OBJECT_REPLACING_FLAGS).
134
+ */
135
+ const CREATES_NAMESPACED_OBJECT_VERBS: Set<string> = new Set<string>([
136
+ "expose",
137
+ "autoscale",
138
+ ]);
139
+
140
+ /*
141
+ * What each `kubectl create` subcommand makes, by every alias cobra
142
+ * matches. Anything not listed here is uncertain (the shared policy denies
143
+ * it anyway).
144
+ */
145
+ const CREATE_SUBCOMMAND_SCOPES: Record<
146
+ string,
147
+ "namespace-object" | "cluster-scoped" | "namespaced"
148
+ > = {
149
+ namespace: "namespace-object",
150
+ ns: "namespace-object",
151
+ priorityclass: "cluster-scoped",
152
+ pc: "cluster-scoped",
153
+ clusterrole: "cluster-scoped",
154
+ clusterrolebinding: "cluster-scoped",
155
+ quota: "namespaced",
156
+ resourcequota: "namespaced",
157
+ secret: "namespaced",
158
+ configmap: "namespaced",
159
+ cm: "namespaced",
160
+ serviceaccount: "namespaced",
161
+ sa: "namespaced",
162
+ service: "namespaced",
163
+ svc: "namespaced",
164
+ deployment: "namespaced",
165
+ deploy: "namespaced",
166
+ role: "namespaced",
167
+ rolebinding: "namespaced",
168
+ poddisruptionbudget: "namespaced",
169
+ pdb: "namespaced",
170
+ job: "namespaced",
171
+ cronjob: "namespaced",
172
+ cj: "namespaced",
173
+ ingress: "namespaced",
174
+ ing: "namespaced",
175
+ token: "namespaced",
176
+ };
177
+
178
+ // The kind a `kubectl create <subcommand>` of this scope makes, for messages.
179
+ const CREATE_CLUSTER_SCOPED_KINDS: Record<string, string> = {
180
+ priorityclass: "priorityclass",
181
+ pc: "priorityclass",
182
+ clusterrole: "clusterrole",
183
+ clusterrolebinding: "clusterrolebinding",
184
+ };
185
+
186
+ /*
187
+ * A built-in kind that lives outside any namespace, the way discovery
188
+ * describes it: its API group ("" for the core group), its plural resource
189
+ * name and its short names. kubectl knows it by exactly those, its
190
+ * singular (the key below) and its Kind, which is the singular in another
191
+ * case.
192
+ */
193
+ interface ClusterScopedKind {
194
+ group: string;
195
+ plural: string;
196
+ shortNames: Array<string>;
197
+ }
198
+
199
+ /*
200
+ * EVERY built-in cluster-scoped kind the Kubernetes API server serves
201
+ * (upstream discovery, api/discovery/aggregated_v2.json and api__v1.json of
202
+ * v1.36), keyed by its singular — alpha and beta kinds included, since a
203
+ * cluster may switch them on. A superset of the shared policy's
204
+ * CLUSTER_SCOPED_KINDS (the scope test pins that parity through the
205
+ * policy's own verdicts).
206
+ */
207
+ const BUILTIN_CLUSTER_SCOPED_KINDS: Record<string, ClusterScopedKind> = {
208
+ node: { group: "", plural: "nodes", shortNames: ["no"] },
209
+ namespace: { group: "", plural: "namespaces", shortNames: ["ns"] },
210
+ persistentvolume: {
211
+ group: "",
212
+ plural: "persistentvolumes",
213
+ shortNames: ["pv"],
214
+ },
215
+ componentstatus: {
216
+ group: "",
217
+ plural: "componentstatuses",
218
+ shortNames: ["cs"],
219
+ },
220
+ storageclass: {
221
+ group: "storage.k8s.io",
222
+ plural: "storageclasses",
223
+ shortNames: ["sc"],
224
+ },
225
+ csidriver: { group: "storage.k8s.io", plural: "csidrivers", shortNames: [] },
226
+ csinode: { group: "storage.k8s.io", plural: "csinodes", shortNames: [] },
227
+ volumeattachment: {
228
+ group: "storage.k8s.io",
229
+ plural: "volumeattachments",
230
+ shortNames: [],
231
+ },
232
+ volumeattributesclass: {
233
+ group: "storage.k8s.io",
234
+ plural: "volumeattributesclasses",
235
+ shortNames: ["vac"],
236
+ },
237
+ storageversionmigration: {
238
+ group: "storagemigration.k8s.io",
239
+ plural: "storageversionmigrations",
240
+ shortNames: [],
241
+ },
242
+ customresourcedefinition: {
243
+ group: "apiextensions.k8s.io",
244
+ plural: "customresourcedefinitions",
245
+ shortNames: ["crd", "crds"],
246
+ },
247
+ apiservice: {
248
+ group: "apiregistration.k8s.io",
249
+ plural: "apiservices",
250
+ shortNames: [],
251
+ },
252
+ mutatingwebhookconfiguration: {
253
+ group: "admissionregistration.k8s.io",
254
+ plural: "mutatingwebhookconfigurations",
255
+ shortNames: [],
256
+ },
257
+ validatingwebhookconfiguration: {
258
+ group: "admissionregistration.k8s.io",
259
+ plural: "validatingwebhookconfigurations",
260
+ shortNames: [],
261
+ },
262
+ validatingadmissionpolicy: {
263
+ group: "admissionregistration.k8s.io",
264
+ plural: "validatingadmissionpolicies",
265
+ shortNames: [],
266
+ },
267
+ validatingadmissionpolicybinding: {
268
+ group: "admissionregistration.k8s.io",
269
+ plural: "validatingadmissionpolicybindings",
270
+ shortNames: [],
271
+ },
272
+ mutatingadmissionpolicy: {
273
+ group: "admissionregistration.k8s.io",
274
+ plural: "mutatingadmissionpolicies",
275
+ shortNames: [],
276
+ },
277
+ mutatingadmissionpolicybinding: {
278
+ group: "admissionregistration.k8s.io",
279
+ plural: "mutatingadmissionpolicybindings",
280
+ shortNames: [],
281
+ },
282
+ clusterrole: {
283
+ group: "rbac.authorization.k8s.io",
284
+ plural: "clusterroles",
285
+ shortNames: [],
286
+ },
287
+ clusterrolebinding: {
288
+ group: "rbac.authorization.k8s.io",
289
+ plural: "clusterrolebindings",
290
+ shortNames: [],
291
+ },
292
+ tokenreview: {
293
+ group: "authentication.k8s.io",
294
+ plural: "tokenreviews",
295
+ shortNames: [],
296
+ },
297
+ selfsubjectreview: {
298
+ group: "authentication.k8s.io",
299
+ plural: "selfsubjectreviews",
300
+ shortNames: [],
301
+ },
302
+ subjectaccessreview: {
303
+ group: "authorization.k8s.io",
304
+ plural: "subjectaccessreviews",
305
+ shortNames: [],
306
+ },
307
+ selfsubjectaccessreview: {
308
+ group: "authorization.k8s.io",
309
+ plural: "selfsubjectaccessreviews",
310
+ shortNames: [],
311
+ },
312
+ selfsubjectrulesreview: {
313
+ group: "authorization.k8s.io",
314
+ plural: "selfsubjectrulesreviews",
315
+ shortNames: [],
316
+ },
317
+ priorityclass: {
318
+ group: "scheduling.k8s.io",
319
+ plural: "priorityclasses",
320
+ shortNames: ["pc"],
321
+ },
322
+ ingressclass: {
323
+ group: "networking.k8s.io",
324
+ plural: "ingressclasses",
325
+ shortNames: [],
326
+ },
327
+ ipaddress: {
328
+ group: "networking.k8s.io",
329
+ plural: "ipaddresses",
330
+ shortNames: ["ip"],
331
+ },
332
+ servicecidr: {
333
+ group: "networking.k8s.io",
334
+ plural: "servicecidrs",
335
+ shortNames: [],
336
+ },
337
+ runtimeclass: {
338
+ group: "node.k8s.io",
339
+ plural: "runtimeclasses",
340
+ shortNames: [],
341
+ },
342
+ certificatesigningrequest: {
343
+ group: "certificates.k8s.io",
344
+ plural: "certificatesigningrequests",
345
+ shortNames: ["csr"],
346
+ },
347
+ clustertrustbundle: {
348
+ group: "certificates.k8s.io",
349
+ plural: "clustertrustbundles",
350
+ shortNames: [],
351
+ },
352
+ flowschema: {
353
+ group: "flowcontrol.apiserver.k8s.io",
354
+ plural: "flowschemas",
355
+ shortNames: [],
356
+ },
357
+ prioritylevelconfiguration: {
358
+ group: "flowcontrol.apiserver.k8s.io",
359
+ plural: "prioritylevelconfigurations",
360
+ shortNames: [],
361
+ },
362
+ storageversion: {
363
+ group: "internal.apiserver.k8s.io",
364
+ plural: "storageversions",
365
+ shortNames: [],
366
+ },
367
+ deviceclass: {
368
+ group: "resource.k8s.io",
369
+ plural: "deviceclasses",
370
+ shortNames: [],
371
+ },
372
+ devicetaintrule: {
373
+ group: "resource.k8s.io",
374
+ plural: "devicetaintrules",
375
+ shortNames: [],
376
+ },
377
+ resourceslice: {
378
+ group: "resource.k8s.io",
379
+ plural: "resourceslices",
380
+ shortNames: [],
381
+ },
382
+ resourcepoolstatusrequest: {
383
+ group: "resource.k8s.io",
384
+ plural: "resourcepoolstatusrequests",
385
+ shortNames: [],
386
+ },
387
+ };
388
+
389
+ // A name kubectl resolves to a cluster-scoped kind, and whether it is short.
390
+ interface ClusterScopedKindName {
391
+ kind: string;
392
+ isShortName: boolean;
393
+ }
394
+
395
+ /*
396
+ * Every name kubectl resolves to one of those kinds (lowercased): plural,
397
+ * singular and short names. A Kind ("StorageClass") is its singular once
398
+ * lowercased, which is how kubectl matches it too.
399
+ */
400
+ function buildClusterScopedKindNames(): Record<string, ClusterScopedKindName> {
401
+ const names: Record<string, ClusterScopedKindName> = {};
402
+
403
+ for (const kind of Object.keys(BUILTIN_CLUSTER_SCOPED_KINDS)) {
404
+ const definition: ClusterScopedKind = BUILTIN_CLUSTER_SCOPED_KINDS[kind]!;
405
+
406
+ names[kind] = { kind, isShortName: false };
407
+ names[definition.plural] = { kind, isShortName: false };
408
+
409
+ for (const shortName of definition.shortNames) {
410
+ names[shortName] = { kind, isShortName: true };
411
+ }
412
+ }
413
+
414
+ return names;
415
+ }
416
+
417
+ const CLUSTER_SCOPED_KIND_NAMES: Record<string, ClusterScopedKindName> =
418
+ buildClusterScopedKindNames();
419
+
420
+ /*
421
+ * An API version as Kubernetes spells one ("v1", "v1beta2", "v2alpha1"):
422
+ * the middle segment of "RESOURCE.VERSION.GROUP".
423
+ */
424
+ const API_VERSION_SEGMENT: RegExp = /^v\d+(?:(?:alpha|beta)\d+)?$/;
425
+
426
+ /*
427
+ * Flags by arity, mirroring the shared policy's KNOWN_FLAGS (every flag
428
+ * OneUptime AI may use; the policy denies the rest). "value" flags take a
429
+ * value — the rest of a short cluster, or the next token; "none" flags
430
+ * (booleans, and optional-value flags such as --cascade, --dry-run and
431
+ * --validate, which only take one written with "=") never consume the next
432
+ * token.
433
+ */
434
+ const BOOLEAN_SHORT_FLAGS: Set<string> = new Set<string>(["A", "w", "q"]);
435
+
436
+ const VALUE_SHORT_FLAGS: Set<string> = new Set<string>([
437
+ "n",
438
+ "o",
439
+ "L",
440
+ "l",
441
+ "c",
442
+ "p",
443
+ "e",
444
+ "r",
445
+ ]);
446
+
447
+ /*
448
+ * Long flags that never take the next token as their value: the policy's
449
+ * boolean flags and its optional-value flags (--cascade, --dry-run,
450
+ * --validate), which only take a value written with "=". The namespace
451
+ * reader only uses it to decide that a namespace flag right after one of
452
+ * these IS a flag (a flag missing from it makes that namespace flag
453
+ * ambiguous, which is refused); the object reader needs every flag's
454
+ * arity, and refuses a flag it finds in neither table.
455
+ */
456
+ const NON_CONSUMING_LONG_FLAGS: Set<string> = new Set<string>([
457
+ "match-server-version",
458
+ "allow-missing-template-keys",
459
+ "show-labels",
460
+ "show-kind",
461
+ "show-managed-fields",
462
+ "no-headers",
463
+ "server-print",
464
+ "ignore-not-found",
465
+ "output-watch-events",
466
+ "all-namespaces",
467
+ "all",
468
+ "watch",
469
+ "watch-only",
470
+ "follow",
471
+ "previous",
472
+ "timestamps",
473
+ "all-containers",
474
+ "all-pods",
475
+ "ignore-errors",
476
+ "insecure-skip-tls-verify-backend",
477
+ "show-events",
478
+ "sum",
479
+ "use-protocol-buffers",
480
+ "show-capacity",
481
+ "cached",
482
+ "namespaced",
483
+ "client",
484
+ "list",
485
+ "quiet",
486
+ "force",
487
+ "now",
488
+ "wait",
489
+ "ignore-daemonsets",
490
+ "delete-emptydir-data",
491
+ "delete-local-data",
492
+ "disable-eviction",
493
+ "overwrite",
494
+ "local",
495
+ "record",
496
+ "save-config",
497
+ "append-hash",
498
+ "global-default",
499
+ "windows-line-endings",
500
+ "cascade",
501
+ "dry-run",
502
+ "validate",
503
+ ]);
504
+
505
+ // Long flags that always take a value: "--selector app=web", "--image=x".
506
+ const VALUE_LONG_FLAGS: Set<string> = new Set<string>([
507
+ "namespace",
508
+ "request-timeout",
509
+ "output",
510
+ "label-columns",
511
+ "sort-by",
512
+ "chunk-size",
513
+ "subresource",
514
+ "selector",
515
+ "labels",
516
+ "field-selector",
517
+ "container",
518
+ "since",
519
+ "since-time",
520
+ "tail",
521
+ "limit-bytes",
522
+ "max-log-requests",
523
+ "pod-running-timeout",
524
+ "patch",
525
+ "prefix",
526
+ "containers",
527
+ "for",
528
+ "types",
529
+ "api-group",
530
+ "categories",
531
+ "verbs",
532
+ "api-version",
533
+ "revision",
534
+ "to-revision",
535
+ "timeout",
536
+ "field-manager",
537
+ "replicas",
538
+ "current-replicas",
539
+ "resource-version",
540
+ "grace-period",
541
+ "pod-selector",
542
+ "skip-wait-for-delete-timeout",
543
+ "type",
544
+ "image",
545
+ "env",
546
+ "from",
547
+ "keys",
548
+ "limits",
549
+ "requests",
550
+ "restart",
551
+ "schedule",
552
+ "port",
553
+ "target-port",
554
+ "protocol",
555
+ "name",
556
+ "external-ip",
557
+ "cluster-ip",
558
+ "load-balancer-ip",
559
+ "overrides",
560
+ "override-type",
561
+ "session-affinity",
562
+ "min",
563
+ "max",
564
+ "cpu",
565
+ "cpu-percent",
566
+ "from-literal",
567
+ "resource",
568
+ "resource-name",
569
+ "verb",
570
+ "non-resource-url",
571
+ "aggregation-rule",
572
+ "role",
573
+ "clusterrole",
574
+ "group",
575
+ "serviceaccount",
576
+ "hard",
577
+ "scopes",
578
+ "min-available",
579
+ "max-unavailable",
580
+ "value",
581
+ "description",
582
+ "preemption-policy",
583
+ "class",
584
+ "rule",
585
+ "annotation",
586
+ "default-backend",
587
+ "tcp",
588
+ "node-port",
589
+ "clusterip",
590
+ "docker-server",
591
+ "docker-username",
592
+ "docker-password",
593
+ "docker-email",
594
+ ]);
595
+
596
+ type FlagArity = "value" | "none";
597
+
598
+ /*
599
+ * Flags whose arity depends on the verb, as in the policy's
600
+ * VERB_FLAG_OVERRIDES: -p is --previous (boolean) on logs, --prefix a
601
+ * boolean on logs, --containers a boolean on top, and --recursive a boolean
602
+ * on explain.
603
+ */
604
+ const VERB_FLAG_ARITY_OVERRIDES: Record<string, Record<string, FlagArity>> = {
605
+ logs: { p: "none", prefix: "none" },
606
+ top: { containers: "none" },
607
+ explain: { recursive: "none" },
608
+ };
609
+
610
+ // A negative number or duration (`-1`, `-5s`): a value, never a flag.
611
+ const NEGATIVE_NUMBER_TOKEN: RegExp = /^-\d/;
612
+
613
+ function hasOwn(record: Record<string, unknown>, key: string): boolean {
614
+ return Object.prototype.hasOwnProperty.call(record, key);
615
+ }
616
+
617
+ /*
618
+ * A flag's arity the way the policy looks it up: by its name alone (short
619
+ * letters and long names share one table), after the verb's own meaning of
620
+ * it. Null for a flag neither table knows.
621
+ */
622
+ function lookupFlagArity(
623
+ name: string,
624
+ verb: string | undefined,
625
+ ): FlagArity | null {
626
+ if (verb !== undefined && hasOwn(VERB_FLAG_ARITY_OVERRIDES, verb)) {
627
+ const overrides: Record<string, FlagArity> =
628
+ VERB_FLAG_ARITY_OVERRIDES[verb]!;
629
+
630
+ if (hasOwn(overrides, name)) {
631
+ return overrides[name]!;
632
+ }
633
+ }
634
+
635
+ if (BOOLEAN_SHORT_FLAGS.has(name) || NON_CONSUMING_LONG_FLAGS.has(name)) {
636
+ return "none";
637
+ }
638
+
639
+ if (VALUE_SHORT_FLAGS.has(name) || VALUE_LONG_FLAGS.has(name)) {
640
+ return "value";
641
+ }
642
+
643
+ return null;
644
+ }
645
+
646
+ interface PositionalsReading {
647
+ positionals: Array<string>;
648
+ // Why the positionals cannot be split for certain, or null.
649
+ uncertainty: string | null;
650
+ /*
651
+ * The first flag that replaces the object kubectl builds (see
652
+ * OBJECT_REPLACING_FLAGS), as written without its value, or null.
653
+ */
654
+ objectReplacingFlag: string | null;
655
+ }
656
+
657
+ function describeUnknownFlag(flag: string): string {
658
+ return `"${flag}" is a flag the write scope does not know, so whether it takes the next word as its value cannot be told`;
659
+ }
660
+
661
+ /*
662
+ * Flags that replace the object kubectl builds with one the flag's value
663
+ * describes: kubectl merges --overrides (a JSON merge, strategic merge or
664
+ * JSON patch, per --override-type) into the Service `kubectl expose`
665
+ * generates — or the Pod `kubectl run` does — and then picks the REST
666
+ * mapping, and so the kind and the namespace it creates in, from the
667
+ * merged object. `kubectl expose deployment web -n prod --overrides=...`
668
+ * can therefore create a ClusterRoleBinding, a PriorityClass, a Namespace
669
+ * or a privileged Job instead of a Service in prod. Read by their
670
+ * normalized name ("--override_type" is "--override-type" to kubectl).
671
+ */
672
+ const OBJECT_REPLACING_FLAGS: Set<string> = new Set<string>([
673
+ "overrides",
674
+ "override-type",
675
+ ]);
676
+
677
+ function describeObjectReplacingFlag(flag: string): string {
678
+ return `"${flag}" lets kubectl create whatever object its value describes instead of the one the command names — of any kind, in any namespace — so what the command changes cannot be read from it`;
679
+ }
680
+
681
+ /*
682
+ * The positionals of an argv, split exactly the way the shared policy (and
683
+ * pflag) split them: a value flag takes the rest of its short cluster or
684
+ * the next token, "--flag=value" carries its own, and everything after
685
+ * "--" is positional. A flag neither arity table knows makes the split
686
+ * uncertain — whether it swallows the next word decides which word is the
687
+ * kind — so the reason is returned instead of a guess.
688
+ */
689
+ function readPositionals(args: Array<string>): PositionalsReading {
690
+ const positionals: Array<string> = [];
691
+ let verb: string | undefined = undefined;
692
+ let afterDoubleDash: boolean = false;
693
+ let objectReplacingFlag: string | null = null;
694
+
695
+ for (let i: number = 0; i < args.length; i++) {
696
+ const token: string = args[i]!;
697
+
698
+ if (afterDoubleDash || !token.startsWith("-") || token === "-") {
699
+ positionals.push(token);
700
+ if (verb === undefined) {
701
+ verb = token.toLowerCase();
702
+ }
703
+ continue;
704
+ }
705
+
706
+ if (token === "--") {
707
+ afterDoubleDash = true;
708
+ continue;
709
+ }
710
+
711
+ if (token.startsWith("--")) {
712
+ const eq: number = token.indexOf("=");
713
+ const written: string = eq >= 0 ? token.slice(0, eq) : token;
714
+ const name: string = normalizeKubectlFlagName(written.slice(2));
715
+ const arity: FlagArity | null = lookupFlagArity(name, verb);
716
+
717
+ if (arity === null) {
718
+ return {
719
+ positionals,
720
+ uncertainty: describeUnknownFlag(token),
721
+ objectReplacingFlag,
722
+ };
723
+ }
724
+
725
+ if (objectReplacingFlag === null && OBJECT_REPLACING_FLAGS.has(name)) {
726
+ objectReplacingFlag = written;
727
+ }
728
+
729
+ if (eq < 0 && arity === "value") {
730
+ i++; // Its value is the next token, whatever it looks like.
731
+ }
732
+ continue;
733
+ }
734
+
735
+ // "-abc": a cluster of short flags, read letter by letter.
736
+ let rest: string = token.slice(1);
737
+
738
+ while (rest.length > 0) {
739
+ const letter: string = rest.charAt(0);
740
+ const arity: FlagArity | null = lookupFlagArity(letter, verb);
741
+
742
+ if (arity === null) {
743
+ return {
744
+ positionals,
745
+ uncertainty: describeUnknownFlag(`-${letter}`),
746
+ objectReplacingFlag,
747
+ };
748
+ }
749
+
750
+ // "-n=web"
751
+ if (rest.charAt(1) === "=") {
752
+ break;
753
+ }
754
+
755
+ if (arity === "none") {
756
+ rest = rest.slice(1);
757
+ continue;
758
+ }
759
+
760
+ // "-n web" takes the next token; "-nweb" carries its value inline.
761
+ if (rest.length === 1) {
762
+ i++;
763
+ }
764
+ break;
765
+ }
766
+ }
767
+
768
+ return { positionals, uncertainty: null, objectReplacingFlag };
769
+ }
770
+
771
+ /*
772
+ * The commands that read the words after their objects as updates, KEY=VALUE
773
+ * or KEY- (kubectl's GetResourcesAndPairs for label, annotate and set image,
774
+ * SplitEnvironmentFromResources for set env, and taint's own split) — the
775
+ * shared policy's readsObjectsThenPairs. For these, and only these, the
776
+ * objects end at the first such word. Every other verb hands kubectl's
777
+ * resource builder ALL of its words, `=` or not, and kubectl goes on to the
778
+ * next object when one fails: with the pinned kubectl v1.36.4 against a
779
+ * fake API server, `patch pod/a=b node/n1` PATCHed the Node after the
780
+ * missing pod's error. (taint never gets here: it is a node verb.)
781
+ */
782
+ function readsObjectsThenPairs(verb: string, subcommand: string): boolean {
783
+ if (verb === "label" || verb === "annotate" || verb === "taint") {
784
+ return true;
785
+ }
786
+
787
+ return verb === "set" && (subcommand === "image" || subcommand === "env");
788
+ }
789
+
790
+ /*
791
+ * The object tokens of a command, split the way kubectl splits positionals:
792
+ * every token after the verb for delete; for label, annotate, set image and
793
+ * set env (readsObjectsThenPairs), the leading tokens after the verb (and
794
+ * the subcommand) that are not KEY=VALUE or KEY- pairs; for set selector,
795
+ * every token after the subcommand but the last, which kubectl always reads
796
+ * as the selector expression (getResourcesAndSelector); for every other
797
+ * object verb, every token after the verb (and the subcommand, for rollout
798
+ * and set). So `label pod web-1 node/n1=x` names only the pod, while `patch
799
+ * pod/a=b node/n1` names the Node.
800
+ */
801
+ function objectTokens(verb: string, positionals: Array<string>): Array<string> {
802
+ if (verb === "delete") {
803
+ return positionals.slice(1);
804
+ }
805
+
806
+ const start: number = verb === "rollout" || verb === "set" ? 2 : 1;
807
+ const words: Array<string> = positionals.slice(start);
808
+ const subcommand: string = (positionals[1] || "").toLowerCase();
809
+
810
+ if (verb === "set" && subcommand === "selector") {
811
+ return words.slice(0, -1);
812
+ }
813
+
814
+ if (!readsObjectsThenPairs(verb, subcommand)) {
815
+ return words;
816
+ }
817
+
818
+ const tokens: Array<string> = [];
819
+
820
+ for (const token of words) {
821
+ if (token.includes("=") || token.endsWith("-")) {
822
+ break;
823
+ }
824
+ tokens.push(token);
825
+ }
826
+
827
+ return tokens;
828
+ }
829
+
830
+ interface ObjectReference {
831
+ // The kind as written ("nodes", "ns", "storageclasses.storage.k8s.io").
832
+ rawKind: string;
833
+ // The object's name; null for a bare kind (every object, or a selector).
834
+ name: string | null;
835
+ }
836
+
837
+ interface ObjectReferencesReading {
838
+ references: Array<ObjectReference>;
839
+ uncertainty: string | null;
840
+ }
841
+
842
+ /*
843
+ * The objects the tokens name, read the way kubectl's resource builder
844
+ * reads them: "kind[,kind2] name1 name2" (each name of each kind) or
845
+ * "kind/name kind2/name2". A separate name after a kind/name is an error in
846
+ * kubectl, and uncertain here.
847
+ */
848
+ function readObjectReferences(tokens: Array<string>): ObjectReferencesReading {
849
+ const references: Array<ObjectReference> = [];
850
+ let kinds: Array<string> = [];
851
+ const names: Array<string> = [];
852
+
853
+ for (let i: number = 0; i < tokens.length; i++) {
854
+ const token: string = tokens[i]!;
855
+ const slash: number = token.indexOf("/");
856
+
857
+ if (slash >= 0) {
858
+ references.push({
859
+ rawKind: token.slice(0, slash),
860
+ name: token.slice(slash + 1),
861
+ });
862
+ } else if (i === 0) {
863
+ kinds = token.split(",");
864
+ } else if (kinds.length === 0) {
865
+ return {
866
+ references,
867
+ uncertainty: `"${token}" follows "${tokens[0]}", and kubectl does not accept a separate name after TYPE/NAME`,
868
+ };
869
+ } else {
870
+ names.push(token);
871
+ }
872
+ }
873
+
874
+ for (const kind of kinds) {
875
+ if (names.length === 0) {
876
+ references.push({ rawKind: kind, name: null });
877
+ continue;
878
+ }
879
+
880
+ for (const name of names) {
881
+ references.push({ rawKind: kind, name });
882
+ }
883
+ }
884
+
885
+ return { references, uncertainty: null };
886
+ }
887
+
888
+ /*
889
+ * Does a group written after a kind name match that kind's own group, the
890
+ * way kubectl matches it? An empty group matches the name in every group
891
+ * (as the bare name does); otherwise the kind's own group, or — kubectl's
892
+ * "group prefixing" fallback when no group matches exactly — any prefix of
893
+ * it. The core group is never a prefix match ("nodes.core" is an error).
894
+ */
895
+ function writtenGroupNamesKindGroup(data: {
896
+ written: string;
897
+ group: string;
898
+ prefixMatches: boolean;
899
+ }): boolean {
900
+ if (data.written === "" || data.written === data.group) {
901
+ return true;
902
+ }
903
+
904
+ return (
905
+ data.prefixMatches &&
906
+ data.group !== "" &&
907
+ data.group.startsWith(data.written)
908
+ );
909
+ }
910
+
911
+ /*
912
+ * The built-in cluster-scoped kind a written kind names, or null for any
913
+ * other kind (namespaced, or a custom resource whose scope this reader
914
+ * cannot see). Read the way kubectl's resource builder reads it
915
+ * (schema.ParseResourceArg, then client-go's shortcut expander and REST
916
+ * mapper):
917
+ *
918
+ * - with two dots or more, first as "RESOURCE.VERSION.GROUP". A short
919
+ * name there matches its kind in any group that GROUP is a prefix of
920
+ * ("sc.v1.storage"), and in every group when GROUP is empty — whatever
921
+ * the version, which the expansion drops ("sc.v1.", "sc.foo.", "no.x.").
922
+ * A plural or singular name matches with an empty GROUP or its own,
923
+ * after a real API version ("nodes.v1.", "storageclasses.v1.") or none
924
+ * ("nodes..");
925
+ * - then as "RESOURCE.GROUP", GROUP being everything after the first dot:
926
+ * empty ("sc.", "nodes."), the kind's own group, or any prefix of it
927
+ * ("sc.storage", "storageclasses.stor", "csr.cert", "ip.net",
928
+ * "storageclasses.storage.").
929
+ *
930
+ * The core group is never a prefix match: "nodes.core" and "no.x" are
931
+ * errors in kubectl, and "nodes.example.com" is some custom resource.
932
+ *
933
+ * A custom resource that shares a name, a short name or a group prefix with
934
+ * a built-in kind loses to it — discovery lists the built-in groups first,
935
+ * and kubectl takes the first match — so the prefix spellings are the
936
+ * built-in kind exactly as the bare name is.
937
+ */
938
+ function clusterScopedKindOf(rawKind: string): string | null {
939
+ const lower: string = rawKind.trim().toLowerCase();
940
+ const dot: number = lower.indexOf(".");
941
+ const head: string = dot >= 0 ? lower.slice(0, dot) : lower;
942
+
943
+ if (!hasOwn(CLUSTER_SCOPED_KIND_NAMES, head)) {
944
+ return null;
945
+ }
946
+
947
+ const name: ClusterScopedKindName = CLUSTER_SCOPED_KIND_NAMES[head]!;
948
+
949
+ if (dot < 0) {
950
+ return name.kind;
951
+ }
952
+
953
+ const group: string = BUILTIN_CLUSTER_SCOPED_KINDS[name.kind]!.group;
954
+ const qualifier: string = lower.slice(dot + 1);
955
+ const versionDot: number = qualifier.indexOf(".");
956
+
957
+ // RESOURCE.VERSION.GROUP
958
+ if (versionDot >= 0) {
959
+ const version: string = qualifier.slice(0, versionDot);
960
+ const versionedGroup: string = qualifier.slice(versionDot + 1);
961
+
962
+ // A short name's expansion keeps no version when no group is written.
963
+ if (name.isShortName && versionedGroup === "") {
964
+ return name.kind;
965
+ }
966
+
967
+ if (
968
+ (version === "" || API_VERSION_SEGMENT.test(version)) &&
969
+ writtenGroupNamesKindGroup({
970
+ written: versionedGroup,
971
+ group,
972
+ // With a version, only a short name falls back to a group prefix.
973
+ prefixMatches: name.isShortName || version === "",
974
+ })
975
+ ) {
976
+ return name.kind;
977
+ }
978
+ }
979
+
980
+ // RESOURCE.GROUP
981
+ if (
982
+ writtenGroupNamesKindGroup({
983
+ written: qualifier,
984
+ group,
985
+ prefixMatches: true,
986
+ })
987
+ ) {
988
+ return name.kind;
989
+ }
990
+
991
+ return null;
992
+ }
993
+
994
+ /*
995
+ * What a write changes, as far as the scope rules care (see the
996
+ * header). Everything is decided from the argv alone.
997
+ */
998
+ export interface KubectlWriteTargets {
999
+ // The verb kubectl runs (the first positional), lowercased; "" when none.
1000
+ verb: string;
1001
+ // Why the objects cannot be read for certain, or null.
1002
+ uncertainty: string | null;
1003
+ /*
1004
+ * With an uncertainty, what to change in the command so its objects can
1005
+ * be read, as a sentence for whoever composes it; "" otherwise.
1006
+ */
1007
+ uncertaintyFix: string;
1008
+ // A node operation: a node verb, or a Node among the objects.
1009
+ touchesNodes: boolean;
1010
+ // The Namespace objects it names, lowercased, in order.
1011
+ namespaceObjects: Array<string>;
1012
+ // It changes Namespace objects it does not name (a selector, --all, none).
1013
+ unnamedNamespaceObjects: boolean;
1014
+ // The other built-in cluster-scoped kinds it changes (not node/namespace).
1015
+ clusterScopedKinds: Array<string>;
1016
+ // Something it changes lives in a namespace (-n, or the default one).
1017
+ namespaced: boolean;
1018
+ }
1019
+
1020
+ type NamespaceFlag =
1021
+ | { kind: "inline"; value: string }
1022
+ | { kind: "next" }
1023
+ | { kind: "uncertain" };
1024
+
1025
+ export interface KubectlNamespaceResolution {
1026
+ // Every namespace the argv sets, in order (kubectl uses the last one).
1027
+ namespaces: Array<string>;
1028
+ // Whether it asks for every namespace (-A / --all-namespaces).
1029
+ allNamespaces: boolean;
1030
+ // Why the namespace cannot be read with certainty, or null.
1031
+ ambiguity: string | null;
1032
+ }
1033
+
1034
+ function isFlagToken(token: string): boolean {
1035
+ return (
1036
+ token.startsWith("-") &&
1037
+ token !== "-" &&
1038
+ token !== "--" &&
1039
+ !NEGATIVE_NUMBER_TOKEN.test(token)
1040
+ );
1041
+ }
1042
+
1043
+ /*
1044
+ * Does this token switch on --all-namespaces (-A alone, or inside a cluster
1045
+ * of boolean letters)? Not when it is written "=false".
1046
+ */
1047
+ function readsAllNamespaces(token: string): boolean {
1048
+ if (!isFlagToken(token)) {
1049
+ return false;
1050
+ }
1051
+
1052
+ if (token.startsWith("--")) {
1053
+ const eq: number = token.indexOf("=");
1054
+ const name: string = normalizeKubectlFlagName(
1055
+ eq >= 0 ? token.slice(2, eq) : token.slice(2),
1056
+ );
1057
+ const value: string = eq >= 0 ? token.slice(eq + 1) : "";
1058
+
1059
+ return name === "all-namespaces" && value.trim().toLowerCase() !== "false";
1060
+ }
1061
+
1062
+ const body: string = token.slice(1);
1063
+
1064
+ for (let j: number = 0; j < body.length; j++) {
1065
+ const letter: string = body[j]!;
1066
+
1067
+ if (letter === "A") {
1068
+ const rest: string = body.slice(j + 1);
1069
+
1070
+ return rest.startsWith("=")
1071
+ ? rest.slice(1).trim().toLowerCase() !== "false"
1072
+ : true;
1073
+ }
1074
+
1075
+ if (BOOLEAN_SHORT_FLAGS.has(letter)) {
1076
+ continue;
1077
+ }
1078
+
1079
+ if (VALUE_SHORT_FLAGS.has(letter) || letter === "=") {
1080
+ // The rest of the token is that flag's value.
1081
+ return false;
1082
+ }
1083
+
1084
+ // A letter this reader does not know: assume the worst about what follows.
1085
+ return body.slice(j + 1).includes("A");
1086
+ }
1087
+
1088
+ return false;
1089
+ }
1090
+
1091
+ /*
1092
+ * Does this token set the namespace, and where is its value? Null when it
1093
+ * does not. "uncertain" for a short cluster where an unknown letter comes
1094
+ * before an `n` — whether kubectl reaches that `n` depends on the letter.
1095
+ */
1096
+ function readNamespaceFlag(token: string): NamespaceFlag | null {
1097
+ if (!isFlagToken(token)) {
1098
+ return null;
1099
+ }
1100
+
1101
+ if (token.startsWith("--")) {
1102
+ const eq: number = token.indexOf("=");
1103
+ const name: string = normalizeKubectlFlagName(
1104
+ eq >= 0 ? token.slice(2, eq) : token.slice(2),
1105
+ );
1106
+
1107
+ if (name !== "namespace") {
1108
+ return null;
1109
+ }
1110
+
1111
+ return eq >= 0
1112
+ ? { kind: "inline", value: token.slice(eq + 1) }
1113
+ : { kind: "next" };
1114
+ }
1115
+
1116
+ const body: string = token.slice(1);
1117
+
1118
+ for (let j: number = 0; j < body.length; j++) {
1119
+ const letter: string = body[j]!;
1120
+
1121
+ if (letter === "n") {
1122
+ const rest: string = body.slice(j + 1);
1123
+
1124
+ if (rest.startsWith("=")) {
1125
+ return { kind: "inline", value: rest.slice(1) };
1126
+ }
1127
+
1128
+ return rest ? { kind: "inline", value: rest } : { kind: "next" };
1129
+ }
1130
+
1131
+ if (BOOLEAN_SHORT_FLAGS.has(letter)) {
1132
+ continue;
1133
+ }
1134
+
1135
+ if (VALUE_SHORT_FLAGS.has(letter) || letter === "=") {
1136
+ // The rest of the token is that flag's value, not more flags.
1137
+ return null;
1138
+ }
1139
+
1140
+ // A letter the policy does not know: its arity decides whether `n` counts.
1141
+ return body.slice(j + 1).includes("n") ? { kind: "uncertain" } : null;
1142
+ }
1143
+
1144
+ return null;
1145
+ }
1146
+
1147
+ /*
1148
+ * Could this token, read as a flag, take the NEXT token as its value? "no"
1149
+ * only when that is certain; "maybe" otherwise (a value flag written
1150
+ * without "=", a flag this reader does not know). A token that is itself a
1151
+ * value can never take the next one, so "no" for a positional is exact.
1152
+ */
1153
+ function mayTakeNextToken(token: string): "no" | "maybe" {
1154
+ if (!isFlagToken(token)) {
1155
+ return "no";
1156
+ }
1157
+
1158
+ if (token.startsWith("--")) {
1159
+ const eq: number = token.indexOf("=");
1160
+
1161
+ if (eq >= 0) {
1162
+ return "no";
1163
+ }
1164
+
1165
+ return NON_CONSUMING_LONG_FLAGS.has(
1166
+ normalizeKubectlFlagName(token.slice(2)),
1167
+ )
1168
+ ? "no"
1169
+ : "maybe";
1170
+ }
1171
+
1172
+ const body: string = token.slice(1);
1173
+
1174
+ for (let j: number = 0; j < body.length; j++) {
1175
+ const letter: string = body[j]!;
1176
+
1177
+ if (letter === "=") {
1178
+ return "no";
1179
+ }
1180
+
1181
+ if (BOOLEAN_SHORT_FLAGS.has(letter)) {
1182
+ continue;
1183
+ }
1184
+
1185
+ if (VALUE_SHORT_FLAGS.has(letter)) {
1186
+ // An inline value ("-lapp=web", "-nweb") leaves nothing to take.
1187
+ return j + 1 < body.length ? "no" : "maybe";
1188
+ }
1189
+
1190
+ return "maybe";
1191
+ }
1192
+
1193
+ // A cluster of boolean letters only ("-A").
1194
+ return "no";
1195
+ }
1196
+
1197
+ /*
1198
+ * A command as the write scope judges it: the argv and what the shared
1199
+ * policy made of it. A KubectlPolicyResult is one.
1200
+ */
1201
+ export interface KubectlWriteScopeCommand {
1202
+ // The argv, without the leading "kubectl".
1203
+ args: Array<string>;
1204
+ // Only Read is exempt; every other tier is judged as a write.
1205
+ tier: KubectlCommandTier;
1206
+ /*
1207
+ * The policy's verb label ("rollout restart"). The objects are read here
1208
+ * again, and a reading whose verb disagrees with it is refused; ""
1209
+ * skips that cross-check.
1210
+ */
1211
+ verb: string;
1212
+ // The command as rendered for humans, for messages.
1213
+ displayCommand: string;
1214
+ }
1215
+
1216
+ // Everything the one write-scope question is asked with (see getRefusal).
1217
+ export interface KubectlWriteScopeInput {
1218
+ /*
1219
+ * The command: the shared policy's verdict on it (a KubectlPolicyResult,
1220
+ * which every caller already has), or its argv, which is then evaluated
1221
+ * with KubectlPolicy.evaluateArgs — what the Runner does with the argv it
1222
+ * receives.
1223
+ */
1224
+ command: KubectlWriteScopeCommand | Array<string>;
1225
+ /*
1226
+ * The namespaces AI-composed writes may land in
1227
+ * (KUBECTL_WRITE_NAMESPACES_ENV, the chart's
1228
+ * aiAccess.remediation.namespaces); empty means cluster-wide.
1229
+ */
1230
+ writeNamespaces: Array<string>;
1231
+ /*
1232
+ * The namespace the Runner's own pod runs in (RUNNER_POD_NAMESPACE_ENV),
1233
+ * or null when it is not known.
1234
+ */
1235
+ podNamespace: string | null;
1236
+ /*
1237
+ * The node switch (KUBECTL_ALLOW_NODE_OPERATIONS_ENV), as the Runner
1238
+ * applies it.
1239
+ */
1240
+ allowNodeOperations: boolean;
1241
+ /*
1242
+ * Whether kubectl runs through a kubeconfig built from a Kubernetes
1243
+ * credential — which names no namespace, so a missing -n means
1244
+ * "default" — rather than with the in-cluster Runner's own
1245
+ * ServiceAccount, where a missing -n means the pod's own namespace.
1246
+ */
1247
+ usesCredential: boolean;
1248
+ }
1249
+
1250
+ /*
1251
+ * Why a write is refused. Every caller words the refusal for its own
1252
+ * reader from the facts that come with it.
1253
+ */
1254
+ export type KubectlWriteScopeRefusalCode =
1255
+ /*
1256
+ * A node operation while the node switch is off — or, when `uncertainty`
1257
+ * is set, a write whose objects cannot be read for certain, which could
1258
+ * be one.
1259
+ */
1260
+ | "node_operations"
1261
+ // The objects the write changes cannot be read for certain.
1262
+ | "objects_uncertain"
1263
+ // The namespace the write lands in cannot be read for certain.
1264
+ | "namespace_uncertain"
1265
+ // The objects were read with another verb than the policy's.
1266
+ | "verb_mismatch"
1267
+ // It changes Namespace objects it does not name (a selector, --all).
1268
+ | "unnamed_namespace_objects"
1269
+ // It changes other cluster-scoped objects while a write list is set.
1270
+ | "cluster_scoped"
1271
+ // A namespaced write across every namespace (-A).
1272
+ | "all_namespaces"
1273
+ // A namespaced write with no -n, where the default namespace is unknown.
1274
+ | "no_namespace"
1275
+ // It changes the Runner's own namespace.
1276
+ | "own_namespace"
1277
+ // It changes a namespace outside the write-namespace list.
1278
+ | "outside_scope";
1279
+
1280
+ // How an own_namespace or outside_scope write reaches its namespace.
1281
+ export type KubectlWriteScopeNamespaceSource =
1282
+ // It changes that Namespace object, which is judged by its name.
1283
+ | "namespace_object"
1284
+ // -n / --namespace names it.
1285
+ | "namespace_flag"
1286
+ // It names no namespace, and kubectl would use this one.
1287
+ | "default_namespace";
1288
+
1289
+ // The facts behind a refusal, for callers that word it themselves.
1290
+ export interface KubectlWriteScopeRefusalFacts {
1291
+ code: KubectlWriteScopeRefusalCode;
1292
+ // The command as rendered for humans.
1293
+ displayCommand: string;
1294
+ // The scope it was judged against, trimmed and lowercased.
1295
+ writeNamespaces: Array<string>;
1296
+ // The Runner pod's namespace, trimmed and lowercased; "" when unknown.
1297
+ podNamespace: string;
1298
+ // own_namespace, outside_scope: the namespace, and how the write reaches it.
1299
+ namespace: string | null;
1300
+ namespaceSource: KubectlWriteScopeNamespaceSource | null;
1301
+ /*
1302
+ * Why the reading is not certain: set for objects_uncertain and
1303
+ * namespace_uncertain, and for node_operations when the write only
1304
+ * might be one.
1305
+ */
1306
+ uncertainty: string | null;
1307
+ // cluster_scoped: the kinds it changes.
1308
+ clusterScopedKinds: Array<string>;
1309
+ // verb_mismatch: the verb read here, and the policy's.
1310
+ readVerb: string;
1311
+ policyVerb: string;
1312
+ /*
1313
+ * What to change in the command itself so it can be read or run, as a
1314
+ * sentence for whoever composes it — or "" when no rewrite of the
1315
+ * command helps (the node switch, a namespace outside the scope).
1316
+ */
1317
+ fix: string;
1318
+ }
1319
+
1320
+ export interface KubectlWriteScopeRefusal
1321
+ extends KubectlWriteScopeRefusalFacts {
1322
+ /*
1323
+ * The whole refusal in the Runner's own words ("this Runner ..."), as it
1324
+ * reports it after "Refused by the Runner: ".
1325
+ */
1326
+ reason: string;
1327
+ }
1328
+
1329
+ const FIX_PUT_THE_NAMESPACE_FIRST: string =
1330
+ "Put the namespace first so it cannot be misread: kubectl -n <namespace> ...";
1331
+ const FIX_NAME_THE_OBJECTS: string =
1332
+ 'Name the objects right after the verb (TYPE NAME or TYPE/NAME) and give each flag its value with "=" (--selector=app=web).';
1333
+ const FIX_LEAVE_OUT_OVERRIDES: string =
1334
+ "Leave out --overrides and --override-type, so kubectl creates only the object the command itself describes.";
1335
+ const FIX_NAME_EACH_NAMESPACE_OBJECT: string = "Name each Namespace object.";
1336
+ const FIX_NAME_ONE_NAMESPACE: string =
1337
+ "Name one namespace with -n <namespace>.";
1338
+ const FIX_NAME_THE_NAMESPACE: string =
1339
+ "Name the namespace with -n <namespace>.";
1340
+ const FIX_NAME_THE_TARGET_NAMESPACE: string =
1341
+ "Name the target namespace with -n <namespace>.";
1342
+
1343
+ function normalizeNamespace(value: string | null | undefined): string {
1344
+ return (value || "").trim().toLowerCase();
1345
+ }
1346
+
1347
+ function normalizeNamespaces(
1348
+ values: Array<string> | null | undefined,
1349
+ ): Array<string> {
1350
+ return (values || [])
1351
+ .map((value: string) => {
1352
+ return normalizeNamespace(value);
1353
+ })
1354
+ .filter((value: string) => {
1355
+ return value.length > 0;
1356
+ });
1357
+ }
1358
+
1359
+ // The Runner's scope, in its own words, for the end of a refusal.
1360
+ function describeRunnerScope(data: {
1361
+ writeNamespaces: Array<string>;
1362
+ podNamespace: string;
1363
+ }): string {
1364
+ const parts: Array<string> = [];
1365
+
1366
+ if (data.writeNamespaces.length > 0) {
1367
+ parts.push(
1368
+ `This Runner only lets OneUptime AI change ${data.writeNamespaces
1369
+ .map((namespace: string) => {
1370
+ return `"${namespace}"`;
1371
+ })
1372
+ .join(
1373
+ ", ",
1374
+ )} (${KUBECTL_WRITE_NAMESPACES_ENV}, from aiAccess.remediation.namespaces on the Kubernetes agent chart).`,
1375
+ );
1376
+ }
1377
+
1378
+ if (data.podNamespace) {
1379
+ parts.push(
1380
+ `It never changes its own namespace "${data.podNamespace}" (${RUNNER_POD_NAMESPACE_ENV}).`,
1381
+ );
1382
+ }
1383
+
1384
+ parts.push("Reads are not restricted.");
1385
+
1386
+ return parts.join(" ");
1387
+ }
1388
+
1389
+ // A sentence and, when there is one, the fix after it.
1390
+ function withFix(sentence: string, fix: string): string {
1391
+ return fix ? `${sentence} ${fix}` : sentence;
1392
+ }
1393
+
1394
+ /*
1395
+ * A refusal in the Runner's own words. The Runner reports a node-switch
1396
+ * refusal with its own host's setting instead (KubectlExecutor); this
1397
+ * wording is the fallback that names the variable.
1398
+ */
1399
+ function describeForRunner(refusal: KubectlWriteScopeRefusalFacts): string {
1400
+ const command: string = refusal.displayCommand;
1401
+ const scope: string = describeRunnerScope(refusal);
1402
+ const target: string = refusal.namespace || "";
1403
+
1404
+ switch (refusal.code) {
1405
+ case "node_operations":
1406
+ return withFix(
1407
+ `${
1408
+ refusal.uncertainty === null
1409
+ ? `"${command}" is a node operation (cordon, uncordon, drain, taint, or a change to a Node object)`
1410
+ : `this Runner cannot tell for certain whether "${command}" changes a node (${refusal.uncertainty})`
1411
+ }, and this Runner does not allow AI-composed node operations (${KUBECTL_ALLOW_NODE_OPERATIONS_ENV}).`,
1412
+ refusal.fix,
1413
+ );
1414
+ case "namespace_uncertain":
1415
+ return withFix(
1416
+ `this Runner cannot tell for certain which namespace "${command}" changes (${refusal.uncertainty}). ${scope}`,
1417
+ refusal.fix,
1418
+ );
1419
+ case "objects_uncertain":
1420
+ return withFix(
1421
+ `this Runner cannot tell for certain which objects "${command}" changes (${refusal.uncertainty}). ${scope}`,
1422
+ refusal.fix,
1423
+ );
1424
+ case "verb_mismatch":
1425
+ return `this Runner reads the verb of "${command}" as "${refusal.readVerb}", but the kubectl policy read "${refusal.policyVerb}", so it cannot tell for certain what the command changes. ${scope}`;
1426
+ case "unnamed_namespace_objects":
1427
+ return withFix(
1428
+ `"${command}" would change Namespace objects without naming them (a selector, --all or no name at all), so this Runner cannot tell whether one of them is ${
1429
+ refusal.podNamespace
1430
+ ? `"${refusal.podNamespace}", the namespace it runs in`
1431
+ : "outside the namespaces it lets OneUptime AI change"
1432
+ }. ${scope}`,
1433
+ refusal.fix,
1434
+ );
1435
+ case "cluster_scoped":
1436
+ return `"${command}" changes ${refusal.clusterScopedKinds.join(
1437
+ ", ",
1438
+ )} objects, which are cluster-scoped: they live outside every namespace, so outside the namespaces this Runner lets OneUptime AI change, whatever -n says. ${scope}`;
1439
+ case "all_namespaces":
1440
+ return withFix(
1441
+ `"${command}" would change every namespace, including ones this Runner may not change. ${scope}`,
1442
+ refusal.fix,
1443
+ );
1444
+ case "no_namespace":
1445
+ return withFix(
1446
+ `"${command}" names no namespace and this Runner cannot tell which one it would change. ${scope}`,
1447
+ refusal.fix,
1448
+ );
1449
+ case "own_namespace":
1450
+ if (refusal.namespaceSource === "namespace_object") {
1451
+ return `"${command}" would change the Namespace object "${target}" — the namespace this Runner itself runs in; a change there could reconfigure the Kubernetes agent or this Runner, so OneUptime AI never makes one. ${scope}`;
1452
+ }
1453
+
1454
+ return withFix(
1455
+ `"${command}" ${
1456
+ refusal.namespaceSource === "namespace_flag"
1457
+ ? `would change namespace "${target}"`
1458
+ : `names no namespace, so kubectl would run it in "${target}"`
1459
+ }, the namespace this Runner itself runs in — a change there could scale away or reconfigure the Kubernetes agent or this Runner, so OneUptime AI never makes one. ${scope}`,
1460
+ refusal.fix,
1461
+ );
1462
+ case "outside_scope":
1463
+ if (refusal.namespaceSource === "namespace_object") {
1464
+ return `"${command}" would change the Namespace object "${target}", which is outside the namespaces this Runner lets OneUptime AI change (a Namespace object is judged by its name; -n does not apply to it). ${scope}`;
1465
+ }
1466
+
1467
+ return withFix(
1468
+ `"${command}" ${
1469
+ refusal.namespaceSource === "namespace_flag"
1470
+ ? `would change namespace "${target}"`
1471
+ : `names no namespace, so kubectl would run it in "${target}"`
1472
+ }, which is outside the namespaces this Runner lets OneUptime AI change. ${scope}`,
1473
+ refusal.fix,
1474
+ );
1475
+ default: {
1476
+ const unhandled: never = refusal.code;
1477
+ return unhandled;
1478
+ }
1479
+ }
1480
+ }
1481
+
1482
+ export default class KubectlWriteScope {
1483
+ /*
1484
+ * The namespaces an argv sets, read the way kubectl reads them, or why
1485
+ * that cannot be decided for certain.
1486
+ */
1487
+ public static resolveNamespaces(
1488
+ args: Array<string>,
1489
+ ): KubectlNamespaceResolution {
1490
+ const namespaces: Array<string> = [];
1491
+ let allNamespaces: boolean = false;
1492
+ // Whether the previous token might take this one as its value.
1493
+ let previous: "no" | "maybe" = "no";
1494
+ let afterDoubleDash: boolean = false;
1495
+
1496
+ const ambiguous: (reason: string) => KubectlNamespaceResolution = (
1497
+ reason: string,
1498
+ ): KubectlNamespaceResolution => {
1499
+ return { namespaces, allNamespaces, ambiguity: reason };
1500
+ };
1501
+
1502
+ for (let i: number = 0; i < args.length; i++) {
1503
+ const token: string = args[i]!;
1504
+ const flag: NamespaceFlag | null = readNamespaceFlag(token);
1505
+
1506
+ if (afterDoubleDash) {
1507
+ if (flag) {
1508
+ return ambiguous(
1509
+ `"${token}" comes after "--", where kubectl does not read it as a flag`,
1510
+ );
1511
+ }
1512
+ continue;
1513
+ }
1514
+
1515
+ if (token === "--") {
1516
+ afterDoubleDash = true;
1517
+ continue;
1518
+ }
1519
+
1520
+ /*
1521
+ * Counted even when the token might be the previous flag's value:
1522
+ * assuming "every namespace" can only ever cost a refusal.
1523
+ */
1524
+ if (readsAllNamespaces(token)) {
1525
+ allNamespaces = true;
1526
+ }
1527
+
1528
+ if (!flag) {
1529
+ previous = mayTakeNextToken(token);
1530
+ continue;
1531
+ }
1532
+
1533
+ if (previous === "maybe") {
1534
+ return ambiguous(
1535
+ `"${token}" follows "${args[i - 1]}", which may take it as its own value`,
1536
+ );
1537
+ }
1538
+
1539
+ if (flag.kind === "uncertain") {
1540
+ return ambiguous(
1541
+ `"${token}" combines "n" with a short flag the write scope does not know`,
1542
+ );
1543
+ }
1544
+
1545
+ if (flag.kind === "inline") {
1546
+ namespaces.push(flag.value);
1547
+ previous = "no";
1548
+ continue;
1549
+ }
1550
+
1551
+ // "-n web" / "--namespace web": the value is the next token, whatever it is.
1552
+ if (i + 1 >= args.length) {
1553
+ return ambiguous(`"${token}" has no namespace after it`);
1554
+ }
1555
+
1556
+ namespaces.push(args[i + 1]!);
1557
+ i++;
1558
+ previous = "no";
1559
+ }
1560
+
1561
+ return { namespaces, allNamespaces, ambiguity: null };
1562
+ }
1563
+
1564
+ /*
1565
+ * What a write changes, read from the argv the way kubectl reads it (see
1566
+ * the header): whether it is a node operation, which Namespace objects
1567
+ * and other cluster-scoped kinds it names, and whether anything it
1568
+ * changes lives in a namespace. getRefusal judges both the node switch
1569
+ * and the namespace scope from this one reading.
1570
+ */
1571
+ public static resolveTargets(args: Array<string>): KubectlWriteTargets {
1572
+ const targets: KubectlWriteTargets = {
1573
+ verb: "",
1574
+ uncertainty: null,
1575
+ uncertaintyFix: "",
1576
+ touchesNodes: false,
1577
+ namespaceObjects: [],
1578
+ unnamedNamespaceObjects: false,
1579
+ clusterScopedKinds: [],
1580
+ namespaced: false,
1581
+ };
1582
+
1583
+ const reading: PositionalsReading = readPositionals(args);
1584
+
1585
+ if (reading.uncertainty !== null) {
1586
+ targets.uncertainty = reading.uncertainty;
1587
+ targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
1588
+ return targets;
1589
+ }
1590
+
1591
+ const positionals: Array<string> = reading.positionals;
1592
+ const verb: string = (positionals[0] || "").toLowerCase();
1593
+ targets.verb = verb;
1594
+
1595
+ /*
1596
+ * --overrides decides what kubectl creates, whatever the verb and the
1597
+ * objects say (see OBJECT_REPLACING_FLAGS) — on every verb, not only
1598
+ * expose, so this reading never depends on the shared policy denying
1599
+ * the flag first.
1600
+ */
1601
+ if (reading.objectReplacingFlag !== null) {
1602
+ targets.uncertainty = describeObjectReplacingFlag(
1603
+ reading.objectReplacingFlag,
1604
+ );
1605
+ targets.uncertaintyFix = FIX_LEAVE_OUT_OVERRIDES;
1606
+ return targets;
1607
+ }
1608
+
1609
+ // cordon, uncordon, drain and taint only ever act on nodes.
1610
+ if (NODE_VERBS.has(verb)) {
1611
+ targets.touchesNodes = true;
1612
+ return targets;
1613
+ }
1614
+
1615
+ if (verb === "create") {
1616
+ // cobra matches subcommands case-sensitively (the policy denies others).
1617
+ const subcommand: string = positionals[1] || "";
1618
+
1619
+ if (!hasOwn(CREATE_SUBCOMMAND_SCOPES, subcommand)) {
1620
+ targets.uncertainty = `"create ${subcommand}" is not a kubectl create subcommand the write scope knows`;
1621
+ targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
1622
+ return targets;
1623
+ }
1624
+
1625
+ const scope: string = CREATE_SUBCOMMAND_SCOPES[subcommand]!;
1626
+
1627
+ if (scope === "namespace-object") {
1628
+ const name: string = (positionals[2] || "").trim().toLowerCase();
1629
+
1630
+ if (name) {
1631
+ targets.namespaceObjects.push(name);
1632
+ } else {
1633
+ targets.unnamedNamespaceObjects = true;
1634
+ }
1635
+ } else if (scope === "cluster-scoped") {
1636
+ targets.clusterScopedKinds.push(
1637
+ CREATE_CLUSTER_SCOPED_KINDS[subcommand] || subcommand,
1638
+ );
1639
+ } else {
1640
+ targets.namespaced = true;
1641
+ }
1642
+
1643
+ return targets;
1644
+ }
1645
+
1646
+ // Any other verb acts in the namespace kubectl runs it in.
1647
+ if (!OBJECT_VERBS.has(verb)) {
1648
+ targets.namespaced = true;
1649
+ return targets;
1650
+ }
1651
+
1652
+ const references: ObjectReferencesReading = readObjectReferences(
1653
+ objectTokens(verb, positionals),
1654
+ );
1655
+
1656
+ if (references.uncertainty !== null) {
1657
+ targets.uncertainty = references.uncertainty;
1658
+ targets.uncertaintyFix = FIX_NAME_THE_OBJECTS;
1659
+ return targets;
1660
+ }
1661
+
1662
+ /*
1663
+ * No object at all is a kubectl error; judging it as namespaced keeps
1664
+ * the stricter rule. expose and autoscale make a namespaced Service or
1665
+ * HorizontalPodAutoscaler whatever they name (--overrides, which could
1666
+ * make it anything else, was refused as uncertain above).
1667
+ */
1668
+ if (
1669
+ references.references.length === 0 ||
1670
+ CREATES_NAMESPACED_OBJECT_VERBS.has(verb)
1671
+ ) {
1672
+ targets.namespaced = true;
1673
+ }
1674
+
1675
+ for (const reference of references.references) {
1676
+ const kind: string | null = clusterScopedKindOf(reference.rawKind);
1677
+
1678
+ if (kind === null) {
1679
+ targets.namespaced = true;
1680
+ continue;
1681
+ }
1682
+
1683
+ if (kind === "node") {
1684
+ targets.touchesNodes = true;
1685
+ continue;
1686
+ }
1687
+
1688
+ if (kind === "namespace") {
1689
+ const name: string = (reference.name || "").trim().toLowerCase();
1690
+
1691
+ if (!name) {
1692
+ targets.unnamedNamespaceObjects = true;
1693
+ } else if (!targets.namespaceObjects.includes(name)) {
1694
+ targets.namespaceObjects.push(name);
1695
+ }
1696
+ continue;
1697
+ }
1698
+
1699
+ if (!targets.clusterScopedKinds.includes(kind)) {
1700
+ targets.clusterScopedKinds.push(kind);
1701
+ }
1702
+ }
1703
+
1704
+ return targets;
1705
+ }
1706
+
1707
+ /*
1708
+ * Test seams, so a test can hold these tables against the shared policy's
1709
+ * own verdicts: every flag name this reader knows the arity of, a flag's
1710
+ * arity ("value", "none", or null when unknown), every kind spelling it
1711
+ * knows is cluster-scoped, and the cluster-scoped kind a spelling names.
1712
+ */
1713
+ public static readonly knownFlagNames: ReadonlyArray<string> = [
1714
+ ...Array.from(BOOLEAN_SHORT_FLAGS),
1715
+ ...Array.from(VALUE_SHORT_FLAGS),
1716
+ ...Array.from(NON_CONSUMING_LONG_FLAGS),
1717
+ ...Array.from(VALUE_LONG_FLAGS),
1718
+ ];
1719
+
1720
+ public static readonly verbFlagArityOverrides: ReadonlyArray<{
1721
+ verb: string;
1722
+ flag: string;
1723
+ arity: FlagArity;
1724
+ }> = Object.entries(VERB_FLAG_ARITY_OVERRIDES).flatMap(
1725
+ ([verb, overrides]: [string, Record<string, FlagArity>]) => {
1726
+ return Object.entries(overrides).map(
1727
+ ([flag, arity]: [string, FlagArity]) => {
1728
+ return { verb, flag, arity };
1729
+ },
1730
+ );
1731
+ },
1732
+ );
1733
+
1734
+ public static readonly clusterScopedKindSpellings: ReadonlyArray<string> =
1735
+ Object.keys(CLUSTER_SCOPED_KIND_NAMES);
1736
+
1737
+ public static getFlagArity(
1738
+ name: string,
1739
+ verb?: string | undefined,
1740
+ ): FlagArity | null {
1741
+ return lookupFlagArity(name, verb);
1742
+ }
1743
+
1744
+ public static getClusterScopedKind(rawKind: string): string | null {
1745
+ return clusterScopedKindOf(rawKind);
1746
+ }
1747
+
1748
+ /*
1749
+ * THE write-scope question, for every caller (see the header): why the
1750
+ * Runner will not run this command where it lands — or null when it
1751
+ * will. Read commands are never refused; every other tier is judged as a
1752
+ * write (the policy refuses a Denied one on its own, before or after).
1753
+ *
1754
+ * In order: the node switch (a node operation, or a write whose objects
1755
+ * cannot be read for certain, while it is off); then, when a scope is
1756
+ * set at all (write namespaces, or a known pod namespace), what the write
1757
+ * changes — Namespace objects by name, other cluster-scoped objects
1758
+ * against the write-namespace list, and namespaced objects by the
1759
+ * namespace they land in.
1760
+ */
1761
+ public static getRefusal(
1762
+ input: KubectlWriteScopeInput,
1763
+ ): KubectlWriteScopeRefusal | null {
1764
+ const command: KubectlWriteScopeCommand = Array.isArray(input.command)
1765
+ ? KubectlPolicy.evaluateArgs(input.command)
1766
+ : input.command;
1767
+
1768
+ if (command.tier === KubectlCommandTier.Read) {
1769
+ return null;
1770
+ }
1771
+
1772
+ const writeNamespaces: Array<string> = normalizeNamespaces(
1773
+ input.writeNamespaces,
1774
+ );
1775
+ const podNamespace: string = normalizeNamespace(input.podNamespace);
1776
+ const hasScope: boolean = writeNamespaces.length > 0 || podNamespace !== "";
1777
+
1778
+ if (input.allowNodeOperations && !hasScope) {
1779
+ return null;
1780
+ }
1781
+
1782
+ const refuse: (
1783
+ code: KubectlWriteScopeRefusalCode,
1784
+ facts?: Partial<KubectlWriteScopeRefusalFacts>,
1785
+ ) => KubectlWriteScopeRefusal = (
1786
+ code: KubectlWriteScopeRefusalCode,
1787
+ facts: Partial<KubectlWriteScopeRefusalFacts> = {},
1788
+ ): KubectlWriteScopeRefusal => {
1789
+ const refusalFacts: KubectlWriteScopeRefusalFacts = {
1790
+ code,
1791
+ displayCommand: command.displayCommand,
1792
+ writeNamespaces,
1793
+ podNamespace,
1794
+ namespace: null,
1795
+ namespaceSource: null,
1796
+ uncertainty: null,
1797
+ clusterScopedKinds: [],
1798
+ readVerb: "",
1799
+ policyVerb: "",
1800
+ fix: "",
1801
+ ...facts,
1802
+ };
1803
+
1804
+ return { ...refusalFacts, reason: describeForRunner(refusalFacts) };
1805
+ };
1806
+
1807
+ const targets: KubectlWriteTargets = KubectlWriteScope.resolveTargets(
1808
+ command.args,
1809
+ );
1810
+
1811
+ /*
1812
+ * The node switch: nodes are cluster-scoped, so no namespace scope can
1813
+ * bound them, and the chart's node role is optional. A write whose
1814
+ * objects cannot be read for certain could be a node operation, so it
1815
+ * is refused too.
1816
+ */
1817
+ if (
1818
+ !input.allowNodeOperations &&
1819
+ (targets.touchesNodes || targets.uncertainty !== null)
1820
+ ) {
1821
+ return refuse("node_operations", {
1822
+ uncertainty: targets.uncertainty,
1823
+ fix: targets.uncertainty === null ? "" : targets.uncertaintyFix,
1824
+ });
1825
+ }
1826
+
1827
+ if (!hasScope) {
1828
+ return null;
1829
+ }
1830
+
1831
+ if (targets.uncertainty !== null) {
1832
+ /*
1833
+ * A namespace flag that another flag may swallow is the usual cause
1834
+ * (`--selector -n web` makes "web" an object); say so, with the
1835
+ * spelling that cannot be misread.
1836
+ */
1837
+ const namespaceReading: KubectlNamespaceResolution =
1838
+ KubectlWriteScope.resolveNamespaces(command.args);
1839
+
1840
+ if (namespaceReading.ambiguity) {
1841
+ return refuse("namespace_uncertain", {
1842
+ uncertainty: namespaceReading.ambiguity,
1843
+ fix: FIX_PUT_THE_NAMESPACE_FIRST,
1844
+ });
1845
+ }
1846
+
1847
+ return refuse("objects_uncertain", {
1848
+ uncertainty: targets.uncertainty,
1849
+ fix: targets.uncertaintyFix,
1850
+ });
1851
+ }
1852
+
1853
+ const policyVerb: string = (command.verb.split(" ")[0] || "").toLowerCase();
1854
+
1855
+ if (policyVerb && policyVerb !== targets.verb) {
1856
+ return refuse("verb_mismatch", {
1857
+ readVerb: targets.verb,
1858
+ policyVerb,
1859
+ });
1860
+ }
1861
+
1862
+ /*
1863
+ * A Namespace object is judged by its name: kubectl ignores -n for it,
1864
+ * so `label namespace X ... -n <allowed>` changes X.
1865
+ */
1866
+ if (targets.unnamedNamespaceObjects) {
1867
+ return refuse("unnamed_namespace_objects", {
1868
+ fix: FIX_NAME_EACH_NAMESPACE_OBJECT,
1869
+ });
1870
+ }
1871
+
1872
+ for (const name of targets.namespaceObjects) {
1873
+ if (podNamespace && name === podNamespace) {
1874
+ return refuse("own_namespace", {
1875
+ namespace: name,
1876
+ namespaceSource: "namespace_object",
1877
+ });
1878
+ }
1879
+
1880
+ if (writeNamespaces.length > 0 && !writeNamespaces.includes(name)) {
1881
+ return refuse("outside_scope", {
1882
+ namespace: name,
1883
+ namespaceSource: "namespace_object",
1884
+ });
1885
+ }
1886
+ }
1887
+
1888
+ /*
1889
+ * Any other cluster-scoped object lives outside every namespace, so
1890
+ * outside every listed one. Without a list, RBAC bounds it.
1891
+ */
1892
+ if (targets.clusterScopedKinds.length > 0 && writeNamespaces.length > 0) {
1893
+ return refuse("cluster_scoped", {
1894
+ clusterScopedKinds: [...targets.clusterScopedKinds],
1895
+ });
1896
+ }
1897
+
1898
+ if (!targets.namespaced) {
1899
+ return null;
1900
+ }
1901
+
1902
+ const resolution: KubectlNamespaceResolution =
1903
+ KubectlWriteScope.resolveNamespaces(command.args);
1904
+
1905
+ if (resolution.ambiguity) {
1906
+ return refuse("namespace_uncertain", {
1907
+ uncertainty: resolution.ambiguity,
1908
+ fix: FIX_PUT_THE_NAMESPACE_FIRST,
1909
+ });
1910
+ }
1911
+
1912
+ /*
1913
+ * The shared policy already denies a write across all namespaces; this
1914
+ * layer does not rely on that — every namespace includes the ones the
1915
+ * Runner may not change.
1916
+ */
1917
+ if (resolution.allNamespaces) {
1918
+ return refuse("all_namespaces", { fix: FIX_NAME_ONE_NAMESPACE });
1919
+ }
1920
+
1921
+ const explicit: boolean = resolution.namespaces.length > 0;
1922
+ const source: KubectlWriteScopeNamespaceSource = explicit
1923
+ ? "namespace_flag"
1924
+ : "default_namespace";
1925
+ // What a missing -n means: see KubectlWriteScopeInput.usesCredential.
1926
+ const defaultNamespace: string = input.usesCredential
1927
+ ? "default"
1928
+ : podNamespace;
1929
+ /*
1930
+ * Every namespace the argv sets, blanks kept: `-n ""` names no
1931
+ * namespace kubectl could be held to.
1932
+ */
1933
+ const namespaces: Array<string> = explicit
1934
+ ? resolution.namespaces.map((namespace: string) => {
1935
+ return normalizeNamespace(namespace);
1936
+ })
1937
+ : [defaultNamespace];
1938
+ const fix: string = explicit ? "" : FIX_NAME_THE_TARGET_NAMESPACE;
1939
+
1940
+ for (const target of namespaces) {
1941
+ if (!target) {
1942
+ return refuse("no_namespace", { fix: FIX_NAME_THE_NAMESPACE });
1943
+ }
1944
+
1945
+ if (podNamespace && target === podNamespace) {
1946
+ return refuse("own_namespace", {
1947
+ namespace: target,
1948
+ namespaceSource: source,
1949
+ fix,
1950
+ });
1951
+ }
1952
+
1953
+ if (writeNamespaces.length > 0 && !writeNamespaces.includes(target)) {
1954
+ return refuse("outside_scope", {
1955
+ namespace: target,
1956
+ namespaceSource: source,
1957
+ fix,
1958
+ });
1959
+ }
1960
+ }
1961
+
1962
+ return null;
1963
+ }
1964
+ }