@oneuptime/common 9.4.12 → 9.4.13

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 (256) hide show
  1. package/Models/DatabaseModels/Incident.ts +77 -0
  2. package/Models/DatabaseModels/IncidentEpisode.ts +1223 -0
  3. package/Models/DatabaseModels/IncidentEpisodeFeed.ts +533 -0
  4. package/Models/DatabaseModels/IncidentEpisodeInternalNote.ts +456 -0
  5. package/Models/DatabaseModels/IncidentEpisodeMember.ts +587 -0
  6. package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +421 -0
  7. package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +419 -0
  8. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +524 -0
  9. package/Models/DatabaseModels/IncidentGroupingRule.ts +1430 -0
  10. package/Models/DatabaseModels/Index.ts +18 -0
  11. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +70 -0
  12. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +59 -0
  13. package/Models/DatabaseModels/UserOnCallLog.ts +48 -0
  14. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +49 -0
  15. package/Models/DatabaseModels/WorkspaceNotificationLog.ts +57 -0
  16. package/Server/API/IncidentEpisodeAPI.ts +150 -0
  17. package/Server/API/SlackAPI.ts +23 -0
  18. package/Server/API/UserOnCallLogTimelineAPI.ts +24 -4
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.ts +729 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.ts +261 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.ts +28 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  23. package/Server/Services/BillingService.ts +1 -3
  24. package/Server/Services/CallService.ts +1 -0
  25. package/Server/Services/IncidentEpisodeFeedService.ts +94 -0
  26. package/Server/Services/IncidentEpisodeInternalNoteService.ts +71 -0
  27. package/Server/Services/IncidentEpisodeMemberService.ts +321 -0
  28. package/Server/Services/IncidentEpisodeOwnerTeamService.ts +10 -0
  29. package/Server/Services/IncidentEpisodeOwnerUserService.ts +10 -0
  30. package/Server/Services/IncidentEpisodeService.ts +1045 -0
  31. package/Server/Services/IncidentEpisodeStateTimelineService.ts +566 -0
  32. package/Server/Services/IncidentGroupingEngineService.ts +1047 -0
  33. package/Server/Services/IncidentGroupingRuleService.ts +14 -0
  34. package/Server/Services/IncidentService.ts +11 -0
  35. package/Server/Services/Index.ts +18 -0
  36. package/Server/Services/MailService.ts +1 -0
  37. package/Server/Services/MonitorService.ts +9 -0
  38. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +18 -0
  39. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +64 -2
  40. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +26 -1
  41. package/Server/Services/OnCallDutyPolicyService.ts +15 -0
  42. package/Server/Services/SmsService.ts +1 -0
  43. package/Server/Services/UserNotificationRuleService.ts +48 -2
  44. package/Server/Services/UserNotificationSettingService.ts +23 -0
  45. package/Server/Services/UserOnCallLogService.ts +41 -4
  46. package/Server/Services/WhatsAppService.ts +1 -0
  47. package/Server/Services/WorkspaceNotificationLogService.ts +16 -0
  48. package/Server/Services/WorkspaceNotificationRuleService.ts +116 -0
  49. package/Server/Utils/AI/IncidentEpisodeAIContextBuilder.ts +490 -0
  50. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +1 -1
  51. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  52. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +1 -1
  53. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +1 -1
  54. package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +2 -2
  55. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +182 -0
  56. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +13 -0
  57. package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +1 -1
  58. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +37 -0
  59. package/Server/Utils/PushNotificationUtil.ts +31 -0
  60. package/Server/Utils/WhatsAppTemplateUtil.ts +14 -0
  61. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.ts +18 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +702 -0
  63. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +20 -0
  64. package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +11 -0
  65. package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +918 -0
  66. package/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.ts +120 -0
  67. package/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.ts +74 -0
  68. package/Types/Email/EmailTemplateType.ts +6 -0
  69. package/Types/Monitor/CriteriaFilter.ts +24 -4
  70. package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
  71. package/Types/Monitor/MonitorStep.ts +37 -0
  72. package/Types/Monitor/MonitorStepSnmpMonitor.ts +102 -0
  73. package/Types/Monitor/MonitorType.ts +15 -2
  74. package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +8 -0
  75. package/Types/Monitor/SnmpMonitor/SnmpDataType.ts +21 -0
  76. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +16 -0
  77. package/Types/Monitor/SnmpMonitor/SnmpOid.ts +60 -0
  78. package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +7 -0
  79. package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +7 -0
  80. package/Types/Monitor/SnmpMonitor/SnmpV3Auth.ts +12 -0
  81. package/Types/Monitor/SnmpMonitor/SnmpVersion.ts +7 -0
  82. package/Types/NotificationSetting/NotificationSettingEventType.ts +7 -0
  83. package/Types/Permission.ts +311 -0
  84. package/Types/Probe/ProbeMonitorResponse.ts +2 -0
  85. package/Types/UserNotification/UserNotificationEventType.ts +1 -0
  86. package/Types/WhatsApp/WhatsAppTemplates.ts +24 -0
  87. package/Types/Workspace/NotificationRules/EventType.ts +1 -0
  88. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +38 -1
  89. package/Utils/Monitor/MonitorMetricType.ts +2 -1
  90. package/build/dist/Models/DatabaseModels/Incident.js +78 -0
  91. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  92. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1250 -0
  93. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -0
  94. package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js +555 -0
  95. package/build/dist/Models/DatabaseModels/IncidentEpisodeFeed.js.map +1 -0
  96. package/build/dist/Models/DatabaseModels/IncidentEpisodeInternalNote.js +467 -0
  97. package/build/dist/Models/DatabaseModels/IncidentEpisodeInternalNote.js.map +1 -0
  98. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +607 -0
  99. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -0
  100. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +437 -0
  101. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -0
  102. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +436 -0
  103. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -0
  104. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +546 -0
  105. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -0
  106. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +1437 -0
  107. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -0
  108. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  109. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  110. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +69 -0
  111. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +58 -0
  113. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  114. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +47 -0
  115. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  116. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +48 -0
  117. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  118. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js +58 -0
  119. package/build/dist/Models/DatabaseModels/WorkspaceNotificationLog.js.map +1 -1
  120. package/build/dist/Server/API/IncidentEpisodeAPI.js +97 -0
  121. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -0
  122. package/build/dist/Server/API/SlackAPI.js +18 -0
  123. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  124. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +30 -10
  125. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  126. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.js +256 -0
  127. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769626069479-MigrationName.js.map +1 -0
  128. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.js +96 -0
  129. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769629928240-MigrationName.js.map +1 -0
  130. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.js +25 -0
  131. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1769676117342-RenameEvaluateOverTimeInCriteriaFilter.js.map +1 -0
  132. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  133. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  134. package/build/dist/Server/Services/BillingService.js +1 -2
  135. package/build/dist/Server/Services/BillingService.js.map +1 -1
  136. package/build/dist/Server/Services/CallService.js.map +1 -1
  137. package/build/dist/Server/Services/IncidentEpisodeFeedService.js +83 -0
  138. package/build/dist/Server/Services/IncidentEpisodeFeedService.js.map +1 -0
  139. package/build/dist/Server/Services/IncidentEpisodeInternalNoteService.js +70 -0
  140. package/build/dist/Server/Services/IncidentEpisodeInternalNoteService.js.map +1 -0
  141. package/build/dist/Server/Services/IncidentEpisodeMemberService.js +298 -0
  142. package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -0
  143. package/build/dist/Server/Services/IncidentEpisodeOwnerTeamService.js +9 -0
  144. package/build/dist/Server/Services/IncidentEpisodeOwnerTeamService.js.map +1 -0
  145. package/build/dist/Server/Services/IncidentEpisodeOwnerUserService.js +9 -0
  146. package/build/dist/Server/Services/IncidentEpisodeOwnerUserService.js.map +1 -0
  147. package/build/dist/Server/Services/IncidentEpisodeService.js +933 -0
  148. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -0
  149. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +498 -0
  150. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -0
  151. package/build/dist/Server/Services/IncidentGroupingEngineService.js +799 -0
  152. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -0
  153. package/build/dist/Server/Services/IncidentGroupingRuleService.js +13 -0
  154. package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -0
  155. package/build/dist/Server/Services/IncidentService.js +10 -0
  156. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  157. package/build/dist/Server/Services/Index.js +16 -0
  158. package/build/dist/Server/Services/Index.js.map +1 -1
  159. package/build/dist/Server/Services/MailService.js.map +1 -1
  160. package/build/dist/Server/Services/MonitorService.js +9 -1
  161. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  162. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +10 -0
  163. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  164. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +48 -2
  165. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  166. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +20 -1
  167. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  168. package/build/dist/Server/Services/OnCallDutyPolicyService.js +8 -0
  169. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  170. package/build/dist/Server/Services/SmsService.js.map +1 -1
  171. package/build/dist/Server/Services/UserNotificationRuleService.js +39 -2
  172. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  173. package/build/dist/Server/Services/UserNotificationSettingService.js +9 -0
  174. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  175. package/build/dist/Server/Services/UserOnCallLogService.js +35 -3
  176. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  177. package/build/dist/Server/Services/WhatsAppService.js.map +1 -1
  178. package/build/dist/Server/Services/WorkspaceNotificationLogService.js +12 -0
  179. package/build/dist/Server/Services/WorkspaceNotificationLogService.js.map +1 -1
  180. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +95 -1
  181. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  182. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js +402 -0
  183. package/build/dist/Server/Utils/AI/IncidentEpisodeAIContextBuilder.js.map +1 -0
  184. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +1 -1
  185. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  186. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +1 -1
  187. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +1 -1
  188. package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +2 -2
  189. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +135 -0
  190. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -0
  191. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +10 -0
  192. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  193. package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +1 -1
  194. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +26 -0
  195. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  196. package/build/dist/Server/Utils/PushNotificationUtil.js +20 -0
  197. package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
  198. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +8 -0
  199. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  200. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js +17 -0
  201. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes.js.map +1 -1
  202. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +547 -0
  203. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -0
  204. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +15 -0
  205. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  206. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +10 -0
  207. package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
  208. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +651 -0
  209. package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -0
  210. package/build/dist/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.js +100 -0
  211. package/build/dist/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.js.map +1 -0
  212. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.js +70 -0
  213. package/build/dist/Server/Utils/Workspace/WorkspaceMessages/IncidentEpisode.js.map +1 -0
  214. package/build/dist/Types/Email/EmailTemplateType.js +5 -0
  215. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  216. package/build/dist/Types/Monitor/CriteriaFilter.js +16 -3
  217. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  218. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
  219. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  220. package/build/dist/Types/Monitor/MonitorStep.js +26 -0
  221. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  222. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +77 -0
  223. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -0
  224. package/build/dist/Types/Monitor/MonitorType.js +13 -2
  225. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  226. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +9 -0
  227. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -0
  228. package/build/dist/Types/Monitor/SnmpMonitor/SnmpDataType.js +22 -0
  229. package/build/dist/Types/Monitor/SnmpMonitor/SnmpDataType.js.map +1 -0
  230. package/build/dist/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.js +2 -0
  231. package/build/dist/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.js.map +1 -0
  232. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOid.js +55 -0
  233. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOid.js.map +1 -0
  234. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +8 -0
  235. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -0
  236. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +8 -0
  237. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -0
  238. package/build/dist/Types/Monitor/SnmpMonitor/SnmpV3Auth.js +2 -0
  239. package/build/dist/Types/Monitor/SnmpMonitor/SnmpV3Auth.js.map +1 -0
  240. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js +8 -0
  241. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVersion.js.map +1 -0
  242. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +5 -0
  243. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  244. package/build/dist/Types/Permission.js +264 -0
  245. package/build/dist/Types/Permission.js.map +1 -1
  246. package/build/dist/Types/UserNotification/UserNotificationEventType.js +1 -0
  247. package/build/dist/Types/UserNotification/UserNotificationEventType.js.map +1 -1
  248. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js +15 -0
  249. package/build/dist/Types/WhatsApp/WhatsAppTemplates.js.map +1 -1
  250. package/build/dist/Types/Workspace/NotificationRules/EventType.js +1 -0
  251. package/build/dist/Types/Workspace/NotificationRules/EventType.js.map +1 -1
  252. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +33 -1
  253. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  254. package/build/dist/Utils/Monitor/MonitorMetricType.js +2 -1
  255. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  256. package/package.json +1 -1
@@ -198,6 +198,15 @@ import AlertEpisodeInternalNote from "./AlertEpisodeInternalNote";
198
198
  import AlertEpisodeFeed from "./AlertEpisodeFeed";
199
199
  import AlertGroupingRule from "./AlertGroupingRule";
200
200
 
201
+ import IncidentEpisode from "./IncidentEpisode";
202
+ import IncidentEpisodeMember from "./IncidentEpisodeMember";
203
+ import IncidentEpisodeStateTimeline from "./IncidentEpisodeStateTimeline";
204
+ import IncidentEpisodeOwnerUser from "./IncidentEpisodeOwnerUser";
205
+ import IncidentEpisodeOwnerTeam from "./IncidentEpisodeOwnerTeam";
206
+ import IncidentEpisodeInternalNote from "./IncidentEpisodeInternalNote";
207
+ import IncidentEpisodeFeed from "./IncidentEpisodeFeed";
208
+ import IncidentGroupingRule from "./IncidentGroupingRule";
209
+
201
210
  import TableView from "./TableView";
202
211
  import Dashboard from "./Dashboard";
203
212
 
@@ -291,6 +300,15 @@ const AllModelTypes: Array<{
291
300
  AlertEpisodeFeed,
292
301
  AlertGroupingRule,
293
302
 
303
+ IncidentEpisode,
304
+ IncidentEpisodeMember,
305
+ IncidentEpisodeStateTimeline,
306
+ IncidentEpisodeOwnerUser,
307
+ IncidentEpisodeOwnerTeam,
308
+ IncidentEpisodeInternalNote,
309
+ IncidentEpisodeFeed,
310
+ IncidentGroupingRule,
311
+
294
312
  MonitorStatusTimeline,
295
313
 
296
314
  File,
@@ -26,6 +26,7 @@ import UserNotificationEventType from "../../Types/UserNotification/UserNotifica
26
26
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
27
27
  import Alert from "./Alert";
28
28
  import AlertEpisode from "./AlertEpisode";
29
+ import IncidentEpisode from "./IncidentEpisode";
29
30
  import EnableWorkflow from "../../Types/Database/EnableWorkflow";
30
31
 
31
32
  @TableBillingAccessControl({
@@ -412,6 +413,75 @@ export default class OnCallDutyPolicyExecutionLog extends BaseModel {
412
413
  })
413
414
  public triggeredByAlertEpisodeId?: ObjectID = undefined;
414
415
 
416
+ @ColumnAccessControl({
417
+ create: [
418
+ Permission.ProjectOwner,
419
+ Permission.ProjectAdmin,
420
+ Permission.ProjectMember,
421
+ Permission.CreateProjectOnCallDutyPolicyExecutionLog,
422
+ ],
423
+ read: [
424
+ Permission.ProjectOwner,
425
+ Permission.ProjectAdmin,
426
+ Permission.ProjectMember,
427
+ Permission.ReadProjectOnCallDutyPolicyExecutionLog,
428
+ ],
429
+ update: [],
430
+ })
431
+ @TableColumn({
432
+ manyToOneRelationColumn: "triggeredByIncidentEpisodeId",
433
+ type: TableColumnType.Entity,
434
+ modelType: IncidentEpisode,
435
+ title: "Triggered By Incident Episode",
436
+ description:
437
+ "Relation to the incident episode which triggered this on-call escalation policy.",
438
+ })
439
+ @ManyToOne(
440
+ () => {
441
+ return IncidentEpisode;
442
+ },
443
+ {
444
+ eager: false,
445
+ nullable: true,
446
+ onDelete: "CASCADE",
447
+ orphanedRowAction: "nullify",
448
+ },
449
+ )
450
+ @JoinColumn({ name: "triggeredByIncidentEpisodeId" })
451
+ public triggeredByIncidentEpisode?: IncidentEpisode = undefined;
452
+
453
+ @ColumnAccessControl({
454
+ create: [
455
+ Permission.ProjectOwner,
456
+ Permission.ProjectAdmin,
457
+ Permission.ProjectMember,
458
+ Permission.CreateProjectOnCallDutyPolicyExecutionLog,
459
+ ],
460
+ read: [
461
+ Permission.ProjectOwner,
462
+ Permission.ProjectAdmin,
463
+ Permission.ProjectMember,
464
+ Permission.ReadProjectOnCallDutyPolicyExecutionLog,
465
+ ],
466
+ update: [],
467
+ })
468
+ @Index()
469
+ @TableColumn({
470
+ type: TableColumnType.ObjectID,
471
+ required: false,
472
+ canReadOnRelationQuery: true,
473
+ title: "Triggered By Incident Episode ID",
474
+ description:
475
+ "ID of the incident episode which triggered this on-call escalation policy.",
476
+ example: "a7b8c9d0-e1f2-3456-0123-567890123456",
477
+ })
478
+ @Column({
479
+ type: ColumnType.ObjectID,
480
+ nullable: true,
481
+ transformer: ObjectID.getDatabaseTransformer(),
482
+ })
483
+ public triggeredByIncidentEpisodeId?: ObjectID = undefined;
484
+
415
485
  @ColumnAccessControl({
416
486
  create: [
417
487
  Permission.ProjectOwner,
@@ -28,6 +28,7 @@ import UserNotificationEventType from "../../Types/UserNotification/UserNotifica
28
28
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
29
29
  import Alert from "./Alert";
30
30
  import AlertEpisode from "./AlertEpisode";
31
+ import IncidentEpisode from "./IncidentEpisode";
31
32
 
32
33
  @TableBillingAccessControl({
33
34
  create: PlanType.Growth,
@@ -347,6 +348,64 @@ export default class OnCallDutyPolicyExecutionLogTimeline extends BaseModel {
347
348
  })
348
349
  public triggeredByAlertEpisodeId?: ObjectID = undefined;
349
350
 
351
+ @ColumnAccessControl({
352
+ create: [],
353
+ read: [
354
+ Permission.ProjectOwner,
355
+ Permission.ProjectAdmin,
356
+ Permission.ProjectMember,
357
+ Permission.ReadProjectOnCallDutyPolicyExecutionLogTimeline,
358
+ ],
359
+ update: [],
360
+ })
361
+ @TableColumn({
362
+ manyToOneRelationColumn: "triggeredByIncidentEpisodeId",
363
+ type: TableColumnType.Entity,
364
+ modelType: IncidentEpisode,
365
+ title: "Incident Episode",
366
+ description:
367
+ "Relation to Incident Episode Resource in which this object belongs",
368
+ })
369
+ @ManyToOne(
370
+ () => {
371
+ return IncidentEpisode;
372
+ },
373
+ {
374
+ eager: false,
375
+ nullable: true,
376
+ onDelete: "CASCADE",
377
+ orphanedRowAction: "nullify",
378
+ },
379
+ )
380
+ @JoinColumn({ name: "triggeredByIncidentEpisodeId" })
381
+ public triggeredByIncidentEpisode?: IncidentEpisode = undefined;
382
+
383
+ @ColumnAccessControl({
384
+ create: [],
385
+ read: [
386
+ Permission.ProjectOwner,
387
+ Permission.ProjectAdmin,
388
+ Permission.ProjectMember,
389
+ Permission.ReadProjectOnCallDutyPolicyExecutionLogTimeline,
390
+ ],
391
+ update: [],
392
+ })
393
+ @Index()
394
+ @TableColumn({
395
+ type: TableColumnType.ObjectID,
396
+ required: false,
397
+ canReadOnRelationQuery: true,
398
+ title: "Incident Episode ID",
399
+ description:
400
+ "ID of your OneUptime Incident Episode in which this object belongs",
401
+ })
402
+ @Column({
403
+ type: ColumnType.ObjectID,
404
+ nullable: true,
405
+ transformer: ObjectID.getDatabaseTransformer(),
406
+ })
407
+ public triggeredByIncidentEpisodeId?: ObjectID = undefined;
408
+
350
409
  @ColumnAccessControl({
351
410
  create: [],
352
411
  read: [
@@ -29,6 +29,7 @@ import UserNotificationEventType from "../../Types/UserNotification/UserNotifica
29
29
  import UserNotificationExecutionStatus from "../../Types/UserNotification/UserNotificationExecutionStatus";
30
30
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
31
31
  import AlertEpisode from "./AlertEpisode";
32
+ import IncidentEpisode from "./IncidentEpisode";
32
33
  import Alert from "./Alert";
33
34
 
34
35
  @EnableDocumentation()
@@ -481,6 +482,53 @@ export default class UserOnCallLog extends BaseModel {
481
482
  })
482
483
  public triggeredByAlertEpisodeId?: ObjectID = undefined;
483
484
 
485
+ @ColumnAccessControl({
486
+ create: [],
487
+ read: [Permission.CurrentUser],
488
+ update: [],
489
+ })
490
+ @TableColumn({
491
+ manyToOneRelationColumn: "triggeredByIncidentEpisodeId",
492
+ type: TableColumnType.Entity,
493
+ modelType: IncidentEpisode,
494
+ title: "Triggered By Incident Episode",
495
+ description:
496
+ "Relation to Incident Episode which triggered this on-call duty policy.",
497
+ })
498
+ @ManyToOne(
499
+ () => {
500
+ return IncidentEpisode;
501
+ },
502
+ {
503
+ eager: false,
504
+ nullable: true,
505
+ onDelete: "CASCADE",
506
+ orphanedRowAction: "nullify",
507
+ },
508
+ )
509
+ @JoinColumn({ name: "triggeredByIncidentEpisodeId" })
510
+ public triggeredByIncidentEpisode?: IncidentEpisode = undefined;
511
+
512
+ @ColumnAccessControl({
513
+ create: [],
514
+ read: [Permission.CurrentUser],
515
+ update: [],
516
+ })
517
+ @TableColumn({
518
+ type: TableColumnType.ObjectID,
519
+ title: "Triggered By Incident Episode ID",
520
+ required: false,
521
+ description:
522
+ "ID of the Incident Episode which triggered this on-call escalation policy.",
523
+ example: "3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f",
524
+ })
525
+ @Column({
526
+ type: ColumnType.ObjectID,
527
+ nullable: true,
528
+ transformer: ObjectID.getDatabaseTransformer(),
529
+ })
530
+ public triggeredByIncidentEpisodeId?: ObjectID = undefined;
531
+
484
532
  @ColumnAccessControl({
485
533
  create: [],
486
534
  read: [Permission.CurrentUser],
@@ -1,6 +1,7 @@
1
1
  import Incident from "./Incident";
2
2
  import Alert from "./Alert";
3
3
  import AlertEpisode from "./AlertEpisode";
4
+ import IncidentEpisode from "./IncidentEpisode";
4
5
  import OnCallDutyPolicy from "./OnCallDutyPolicy";
5
6
  import OnCallDutyPolicyEscalationRule from "./OnCallDutyPolicyEscalationRule";
6
7
  import OnCallDutyPolicyExecutionLog from "./OnCallDutyPolicyExecutionLog";
@@ -438,6 +439,54 @@ export default class UserOnCallLogTimeline extends BaseModel {
438
439
  })
439
440
  public triggeredByAlertEpisodeId?: ObjectID = undefined;
440
441
 
442
+ @ColumnAccessControl({
443
+ create: [],
444
+ read: [Permission.CurrentUser],
445
+ update: [],
446
+ })
447
+ @TableColumn({
448
+ manyToOneRelationColumn: "triggeredByIncidentEpisodeId",
449
+ type: TableColumnType.Entity,
450
+ modelType: IncidentEpisode,
451
+ title: "Incident Episode",
452
+ description:
453
+ "Relation to Incident Episode Resource in which this object belongs",
454
+ })
455
+ @ManyToOne(
456
+ () => {
457
+ return IncidentEpisode;
458
+ },
459
+ {
460
+ eager: false,
461
+ nullable: true,
462
+ onDelete: "CASCADE",
463
+ orphanedRowAction: "nullify",
464
+ },
465
+ )
466
+ @JoinColumn({ name: "triggeredByIncidentEpisodeId" })
467
+ public triggeredByIncidentEpisode?: IncidentEpisode = undefined;
468
+
469
+ @ColumnAccessControl({
470
+ create: [],
471
+ read: [Permission.CurrentUser],
472
+ update: [],
473
+ })
474
+ @Index()
475
+ @TableColumn({
476
+ type: TableColumnType.ObjectID,
477
+ required: false,
478
+ canReadOnRelationQuery: true,
479
+ title: "Incident Episode ID",
480
+ description:
481
+ "ID of your OneUptime Incident Episode in which this object belongs",
482
+ })
483
+ @Column({
484
+ type: ColumnType.ObjectID,
485
+ nullable: true,
486
+ transformer: ObjectID.getDatabaseTransformer(),
487
+ })
488
+ public triggeredByIncidentEpisodeId?: ObjectID = undefined;
489
+
441
490
  @ColumnAccessControl({
442
491
  create: [],
443
492
  read: [Permission.CurrentUser],
@@ -2,6 +2,7 @@ import Project from "./Project";
2
2
  import Incident from "./Incident";
3
3
  import Alert from "./Alert";
4
4
  import AlertEpisode from "./AlertEpisode";
5
+ import IncidentEpisode from "./IncidentEpisode";
5
6
  import ScheduledMaintenance from "./ScheduledMaintenance";
6
7
  import StatusPage from "./StatusPage";
7
8
  import StatusPageAnnouncement from "./StatusPageAnnouncement";
@@ -539,6 +540,62 @@ export default class WorkspaceNotificationLog extends BaseModel {
539
540
  })
540
541
  public alertEpisodeId?: ObjectID = undefined;
541
542
 
543
+ @ColumnAccessControl({
544
+ create: [],
545
+ read: [
546
+ Permission.ProjectOwner,
547
+ Permission.ProjectAdmin,
548
+ Permission.ProjectMember,
549
+ Permission.ReadPushLog,
550
+ ],
551
+ update: [],
552
+ })
553
+ @TableColumn({
554
+ manyToOneRelationColumn: "incidentEpisodeId",
555
+ type: TableColumnType.Entity,
556
+ modelType: IncidentEpisode,
557
+ title: "Incident Episode",
558
+ description: "Incident Episode associated with this message (if any)",
559
+ })
560
+ @ManyToOne(
561
+ () => {
562
+ return IncidentEpisode;
563
+ },
564
+ {
565
+ eager: false,
566
+ nullable: true,
567
+ onDelete: "CASCADE",
568
+ orphanedRowAction: "nullify",
569
+ },
570
+ )
571
+ @JoinColumn({ name: "incidentEpisodeId" })
572
+ public incidentEpisode?: IncidentEpisode = undefined;
573
+
574
+ @ColumnAccessControl({
575
+ create: [],
576
+ read: [
577
+ Permission.ProjectOwner,
578
+ Permission.ProjectAdmin,
579
+ Permission.ProjectMember,
580
+ Permission.ReadPushLog,
581
+ ],
582
+ update: [],
583
+ })
584
+ @Index()
585
+ @TableColumn({
586
+ type: TableColumnType.ObjectID,
587
+ required: false,
588
+ canReadOnRelationQuery: true,
589
+ title: "Incident Episode ID",
590
+ description: "ID of Incident Episode associated with this message (if any)",
591
+ })
592
+ @Column({
593
+ type: ColumnType.ObjectID,
594
+ nullable: true,
595
+ transformer: ObjectID.getDatabaseTransformer(),
596
+ })
597
+ public incidentEpisodeId?: ObjectID = undefined;
598
+
542
599
  @ColumnAccessControl({
543
600
  create: [],
544
601
  read: [
@@ -0,0 +1,150 @@
1
+ import IncidentEpisode from "../../Models/DatabaseModels/IncidentEpisode";
2
+ import BadDataException from "../../Types/Exception/BadDataException";
3
+ import NotFoundException from "../../Types/Exception/NotFoundException";
4
+ import ObjectID from "../../Types/ObjectID";
5
+ import IncidentEpisodeService, {
6
+ Service as IncidentEpisodeServiceType,
7
+ } from "../Services/IncidentEpisodeService";
8
+ import UserMiddleware from "../Middleware/UserAuthorization";
9
+ import Response from "../Utils/Response";
10
+ import BaseAPI from "./BaseAPI";
11
+ import {
12
+ ExpressRequest,
13
+ ExpressResponse,
14
+ NextFunction,
15
+ } from "../Utils/Express";
16
+ import CommonAPI from "./CommonAPI";
17
+ import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
18
+ import AIService, { AILogRequest, AILogResponse } from "../Services/AIService";
19
+ import IncidentEpisodeAIContextBuilder, {
20
+ IncidentEpisodeContextData,
21
+ } from "../Utils/AI/IncidentEpisodeAIContextBuilder";
22
+ import { AIGenerationContext } from "../Utils/AI/IncidentAIContextBuilder";
23
+ import JSONFunctions from "../../Types/JSONFunctions";
24
+ import Permission from "../../Types/Permission";
25
+
26
+ export default class IncidentEpisodeAPI extends BaseAPI<
27
+ IncidentEpisode,
28
+ IncidentEpisodeServiceType
29
+ > {
30
+ public constructor() {
31
+ super(IncidentEpisode, IncidentEpisodeService);
32
+
33
+ // Generate postmortem from AI
34
+ this.router.post(
35
+ `${new this.entityType()
36
+ .getCrudApiPath()
37
+ ?.toString()}/generate-postmortem-from-ai/:episodeId`,
38
+ UserMiddleware.getUserMiddleware,
39
+ async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
40
+ try {
41
+ await this.generatePostmortemFromAI(req, res);
42
+ } catch (err) {
43
+ next(err);
44
+ }
45
+ },
46
+ );
47
+ }
48
+
49
+ private async generatePostmortemFromAI(
50
+ req: ExpressRequest,
51
+ res: ExpressResponse,
52
+ ): Promise<void> {
53
+ const episodeIdParam: string | undefined = req.params["episodeId"];
54
+
55
+ if (!episodeIdParam) {
56
+ throw new BadDataException("Episode ID is required");
57
+ }
58
+
59
+ let episodeId: ObjectID;
60
+
61
+ try {
62
+ episodeId = new ObjectID(episodeIdParam);
63
+ } catch {
64
+ throw new BadDataException("Invalid Episode ID");
65
+ }
66
+
67
+ const props: DatabaseCommonInteractionProps =
68
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
69
+
70
+ // Verify user has permission to edit the episode
71
+ const permissions: Array<Permission> | undefined = props
72
+ .userTenantAccessPermission?.["permissions"] as
73
+ | Array<Permission>
74
+ | undefined;
75
+
76
+ const hasPermission: boolean = permissions
77
+ ? permissions.some((p: Permission) => {
78
+ return (
79
+ p === Permission.ProjectOwner ||
80
+ p === Permission.ProjectAdmin ||
81
+ p === Permission.EditIncidentEpisode
82
+ );
83
+ })
84
+ : false;
85
+
86
+ if (!hasPermission && !props.isMasterAdmin) {
87
+ throw new BadDataException(
88
+ "You do not have permission to generate postmortem for this episode. You need to have one of these permissions: Project Owner, Project Admin, Edit Incident Episode.",
89
+ );
90
+ }
91
+
92
+ // Get the template from request body if provided
93
+ const template: string | undefined = JSONFunctions.getJSONValueInPath(
94
+ req.body,
95
+ "template",
96
+ ) as string | undefined;
97
+
98
+ // Always include workspace messages for comprehensive context
99
+ const includeWorkspaceMessages: boolean = true;
100
+
101
+ // Get the episode to verify it exists and get the project ID
102
+ const episode: IncidentEpisode | null = await this.service.findOneById({
103
+ id: episodeId,
104
+ select: {
105
+ _id: true,
106
+ projectId: true,
107
+ },
108
+ props,
109
+ });
110
+
111
+ if (!episode || !episode.projectId) {
112
+ throw new NotFoundException("Episode not found");
113
+ }
114
+
115
+ // Build episode context
116
+ const contextData: IncidentEpisodeContextData =
117
+ await IncidentEpisodeAIContextBuilder.buildEpisodeContext({
118
+ episodeId,
119
+ includeWorkspaceMessages,
120
+ workspaceMessageLimit: 500,
121
+ });
122
+
123
+ // Format context for postmortem generation
124
+ const aiContext: AIGenerationContext =
125
+ IncidentEpisodeAIContextBuilder.formatEpisodeContextForPostmortem(
126
+ contextData,
127
+ template,
128
+ );
129
+
130
+ // Generate postmortem using AIService (handles billing and logging)
131
+ const aiLogRequest: AILogRequest = {
132
+ projectId: episode.projectId,
133
+ feature: "Incident Episode Postmortem",
134
+ messages: aiContext.messages,
135
+ maxTokens: 8192,
136
+ temperature: 0.7,
137
+ };
138
+
139
+ if (props.userId) {
140
+ aiLogRequest.userId = props.userId;
141
+ }
142
+
143
+ const response: AILogResponse =
144
+ await AIService.executeWithLogging(aiLogRequest);
145
+
146
+ return Response.sendJsonObjectResponse(req, res, {
147
+ postmortemNote: response.content,
148
+ });
149
+ }
150
+ }
@@ -32,6 +32,7 @@ import SlackAuthAction, {
32
32
  import SlackIncidentActions from "../Utils/Workspace/Slack/Actions/Incident";
33
33
  import SlackAlertActions from "../Utils/Workspace/Slack/Actions/Alert";
34
34
  import SlackAlertEpisodeActions from "../Utils/Workspace/Slack/Actions/AlertEpisode";
35
+ import SlackIncidentEpisodeActions from "../Utils/Workspace/Slack/Actions/IncidentEpisode";
35
36
  import SlackScheduledMaintenanceActions from "../Utils/Workspace/Slack/Actions/ScheduledMaintenance";
36
37
  import LIMIT_MAX from "../../Types/Database/LimitMax";
37
38
  import SlackMonitorActions from "../Utils/Workspace/Slack/Actions/Monitor";
@@ -647,6 +648,19 @@ export default class SlackAPI {
647
648
  });
648
649
  }
649
650
 
651
+ if (
652
+ SlackIncidentEpisodeActions.isIncidentEpisodeAction({
653
+ actionType: action.actionType,
654
+ })
655
+ ) {
656
+ return SlackIncidentEpisodeActions.handleIncidentEpisodeAction({
657
+ slackRequest: authResult,
658
+ action: action,
659
+ req: req,
660
+ res: res,
661
+ });
662
+ }
663
+
650
664
  if (
651
665
  SlackMonitorActions.isMonitorAction({
652
666
  actionType: action.actionType,
@@ -837,6 +851,15 @@ export default class SlackAPI {
837
851
  logger.error(err);
838
852
  }
839
853
 
854
+ try {
855
+ await SlackIncidentEpisodeActions.handleEmojiReaction(
856
+ reactionData,
857
+ );
858
+ } catch (err) {
859
+ logger.error("Error handling incident episode emoji reaction:");
860
+ logger.error(err);
861
+ }
862
+
840
863
  try {
841
864
  await SlackScheduledMaintenanceActions.handleEmojiReaction(
842
865
  reactionData,
@@ -142,6 +142,11 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
142
142
  title: true,
143
143
  description: true,
144
144
  },
145
+ triggeredByIncidentEpisodeId: true,
146
+ triggeredByIncidentEpisode: {
147
+ title: true,
148
+ description: true,
149
+ },
145
150
  },
146
151
  props: {
147
152
  isRoot: true,
@@ -158,12 +163,15 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
158
163
 
159
164
  const notificationType: string = timelineItem.triggeredByIncidentId
160
165
  ? "Incident"
161
- : timelineItem.triggeredByAlertEpisodeId
162
- ? "Alert Episode"
163
- : "Alert";
166
+ : timelineItem.triggeredByIncidentEpisodeId
167
+ ? "Incident Episode"
168
+ : timelineItem.triggeredByAlertEpisodeId
169
+ ? "Alert Episode"
170
+ : "Alert";
164
171
 
165
172
  const notificationTitle: string =
166
173
  timelineItem.triggeredByIncident?.title ||
174
+ timelineItem.triggeredByIncidentEpisode?.title ||
167
175
  timelineItem.triggeredByAlertEpisode?.title ||
168
176
  timelineItem.triggeredByAlert?.title ||
169
177
  "";
@@ -222,6 +230,7 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
222
230
  triggeredByIncidentId: true,
223
231
  triggeredByAlertId: true,
224
232
  triggeredByAlertEpisodeId: true,
233
+ triggeredByIncidentEpisodeId: true,
225
234
  triggeredByAlert: {
226
235
  title: true,
227
236
  },
@@ -231,6 +240,9 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
231
240
  triggeredByAlertEpisode: {
232
241
  title: true,
233
242
  },
243
+ triggeredByIncidentEpisode: {
244
+ title: true,
245
+ },
234
246
  acknowledgedAt: true,
235
247
  isAcknowledged: true,
236
248
  },
@@ -267,10 +279,18 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
267
279
  title: timelineItem.triggeredByIncident?.title || "",
268
280
  };
269
281
  }
282
+ if (timelineItem.triggeredByIncidentEpisodeId) {
283
+ return {
284
+ type: "Incident Episode",
285
+ path: "incidents/episodes",
286
+ id: timelineItem.triggeredByIncidentEpisodeId,
287
+ title: timelineItem.triggeredByIncidentEpisode?.title || "",
288
+ };
289
+ }
270
290
  if (timelineItem.triggeredByAlertEpisodeId) {
271
291
  return {
272
292
  type: "Alert Episode",
273
- path: "alert-episodes",
293
+ path: "alerts/episodes",
274
294
  id: timelineItem.triggeredByAlertEpisodeId,
275
295
  title: timelineItem.triggeredByAlertEpisode?.title || "",
276
296
  };