@oneuptime/common 14.0.9 → 14.0.10

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 (383) hide show
  1. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  2. package/Models/DatabaseModels/CephCluster.ts +213 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +213 -0
  4. package/Models/DatabaseModels/DockerHost.ts +213 -0
  5. package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
  6. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  7. package/Models/DatabaseModels/Host.ts +213 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/PodmanHost.ts +213 -0
  10. package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
  11. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  12. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  13. package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
  14. package/Server/API/AutoRemediationAPI.ts +392 -1
  15. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  18. package/Server/Infrastructure/Semaphore.ts +22 -0
  19. package/Server/Middleware/TelemetryIngest.ts +15 -5
  20. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  21. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  22. package/Server/Services/CephClusterService.ts +109 -1
  23. package/Server/Services/DatabaseServerService.ts +116 -1
  24. package/Server/Services/DockerHostService.ts +109 -1
  25. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  26. package/Server/Services/HostService.ts +126 -4
  27. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  28. package/Server/Services/PodmanHostService.ts +109 -1
  29. package/Server/Services/ProxmoxClusterService.ts +110 -1
  30. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  31. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  32. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  33. package/Server/Services/RunnerJobService.ts +611 -4
  34. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  35. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  36. package/Server/Services/VMwareVCenterService.ts +110 -1
  37. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
  38. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
  39. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  40. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
  41. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  42. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  43. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  44. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  45. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
  46. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
  47. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
  48. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
  49. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  50. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  51. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  52. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  53. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  54. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  55. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  56. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  57. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  60. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
  61. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  63. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  64. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  65. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  66. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  67. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
  68. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
  69. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  70. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  71. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  72. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  73. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  74. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
  75. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
  76. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  77. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  78. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  79. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
  80. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  81. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  82. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  83. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  84. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  85. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  86. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  87. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  88. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  89. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  90. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  91. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  92. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  93. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  95. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  96. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  97. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  98. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  99. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  100. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  101. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  102. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  103. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  104. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  105. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  106. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  107. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  108. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  109. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  110. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  111. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
  112. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  113. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  114. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  115. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
  116. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  117. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  118. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
  119. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  120. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  121. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  122. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
  123. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  124. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  125. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  126. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  127. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  128. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  129. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  130. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  131. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  132. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  133. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  134. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  135. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  137. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  138. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  139. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  140. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  141. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  142. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  143. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  144. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  145. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  146. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  147. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  148. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  149. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  150. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  151. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
  152. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  153. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  154. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  155. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  156. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  157. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  158. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  159. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  160. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  161. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  162. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  163. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  164. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  165. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  166. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  167. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  168. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  169. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  170. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  171. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  172. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  173. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  174. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  175. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  176. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  177. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  178. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  179. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  180. package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
  181. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  182. package/Types/Runbook/RunbookStepType.ts +29 -0
  183. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  184. package/Utils/AI/InvestigationReport.ts +121 -15
  185. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  186. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  187. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  188. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  189. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  190. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  191. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  192. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  193. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  194. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  195. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  196. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  197. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  198. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  199. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  200. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
  202. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
  204. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  205. package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
  206. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
  208. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/Host.js +219 -0
  212. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  214. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
  218. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  220. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  222. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
  224. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  225. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  226. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  227. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  228. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  234. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  235. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  236. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  237. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  239. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  240. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  241. package/build/dist/Server/Services/CephClusterService.js +104 -0
  242. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  243. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  244. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  245. package/build/dist/Server/Services/DockerHostService.js +104 -0
  246. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  247. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  248. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  249. package/build/dist/Server/Services/HostService.js +114 -2
  250. package/build/dist/Server/Services/HostService.js.map +1 -1
  251. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  252. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  253. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  254. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  255. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  256. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  257. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  258. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  259. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  260. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  261. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  262. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  263. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  264. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  265. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  266. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  267. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  268. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  269. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  270. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
  272. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
  274. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  276. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
  278. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  279. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  280. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  281. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  282. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  283. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  284. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  285. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  286. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  287. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
  288. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
  290. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
  292. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  293. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
  294. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  295. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  296. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  297. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  298. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  299. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  300. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  301. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  302. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  303. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  304. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
  314. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  315. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  316. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  317. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
  318. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  319. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  320. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  321. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  322. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  323. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  324. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  325. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  326. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  327. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  328. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  329. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  330. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  331. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  332. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  333. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  334. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  335. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  336. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  337. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  338. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  339. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  340. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  341. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  342. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  343. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  344. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  345. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
  346. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  347. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  348. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  349. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  350. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  351. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  352. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  353. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  354. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  355. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  356. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  357. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  358. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  359. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  360. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  361. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  362. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  363. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  364. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  365. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  366. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  367. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  368. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  369. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  370. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  371. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  372. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  373. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  374. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  375. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  376. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  377. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  378. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  379. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  380. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  381. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  382. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  383. package/package.json +1 -1
@@ -0,0 +1,334 @@
1
+ import {
2
+ GENERIC_REDACTED_MARKER,
3
+ GenericOutputRedactor,
4
+ RESOURCE_OUTPUT_REDACTION_HOOKS,
5
+ RESOURCE_REDACTED_MARKER,
6
+ ResourceOutputRedaction,
7
+ getResourceOutputRedactionHooks,
8
+ redactResourceCommandOutput,
9
+ redactResourceCommandOutputWithCount,
10
+ } from "../../../../Utils/AiRemediation/Resource/ResourceOutputRedactor";
11
+ import KubectlOutputRedactor, {
12
+ KUBECTL_REDACTED_MARKER,
13
+ } from "../../../../Utils/AiRemediation/KubectlOutputRedactor";
14
+ import AiResourceType from "../../../../Types/ResourceAiAgent/AiResourceType";
15
+ import { describe, expect, test } from "@jest/globals";
16
+
17
+ /*
18
+ * Contract under test — redaction of a resource command's output, applied
19
+ * on the agent before the output leaves the host and on the server before
20
+ * it is stored or shown to a model.
21
+ *
22
+ * - The generic rules are KubectlOutputRedactor's, copied (the directory is
23
+ * import-closed): same marker, same answers on the same input.
24
+ * - Per-program hooks run first: every `docker inspect` Env value, a Ceph
25
+ * keyring's key. A program without hooks gets the generic rules only.
26
+ * - It is total: anything that is not text is "", and a hook that throws
27
+ * never lets the output through without the generic rules.
28
+ */
29
+
30
+ function redact(
31
+ text: string,
32
+ program: string = "docker",
33
+ resourceType: AiResourceType = AiResourceType.DockerHost,
34
+ ): string {
35
+ return redactResourceCommandOutput({ resourceType, program, text });
36
+ }
37
+
38
+ const PRETTY_DOCKER_INSPECT: string = `[
39
+ {
40
+ "Id": "3f2a9c1b7d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8",
41
+ "Name": "/web",
42
+ "Config": {
43
+ "Hostname": "3f2a9c1b7d4e",
44
+ "Env": [
45
+ "APP_CONFIG=eyJob3N0IjoiZGIifQ",
46
+ "DATABASE=postgres://app:hunter2@db:5432/app",
47
+ "POSTGRES_PASSWORD=hunter2",
48
+ "PATH=/usr/local/bin:/usr/bin",
49
+ "EMPTY=",
50
+ "PASSTHROUGH"
51
+ ],
52
+ "Image": "nginx:1.27"
53
+ }
54
+ }
55
+ ]`;
56
+
57
+ describe("the generic rules are KubectlOutputRedactor's", () => {
58
+ test("the marker is the same", () => {
59
+ expect(GENERIC_REDACTED_MARKER).toBe(KUBECTL_REDACTED_MARKER);
60
+ expect(RESOURCE_REDACTED_MARKER).toBe("[redacted]");
61
+ });
62
+
63
+ const corpus: Array<string> = [
64
+ "",
65
+ "no secrets here\nCONTAINER ID IMAGE STATUS",
66
+ "DB_PASSWORD=hunter2 started",
67
+ 'password: "hunter2"\napi_key: abcdef123456',
68
+ "connecting to postgres://app:hunter2@db:5432/app",
69
+ "Authorization: Bearer abcdefghijklmnop.qrstuvwxyz",
70
+ "token eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U",
71
+ "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA\n-----END RSA PRIVATE KEY-----",
72
+ '{"name":"DB_PASSWORD","value":"hunter2"}',
73
+ "--db-password hunter2 --verbose",
74
+ "mysql -phunter2 -u root",
75
+ "cGFzc3dvcmQ= and a long run QWxhZGRpbjpvcGVuIHNlc2FtZQQWxhZGRpbjpvcGVuIHNlc2FtZQ",
76
+ "data:\n password: aHVudGVyMg==\n user: YWRtaW4=",
77
+ "kind: Secret\ndata:\n x: eQ==",
78
+ "line with\r\nwindows endings DB_TOKEN=abc",
79
+ ];
80
+
81
+ test.each(
82
+ corpus.map((text: string) => {
83
+ return [text];
84
+ }),
85
+ )("gives KubectlOutputRedactor's answer for %p", (text: string) => {
86
+ expect(GenericOutputRedactor.redact(text)).toEqual(
87
+ KubectlOutputRedactor.redact(text),
88
+ );
89
+ });
90
+ });
91
+
92
+ describe("docker: every Env value is masked", () => {
93
+ test("pretty-printed docker inspect keeps names, masks values", () => {
94
+ const text: string = redact(PRETTY_DOCKER_INSPECT);
95
+
96
+ expect(text).toContain('"APP_CONFIG=[redacted]"');
97
+ expect(text).toContain('"DATABASE=[redacted]"');
98
+ expect(text).toContain('"POSTGRES_PASSWORD=[redacted]"');
99
+ expect(text).toContain('"PATH=[redacted]"');
100
+ // Nothing to hide in an empty value or a pass-through name.
101
+ expect(text).toContain('"EMPTY="');
102
+ expect(text).toContain('"PASSTHROUGH"');
103
+ expect(text).not.toContain("hunter2");
104
+ expect(text).not.toContain("eyJob3N0IjoiZGIifQ");
105
+ // Everything outside the Env list is untouched.
106
+ expect(text).toContain('"Name": "/web"');
107
+ expect(text).toContain('"Image": "nginx:1.27"');
108
+ });
109
+
110
+ test("counts each masked value", () => {
111
+ const redaction: ResourceOutputRedaction =
112
+ redactResourceCommandOutputWithCount({
113
+ resourceType: AiResourceType.DockerHost,
114
+ program: "docker",
115
+ text: '"Env": ["A=1", "B=2", "C"]',
116
+ });
117
+
118
+ expect(redaction.text).toBe('"Env": ["A=[redacted]", "B=[redacted]", "C"]');
119
+ expect(redaction.redactionCount).toBe(2);
120
+ });
121
+
122
+ test("compact JSON (docker inspect -f '{{json .Config}}')", () => {
123
+ expect(redact('{"Env":["APP_KEY=abc","MODE=prod"],"Cmd":["nginx"]}')).toBe(
124
+ '{"Env":["APP_KEY=[redacted]","MODE=[redacted]"],"Cmd":["nginx"]}',
125
+ );
126
+ });
127
+
128
+ test("several containers, several Env lists", () => {
129
+ const text: string = redact(
130
+ '[{"Config":{"Env":["A=secret-one"]}},{"Config":{"Env":["B=secret-two"]}}]',
131
+ );
132
+
133
+ expect(text).not.toContain("secret-one");
134
+ expect(text).not.toContain("secret-two");
135
+ });
136
+
137
+ test("a value holding an escaped quote or a bracket is masked whole", () => {
138
+ const text: string = redact(
139
+ '"Env": ["JSON_CFG={\\"pw\\":\\"x]y\\"}", "NEXT=secret"]',
140
+ );
141
+
142
+ expect(text).toBe('"Env": ["JSON_CFG=[redacted]", "NEXT=[redacted]"]');
143
+ });
144
+
145
+ test("JSON escaped inside another JSON string", () => {
146
+ const text: string = redact(
147
+ '{"output":"{\\"Env\\":[\\"TOKEN=abc123\\",\\"MODE=prod\\"]}"}',
148
+ );
149
+
150
+ expect(text).not.toContain("abc123");
151
+ expect(text).not.toContain("MODE=prod");
152
+ expect(text).toContain("MODE=[redacted]");
153
+ });
154
+
155
+ test("output truncated inside the Env list is masked to the end", () => {
156
+ const text: string = redact('"Env": [\n "A=visible-secret",\n "B=trunc');
157
+
158
+ expect(text).not.toContain("visible-secret");
159
+ expect(text).not.toContain("trunc");
160
+ });
161
+
162
+ test("a null Env and an empty list are left alone", () => {
163
+ expect(redact('"Env": null, "Cmd": []')).toBe('"Env": null, "Cmd": []');
164
+ expect(redact('"Env": []')).toBe('"Env": []');
165
+ });
166
+
167
+ test("docker service inspect (swarm) is masked the same way", () => {
168
+ expect(
169
+ redact(
170
+ '"ContainerSpec": {"Env": ["SECRET_SAUCE=ketchup"]}',
171
+ "docker",
172
+ AiResourceType.DockerSwarmCluster,
173
+ ),
174
+ ).toBe('"ContainerSpec": {"Env": ["SECRET_SAUCE=[redacted]"]}');
175
+ });
176
+
177
+ test("only docker output gets the Env hook", () => {
178
+ expect(redact('"Env": ["MODE=prod"]', "pvesh")).toBe(
179
+ '"Env": ["MODE=prod"]',
180
+ );
181
+ });
182
+ });
183
+
184
+ describe("ceph: keyring keys are masked", () => {
185
+ test.each([
186
+ [
187
+ '[client.oneuptime-ai]\n\tkey = AQDxJ2ZmAAAAABAAxyz0123456789abcdefghij==\n\tcaps mon = "allow r"',
188
+ "\tkey = [redacted]",
189
+ ],
190
+ [
191
+ "client.admin\n\tkey: AQDxJ2ZmAAAAABAAxyz0123456789abcdefghij==\n\tcaps: [mds] allow *",
192
+ "\tkey: [redacted]",
193
+ ],
194
+ [
195
+ '[{"entity":"client.admin","key":"AQDxJ2ZmAAAAABAAxyz0123456789abcdefghij==","caps":{}}]',
196
+ '"key":"[redacted]"',
197
+ ],
198
+ ])("%p", (text: string, expected: string) => {
199
+ const redacted: string = redact(text, "ceph", AiResourceType.CephCluster);
200
+
201
+ expect(redacted).toContain(expected);
202
+ expect(redacted).not.toContain("AQDxJ2ZmAAAAABAAxyz0123456789abcdefghij");
203
+ });
204
+
205
+ test("ceph output without keys is untouched", () => {
206
+ const text: string = "HEALTH_WARN 1 osds down\nosd.3 is down";
207
+
208
+ expect(redact(text, "ceph", AiResourceType.CephCluster)).toBe(text);
209
+ });
210
+ });
211
+
212
+ describe("the generic rules apply to every program", () => {
213
+ test.each([
214
+ ["docker", AiResourceType.DockerHost],
215
+ ["pvesh", AiResourceType.ProxmoxCluster],
216
+ ["govc", AiResourceType.VMwareVCenter],
217
+ ["ceph", AiResourceType.CephCluster],
218
+ ["db", AiResourceType.DatabaseServer],
219
+ ["journalctl", AiResourceType.Host],
220
+ ["cat", AiResourceType.Host],
221
+ ["unknown-program", AiResourceType.Host],
222
+ ])("%s", (program: string, resourceType: AiResourceType) => {
223
+ const text: string = redact(
224
+ [
225
+ '"cipassword": "hunter2"',
226
+ "DB_PASSWORD=hunter2",
227
+ "url: postgres://app:hunter2@db:5432/app",
228
+ "Authorization: Bearer abcdefghijklmnop",
229
+ ].join("\n"),
230
+ program,
231
+ resourceType,
232
+ );
233
+
234
+ expect(text).not.toContain("hunter2");
235
+ expect(text).not.toContain("abcdefghijklmnop");
236
+ });
237
+
238
+ test("ordinary output passes through unchanged", () => {
239
+ const text: string =
240
+ "CONTAINER ID IMAGE STATUS\n3f2a9c1b7d4e nginx:1.27 Up 3 hours";
241
+
242
+ expect(redact(text)).toBe(text);
243
+ });
244
+ });
245
+
246
+ describe("the hook table", () => {
247
+ test("lists the programs whose kits extend it", () => {
248
+ expect(Object.keys(RESOURCE_OUTPUT_REDACTION_HOOKS).sort()).toEqual(
249
+ [
250
+ "ceph",
251
+ "db",
252
+ "docker",
253
+ "govc",
254
+ "journalctl",
255
+ "ps",
256
+ "pvesh",
257
+ "systemctl",
258
+ "top",
259
+ ].sort(),
260
+ );
261
+ expect(getResourceOutputRedactionHooks("docker").length).toBeGreaterThan(0);
262
+ expect(getResourceOutputRedactionHooks("ceph").length).toBeGreaterThan(0);
263
+ });
264
+
265
+ test.each([["df"], ["__proto__"], ["constructor"], ["toString"], [""]])(
266
+ "%p has no hooks",
267
+ (program: string) => {
268
+ expect(getResourceOutputRedactionHooks(program)).toEqual([]);
269
+ },
270
+ );
271
+
272
+ test("a non-string program has no hooks", () => {
273
+ expect(getResourceOutputRedactionHooks(null as unknown as string)).toEqual(
274
+ [],
275
+ );
276
+ });
277
+ });
278
+
279
+ describe("totality", () => {
280
+ test.each([[null], [undefined], [42], [{}], [""]])(
281
+ "text %p redacts to an empty string",
282
+ (text: unknown) => {
283
+ expect(
284
+ redactResourceCommandOutputWithCount({
285
+ resourceType: AiResourceType.DockerHost,
286
+ program: "docker",
287
+ text: text as string,
288
+ }),
289
+ ).toEqual({ text: "", redactionCount: 0 });
290
+ },
291
+ );
292
+
293
+ test("a missing request redacts to an empty string", () => {
294
+ expect(
295
+ redactResourceCommandOutput(
296
+ null as unknown as Parameters<typeof redactResourceCommandOutput>[0],
297
+ ),
298
+ ).toBe("");
299
+ });
300
+
301
+ test("a hook that throws never skips the generic rules", () => {
302
+ const hooks: Array<unknown> = RESOURCE_OUTPUT_REDACTION_HOOKS[
303
+ "pvesh"
304
+ ] as unknown as Array<unknown>;
305
+
306
+ hooks.push((): never => {
307
+ throw new Error("broken hook");
308
+ });
309
+
310
+ try {
311
+ expect(redact("DB_PASSWORD=hunter2", "pvesh")).toBe(
312
+ "DB_PASSWORD=[redacted]",
313
+ );
314
+ } finally {
315
+ hooks.pop();
316
+ }
317
+ });
318
+
319
+ test("a hook that returns garbage is ignored", () => {
320
+ const hooks: Array<unknown> = RESOURCE_OUTPUT_REDACTION_HOOKS[
321
+ "govc"
322
+ ] as unknown as Array<unknown>;
323
+
324
+ hooks.push((): unknown => {
325
+ return null;
326
+ });
327
+
328
+ try {
329
+ expect(redact("password=x", "govc")).toBe("password=[redacted]");
330
+ } finally {
331
+ hooks.pop();
332
+ }
333
+ });
334
+ });
@@ -0,0 +1,98 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { describe, expect, test } from "@jest/globals";
4
+
5
+ /*
6
+ * Contract under test — the generic rules in ResourceOutputRedactor are a
7
+ * faithful COPY of KubectlOutputRedactor.
8
+ *
9
+ * The resource policy directory is import-closed (the resource AI agent
10
+ * carries a byte-identical copy of it), so it cannot import
11
+ * Utils/AiRemediation/KubectlOutputRedactor. Instead it carries the
12
+ * redactor's rules verbatim — everything from the KubectlOutputRedaction
13
+ * interface to the end of the file — with only four same-length renames.
14
+ * A fix to the Kubernetes redactor that is not re-copied here would leave
15
+ * resource output with a hole the cluster lane no longer has, so this fails
16
+ * the moment the two differ: re-copy the block (apply RENAMES) into
17
+ * Utils/AiRemediation/Resource/ResourceOutputRedactor.ts.
18
+ *
19
+ * Read with fs, never required: the comparison is of source text.
20
+ */
21
+
22
+ const COMMON_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..");
23
+
24
+ const SOURCE_FILE: string = path.join(
25
+ COMMON_ROOT,
26
+ "Utils",
27
+ "AiRemediation",
28
+ "KubectlOutputRedactor.ts",
29
+ );
30
+
31
+ const COPY_FILE: string = path.join(
32
+ COMMON_ROOT,
33
+ "Utils",
34
+ "AiRemediation",
35
+ "Resource",
36
+ "ResourceOutputRedactor.ts",
37
+ );
38
+
39
+ // Where the copied block starts in the source.
40
+ const COPY_START: string = "export interface KubectlOutputRedaction";
41
+
42
+ /*
43
+ * Applied in order. Each new name has the old name's length, so a
44
+ * formatter never re-wraps a copied line and the texts stay comparable.
45
+ */
46
+ const RENAMES: Array<[string, string]> = [
47
+ [
48
+ "export default class KubectlOutputRedactor",
49
+ "export class GenericOutputRedactor",
50
+ ],
51
+ ["KubectlOutputRedactor", "GenericOutputRedactor"],
52
+ ["KubectlOutputRedaction", "GenericOutputRedaction"],
53
+ ["KUBECTL_REDACTED_MARKER", "GENERIC_REDACTED_MARKER"],
54
+ ];
55
+
56
+ function expectedCopy(): string {
57
+ const source: string = fs.readFileSync(SOURCE_FILE, "utf8");
58
+ const start: number = source.indexOf(COPY_START);
59
+
60
+ expect(start).toBeGreaterThan(-1);
61
+
62
+ let block: string = source.slice(start);
63
+
64
+ for (const [from, to] of RENAMES) {
65
+ block = block.split(from).join(to);
66
+ }
67
+
68
+ return block;
69
+ }
70
+
71
+ describe("ResourceOutputRedactor carries KubectlOutputRedactor's rules verbatim", () => {
72
+ test("the renames keep every identifier's length", () => {
73
+ for (const [from, to] of RENAMES.slice(1)) {
74
+ expect(to).toHaveLength(from.length);
75
+ }
76
+ });
77
+
78
+ test("the copied block is identical to the source after the renames", () => {
79
+ const copy: string = fs.readFileSync(COPY_FILE, "utf8");
80
+ const expected: string = expectedCopy();
81
+
82
+ expect(copy.includes(expected)).toBe(true);
83
+ });
84
+
85
+ test("the copy mentions the source it must follow", () => {
86
+ const copy: string = fs.readFileSync(COPY_FILE, "utf8");
87
+
88
+ expect(copy).toContain("KubectlOutputRedactor");
89
+ expect(copy).toContain("ResourceOutputRedactorCopyParity.test.ts");
90
+ });
91
+
92
+ test("no Kubernetes identifier survives in the copied code", () => {
93
+ const expected: string = expectedCopy();
94
+
95
+ expect(expected).not.toMatch(/\bKubectlOutputRedact(or|ion)\b/);
96
+ expect(expected).not.toContain("KUBECTL_REDACTED_MARKER");
97
+ });
98
+ });