@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
@@ -21,14 +21,8 @@ import OnCallDutyPolicyService from "../../../../Services/OnCallDutyPolicyServic
21
21
  import IncidentStateService from "../../../../Services/IncidentStateService";
22
22
  import UserNotificationEventType from "../../../../../Types/UserNotification/UserNotificationEventType";
23
23
  import OnCallDutyPolicy from "../../../../../Models/DatabaseModels/OnCallDutyPolicy";
24
- import IncidentSeverityService from "../../../../Services/IncidentSeverityService";
25
- import MonitorService from "../../../../Services/MonitorService";
26
24
  import Monitor from "../../../../../Models/DatabaseModels/Monitor";
27
- import MonitorStatusService from "../../../../Services/MonitorStatusService";
28
- import LabelService from "../../../../Services/LabelService";
29
25
  import Label from "../../../../../Models/DatabaseModels/Label";
30
- import SortOrder from "../../../../../Types/BaseDatabase/SortOrder";
31
- import { LIMIT_PER_PROJECT } from "../../../../../Types/Database/LimitMax";
32
26
  import BadDataException from "../../../../../Types/Exception/BadDataException";
33
27
  import MicrosoftTeamsActionAuthorization from "./Authorization";
34
28
  import WorkspaceProjectReferenceValidator from "../../WorkspaceProjectReferenceValidator";
@@ -37,6 +31,13 @@ import IncidentStateTimeline from "../../../../../Models/DatabaseModels/Incident
37
31
  import IncidentPublicNote from "../../../../../Models/DatabaseModels/IncidentPublicNote";
38
32
  import IncidentInternalNote from "../../../../../Models/DatabaseModels/IncidentInternalNote";
39
33
  import OnCallDutyPolicyExecutionLog from "../../../../../Models/DatabaseModels/OnCallDutyPolicyExecutionLog";
34
+ import ColumnLength from "../../../../../Types/Database/ColumnLength";
35
+ import { truncateToLength } from "../../../Database/TruncateColumnValue";
36
+ import MicrosoftTeamsCardChoices from "../MicrosoftTeamsCardChoices";
37
+ import { MICROSOFT_TEAMS_CARD_SIZE_BUDGETS_IN_BYTES } from "../MicrosoftTeamsMessageSize";
38
+ import MicrosoftTeamsReplies from "../MicrosoftTeamsReplies";
39
+ // Incident.title is a LongText column.
40
+ const MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH = ColumnLength.LongText;
40
41
  export default class MicrosoftTeamsIncidentActions {
41
42
  static isIncidentAction(data) {
42
43
  // Check if the action is related to incidents
@@ -383,11 +384,12 @@ export default class MicrosoftTeamsIncidentActions {
383
384
  userId: oneUptimeUserId,
384
385
  });
385
386
  }
386
- await turnContext.sendActivity("✅ Note added successfully.");
387
- // Hide the form card by deleting it
388
- if (turnContext.activity.replyToId) {
389
- await turnContext.deleteActivity(turnContext.activity.replyToId);
390
- }
387
+ await MicrosoftTeamsReplies.sendBestEffort(turnContext, "✅ Note added successfully.");
388
+ /*
389
+ * The action is done: a refused reply or a failed delete of the
390
+ * form must not read as a failed action, which invites a repeat.
391
+ */
392
+ await MicrosoftTeamsReplies.deleteBestEffort(turnContext, turnContext.activity.replyToId);
391
393
  return;
392
394
  }
393
395
  await turnContext.sendActivity("Unable to add note: missing note data.");
@@ -440,11 +442,12 @@ export default class MicrosoftTeamsIncidentActions {
440
442
  triggeredByIncidentId: incidentId,
441
443
  userNotificationEventType: UserNotificationEventType.IncidentCreated,
442
444
  });
443
- await turnContext.sendActivity("✅ On-call policy executed successfully.");
444
- // Hide the form card by deleting it
445
- if (turnContext.activity.replyToId) {
446
- await turnContext.deleteActivity(turnContext.activity.replyToId);
447
- }
445
+ await MicrosoftTeamsReplies.sendBestEffort(turnContext, "✅ On-call policy executed successfully.");
446
+ /*
447
+ * The action is done: a refused reply or a failed delete of the
448
+ * form must not read as a failed action, which invites a repeat.
449
+ */
450
+ await MicrosoftTeamsReplies.deleteBestEffort(turnContext, turnContext.activity.replyToId);
448
451
  return;
449
452
  }
450
453
  await turnContext.sendActivity("Unable to execute on-call policy: missing policy id.");
@@ -490,11 +493,12 @@ export default class MicrosoftTeamsIncidentActions {
490
493
  },
491
494
  props: databaseProps,
492
495
  });
493
- await turnContext.sendActivity("✅ Incident state changed successfully.");
494
- // Hide the form card by deleting it
495
- if (turnContext.activity.replyToId) {
496
- await turnContext.deleteActivity(turnContext.activity.replyToId);
497
- }
496
+ await MicrosoftTeamsReplies.sendBestEffort(turnContext, "✅ Incident state changed successfully.");
497
+ /*
498
+ * The action is done: a refused reply or a failed delete of the
499
+ * form must not read as a failed action, which invites a repeat.
500
+ */
501
+ await MicrosoftTeamsReplies.deleteBestEffort(turnContext, turnContext.activity.replyToId);
498
502
  return;
499
503
  }
500
504
  await turnContext.sendActivity("Unable to change incident state: missing state id.");
@@ -502,8 +506,8 @@ export default class MicrosoftTeamsIncidentActions {
502
506
  }
503
507
  if (actionType === MicrosoftTeamsIncidentActionType.SubmitNewIncident) {
504
508
  // Handle new incident submission
505
- const title = value["incidentTitle"] || "";
506
- const description = value["incidentDescription"] || "";
509
+ const title = (value["incidentTitle"] || "").trim();
510
+ const description = (value["incidentDescription"] || "").trim();
507
511
  const severityId = value["incidentSeverity"] || "";
508
512
  const monitorIds = value["incidentMonitors"] || "";
509
513
  const monitorStatusId = value["monitorStatus"] || "";
@@ -513,8 +517,9 @@ export default class MicrosoftTeamsIncidentActions {
513
517
  await turnContext.sendActivity("Unable to create incident: missing required fields (title, description, or severity).");
514
518
  return;
515
519
  }
520
+ let createdIncident;
516
521
  try {
517
- const createdIncident = await this.createIncidentInProject({
522
+ createdIncident = await this.createIncidentInProject({
518
523
  projectId,
519
524
  oneUptimeUserId,
520
525
  title,
@@ -525,35 +530,69 @@ export default class MicrosoftTeamsIncidentActions {
525
530
  labelIds,
526
531
  onCallPolicyIds,
527
532
  });
528
- // Hide the form card by deleting it first
529
- if (turnContext.activity.replyToId) {
530
- await turnContext.deleteActivity(turnContext.activity.replyToId);
531
- }
532
- // Get the incident link
533
- const incidentLink = await IncidentService.getIncidentLinkInDashboard(projectId, createdIncident.id);
534
- // Send confirmation message as a new message in the thread
535
- await turnContext.sendActivity(`✅ Incident created successfully!\n\nView incident: ${incidentLink.toString()}`);
536
- return;
537
533
  }
538
534
  catch (error) {
539
- logger.error("Error creating incident from Microsoft Teams:", {
535
+ MicrosoftTeamsReplies.logFailure("Could not create an incident from Microsoft Teams", error, {
540
536
  projectId: projectId.toString(),
541
537
  });
542
- logger.error(error);
543
- await turnContext.sendActivity("❌ Failed to create incident. Please try again.");
538
+ await MicrosoftTeamsReplies.sendBestEffort(turnContext, await this.getIncidentCreateFailedMessage({
539
+ error: error,
540
+ projectId: projectId,
541
+ }));
544
542
  return;
545
543
  }
544
+ /*
545
+ * The incident exists from here on, so nothing below may report the
546
+ * create as failed: a user told it failed submits again, which creates
547
+ * a second incident and pages its on-call policies a second time. The
548
+ * confirmation goes first; removing the submitted form is a courtesy.
549
+ */
550
+ await MicrosoftTeamsReplies.sendBestEffort(turnContext, await this.getIncidentCreatedMessage({
551
+ projectId: projectId,
552
+ incidentId: createdIncident.id || undefined,
553
+ }));
554
+ await MicrosoftTeamsReplies.deleteBestEffort(turnContext, turnContext.activity.replyToId);
555
+ return;
546
556
  }
547
557
  // Default fallback for unimplemented actions
548
558
  await turnContext.sendActivity("Sorry, but the action " +
549
559
  actionType +
550
560
  " you requested is not implemented yet.");
551
561
  }
562
+ /*
563
+ * Why a submitted incident was not created, for the user: the reason when
564
+ * OneUptime wrote one for them (a reference to another project's monitor,
565
+ * say), otherwise a generic line; the details go to the log.
566
+ */
567
+ static async getIncidentCreateFailedMessage(data) {
568
+ const reason = MicrosoftTeamsReplies.getUserFacingErrorMessage(data.error);
569
+ if (reason) {
570
+ return `❌ Could not create the incident: ${reason}`;
571
+ }
572
+ const createInOneUptimeUrl = await MicrosoftTeamsReplies.getDashboardLink({
573
+ projectId: data.projectId,
574
+ route: "/incidents/create",
575
+ });
576
+ return `❌ Could not create the incident because of an unexpected error. Please try again, or create it in OneUptime${createInOneUptimeUrl ? `: ${createInOneUptimeUrl}` : "."}`;
577
+ }
578
+ // The confirmation, with a link to the incident when one can be built.
579
+ static async getIncidentCreatedMessage(data) {
580
+ if (data.incidentId) {
581
+ try {
582
+ const incidentLink = await IncidentService.getIncidentLinkInDashboard(data.projectId, data.incidentId);
583
+ return `✅ Incident created successfully!\n\nView incident: ${incidentLink.toString()}`;
584
+ }
585
+ catch (error) {
586
+ logger.debug("Could not build the link to a new incident");
587
+ logger.debug(error);
588
+ }
589
+ }
590
+ return "✅ Incident created successfully!";
591
+ }
552
592
  /*
553
593
  * Every id below comes from the submitted card, not from the form we sent,
554
- * and the writes run as root. So they are checked against the linked project
555
- * before anything is created, and the monitor status write is scoped to that
556
- * project as well.
594
+ * and the incident is created as root. So they are checked against the
595
+ * linked project before anything is created.
557
596
  */
558
597
  static async createIncidentInProject(data) {
559
598
  var _a, _b;
@@ -601,6 +640,16 @@ export default class MicrosoftTeamsIncidentActions {
601
640
  return policy;
602
641
  });
603
642
  }
643
+ /*
644
+ * IncidentService moves the incident's monitors to this status, as it does
645
+ * for an incident declared in the dashboard or from Slack: with a status
646
+ * timeline entry and owner notifications, and back again once the
647
+ * incident is resolved. Teams used to write currentMonitorStatusId on the
648
+ * monitors directly, which did none of that.
649
+ */
650
+ if (monitorStatusId) {
651
+ incident.changeMonitorStatusToId = monitorStatusId;
652
+ }
604
653
  // Save the incident
605
654
  const createdIncident = await IncidentService.create({
606
655
  data: incident,
@@ -612,23 +661,6 @@ export default class MicrosoftTeamsIncidentActions {
612
661
  projectId: projectId.toString(),
613
662
  incidentId: (_b = createdIncident.id) === null || _b === void 0 ? void 0 : _b.toString(),
614
663
  });
615
- // Update monitor status if specified
616
- if (monitorStatusId) {
617
- for (const monitorId of monitorIdArray) {
618
- await MonitorService.updateOneBy({
619
- query: {
620
- _id: monitorId.toString(),
621
- projectId: projectId,
622
- },
623
- data: {
624
- currentMonitorStatusId: monitorStatusId,
625
- },
626
- props: {
627
- isRoot: true,
628
- },
629
- });
630
- }
631
- }
632
664
  return createdIncident;
633
665
  }
634
666
  static buildAddIncidentNoteCard(incidentId) {
@@ -870,135 +902,60 @@ export default class MicrosoftTeamsIncidentActions {
870
902
  logger.error(error);
871
903
  }
872
904
  }
873
- static async buildNewIncidentCard(projectId) {
874
- // Fetch severities
875
- const severities = await IncidentSeverityService.findBy({
876
- query: {
877
- projectId: projectId,
878
- },
879
- sort: {
880
- order: SortOrder.Ascending,
881
- },
882
- skip: 0,
883
- limit: LIMIT_PER_PROJECT,
884
- select: {
885
- name: true,
886
- },
887
- props: {
888
- isRoot: true,
889
- },
890
- });
891
- const severityChoices = severities.map((severity) => {
892
- var _a;
893
- return {
894
- title: severity.name || "",
895
- value: ((_a = severity._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
896
- };
897
- });
898
- // Fetch monitors
899
- const monitors = await MonitorService.findBy({
900
- query: {
901
- projectId: projectId,
902
- },
903
- select: {
904
- name: true,
905
- },
906
- props: {
907
- isRoot: true,
908
- },
909
- limit: LIMIT_PER_PROJECT,
910
- skip: 0,
911
- });
912
- const monitorChoices = monitors
913
- .map((monitor) => {
914
- var _a;
915
- return {
916
- title: monitor.name || "",
917
- value: ((_a = monitor._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
918
- };
919
- })
920
- .filter((choice) => {
921
- return choice.title && choice.value;
922
- });
923
- // Fetch monitor statuses
924
- const monitorStatuses = await MonitorStatusService.findBy({
925
- query: {
926
- projectId: projectId,
927
- },
928
- select: {
929
- name: true,
930
- },
931
- props: {
932
- isRoot: true,
933
- },
934
- sort: {
935
- priority: SortOrder.Ascending,
936
- },
937
- limit: LIMIT_PER_PROJECT,
938
- skip: 0,
939
- });
940
- const monitorStatusChoices = monitorStatuses
941
- .map((status) => {
942
- var _a;
943
- return {
944
- title: status.name || "",
945
- value: ((_a = status._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
946
- };
947
- })
948
- .filter((choice) => {
949
- return choice.title && choice.value;
950
- });
951
- // Fetch labels
952
- const labels = await LabelService.findBy({
953
- query: {
954
- projectId: projectId,
955
- },
956
- select: {
957
- name: true,
958
- },
959
- props: {
960
- isRoot: true,
961
- },
962
- limit: LIMIT_PER_PROJECT,
963
- skip: 0,
964
- });
965
- const labelChoices = labels
966
- .map((label) => {
967
- var _a;
968
- return {
969
- title: label.name || "",
970
- value: ((_a = label._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
971
- };
972
- })
973
- .filter((choice) => {
974
- return choice.title && choice.value;
905
+ // Every list the "Create New Incident" card offers, read for one project.
906
+ static async getNewIncidentFormChoices(projectId) {
907
+ const [severities, monitors, monitorStatuses, labels, onCallDutyPolicies] = await Promise.all([
908
+ MicrosoftTeamsCardChoices.getIncidentSeverityChoices(projectId),
909
+ MicrosoftTeamsCardChoices.getMonitorChoices(projectId),
910
+ MicrosoftTeamsCardChoices.getMonitorStatusChoices(projectId),
911
+ MicrosoftTeamsCardChoices.getLabelChoices(projectId),
912
+ MicrosoftTeamsCardChoices.getOnCallDutyPolicyChoices(projectId),
913
+ ]);
914
+ return {
915
+ severities: severities,
916
+ monitors: monitors,
917
+ monitorStatuses: monitorStatuses,
918
+ labels: labels,
919
+ onCallDutyPolicies: onCallDutyPolicies,
920
+ };
921
+ }
922
+ /*
923
+ * The "Create New Incident" card for a project, fitted to the first size
924
+ * budget. The bot itself sends the card through
925
+ * MicrosoftTeamsCreateCommands, which also tries the smaller budgets.
926
+ */
927
+ static async buildNewIncidentCard(projectId, options) {
928
+ return this.buildNewIncidentCardForBudget({
929
+ choices: await this.getNewIncidentFormChoices(projectId),
930
+ budgetInBytes: MICROSOFT_TEAMS_CARD_SIZE_BUDGETS_IN_BYTES[0],
931
+ initialTitle: options === null || options === void 0 ? void 0 : options.initialTitle,
975
932
  });
976
- // Fetch on-call policies
977
- const onCallPolicies = await OnCallDutyPolicyService.findBy({
978
- query: {
979
- projectId: projectId,
980
- },
981
- select: {
982
- name: true,
983
- },
984
- props: {
985
- isRoot: true,
933
+ }
934
+ /*
935
+ * The "Create New Incident" card with its monitor, label and on-call policy
936
+ * lists shortened until it fits the budget (issue #4111: listing all of
937
+ * them made Teams refuse the card). Severities are required, so they are
938
+ * never shortened to fit (they are read up to 50).
939
+ */
940
+ static buildNewIncidentCardForBudget(data) {
941
+ return MicrosoftTeamsCardChoices.fitCardToBudget({
942
+ lists: data.choices,
943
+ trimmableKeys: ["monitors", "labels", "onCallDutyPolicies"],
944
+ budgetInBytes: data.budgetInBytes,
945
+ buildCard: (shown) => {
946
+ return this.buildNewIncidentCardBody({
947
+ shown: shown,
948
+ initialTitle: data.initialTitle,
949
+ createInOneUptimeUrl: data.createInOneUptimeUrl,
950
+ });
986
951
  },
987
- limit: LIMIT_PER_PROJECT,
988
- skip: 0,
989
- });
990
- const onCallPolicyChoices = onCallPolicies
991
- .map((policy) => {
992
- var _a;
993
- return {
994
- title: policy.name || "",
995
- value: ((_a = policy._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
996
- };
997
- })
998
- .filter((choice) => {
999
- return choice.title && choice.value;
1000
- });
1001
- // Build the card
952
+ }).card;
953
+ }
954
+ static buildNewIncidentCardBody(data) {
955
+ const { shown } = data;
956
+ const initialTitle = (data.initialTitle || "").trim();
957
+ let isAnythingLeftOff = false;
958
+ const addLaterHint = "You can add them to the incident in OneUptime after it is created.";
1002
959
  const bodyElements = [
1003
960
  {
1004
961
  type: "TextBlock",
@@ -1006,13 +963,11 @@ export default class MicrosoftTeamsIncidentActions {
1006
963
  size: "Large",
1007
964
  weight: "Bolder",
1008
965
  },
1009
- {
1010
- type: "Input.Text",
1011
- id: "incidentTitle",
1012
- label: "Incident Title",
1013
- placeholder: "Enter incident title",
1014
- isRequired: true,
1015
- },
966
+ Object.assign({ type: "Input.Text", id: "incidentTitle", label: "Incident Title", placeholder: "Enter incident title", isRequired: true, maxLength: MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH }, (initialTitle
967
+ ? {
968
+ value: truncateToLength(initialTitle, MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH),
969
+ }
970
+ : {})),
1016
971
  {
1017
972
  type: "Input.Text",
1018
973
  id: "incidentDescription",
@@ -1022,74 +977,93 @@ export default class MicrosoftTeamsIncidentActions {
1022
977
  isRequired: true,
1023
978
  },
1024
979
  ];
980
+ const addNotShownNote = (list, pluralNoun) => {
981
+ const note = MicrosoftTeamsCardChoices.buildNotShownNoteElement({
982
+ list: list,
983
+ pluralNoun: pluralNoun,
984
+ addLaterHint: addLaterHint,
985
+ });
986
+ if (note) {
987
+ isAnythingLeftOff = true;
988
+ bodyElements.push(note);
989
+ }
990
+ };
1025
991
  // Add severity dropdown if we have severities
1026
- if (severityChoices.length > 0) {
992
+ if (shown.severities.choices.length > 0) {
1027
993
  bodyElements.push({
1028
994
  type: "Input.ChoiceSet",
1029
995
  id: "incidentSeverity",
1030
996
  label: "Incident Severity",
1031
997
  style: "compact",
1032
998
  isRequired: true,
1033
- choices: severityChoices,
999
+ choices: shown.severities.choices,
1034
1000
  });
1035
1001
  }
1036
1002
  // Add monitor multi-select if we have monitors
1037
- if (monitorChoices.length > 0) {
1003
+ if (shown.monitors.choices.length > 0) {
1038
1004
  bodyElements.push({
1039
1005
  type: "Input.ChoiceSet",
1040
1006
  id: "incidentMonitors",
1041
1007
  label: "Affected Monitors (Optional)",
1042
1008
  style: "compact",
1043
1009
  isMultiSelect: true,
1044
- choices: monitorChoices,
1010
+ choices: shown.monitors.choices,
1045
1011
  });
1046
1012
  }
1013
+ addNotShownNote(shown.monitors, "monitors");
1047
1014
  // Add monitor status dropdown if we have statuses and monitors
1048
- if (monitorStatusChoices.length > 0 && monitorChoices.length > 0) {
1015
+ if (shown.monitorStatuses.choices.length > 0 &&
1016
+ shown.monitors.choices.length > 0) {
1049
1017
  bodyElements.push({
1050
1018
  type: "Input.ChoiceSet",
1051
1019
  id: "monitorStatus",
1052
1020
  label: "Change Monitor Status To (Optional)",
1053
1021
  style: "compact",
1054
- choices: monitorStatusChoices,
1022
+ choices: shown.monitorStatuses.choices,
1055
1023
  });
1056
1024
  }
1057
1025
  // Add on-call policy multi-select if we have policies
1058
- if (onCallPolicyChoices.length > 0) {
1026
+ if (shown.onCallDutyPolicies.choices.length > 0) {
1059
1027
  bodyElements.push({
1060
1028
  type: "Input.ChoiceSet",
1061
1029
  id: "onCallDutyPolicies",
1062
1030
  label: "Execute On-Call Policies (Optional)",
1063
1031
  style: "compact",
1064
1032
  isMultiSelect: true,
1065
- choices: onCallPolicyChoices,
1033
+ choices: shown.onCallDutyPolicies.choices,
1066
1034
  });
1067
1035
  }
1036
+ addNotShownNote(shown.onCallDutyPolicies, "on-call policies");
1068
1037
  // Add labels multi-select if we have labels
1069
- if (labelChoices.length > 0) {
1038
+ if (shown.labels.choices.length > 0) {
1070
1039
  bodyElements.push({
1071
1040
  type: "Input.ChoiceSet",
1072
1041
  id: "labels",
1073
1042
  label: "Labels (Optional)",
1074
1043
  style: "compact",
1075
1044
  isMultiSelect: true,
1076
- choices: labelChoices,
1045
+ choices: shown.labels.choices,
1077
1046
  });
1078
1047
  }
1048
+ addNotShownNote(shown.labels, "labels");
1049
+ const actions = [
1050
+ {
1051
+ type: "Action.Submit",
1052
+ title: "Create Incident",
1053
+ data: {
1054
+ action: MicrosoftTeamsIncidentActionType.SubmitNewIncident,
1055
+ },
1056
+ },
1057
+ ];
1058
+ if (isAnythingLeftOff && data.createInOneUptimeUrl) {
1059
+ actions.push(MicrosoftTeamsCardChoices.buildCreateInOneUptimeAction(data.createInOneUptimeUrl));
1060
+ }
1079
1061
  return {
1080
1062
  type: "AdaptiveCard",
1081
1063
  $schema: "http://adaptivecards.io/schemas/adaptive-card.json",
1082
1064
  version: "1.5",
1083
1065
  body: bodyElements,
1084
- actions: [
1085
- {
1086
- type: "Action.Submit",
1087
- title: "Create Incident",
1088
- data: {
1089
- action: MicrosoftTeamsIncidentActionType.SubmitNewIncident,
1090
- },
1091
- },
1092
- ],
1066
+ actions: actions,
1093
1067
  };
1094
1068
  }
1095
1069
  }