@oneuptime/common 10.4.17 → 10.5.1

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 (318) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +24 -0
  2. package/Models/AnalyticsModels/Log.ts +16 -0
  3. package/Models/AnalyticsModels/Metric.ts +31 -0
  4. package/Models/AnalyticsModels/MonitorLog.ts +5 -0
  5. package/Models/AnalyticsModels/Profile.ts +25 -0
  6. package/Models/AnalyticsModels/ProfileSample.ts +20 -0
  7. package/Models/AnalyticsModels/Span.ts +23 -0
  8. package/Models/DatabaseModels/AlertEpisodeMember.ts +2 -0
  9. package/Models/DatabaseModels/AlertGroupingRule.ts +0 -38
  10. package/Models/DatabaseModels/AlertLabelRule.ts +152 -0
  11. package/Models/DatabaseModels/AlertOwnerRule.ts +114 -0
  12. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +7 -0
  13. package/Models/DatabaseModels/IncidentEpisodeMember.ts +2 -0
  14. package/Models/DatabaseModels/IncidentGroupingRule.ts +0 -38
  15. package/Models/DatabaseModels/IncidentLabelRule.ts +114 -0
  16. package/Models/DatabaseModels/IncidentMember.ts +2 -0
  17. package/Models/DatabaseModels/IncidentOwnerRule.ts +114 -0
  18. package/Models/DatabaseModels/IncidentSla.ts +2 -0
  19. package/Models/DatabaseModels/IncidentTemplate.ts +224 -0
  20. package/Models/DatabaseModels/Index.ts +2 -2
  21. package/Models/DatabaseModels/MetricPipelineRule.ts +2 -0
  22. package/Models/DatabaseModels/MonitorProbe.ts +2 -0
  23. package/Models/DatabaseModels/MonitorTest.ts +2 -0
  24. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.ts +2 -0
  25. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -0
  26. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -0
  27. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -0
  28. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +2 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +2 -0
  30. package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -0
  31. package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -0
  32. package/Models/DatabaseModels/ProjectOidc.ts +4 -0
  33. package/Models/DatabaseModels/ProjectSCIM.ts +4 -0
  34. package/Models/DatabaseModels/ProjectSso.ts +4 -0
  35. package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
  36. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +152 -0
  37. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +152 -0
  38. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +224 -0
  39. package/Models/DatabaseModels/StatusPageOidc.ts +6 -0
  40. package/Models/DatabaseModels/StatusPageSCIM.ts +4 -0
  41. package/Models/DatabaseModels/StatusPageSCIMLog.ts +2 -0
  42. package/Models/DatabaseModels/StatusPageSso.ts +6 -0
  43. package/Models/DatabaseModels/Team.ts +41 -0
  44. package/Models/DatabaseModels/TeamComplianceSetting.ts +4 -0
  45. package/Models/DatabaseModels/{ServiceMonitor.ts → TeamCustomField.ts} +95 -200
  46. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  47. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  48. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  49. package/Models/DatabaseModels/WorkflowLog.ts +2 -0
  50. package/Models/DatabaseModels/WorkflowVariable.ts +2 -0
  51. package/Server/EnvironmentConfig.ts +3 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.ts +1 -1
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.ts +160 -0
  54. package/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.ts +197 -0
  55. package/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.ts +36 -0
  56. package/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.ts +128 -0
  57. package/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.ts +53 -0
  58. package/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.ts +73 -0
  59. package/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.ts +62 -0
  60. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  61. package/Server/Middleware/TelemetryIngestionDisabled.ts +32 -0
  62. package/Server/Services/AlertGroupingEngineService.ts +0 -29
  63. package/Server/Services/AlertLabelRuleEngineService.ts +129 -0
  64. package/Server/Services/AlertOwnerRuleEngineService.ts +205 -1
  65. package/Server/Services/IncidentGroupingEngineService.ts +0 -37
  66. package/Server/Services/IncidentLabelRuleEngineService.ts +83 -0
  67. package/Server/Services/IncidentOwnerRuleEngineService.ts +208 -10
  68. package/Server/Services/IncidentService.ts +139 -1
  69. package/Server/Services/Index.ts +0 -2
  70. package/Server/Services/MonitorProbeService.ts +56 -0
  71. package/Server/Services/MonitorService.ts +55 -0
  72. package/Server/Services/ProjectService.ts +17 -8
  73. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +129 -0
  74. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +289 -7
  75. package/Server/Services/StatusPageService.ts +30 -0
  76. package/Server/Services/TeamCustomFieldService.ts +9 -0
  77. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +226 -28
  78. package/Server/Types/Database/Permissions/EditionPermission.ts +46 -0
  79. package/Server/Types/Database/Permissions/TablePermission.ts +8 -1
  80. package/Server/Utils/Monitor/MonitorAlert.ts +35 -0
  81. package/Server/Utils/Monitor/MonitorIncident.ts +244 -34
  82. package/Tests/Server/Middleware/UserAuthorization.test.ts +11 -19
  83. package/Tests/Types/Permission.test.ts +129 -1
  84. package/Types/Accounts/AccountsLanguage.ts +10 -1
  85. package/Types/AdminDashboard/AdminDashboardLanguage.ts +10 -1
  86. package/Types/BaseDatabase/TableEditionAccessControl.ts +3 -0
  87. package/Types/Dashboard/DashboardLanguage.ts +10 -1
  88. package/Types/Database/AccessControl/TableEditionAccessControl.ts +8 -0
  89. package/Types/Date.ts +1 -1
  90. package/Types/Docs/DocsLanguage.ts +10 -1
  91. package/Types/Permission.ts +87 -54
  92. package/Types/StatusPage/StatusPageLanguage.ts +10 -1
  93. package/UI/Components/Charts/Area/AreaChart.tsx +1 -1
  94. package/UI/Components/Charts/Bar/BarChart.tsx +1 -1
  95. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +5 -1
  96. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +1 -1
  97. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
  98. package/UI/Components/Charts/Line/LineChart.tsx +1 -1
  99. package/UI/Components/Charts/Utils/XAxis.ts +21 -48
  100. package/UI/Components/EntityDropdown/EntityDropdown.tsx +1808 -0
  101. package/UI/Components/Forms/Fields/FormField.tsx +69 -29
  102. package/UI/Components/Link/Link.tsx +13 -1
  103. package/UI/Components/ModelDetail/ModelDetail.tsx +20 -19
  104. package/UI/Components/ModelTable/BaseModelTable.tsx +5 -0
  105. package/UI/Utils/User.ts +16 -0
  106. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +39 -2
  107. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  108. package/build/dist/Models/AnalyticsModels/Log.js +16 -0
  109. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  110. package/build/dist/Models/AnalyticsModels/Metric.js +31 -0
  111. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  112. package/build/dist/Models/AnalyticsModels/MonitorLog.js +5 -0
  113. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  114. package/build/dist/Models/AnalyticsModels/Profile.js +40 -2
  115. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  116. package/build/dist/Models/AnalyticsModels/ProfileSample.js +35 -2
  117. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  118. package/build/dist/Models/AnalyticsModels/Span.js +23 -0
  119. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +2 -0
  121. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  122. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +0 -39
  123. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  124. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +156 -0
  125. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +117 -0
  127. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  129. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +2 -0
  130. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  131. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +0 -39
  132. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +117 -0
  134. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  135. package/build/dist/Models/DatabaseModels/IncidentMember.js +2 -0
  136. package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
  137. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +117 -0
  138. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  139. package/build/dist/Models/DatabaseModels/IncidentSla.js +2 -0
  140. package/build/dist/Models/DatabaseModels/IncidentSla.js.map +1 -1
  141. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +216 -0
  142. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  143. package/build/dist/Models/DatabaseModels/Index.js +2 -2
  144. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  145. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +2 -0
  146. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/MonitorProbe.js +2 -0
  148. package/build/dist/Models/DatabaseModels/MonitorProbe.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/MonitorTest.js +2 -0
  150. package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js +2 -0
  152. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js.map +1 -1
  153. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -0
  154. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
  155. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -0
  156. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
  157. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -0
  158. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
  159. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +2 -0
  160. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  161. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -0
  162. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  163. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -0
  164. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
  165. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -0
  166. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/ProjectOidc.js +4 -0
  168. package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/ProjectSCIM.js +4 -0
  170. package/build/dist/Models/DatabaseModels/ProjectSCIM.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/ProjectSso.js +4 -0
  172. package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
  173. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
  174. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +156 -0
  176. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +156 -0
  178. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +216 -0
  180. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +6 -0
  182. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js +4 -0
  184. package/build/dist/Models/DatabaseModels/StatusPageSCIM.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +2 -0
  186. package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/StatusPageSso.js +6 -0
  188. package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
  189. package/build/dist/Models/DatabaseModels/Team.js +42 -0
  190. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  191. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +4 -0
  192. package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/{ServiceMonitor.js → TeamCustomField.js} +108 -209
  194. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -0
  195. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  196. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  197. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  198. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  199. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  200. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/WorkflowLog.js +2 -0
  202. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +2 -0
  204. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  205. package/build/dist/Server/EnvironmentConfig.js +1 -0
  206. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js +60 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js.map +1 -0
  210. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js +74 -0
  211. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js.map +1 -0
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js +19 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js +50 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js +26 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js +30 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js +50 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js +22 -0
  225. package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js.map +1 -0
  226. package/build/dist/Server/Services/AlertGroupingEngineService.js +0 -25
  227. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  228. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +117 -3
  229. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +175 -5
  231. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  232. package/build/dist/Server/Services/IncidentGroupingEngineService.js +0 -31
  233. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  234. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +76 -3
  235. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +176 -14
  237. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +104 -1
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/Index.js +0 -2
  241. package/build/dist/Server/Services/Index.js.map +1 -1
  242. package/build/dist/Server/Services/MonitorProbeService.js +46 -0
  243. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  244. package/build/dist/Server/Services/MonitorService.js +40 -0
  245. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  246. package/build/dist/Server/Services/ProjectService.js +17 -8
  247. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  248. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +117 -3
  249. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +245 -10
  251. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/StatusPageService.js +24 -0
  253. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  254. package/build/dist/Server/Services/TeamCustomFieldService.js +9 -0
  255. package/build/dist/Server/Services/TeamCustomFieldService.js.map +1 -0
  256. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +166 -26
  257. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  258. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +45 -0
  259. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -0
  260. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +7 -1
  261. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  262. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -0
  263. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  264. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +200 -31
  265. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  266. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +8 -15
  267. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  268. package/build/dist/Tests/Types/Permission.test.js +90 -1
  269. package/build/dist/Tests/Types/Permission.test.js.map +1 -1
  270. package/build/dist/Types/Accounts/AccountsLanguage.js +10 -1
  271. package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
  272. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +10 -1
  273. package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
  274. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js +2 -0
  275. package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js.map +1 -0
  276. package/build/dist/Types/Dashboard/DashboardLanguage.js +10 -1
  277. package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
  278. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js +6 -0
  279. package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js.map +1 -0
  280. package/build/dist/Types/Date.js +1 -1
  281. package/build/dist/Types/Date.js.map +1 -1
  282. package/build/dist/Types/Docs/DocsLanguage.js +10 -1
  283. package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
  284. package/build/dist/Types/Permission.js +80 -44
  285. package/build/dist/Types/Permission.js.map +1 -1
  286. package/build/dist/Types/StatusPage/StatusPageLanguage.js +10 -1
  287. package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
  288. package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
  289. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  290. package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
  291. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  292. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +5 -1
  293. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  294. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +1 -1
  295. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  296. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +11 -1
  297. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  298. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  299. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  300. package/build/dist/UI/Components/Charts/Utils/XAxis.js +21 -47
  301. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  302. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +1125 -0
  303. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -0
  304. package/build/dist/UI/Components/Forms/Fields/FormField.js +28 -10
  305. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  306. package/build/dist/UI/Components/Link/Link.js +11 -2
  307. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  308. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +20 -18
  309. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  310. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -0
  311. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  312. package/build/dist/UI/Utils/User.js +13 -0
  313. package/build/dist/UI/Utils/User.js.map +1 -1
  314. package/package.json +1 -1
  315. package/Server/Services/ServiceMonitorService.ts +0 -57
  316. package/build/dist/Models/DatabaseModels/ServiceMonitor.js.map +0 -1
  317. package/build/dist/Server/Services/ServiceMonitorService.js +0 -56
  318. package/build/dist/Server/Services/ServiceMonitorService.js.map +0 -1
@@ -11,7 +11,6 @@ import IncidentEpisodeRoleMember from "../../Models/DatabaseModels/IncidentEpiso
11
11
  import Label from "../../Models/DatabaseModels/Label";
12
12
  import Monitor from "../../Models/DatabaseModels/Monitor";
13
13
  import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
14
- import ServiceMonitor from "../../Models/DatabaseModels/ServiceMonitor";
15
14
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
16
15
  import logger, { LogAttributes } from "../Utils/Logger";
17
16
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
@@ -24,7 +23,6 @@ import IncidentEpisodeOwnerUserService from "./IncidentEpisodeOwnerUserService";
24
23
  import IncidentEpisodeOwnerTeamService from "./IncidentEpisodeOwnerTeamService";
25
24
  import IncidentEpisodeRoleMemberService from "./IncidentEpisodeRoleMemberService";
26
25
  import MonitorService from "./MonitorService";
27
- import ServiceMonitorService from "./ServiceMonitorService";
28
26
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
29
27
  import IncidentEpisodeFeedService from "./IncidentEpisodeFeedService";
30
28
  import { IncidentEpisodeFeedEventType } from "../../Models/DatabaseModels/IncidentEpisodeFeed";
@@ -95,7 +93,6 @@ class IncidentGroupingEngineServiceClass {
95
93
  groupByMonitor: true,
96
94
  groupBySeverity: true,
97
95
  groupByIncidentTitle: true,
98
- groupByService: true,
99
96
  // Time settings
100
97
  enableTimeWindow: true,
101
98
  timeWindowMinutes: true,
@@ -589,37 +586,6 @@ class IncidentGroupingEngineServiceClass {
589
586
  ): Promise<string> {
590
587
  const parts: Array<string> = [];
591
588
 
592
- /*
593
- * Group by service - only if explicitly enabled
594
- * Must be checked before monitor since service contains multiple monitors
595
- */
596
- if (
597
- rule.groupByService &&
598
- incident.monitors &&
599
- incident.monitors.length > 0
600
- ) {
601
- // Use the first monitor's service for grouping
602
- const firstMonitor: Monitor | undefined = incident.monitors[0];
603
- if (firstMonitor && firstMonitor.id) {
604
- const serviceMonitor: ServiceMonitor | null =
605
- await ServiceMonitorService.findOneBy({
606
- query: {
607
- monitorId: firstMonitor.id,
608
- },
609
- select: {
610
- serviceId: true,
611
- },
612
- props: {
613
- isRoot: true,
614
- },
615
- });
616
-
617
- if (serviceMonitor?.serviceId) {
618
- parts.push(`service:${serviceMonitor.serviceId.toString()}`);
619
- }
620
- }
621
- }
622
-
623
589
  // Group by monitor - only if explicitly enabled
624
590
  if (
625
591
  rule.groupByMonitor &&
@@ -921,9 +887,6 @@ class IncidentGroupingEngineServiceClass {
921
887
  if (rule.groupByIncidentTitle) {
922
888
  groupByParts.push("Incident Title");
923
889
  }
924
- if (rule.groupByService) {
925
- groupByParts.push("Service");
926
- }
927
890
 
928
891
  const groupByDescription: string =
929
892
  groupByParts.length > 0
@@ -1,15 +1,21 @@
1
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
1
2
  import Host from "../../Models/DatabaseModels/Host";
2
3
  import Incident from "../../Models/DatabaseModels/Incident";
3
4
  import IncidentLabelRule from "../../Models/DatabaseModels/IncidentLabelRule";
4
5
  import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
6
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
5
7
  import Label from "../../Models/DatabaseModels/Label";
6
8
  import Monitor from "../../Models/DatabaseModels/Monitor";
9
+ import Service from "../../Models/DatabaseModels/Service";
10
+ import DockerHostService from "./DockerHostService";
7
11
  import HostService from "./HostService";
8
12
  import IncidentFeedService from "./IncidentFeedService";
9
13
  import IncidentLabelRuleService from "./IncidentLabelRuleService";
10
14
  import IncidentService from "./IncidentService";
15
+ import KubernetesClusterService from "./KubernetesClusterService";
11
16
  import LabelService from "./LabelService";
12
17
  import MonitorService from "./MonitorService";
18
+ import ServiceService from "./ServiceService";
13
19
  import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
14
20
  import { Indigo500 } from "../../Types/BrandColors";
15
21
  import ObjectID from "../../Types/ObjectID";
@@ -25,6 +31,9 @@ class IncidentLabelRuleEngineServiceClass {
25
31
  * - labels listed on `labelsToAdd`
26
32
  * - all labels of the incident's monitors when `inheritLabelsFromMonitors`
27
33
  * - all labels of the incident's hosts when `inheritLabelsFromHosts`
34
+ * - all labels of the incident's Kubernetes clusters when `inheritLabelsFromKubernetesClusters`
35
+ * - all labels of the incident's Docker hosts when `inheritLabelsFromDockerHosts`
36
+ * - all labels of the incident's services when `inheritLabelsFromServices`
28
37
  * The union is deduped against labels already on the incident before insert
29
38
  * to avoid PK conflicts on the IncidentLabel join table.
30
39
  */
@@ -56,6 +65,9 @@ class IncidentLabelRuleEngineServiceClass {
56
65
  labelsToAdd: { _id: true },
57
66
  inheritLabelsFromMonitors: true,
58
67
  inheritLabelsFromHosts: true,
68
+ inheritLabelsFromKubernetesClusters: true,
69
+ inheritLabelsFromDockerHosts: true,
70
+ inheritLabelsFromServices: true,
59
71
  },
60
72
  limit: 100,
61
73
  skip: 0,
@@ -68,6 +80,9 @@ class IncidentLabelRuleEngineServiceClass {
68
80
  const labelIdsToAdd: Set<string> = new Set();
69
81
  let inheritFromMonitors: boolean = false;
70
82
  let inheritFromHosts: boolean = false;
83
+ let inheritFromKubernetesClusters: boolean = false;
84
+ let inheritFromDockerHosts: boolean = false;
85
+ let inheritFromServices: boolean = false;
71
86
  const matchedRules: Array<IncidentLabelRule> = [];
72
87
 
73
88
  for (const rule of rules) {
@@ -90,6 +105,15 @@ class IncidentLabelRuleEngineServiceClass {
90
105
  if (rule.inheritLabelsFromHosts) {
91
106
  inheritFromHosts = true;
92
107
  }
108
+ if (rule.inheritLabelsFromKubernetesClusters) {
109
+ inheritFromKubernetesClusters = true;
110
+ }
111
+ if (rule.inheritLabelsFromDockerHosts) {
112
+ inheritFromDockerHosts = true;
113
+ }
114
+ if (rule.inheritLabelsFromServices) {
115
+ inheritFromServices = true;
116
+ }
93
117
  }
94
118
 
95
119
  if (inheritFromMonitors && incident.monitors?.length) {
@@ -128,6 +152,65 @@ class IncidentLabelRuleEngineServiceClass {
128
152
  }
129
153
  }
130
154
 
155
+ if (
156
+ inheritFromKubernetesClusters &&
157
+ incident.kubernetesClusters?.length
158
+ ) {
159
+ for (const incidentCluster of incident.kubernetesClusters) {
160
+ if (!incidentCluster.id) {
161
+ continue;
162
+ }
163
+ const cluster: KubernetesCluster | null =
164
+ await KubernetesClusterService.findOneById({
165
+ id: incidentCluster.id,
166
+ select: { labels: { _id: true } },
167
+ props: { isRoot: true },
168
+ });
169
+ for (const label of cluster?.labels || []) {
170
+ if (label.id) {
171
+ labelIdsToAdd.add(label.id.toString());
172
+ }
173
+ }
174
+ }
175
+ }
176
+
177
+ if (inheritFromDockerHosts && incident.dockerHosts?.length) {
178
+ for (const incidentDockerHost of incident.dockerHosts) {
179
+ if (!incidentDockerHost.id) {
180
+ continue;
181
+ }
182
+ const dockerHost: DockerHost | null =
183
+ await DockerHostService.findOneById({
184
+ id: incidentDockerHost.id,
185
+ select: { labels: { _id: true } },
186
+ props: { isRoot: true },
187
+ });
188
+ for (const label of dockerHost?.labels || []) {
189
+ if (label.id) {
190
+ labelIdsToAdd.add(label.id.toString());
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ if (inheritFromServices && incident.services?.length) {
197
+ for (const incidentService of incident.services) {
198
+ if (!incidentService.id) {
199
+ continue;
200
+ }
201
+ const service: Service | null = await ServiceService.findOneById({
202
+ id: incidentService.id,
203
+ select: { labels: { _id: true } },
204
+ props: { isRoot: true },
205
+ });
206
+ for (const label of service?.labels || []) {
207
+ if (label.id) {
208
+ labelIdsToAdd.add(label.id.toString());
209
+ }
210
+ }
211
+ }
212
+ }
213
+
131
214
  if (labelIdsToAdd.size === 0) {
132
215
  return;
133
216
  }
@@ -1,23 +1,38 @@
1
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
2
+ import DockerHostOwnerTeam from "../../Models/DatabaseModels/DockerHostOwnerTeam";
3
+ import DockerHostOwnerUser from "../../Models/DatabaseModels/DockerHostOwnerUser";
1
4
  import Host from "../../Models/DatabaseModels/Host";
2
5
  import HostOwnerTeam from "../../Models/DatabaseModels/HostOwnerTeam";
3
6
  import HostOwnerUser from "../../Models/DatabaseModels/HostOwnerUser";
4
7
  import Incident from "../../Models/DatabaseModels/Incident";
5
8
  import IncidentOwnerRule from "../../Models/DatabaseModels/IncidentOwnerRule";
6
9
  import IncidentSeverity from "../../Models/DatabaseModels/IncidentSeverity";
10
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
11
+ import KubernetesClusterOwnerTeam from "../../Models/DatabaseModels/KubernetesClusterOwnerTeam";
12
+ import KubernetesClusterOwnerUser from "../../Models/DatabaseModels/KubernetesClusterOwnerUser";
7
13
  import Label from "../../Models/DatabaseModels/Label";
8
14
  import Monitor from "../../Models/DatabaseModels/Monitor";
9
15
  import MonitorOwnerTeam from "../../Models/DatabaseModels/MonitorOwnerTeam";
10
16
  import MonitorOwnerUser from "../../Models/DatabaseModels/MonitorOwnerUser";
17
+ import Service from "../../Models/DatabaseModels/Service";
18
+ import ServiceOwnerTeam from "../../Models/DatabaseModels/ServiceOwnerTeam";
19
+ import ServiceOwnerUser from "../../Models/DatabaseModels/ServiceOwnerUser";
11
20
  import Team from "../../Models/DatabaseModels/Team";
12
21
  import User from "../../Models/DatabaseModels/User";
22
+ import DockerHostOwnerTeamService from "./DockerHostOwnerTeamService";
23
+ import DockerHostOwnerUserService from "./DockerHostOwnerUserService";
13
24
  import HostOwnerTeamService from "./HostOwnerTeamService";
14
25
  import HostOwnerUserService from "./HostOwnerUserService";
15
26
  import IncidentFeedService from "./IncidentFeedService";
16
27
  import IncidentOwnerRuleService from "./IncidentOwnerRuleService";
17
28
  import IncidentService from "./IncidentService";
29
+ import KubernetesClusterOwnerTeamService from "./KubernetesClusterOwnerTeamService";
30
+ import KubernetesClusterOwnerUserService from "./KubernetesClusterOwnerUserService";
18
31
  import MonitorOwnerTeamService from "./MonitorOwnerTeamService";
19
32
  import MonitorOwnerUserService from "./MonitorOwnerUserService";
20
33
  import MonitorService from "./MonitorService";
34
+ import ServiceOwnerTeamService from "./ServiceOwnerTeamService";
35
+ import ServiceOwnerUserService from "./ServiceOwnerUserService";
21
36
  import TeamService from "./TeamService";
22
37
  import UserService from "./UserService";
23
38
  import { IncidentFeedEventType } from "../../Models/DatabaseModels/IncidentFeed";
@@ -64,6 +79,9 @@ class IncidentOwnerRuleEngineServiceClass {
64
79
  ownerTeams: { _id: true },
65
80
  inheritOwnersFromMonitors: true,
66
81
  inheritOwnersFromHosts: true,
82
+ inheritOwnersFromKubernetesClusters: true,
83
+ inheritOwnersFromDockerHosts: true,
84
+ inheritOwnersFromServices: true,
67
85
  },
68
86
  limit: 100,
69
87
  skip: 0,
@@ -73,10 +91,6 @@ class IncidentOwnerRuleEngineServiceClass {
73
91
  return;
74
92
  }
75
93
 
76
- /*
77
- * Collect owners by notify-mode so we can call addOwners with the
78
- * correct notification flag.
79
- */
80
94
  const usersByNotify: Map<boolean, Set<string>> = new Map([
81
95
  [true, new Set()],
82
96
  [false, new Set()],
@@ -91,6 +105,9 @@ class IncidentOwnerRuleEngineServiceClass {
91
105
  const allTeamIds: Set<string> = new Set();
92
106
  let inheritFromMonitors: boolean = false;
93
107
  let inheritFromHosts: boolean = false;
108
+ let inheritFromKubernetesClusters: boolean = false;
109
+ let inheritFromDockerHosts: boolean = false;
110
+ let inheritFromServices: boolean = false;
94
111
  const inheritNotifyMode: { value: boolean | null } = { value: null };
95
112
 
96
113
  for (const rule of rules) {
@@ -120,11 +137,6 @@ class IncidentOwnerRuleEngineServiceClass {
120
137
  if (rule.inheritOwnersFromMonitors) {
121
138
  inheritFromMonitors = true;
122
139
  ruleAddedAny = true;
123
- /*
124
- * If multiple matching rules ask to inherit, prefer notify=true so
125
- * any rule that wants to notify wins. This matches the spirit of
126
- * notifyOwners — once any rule has opted in, owners are notified.
127
- */
128
140
  inheritNotifyMode.value =
129
141
  inheritNotifyMode.value === true ? true : notify;
130
142
  }
@@ -134,6 +146,24 @@ class IncidentOwnerRuleEngineServiceClass {
134
146
  inheritNotifyMode.value =
135
147
  inheritNotifyMode.value === true ? true : notify;
136
148
  }
149
+ if (rule.inheritOwnersFromKubernetesClusters) {
150
+ inheritFromKubernetesClusters = true;
151
+ ruleAddedAny = true;
152
+ inheritNotifyMode.value =
153
+ inheritNotifyMode.value === true ? true : notify;
154
+ }
155
+ if (rule.inheritOwnersFromDockerHosts) {
156
+ inheritFromDockerHosts = true;
157
+ ruleAddedAny = true;
158
+ inheritNotifyMode.value =
159
+ inheritNotifyMode.value === true ? true : notify;
160
+ }
161
+ if (rule.inheritOwnersFromServices) {
162
+ inheritFromServices = true;
163
+ ruleAddedAny = true;
164
+ inheritNotifyMode.value =
165
+ inheritNotifyMode.value === true ? true : notify;
166
+ }
137
167
  if (ruleAddedAny) {
138
168
  matchedRules.push(rule);
139
169
  }
@@ -143,6 +173,12 @@ class IncidentOwnerRuleEngineServiceClass {
143
173
  const inheritedFromMonitorTeamIds: Set<string> = new Set();
144
174
  const inheritedFromHostUserIds: Set<string> = new Set();
145
175
  const inheritedFromHostTeamIds: Set<string> = new Set();
176
+ const inheritedFromKubernetesClusterUserIds: Set<string> = new Set();
177
+ const inheritedFromKubernetesClusterTeamIds: Set<string> = new Set();
178
+ const inheritedFromDockerHostUserIds: Set<string> = new Set();
179
+ const inheritedFromDockerHostTeamIds: Set<string> = new Set();
180
+ const inheritedFromServiceUserIds: Set<string> = new Set();
181
+ const inheritedFromServiceTeamIds: Set<string> = new Set();
146
182
 
147
183
  if (inheritFromMonitors && incident.monitors?.length) {
148
184
  const monitorIds: Array<ObjectID> = incident.monitors
@@ -226,13 +262,149 @@ class IncidentOwnerRuleEngineServiceClass {
226
262
  }
227
263
  }
228
264
 
265
+ if (
266
+ inheritFromKubernetesClusters &&
267
+ incident.kubernetesClusters?.length
268
+ ) {
269
+ const clusterIds: Array<ObjectID> = incident.kubernetesClusters
270
+ .map((c: KubernetesCluster) => {
271
+ return c.id;
272
+ })
273
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
274
+ return Boolean(id);
275
+ });
276
+ if (clusterIds.length > 0) {
277
+ const [clusterOwnerUsers, clusterOwnerTeams]: [
278
+ Array<KubernetesClusterOwnerUser>,
279
+ Array<KubernetesClusterOwnerTeam>,
280
+ ] = await Promise.all([
281
+ KubernetesClusterOwnerUserService.findBy({
282
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
283
+ select: { userId: true },
284
+ props: { isRoot: true },
285
+ limit: LIMIT_MAX,
286
+ skip: 0,
287
+ }),
288
+ KubernetesClusterOwnerTeamService.findBy({
289
+ query: { kubernetesClusterId: QueryHelper.any(clusterIds) },
290
+ select: { teamId: true },
291
+ props: { isRoot: true },
292
+ limit: LIMIT_MAX,
293
+ skip: 0,
294
+ }),
295
+ ]);
296
+ for (const ownerUser of clusterOwnerUsers) {
297
+ if (ownerUser.userId) {
298
+ inheritedFromKubernetesClusterUserIds.add(
299
+ ownerUser.userId.toString(),
300
+ );
301
+ }
302
+ }
303
+ for (const ownerTeam of clusterOwnerTeams) {
304
+ if (ownerTeam.teamId) {
305
+ inheritedFromKubernetesClusterTeamIds.add(
306
+ ownerTeam.teamId.toString(),
307
+ );
308
+ }
309
+ }
310
+ }
311
+ }
312
+
313
+ if (inheritFromDockerHosts && incident.dockerHosts?.length) {
314
+ const dockerHostIds: Array<ObjectID> = incident.dockerHosts
315
+ .map((d: DockerHost) => {
316
+ return d.id;
317
+ })
318
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
319
+ return Boolean(id);
320
+ });
321
+ if (dockerHostIds.length > 0) {
322
+ const [dockerHostOwnerUsers, dockerHostOwnerTeams]: [
323
+ Array<DockerHostOwnerUser>,
324
+ Array<DockerHostOwnerTeam>,
325
+ ] = await Promise.all([
326
+ DockerHostOwnerUserService.findBy({
327
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
328
+ select: { userId: true },
329
+ props: { isRoot: true },
330
+ limit: LIMIT_MAX,
331
+ skip: 0,
332
+ }),
333
+ DockerHostOwnerTeamService.findBy({
334
+ query: { dockerHostId: QueryHelper.any(dockerHostIds) },
335
+ select: { teamId: true },
336
+ props: { isRoot: true },
337
+ limit: LIMIT_MAX,
338
+ skip: 0,
339
+ }),
340
+ ]);
341
+ for (const ownerUser of dockerHostOwnerUsers) {
342
+ if (ownerUser.userId) {
343
+ inheritedFromDockerHostUserIds.add(ownerUser.userId.toString());
344
+ }
345
+ }
346
+ for (const ownerTeam of dockerHostOwnerTeams) {
347
+ if (ownerTeam.teamId) {
348
+ inheritedFromDockerHostTeamIds.add(ownerTeam.teamId.toString());
349
+ }
350
+ }
351
+ }
352
+ }
353
+
354
+ if (inheritFromServices && incident.services?.length) {
355
+ const serviceIds: Array<ObjectID> = incident.services
356
+ .map((s: Service) => {
357
+ return s.id;
358
+ })
359
+ .filter((id: ObjectID | null | undefined): id is ObjectID => {
360
+ return Boolean(id);
361
+ });
362
+ if (serviceIds.length > 0) {
363
+ const [serviceOwnerUsers, serviceOwnerTeams]: [
364
+ Array<ServiceOwnerUser>,
365
+ Array<ServiceOwnerTeam>,
366
+ ] = await Promise.all([
367
+ ServiceOwnerUserService.findBy({
368
+ query: { serviceId: QueryHelper.any(serviceIds) },
369
+ select: { userId: true },
370
+ props: { isRoot: true },
371
+ limit: LIMIT_MAX,
372
+ skip: 0,
373
+ }),
374
+ ServiceOwnerTeamService.findBy({
375
+ query: { serviceId: QueryHelper.any(serviceIds) },
376
+ select: { teamId: true },
377
+ props: { isRoot: true },
378
+ limit: LIMIT_MAX,
379
+ skip: 0,
380
+ }),
381
+ ]);
382
+ for (const ownerUser of serviceOwnerUsers) {
383
+ if (ownerUser.userId) {
384
+ inheritedFromServiceUserIds.add(ownerUser.userId.toString());
385
+ }
386
+ }
387
+ for (const ownerTeam of serviceOwnerTeams) {
388
+ if (ownerTeam.teamId) {
389
+ inheritedFromServiceTeamIds.add(ownerTeam.teamId.toString());
390
+ }
391
+ }
392
+ }
393
+ }
394
+
229
395
  const inheritedUserIds: Set<string> = new Set([
230
396
  ...inheritedFromMonitorUserIds,
231
397
  ...inheritedFromHostUserIds,
398
+ ...inheritedFromKubernetesClusterUserIds,
399
+ ...inheritedFromDockerHostUserIds,
400
+ ...inheritedFromServiceUserIds,
232
401
  ]);
233
402
  const inheritedTeamIds: Set<string> = new Set([
234
403
  ...inheritedFromMonitorTeamIds,
235
404
  ...inheritedFromHostTeamIds,
405
+ ...inheritedFromKubernetesClusterTeamIds,
406
+ ...inheritedFromDockerHostTeamIds,
407
+ ...inheritedFromServiceTeamIds,
236
408
  ]);
237
409
 
238
410
  if (inheritedUserIds.size > 0 || inheritedTeamIds.size > 0) {
@@ -296,6 +468,17 @@ class IncidentOwnerRuleEngineServiceClass {
296
468
  0,
297
469
  inheritedFromHosts:
298
470
  inheritedFromHostUserIds.size + inheritedFromHostTeamIds.size > 0,
471
+ inheritedFromKubernetesClusters:
472
+ inheritedFromKubernetesClusterUserIds.size +
473
+ inheritedFromKubernetesClusterTeamIds.size >
474
+ 0,
475
+ inheritedFromDockerHosts:
476
+ inheritedFromDockerHostUserIds.size +
477
+ inheritedFromDockerHostTeamIds.size >
478
+ 0,
479
+ inheritedFromServices:
480
+ inheritedFromServiceUserIds.size + inheritedFromServiceTeamIds.size >
481
+ 0,
299
482
  });
300
483
  } catch (error) {
301
484
  logger.error(`Error applying incident owner rules: ${error}`, {
@@ -313,6 +496,9 @@ class IncidentOwnerRuleEngineServiceClass {
313
496
  teamIds: Array<string>;
314
497
  inheritedFromMonitors: boolean;
315
498
  inheritedFromHosts: boolean;
499
+ inheritedFromKubernetesClusters: boolean;
500
+ inheritedFromDockerHosts: boolean;
501
+ inheritedFromServices: boolean;
316
502
  }): Promise<void> {
317
503
  const {
318
504
  incident,
@@ -321,6 +507,9 @@ class IncidentOwnerRuleEngineServiceClass {
321
507
  teamIds,
322
508
  inheritedFromMonitors,
323
509
  inheritedFromHosts,
510
+ inheritedFromKubernetesClusters,
511
+ inheritedFromDockerHosts,
512
+ inheritedFromServices,
324
513
  } = data;
325
514
  if (
326
515
  !incident.id ||
@@ -398,9 +587,18 @@ class IncidentOwnerRuleEngineServiceClass {
398
587
  if (inheritedFromHosts) {
399
588
  inheritedSources.push("hosts");
400
589
  }
590
+ if (inheritedFromKubernetesClusters) {
591
+ inheritedSources.push("Kubernetes clusters");
592
+ }
593
+ if (inheritedFromDockerHosts) {
594
+ inheritedSources.push("Docker hosts");
595
+ }
596
+ if (inheritedFromServices) {
597
+ inheritedSources.push("services");
598
+ }
401
599
  const inheritedNote: string =
402
600
  inheritedSources.length > 0
403
- ? `\n\n_Some owners were inherited from the incident's ${inheritedSources.join(" and ")}._`
601
+ ? `\n\n_Some owners were inherited from the incident's ${inheritedSources.join(", ")}._`
404
602
  : "";
405
603
 
406
604
  const feedInfoInMarkdown: string = `🛡️ **Incident Owner Rule${
@@ -28,6 +28,10 @@ import Typeof from "../../Types/Typeof";
28
28
  import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
29
29
  import UserNotificationEventType from "../../Types/UserNotification/UserNotificationEventType";
30
30
  import StatusPageSubscriberNotificationStatus from "../../Types/StatusPage/StatusPageSubscriberNotificationStatus";
31
+ import DockerHost from "../../Models/DatabaseModels/DockerHost";
32
+ import Host from "../../Models/DatabaseModels/Host";
33
+ import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
34
+ import ServiceModel from "../../Models/DatabaseModels/Service";
31
35
  import Model from "../../Models/DatabaseModels/Incident";
32
36
  import IncidentOwnerTeam from "../../Models/DatabaseModels/IncidentOwnerTeam";
33
37
  import IncidentOwnerUser from "../../Models/DatabaseModels/IncidentOwnerUser";
@@ -541,7 +545,16 @@ export class Service extends DatabaseService<Model> {
541
545
  );
542
546
  }
543
547
  } else if (createBy.data.createdIncidentTemplateId) {
544
- // If created from a template, check if template has a custom initial state
548
+ /*
549
+ * Created from a template — pull every field we may want to
550
+ * inherit and apply each one only if the caller didn't already
551
+ * provide it. The dashboard pre-fills these on the client, so in
552
+ * the UI flow this is a no-op; the gain is for API consumers
553
+ * that just send `createdIncidentTemplateId` and expect the
554
+ * server to materialize the rest. `undefined` means "not set by
555
+ * the caller" — an explicit empty array or empty string is
556
+ * treated as an intentional override and we leave it alone.
557
+ */
545
558
  const incidentTemplate: IncidentTemplate | null =
546
559
  await IncidentTemplateService.findOneBy({
547
560
  query: {
@@ -550,6 +563,17 @@ export class Service extends DatabaseService<Model> {
550
563
  },
551
564
  select: {
552
565
  initialIncidentStateId: true,
566
+ incidentSeverityId: true,
567
+ changeMonitorStatusToId: true,
568
+ title: true,
569
+ description: true,
570
+ monitors: { _id: true },
571
+ hosts: { _id: true },
572
+ kubernetesClusters: { _id: true },
573
+ dockerHosts: { _id: true },
574
+ services: { _id: true },
575
+ onCallDutyPolicies: { _id: true },
576
+ labels: { _id: true },
553
577
  },
554
578
  props: {
555
579
  isRoot: true,
@@ -579,6 +603,120 @@ export class Service extends DatabaseService<Model> {
579
603
  initialIncidentStateId = undefined;
580
604
  }
581
605
  }
606
+
607
+ if (incidentTemplate) {
608
+ if (
609
+ createBy.data.incidentSeverityId === undefined &&
610
+ incidentTemplate.incidentSeverityId
611
+ ) {
612
+ createBy.data.incidentSeverityId =
613
+ incidentTemplate.incidentSeverityId;
614
+ }
615
+ if (
616
+ createBy.data.changeMonitorStatusToId === undefined &&
617
+ incidentTemplate.changeMonitorStatusToId
618
+ ) {
619
+ createBy.data.changeMonitorStatusToId =
620
+ incidentTemplate.changeMonitorStatusToId;
621
+ }
622
+ if (
623
+ createBy.data.title === undefined &&
624
+ typeof incidentTemplate.title === "string"
625
+ ) {
626
+ createBy.data.title = incidentTemplate.title;
627
+ }
628
+ if (
629
+ createBy.data.description === undefined &&
630
+ typeof incidentTemplate.description === "string"
631
+ ) {
632
+ createBy.data.description = incidentTemplate.description;
633
+ }
634
+
635
+ const stubBy: <T extends { _id?: string | undefined }>(
636
+ ctor: new () => T,
637
+ rows: Array<{ _id?: string | undefined }> | undefined,
638
+ ) => Array<T> | undefined = <T extends { _id?: string | undefined }>(
639
+ ctor: new () => T,
640
+ rows: Array<{ _id?: string | undefined }> | undefined,
641
+ ): Array<T> | undefined => {
642
+ if (!rows) {
643
+ return undefined;
644
+ }
645
+ return rows
646
+ .filter((row: { _id?: string | undefined }): boolean => {
647
+ return Boolean(row._id);
648
+ })
649
+ .map((row: { _id?: string | undefined }): T => {
650
+ const stub: T = new ctor();
651
+ stub._id = String(row._id);
652
+ return stub;
653
+ });
654
+ };
655
+
656
+ if (createBy.data.monitors === undefined) {
657
+ const stubs: Array<Monitor> | undefined = stubBy(
658
+ Monitor,
659
+ incidentTemplate.monitors,
660
+ );
661
+ if (stubs && stubs.length > 0) {
662
+ createBy.data.monitors = stubs;
663
+ }
664
+ }
665
+ if (createBy.data.hosts === undefined) {
666
+ const stubs: Array<Host> | undefined = stubBy(
667
+ Host,
668
+ incidentTemplate.hosts,
669
+ );
670
+ if (stubs && stubs.length > 0) {
671
+ createBy.data.hosts = stubs;
672
+ }
673
+ }
674
+ if (createBy.data.kubernetesClusters === undefined) {
675
+ const stubs: Array<KubernetesCluster> | undefined = stubBy(
676
+ KubernetesCluster,
677
+ incidentTemplate.kubernetesClusters,
678
+ );
679
+ if (stubs && stubs.length > 0) {
680
+ createBy.data.kubernetesClusters = stubs;
681
+ }
682
+ }
683
+ if (createBy.data.dockerHosts === undefined) {
684
+ const stubs: Array<DockerHost> | undefined = stubBy(
685
+ DockerHost,
686
+ incidentTemplate.dockerHosts,
687
+ );
688
+ if (stubs && stubs.length > 0) {
689
+ createBy.data.dockerHosts = stubs;
690
+ }
691
+ }
692
+ if (createBy.data.services === undefined) {
693
+ const stubs: Array<ServiceModel> | undefined = stubBy(
694
+ ServiceModel,
695
+ incidentTemplate.services,
696
+ );
697
+ if (stubs && stubs.length > 0) {
698
+ createBy.data.services = stubs;
699
+ }
700
+ }
701
+ if (createBy.data.onCallDutyPolicies === undefined) {
702
+ const stubs: Array<OnCallDutyPolicy> | undefined = stubBy(
703
+ OnCallDutyPolicy,
704
+ incidentTemplate.onCallDutyPolicies,
705
+ );
706
+ if (stubs && stubs.length > 0) {
707
+ createBy.data.onCallDutyPolicies = stubs;
708
+ }
709
+ }
710
+ if (createBy.data.labels === undefined) {
711
+ const stubs: Array<Label> | undefined = stubBy(
712
+ Label,
713
+ incidentTemplate.labels,
714
+ );
715
+ if (stubs && stubs.length > 0) {
716
+ createBy.data.labels = stubs;
717
+ }
718
+ }
719
+ }
582
720
  }
583
721
 
584
722
  // If no custom state is provided or found, fall back to default created state