@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
@@ -19,16 +19,8 @@ import IncidentStateService from "../../../../Services/IncidentStateService";
19
19
  import UserNotificationEventType from "../../../../../Types/UserNotification/UserNotificationEventType";
20
20
  import OnCallDutyPolicy from "../../../../../Models/DatabaseModels/OnCallDutyPolicy";
21
21
  import IncidentState from "../../../../../Models/DatabaseModels/IncidentState";
22
- import IncidentSeverityService from "../../../../Services/IncidentSeverityService";
23
- import IncidentSeverity from "../../../../../Models/DatabaseModels/IncidentSeverity";
24
- import MonitorService from "../../../../Services/MonitorService";
25
22
  import Monitor from "../../../../../Models/DatabaseModels/Monitor";
26
- import MonitorStatusService from "../../../../Services/MonitorStatusService";
27
- import MonitorStatus from "../../../../../Models/DatabaseModels/MonitorStatus";
28
- import LabelService from "../../../../Services/LabelService";
29
23
  import Label from "../../../../../Models/DatabaseModels/Label";
30
- import SortOrder from "../../../../../Types/BaseDatabase/SortOrder";
31
- import { LIMIT_PER_PROJECT } from "../../../../../Types/Database/LimitMax";
32
24
  import BadDataException from "../../../../../Types/Exception/BadDataException";
33
25
  import URL from "../../../../../Types/API/URL";
34
26
  import DatabaseCommonInteractionProps from "../../../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
@@ -39,6 +31,25 @@ import IncidentStateTimeline from "../../../../../Models/DatabaseModels/Incident
39
31
  import IncidentPublicNote from "../../../../../Models/DatabaseModels/IncidentPublicNote";
40
32
  import IncidentInternalNote from "../../../../../Models/DatabaseModels/IncidentInternalNote";
41
33
  import OnCallDutyPolicyExecutionLog from "../../../../../Models/DatabaseModels/OnCallDutyPolicyExecutionLog";
34
+ import ColumnLength from "../../../../../Types/Database/ColumnLength";
35
+ import { truncateToLength } from "../../../Database/TruncateColumnValue";
36
+ import MicrosoftTeamsCardChoices, {
37
+ MicrosoftTeamsCardChoiceList,
38
+ } from "../MicrosoftTeamsCardChoices";
39
+ import { MICROSOFT_TEAMS_CARD_SIZE_BUDGETS_IN_BYTES } from "../MicrosoftTeamsMessageSize";
40
+ import MicrosoftTeamsReplies from "../MicrosoftTeamsReplies";
41
+
42
+ // Incident.title is a LongText column.
43
+ const MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH: number = ColumnLength.LongText;
44
+
45
+ // The lists the "Create New Incident" card offers.
46
+ export interface MicrosoftTeamsNewIncidentFormChoices {
47
+ severities: MicrosoftTeamsCardChoiceList;
48
+ monitors: MicrosoftTeamsCardChoiceList;
49
+ monitorStatuses: MicrosoftTeamsCardChoiceList;
50
+ labels: MicrosoftTeamsCardChoiceList;
51
+ onCallDutyPolicies: MicrosoftTeamsCardChoiceList;
52
+ }
42
53
 
43
54
  export default class MicrosoftTeamsIncidentActions {
44
55
  @CaptureSpan()
@@ -488,12 +499,19 @@ export default class MicrosoftTeamsIncidentActions {
488
499
  });
489
500
  }
490
501
 
491
- await turnContext.sendActivity("✅ Note added successfully.");
502
+ await MicrosoftTeamsReplies.sendBestEffort(
503
+ turnContext,
504
+ "✅ Note added successfully.",
505
+ );
492
506
 
493
- // Hide the form card by deleting it
494
- if (turnContext.activity.replyToId) {
495
- await turnContext.deleteActivity(turnContext.activity.replyToId);
496
- }
507
+ /*
508
+ * The action is done: a refused reply or a failed delete of the
509
+ * form must not read as a failed action, which invites a repeat.
510
+ */
511
+ await MicrosoftTeamsReplies.deleteBestEffort(
512
+ turnContext,
513
+ turnContext.activity.replyToId,
514
+ );
497
515
 
498
516
  return;
499
517
  }
@@ -568,14 +586,19 @@ export default class MicrosoftTeamsIncidentActions {
568
586
  userNotificationEventType: UserNotificationEventType.IncidentCreated,
569
587
  });
570
588
 
571
- await turnContext.sendActivity(
589
+ await MicrosoftTeamsReplies.sendBestEffort(
590
+ turnContext,
572
591
  "✅ On-call policy executed successfully.",
573
592
  );
574
593
 
575
- // Hide the form card by deleting it
576
- if (turnContext.activity.replyToId) {
577
- await turnContext.deleteActivity(turnContext.activity.replyToId);
578
- }
594
+ /*
595
+ * The action is done: a refused reply or a failed delete of the
596
+ * form must not read as a failed action, which invites a repeat.
597
+ */
598
+ await MicrosoftTeamsReplies.deleteBestEffort(
599
+ turnContext,
600
+ turnContext.activity.replyToId,
601
+ );
579
602
 
580
603
  return;
581
604
  }
@@ -643,14 +666,19 @@ export default class MicrosoftTeamsIncidentActions {
643
666
  props: databaseProps,
644
667
  });
645
668
 
646
- await turnContext.sendActivity(
669
+ await MicrosoftTeamsReplies.sendBestEffort(
670
+ turnContext,
647
671
  "✅ Incident state changed successfully.",
648
672
  );
649
673
 
650
- // Hide the form card by deleting it
651
- if (turnContext.activity.replyToId) {
652
- await turnContext.deleteActivity(turnContext.activity.replyToId);
653
- }
674
+ /*
675
+ * The action is done: a refused reply or a failed delete of the
676
+ * form must not read as a failed action, which invites a repeat.
677
+ */
678
+ await MicrosoftTeamsReplies.deleteBestEffort(
679
+ turnContext,
680
+ turnContext.activity.replyToId,
681
+ );
654
682
 
655
683
  return;
656
684
  }
@@ -662,9 +690,10 @@ export default class MicrosoftTeamsIncidentActions {
662
690
 
663
691
  if (actionType === MicrosoftTeamsIncidentActionType.SubmitNewIncident) {
664
692
  // Handle new incident submission
665
- const title: string = (value["incidentTitle"] as string) || "";
666
- const description: string =
667
- (value["incidentDescription"] as string) || "";
693
+ const title: string = ((value["incidentTitle"] as string) || "").trim();
694
+ const description: string = (
695
+ (value["incidentDescription"] as string) || ""
696
+ ).trim();
668
697
  const severityId: string = (value["incidentSeverity"] as string) || "";
669
698
  const monitorIds: string = (value["incidentMonitors"] as string) || "";
670
699
  const monitorStatusId: string = (value["monitorStatus"] as string) || "";
@@ -679,8 +708,10 @@ export default class MicrosoftTeamsIncidentActions {
679
708
  return;
680
709
  }
681
710
 
711
+ let createdIncident: Incident;
712
+
682
713
  try {
683
- const createdIncident: Incident = await this.createIncidentInProject({
714
+ createdIncident = await this.createIncidentInProject({
684
715
  projectId,
685
716
  oneUptimeUserId,
686
717
  title,
@@ -691,35 +722,42 @@ export default class MicrosoftTeamsIncidentActions {
691
722
  labelIds,
692
723
  onCallPolicyIds,
693
724
  });
694
-
695
- // Hide the form card by deleting it first
696
- if (turnContext.activity.replyToId) {
697
- await turnContext.deleteActivity(turnContext.activity.replyToId);
698
- }
699
-
700
- // Get the incident link
701
- const incidentLink: URL =
702
- await IncidentService.getIncidentLinkInDashboard(
703
- projectId,
704
- createdIncident.id!,
705
- );
706
-
707
- // Send confirmation message as a new message in the thread
708
- await turnContext.sendActivity(
709
- `✅ Incident created successfully!\n\nView incident: ${incidentLink.toString()}`,
710
- );
711
-
712
- return;
713
725
  } catch (error) {
714
- logger.error("Error creating incident from Microsoft Teams:", {
715
- projectId: projectId.toString(),
716
- });
717
- logger.error(error);
718
- await turnContext.sendActivity(
719
- "❌ Failed to create incident. Please try again.",
726
+ MicrosoftTeamsReplies.logFailure(
727
+ "Could not create an incident from Microsoft Teams",
728
+ error,
729
+ {
730
+ projectId: projectId.toString(),
731
+ },
732
+ );
733
+ await MicrosoftTeamsReplies.sendBestEffort(
734
+ turnContext,
735
+ await this.getIncidentCreateFailedMessage({
736
+ error: error,
737
+ projectId: projectId,
738
+ }),
720
739
  );
721
740
  return;
722
741
  }
742
+
743
+ /*
744
+ * The incident exists from here on, so nothing below may report the
745
+ * create as failed: a user told it failed submits again, which creates
746
+ * a second incident and pages its on-call policies a second time. The
747
+ * confirmation goes first; removing the submitted form is a courtesy.
748
+ */
749
+ await MicrosoftTeamsReplies.sendBestEffort(
750
+ turnContext,
751
+ await this.getIncidentCreatedMessage({
752
+ projectId: projectId,
753
+ incidentId: createdIncident.id || undefined,
754
+ }),
755
+ );
756
+ await MicrosoftTeamsReplies.deleteBestEffort(
757
+ turnContext,
758
+ turnContext.activity.replyToId,
759
+ );
760
+ return;
723
761
  }
724
762
 
725
763
  // Default fallback for unimplemented actions
@@ -730,11 +768,60 @@ export default class MicrosoftTeamsIncidentActions {
730
768
  );
731
769
  }
732
770
 
771
+ /*
772
+ * Why a submitted incident was not created, for the user: the reason when
773
+ * OneUptime wrote one for them (a reference to another project's monitor,
774
+ * say), otherwise a generic line; the details go to the log.
775
+ */
776
+ private static async getIncidentCreateFailedMessage(data: {
777
+ error: unknown;
778
+ projectId: ObjectID;
779
+ }): Promise<string> {
780
+ const reason: string | null =
781
+ MicrosoftTeamsReplies.getUserFacingErrorMessage(data.error);
782
+
783
+ if (reason) {
784
+ return `❌ Could not create the incident: ${reason}`;
785
+ }
786
+
787
+ const createInOneUptimeUrl: string | null =
788
+ await MicrosoftTeamsReplies.getDashboardLink({
789
+ projectId: data.projectId,
790
+ route: "/incidents/create",
791
+ });
792
+
793
+ return `❌ Could not create the incident because of an unexpected error. Please try again, or create it in OneUptime${
794
+ createInOneUptimeUrl ? `: ${createInOneUptimeUrl}` : "."
795
+ }`;
796
+ }
797
+
798
+ // The confirmation, with a link to the incident when one can be built.
799
+ private static async getIncidentCreatedMessage(data: {
800
+ projectId: ObjectID;
801
+ incidentId?: ObjectID | undefined;
802
+ }): Promise<string> {
803
+ if (data.incidentId) {
804
+ try {
805
+ const incidentLink: URL =
806
+ await IncidentService.getIncidentLinkInDashboard(
807
+ data.projectId,
808
+ data.incidentId,
809
+ );
810
+
811
+ return `✅ Incident created successfully!\n\nView incident: ${incidentLink.toString()}`;
812
+ } catch (error) {
813
+ logger.debug("Could not build the link to a new incident");
814
+ logger.debug(error);
815
+ }
816
+ }
817
+
818
+ return "✅ Incident created successfully!";
819
+ }
820
+
733
821
  /*
734
822
  * Every id below comes from the submitted card, not from the form we sent,
735
- * and the writes run as root. So they are checked against the linked project
736
- * before anything is created, and the monitor status write is scoped to that
737
- * project as well.
823
+ * and the incident is created as root. So they are checked against the
824
+ * linked project before anything is created.
738
825
  */
739
826
  private static async createIncidentInProject(data: {
740
827
  projectId: ObjectID;
@@ -806,6 +893,17 @@ export default class MicrosoftTeamsIncidentActions {
806
893
  });
807
894
  }
808
895
 
896
+ /*
897
+ * IncidentService moves the incident's monitors to this status, as it does
898
+ * for an incident declared in the dashboard or from Slack: with a status
899
+ * timeline entry and owner notifications, and back again once the
900
+ * incident is resolved. Teams used to write currentMonitorStatusId on the
901
+ * monitors directly, which did none of that.
902
+ */
903
+ if (monitorStatusId) {
904
+ incident.changeMonitorStatusToId = monitorStatusId;
905
+ }
906
+
809
907
  // Save the incident
810
908
  const createdIncident: Incident = await IncidentService.create({
811
909
  data: incident,
@@ -822,24 +920,6 @@ export default class MicrosoftTeamsIncidentActions {
822
920
  },
823
921
  );
824
922
 
825
- // Update monitor status if specified
826
- if (monitorStatusId) {
827
- for (const monitorId of monitorIdArray) {
828
- await MonitorService.updateOneBy({
829
- query: {
830
- _id: monitorId.toString(),
831
- projectId: projectId,
832
- },
833
- data: {
834
- currentMonitorStatusId: monitorStatusId,
835
- },
836
- props: {
837
- isRoot: true,
838
- },
839
- });
840
- }
841
- }
842
-
843
923
  return createdIncident;
844
924
  }
845
925
 
@@ -1136,148 +1216,94 @@ export default class MicrosoftTeamsIncidentActions {
1136
1216
  }
1137
1217
  }
1138
1218
 
1139
- public static async buildNewIncidentCard(
1219
+ // Every list the "Create New Incident" card offers, read for one project.
1220
+ public static async getNewIncidentFormChoices(
1140
1221
  projectId: ObjectID,
1141
- ): Promise<JSONObject> {
1142
- // Fetch severities
1143
- const severities: Array<IncidentSeverity> =
1144
- await IncidentSeverityService.findBy({
1145
- query: {
1146
- projectId: projectId,
1147
- },
1148
- sort: {
1149
- order: SortOrder.Ascending,
1150
- },
1151
- skip: 0,
1152
- limit: LIMIT_PER_PROJECT,
1153
- select: {
1154
- name: true,
1155
- },
1156
- props: {
1157
- isRoot: true,
1158
- },
1159
- });
1222
+ ): Promise<MicrosoftTeamsNewIncidentFormChoices> {
1223
+ const [severities, monitors, monitorStatuses, labels, onCallDutyPolicies]: [
1224
+ MicrosoftTeamsCardChoiceList,
1225
+ MicrosoftTeamsCardChoiceList,
1226
+ MicrosoftTeamsCardChoiceList,
1227
+ MicrosoftTeamsCardChoiceList,
1228
+ MicrosoftTeamsCardChoiceList,
1229
+ ] = await Promise.all([
1230
+ MicrosoftTeamsCardChoices.getIncidentSeverityChoices(projectId),
1231
+ MicrosoftTeamsCardChoices.getMonitorChoices(projectId),
1232
+ MicrosoftTeamsCardChoices.getMonitorStatusChoices(projectId),
1233
+ MicrosoftTeamsCardChoices.getLabelChoices(projectId),
1234
+ MicrosoftTeamsCardChoices.getOnCallDutyPolicyChoices(projectId),
1235
+ ]);
1160
1236
 
1161
- const severityChoices: Array<{ title: string; value: string }> =
1162
- severities.map((severity: IncidentSeverity) => {
1163
- return {
1164
- title: severity.name || "",
1165
- value: severity._id?.toString() || "",
1166
- };
1167
- });
1237
+ return {
1238
+ severities: severities,
1239
+ monitors: monitors,
1240
+ monitorStatuses: monitorStatuses,
1241
+ labels: labels,
1242
+ onCallDutyPolicies: onCallDutyPolicies,
1243
+ };
1244
+ }
1168
1245
 
1169
- // Fetch monitors
1170
- const monitors: Array<Monitor> = await MonitorService.findBy({
1171
- query: {
1172
- projectId: projectId,
1173
- },
1174
- select: {
1175
- name: true,
1176
- },
1177
- props: {
1178
- isRoot: true,
1179
- },
1180
- limit: LIMIT_PER_PROJECT,
1181
- skip: 0,
1246
+ /*
1247
+ * The "Create New Incident" card for a project, fitted to the first size
1248
+ * budget. The bot itself sends the card through
1249
+ * MicrosoftTeamsCreateCommands, which also tries the smaller budgets.
1250
+ */
1251
+ public static async buildNewIncidentCard(
1252
+ projectId: ObjectID,
1253
+ options?: { initialTitle?: string | undefined } | undefined,
1254
+ ): Promise<JSONObject> {
1255
+ return this.buildNewIncidentCardForBudget({
1256
+ choices: await this.getNewIncidentFormChoices(projectId),
1257
+ budgetInBytes: MICROSOFT_TEAMS_CARD_SIZE_BUDGETS_IN_BYTES[0]!,
1258
+ initialTitle: options?.initialTitle,
1182
1259
  });
1260
+ }
1183
1261
 
1184
- const monitorChoices: Array<{ title: string; value: string }> = monitors
1185
- .map((monitor: Monitor) => {
1186
- return {
1187
- title: monitor.name || "",
1188
- value: monitor._id?.toString() || "",
1189
- };
1190
- })
1191
- .filter((choice: { title: string; value: string }) => {
1192
- return choice.title && choice.value;
1193
- });
1194
-
1195
- // Fetch monitor statuses
1196
- const monitorStatuses: Array<MonitorStatus> =
1197
- await MonitorStatusService.findBy({
1198
- query: {
1199
- projectId: projectId,
1200
- },
1201
- select: {
1202
- name: true,
1203
- },
1204
- props: {
1205
- isRoot: true,
1206
- },
1207
- sort: {
1208
- priority: SortOrder.Ascending,
1209
- },
1210
- limit: LIMIT_PER_PROJECT,
1211
- skip: 0,
1212
- });
1213
-
1214
- const monitorStatusChoices: Array<{ title: string; value: string }> =
1215
- monitorStatuses
1216
- .map((status: MonitorStatus) => {
1217
- return {
1218
- title: status.name || "",
1219
- value: status._id?.toString() || "",
1220
- };
1221
- })
1222
- .filter((choice: { title: string; value: string }) => {
1223
- return choice.title && choice.value;
1262
+ /*
1263
+ * The "Create New Incident" card with its monitor, label and on-call policy
1264
+ * lists shortened until it fits the budget (issue #4111: listing all of
1265
+ * them made Teams refuse the card). Severities are required, so they are
1266
+ * never shortened to fit (they are read up to 50).
1267
+ */
1268
+ public static buildNewIncidentCardForBudget(data: {
1269
+ choices: MicrosoftTeamsNewIncidentFormChoices;
1270
+ budgetInBytes: number;
1271
+ initialTitle?: string | undefined;
1272
+ createInOneUptimeUrl?: string | null | undefined;
1273
+ }): JSONObject {
1274
+ return MicrosoftTeamsCardChoices.fitCardToBudget<
1275
+ keyof MicrosoftTeamsNewIncidentFormChoices
1276
+ >({
1277
+ lists: data.choices,
1278
+ trimmableKeys: ["monitors", "labels", "onCallDutyPolicies"],
1279
+ budgetInBytes: data.budgetInBytes,
1280
+ buildCard: (
1281
+ shown: Record<
1282
+ keyof MicrosoftTeamsNewIncidentFormChoices,
1283
+ MicrosoftTeamsCardChoiceList
1284
+ >,
1285
+ ): JSONObject => {
1286
+ return this.buildNewIncidentCardBody({
1287
+ shown: shown,
1288
+ initialTitle: data.initialTitle,
1289
+ createInOneUptimeUrl: data.createInOneUptimeUrl,
1224
1290
  });
1225
-
1226
- // Fetch labels
1227
- const labels: Array<Label> = await LabelService.findBy({
1228
- query: {
1229
- projectId: projectId,
1230
1291
  },
1231
- select: {
1232
- name: true,
1233
- },
1234
- props: {
1235
- isRoot: true,
1236
- },
1237
- limit: LIMIT_PER_PROJECT,
1238
- skip: 0,
1239
- });
1240
-
1241
- const labelChoices: Array<{ title: string; value: string }> = labels
1242
- .map((label: Label) => {
1243
- return {
1244
- title: label.name || "",
1245
- value: label._id?.toString() || "",
1246
- };
1247
- })
1248
- .filter((choice: { title: string; value: string }) => {
1249
- return choice.title && choice.value;
1250
- });
1292
+ }).card;
1293
+ }
1251
1294
 
1252
- // Fetch on-call policies
1253
- const onCallPolicies: Array<OnCallDutyPolicy> =
1254
- await OnCallDutyPolicyService.findBy({
1255
- query: {
1256
- projectId: projectId,
1257
- },
1258
- select: {
1259
- name: true,
1260
- },
1261
- props: {
1262
- isRoot: true,
1263
- },
1264
- limit: LIMIT_PER_PROJECT,
1265
- skip: 0,
1266
- });
1295
+ private static buildNewIncidentCardBody(data: {
1296
+ shown: MicrosoftTeamsNewIncidentFormChoices;
1297
+ initialTitle?: string | undefined;
1298
+ createInOneUptimeUrl?: string | null | undefined;
1299
+ }): JSONObject {
1300
+ const { shown } = data;
1301
+ const initialTitle: string = (data.initialTitle || "").trim();
1302
+ let isAnythingLeftOff: boolean = false;
1267
1303
 
1268
- const onCallPolicyChoices: Array<{ title: string; value: string }> =
1269
- onCallPolicies
1270
- .map((policy: OnCallDutyPolicy) => {
1271
- return {
1272
- title: policy.name || "",
1273
- value: policy._id?.toString() || "",
1274
- };
1275
- })
1276
- .filter((choice: { title: string; value: string }) => {
1277
- return choice.title && choice.value;
1278
- });
1304
+ const addLaterHint: string =
1305
+ "You can add them to the incident in OneUptime after it is created.";
1279
1306
 
1280
- // Build the card
1281
1307
  const bodyElements: Array<JSONObject> = [
1282
1308
  {
1283
1309
  type: "TextBlock",
@@ -1291,6 +1317,15 @@ export default class MicrosoftTeamsIncidentActions {
1291
1317
  label: "Incident Title",
1292
1318
  placeholder: "Enter incident title",
1293
1319
  isRequired: true,
1320
+ maxLength: MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH,
1321
+ ...(initialTitle
1322
+ ? {
1323
+ value: truncateToLength(
1324
+ initialTitle,
1325
+ MICROSOFT_TEAMS_INCIDENT_TITLE_MAX_LENGTH,
1326
+ ),
1327
+ }
1328
+ : {}),
1294
1329
  },
1295
1330
  {
1296
1331
  type: "Input.Text",
@@ -1302,79 +1337,118 @@ export default class MicrosoftTeamsIncidentActions {
1302
1337
  },
1303
1338
  ];
1304
1339
 
1340
+ const addNotShownNote: (
1341
+ list: MicrosoftTeamsCardChoiceList,
1342
+ pluralNoun: string,
1343
+ ) => void = (
1344
+ list: MicrosoftTeamsCardChoiceList,
1345
+ pluralNoun: string,
1346
+ ): void => {
1347
+ const note: JSONObject | null =
1348
+ MicrosoftTeamsCardChoices.buildNotShownNoteElement({
1349
+ list: list,
1350
+ pluralNoun: pluralNoun,
1351
+ addLaterHint: addLaterHint,
1352
+ });
1353
+
1354
+ if (note) {
1355
+ isAnythingLeftOff = true;
1356
+ bodyElements.push(note);
1357
+ }
1358
+ };
1359
+
1305
1360
  // Add severity dropdown if we have severities
1306
- if (severityChoices.length > 0) {
1361
+ if (shown.severities.choices.length > 0) {
1307
1362
  bodyElements.push({
1308
1363
  type: "Input.ChoiceSet",
1309
1364
  id: "incidentSeverity",
1310
1365
  label: "Incident Severity",
1311
1366
  style: "compact",
1312
1367
  isRequired: true,
1313
- choices: severityChoices,
1368
+ choices: shown.severities.choices,
1314
1369
  });
1315
1370
  }
1316
1371
 
1317
1372
  // Add monitor multi-select if we have monitors
1318
- if (monitorChoices.length > 0) {
1373
+ if (shown.monitors.choices.length > 0) {
1319
1374
  bodyElements.push({
1320
1375
  type: "Input.ChoiceSet",
1321
1376
  id: "incidentMonitors",
1322
1377
  label: "Affected Monitors (Optional)",
1323
1378
  style: "compact",
1324
1379
  isMultiSelect: true,
1325
- choices: monitorChoices,
1380
+ choices: shown.monitors.choices,
1326
1381
  });
1327
1382
  }
1328
1383
 
1384
+ addNotShownNote(shown.monitors, "monitors");
1385
+
1329
1386
  // Add monitor status dropdown if we have statuses and monitors
1330
- if (monitorStatusChoices.length > 0 && monitorChoices.length > 0) {
1387
+ if (
1388
+ shown.monitorStatuses.choices.length > 0 &&
1389
+ shown.monitors.choices.length > 0
1390
+ ) {
1331
1391
  bodyElements.push({
1332
1392
  type: "Input.ChoiceSet",
1333
1393
  id: "monitorStatus",
1334
1394
  label: "Change Monitor Status To (Optional)",
1335
1395
  style: "compact",
1336
- choices: monitorStatusChoices,
1396
+ choices: shown.monitorStatuses.choices,
1337
1397
  });
1338
1398
  }
1339
1399
 
1340
1400
  // Add on-call policy multi-select if we have policies
1341
- if (onCallPolicyChoices.length > 0) {
1401
+ if (shown.onCallDutyPolicies.choices.length > 0) {
1342
1402
  bodyElements.push({
1343
1403
  type: "Input.ChoiceSet",
1344
1404
  id: "onCallDutyPolicies",
1345
1405
  label: "Execute On-Call Policies (Optional)",
1346
1406
  style: "compact",
1347
1407
  isMultiSelect: true,
1348
- choices: onCallPolicyChoices,
1408
+ choices: shown.onCallDutyPolicies.choices,
1349
1409
  });
1350
1410
  }
1351
1411
 
1412
+ addNotShownNote(shown.onCallDutyPolicies, "on-call policies");
1413
+
1352
1414
  // Add labels multi-select if we have labels
1353
- if (labelChoices.length > 0) {
1415
+ if (shown.labels.choices.length > 0) {
1354
1416
  bodyElements.push({
1355
1417
  type: "Input.ChoiceSet",
1356
1418
  id: "labels",
1357
1419
  label: "Labels (Optional)",
1358
1420
  style: "compact",
1359
1421
  isMultiSelect: true,
1360
- choices: labelChoices,
1422
+ choices: shown.labels.choices,
1361
1423
  });
1362
1424
  }
1363
1425
 
1426
+ addNotShownNote(shown.labels, "labels");
1427
+
1428
+ const actions: Array<JSONObject> = [
1429
+ {
1430
+ type: "Action.Submit",
1431
+ title: "Create Incident",
1432
+ data: {
1433
+ action: MicrosoftTeamsIncidentActionType.SubmitNewIncident,
1434
+ },
1435
+ },
1436
+ ];
1437
+
1438
+ if (isAnythingLeftOff && data.createInOneUptimeUrl) {
1439
+ actions.push(
1440
+ MicrosoftTeamsCardChoices.buildCreateInOneUptimeAction(
1441
+ data.createInOneUptimeUrl,
1442
+ ),
1443
+ );
1444
+ }
1445
+
1364
1446
  return {
1365
1447
  type: "AdaptiveCard",
1366
1448
  $schema: "http://adaptivecards.io/schemas/adaptive-card.json",
1367
1449
  version: "1.5",
1368
1450
  body: bodyElements,
1369
- actions: [
1370
- {
1371
- type: "Action.Submit",
1372
- title: "Create Incident",
1373
- data: {
1374
- action: MicrosoftTeamsIncidentActionType.SubmitNewIncident,
1375
- },
1376
- },
1377
- ],
1451
+ actions: actions,
1378
1452
  };
1379
1453
  }
1380
1454
  }