@oneuptime/common 12.0.8 → 12.0.9

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 (769) hide show
  1. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +1 -1
  2. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +1 -1
  3. package/Models/DatabaseModels/AIConversation.ts +32 -0
  4. package/Models/DatabaseModels/AIConversationMessage.ts +41 -0
  5. package/Models/DatabaseModels/AlertEpisodeMember.ts +27 -0
  6. package/Models/DatabaseModels/IncidentEpisodeMember.ts +28 -0
  7. package/Models/DatabaseModels/Index.ts +12 -4
  8. package/Models/DatabaseModels/{TelemetryEntity.ts → InventoryItem.ts} +139 -9
  9. package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
  10. package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +8 -8
  11. package/Models/DatabaseModels/NetworkDevice.ts +141 -0
  12. package/Models/DatabaseModels/NetworkDeviceLink.ts +699 -0
  13. package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +467 -0
  14. package/Models/DatabaseModels/NetworkTopologySuppression.ts +429 -0
  15. package/Models/DatabaseModels/OnCallDutyPolicyFeed.ts +9 -0
  16. package/Models/DatabaseModels/Project.ts +78 -0
  17. package/Models/DatabaseModels/UserCall.ts +42 -0
  18. package/Models/DatabaseModels/UserEmail.ts +44 -0
  19. package/Models/DatabaseModels/UserNotificationRule.ts +425 -55
  20. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +24 -2
  21. package/Models/DatabaseModels/UserPush.ts +49 -0
  22. package/Models/DatabaseModels/UserSMS.ts +43 -0
  23. package/Models/DatabaseModels/UserTelegram.ts +59 -0
  24. package/Models/DatabaseModels/UserWebhook.ts +52 -0
  25. package/Models/DatabaseModels/UserWhatsApp.ts +41 -0
  26. package/Models/DatabaseModels/WorkflowVariable.ts +12 -0
  27. package/Server/API/AIChatAPI.ts +315 -1
  28. package/Server/API/DashboardAPI.ts +217 -1
  29. package/Server/API/OnCallReadinessAPI.ts +841 -0
  30. package/Server/API/TeamComplianceAPI.ts +69 -17
  31. package/Server/API/TelemetryAPI.ts +220 -12
  32. package/Server/EnvironmentConfig.ts +52 -0
  33. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +22 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +4 -4
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +5 -5
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.ts +35 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.ts +82 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.ts +91 -0
  39. package/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.ts +47 -0
  40. package/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.ts +255 -0
  41. package/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.ts +107 -0
  42. package/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.ts +90 -0
  43. package/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.ts +39 -0
  44. package/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.ts +33 -0
  45. package/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.ts +59 -0
  46. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
  47. package/Server/Infrastructure/Queue.ts +78 -13
  48. package/Server/Middleware/PublicDashboardRateLimit.ts +593 -0
  49. package/Server/Services/AIService.ts +7 -0
  50. package/Server/Services/AlertEpisodeStateTimelineService.ts +29 -0
  51. package/Server/Services/AlertSeverityService.ts +63 -0
  52. package/Server/Services/DashboardService.ts +9 -10
  53. package/Server/Services/DatabaseService.ts +32 -2
  54. package/Server/Services/IncidentEpisodeStateTimelineService.ts +29 -0
  55. package/Server/Services/IncidentSeverityService.ts +76 -0
  56. package/Server/Services/Index.ts +12 -4
  57. package/Server/Services/InventoryItemCustomFieldService.ts +9 -0
  58. package/Server/Services/{TelemetryEntityRelationshipService.ts → InventoryItemRelationshipService.ts} +4 -4
  59. package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +89 -20
  60. package/Server/Services/LogAggregationService.ts +45 -8
  61. package/Server/Services/MetricAggregationService.ts +121 -0
  62. package/Server/Services/MetricService.ts +7 -7
  63. package/Server/Services/NetworkDeviceLinkRuleService.ts +10 -0
  64. package/Server/Services/NetworkDeviceLinkService.ts +84 -0
  65. package/Server/Services/NetworkDeviceService.ts +140 -0
  66. package/Server/Services/NetworkSiteService.ts +77 -25
  67. package/Server/Services/NetworkTopologySuppressionService.ts +84 -0
  68. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +41 -29
  69. package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +8 -0
  70. package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +62 -13
  71. package/Server/Services/OnCallDutyPolicyScheduleService.ts +61 -1
  72. package/Server/Services/OnCallNotificationAlertingService.ts +742 -0
  73. package/Server/Services/OnCallReadinessService.ts +2803 -0
  74. package/Server/Services/OnCallSetupReminderService.ts +955 -0
  75. package/Server/Services/ProfileAggregationService.ts +123 -0
  76. package/Server/Services/StatusPageService.ts +9 -10
  77. package/Server/Services/TeamComplianceService.ts +429 -252
  78. package/Server/Services/UserCallService.ts +26 -1
  79. package/Server/Services/UserEmailService.ts +26 -1
  80. package/Server/Services/UserNotificationRuleAdminService.ts +1183 -0
  81. package/Server/Services/UserNotificationRuleService.ts +3812 -333
  82. package/Server/Services/UserOnCallLogService.ts +561 -48
  83. package/Server/Services/UserPushService.ts +29 -0
  84. package/Server/Services/UserService.ts +11 -0
  85. package/Server/Services/UserSmsService.ts +26 -1
  86. package/Server/Services/UserTelegramService.ts +24 -1
  87. package/Server/Services/UserWebhookService.ts +28 -1
  88. package/Server/Services/UserWhatsAppService.ts +24 -1
  89. package/Server/Types/Database/Permissions/BasePermission.ts +19 -0
  90. package/Server/Types/Database/Permissions/CreatePermission.ts +164 -0
  91. package/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.ts +340 -0
  92. package/Server/Types/Database/Permissions/QueryPermission.ts +48 -0
  93. package/Server/Types/Database/Permissions/TenantPermission.ts +8 -1
  94. package/Server/Types/Workflow/Components/API/Delete.ts +1 -1
  95. package/Server/Types/Workflow/Components/API/Get.ts +1 -1
  96. package/Server/Types/Workflow/Components/API/Patch.ts +1 -1
  97. package/Server/Types/Workflow/Components/API/Post.ts +1 -1
  98. package/Server/Types/Workflow/Components/API/Put.ts +1 -1
  99. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +29 -5
  100. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +18 -10
  101. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +55 -0
  102. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +3 -17
  103. package/Server/Types/Workflow/Components/Email.ts +25 -7
  104. package/Server/Types/Workflow/Components/JavaScript.ts +10 -3
  105. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +1 -1
  106. package/Server/Utils/AI/Chat/ChatAgentRunner.ts +643 -48
  107. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +32 -3
  108. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +20 -6
  109. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +7 -0
  110. package/Server/Utils/AI/Toolbox/AIActionTools.ts +2 -2
  111. package/Server/Utils/AI/Toolbox/AIMetaTools.ts +863 -0
  112. package/Server/Utils/AI/Toolbox/AlertTools.ts +177 -15
  113. package/Server/Utils/AI/Toolbox/IncidentTools.ts +191 -10
  114. package/Server/Utils/AI/Toolbox/Index.ts +48 -0
  115. package/Server/Utils/AI/Toolbox/MonitorTools.ts +298 -11
  116. package/Server/Utils/AI/Toolbox/NoteWriteTools.ts +295 -0
  117. package/Server/Utils/AI/Toolbox/OnCallTools.ts +1246 -0
  118. package/Server/Utils/AI/Toolbox/RunbookTools.ts +424 -0
  119. package/Server/Utils/AI/Toolbox/SloTools.ts +456 -0
  120. package/Server/Utils/AI/Toolbox/StatusPageTools.ts +559 -0
  121. package/Server/Utils/AI/Toolbox/TeamTools.ts +327 -0
  122. package/Server/Utils/AI/Toolbox/TimelineTools.ts +615 -0
  123. package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +664 -0
  124. package/Server/Utils/ClientIp.ts +221 -0
  125. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +47 -0
  126. package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +163 -0
  127. package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +147 -0
  128. package/Server/Utils/Express.ts +12 -17
  129. package/Server/Utils/LLM/LLMService.ts +85 -8
  130. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +204 -10
  131. package/Server/Utils/SSRFProtection.ts +98 -23
  132. package/Server/Utils/StartServer.ts +12 -3
  133. package/Server/Utils/Telemetry/EntityRegistry.ts +205 -18
  134. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +25 -25
  135. package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
  136. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +7 -3
  137. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +2146 -0
  138. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +561 -0
  139. package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +2470 -0
  140. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +1897 -0
  141. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3606 -0
  142. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +784 -0
  143. package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +1119 -0
  144. package/Tests/App/Dashboard/SloWidgetFetching.test.tsx +531 -0
  145. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +1312 -0
  146. package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +1390 -0
  147. package/Tests/Models/InventoryItemModel.test.ts +174 -0
  148. package/Tests/Models/InventoryItemNaming.test.ts +302 -0
  149. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +437 -0
  150. package/Tests/Server/API/DashboardPublicRateLimit.test.ts +659 -0
  151. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +18 -0
  152. package/Tests/Server/API/DashboardPublicSloAPI.test.ts +880 -0
  153. package/Tests/Server/API/Helpers.ts +24 -15
  154. package/Tests/Server/API/OnCallReadinessAPI.test.ts +2680 -0
  155. package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +915 -0
  156. package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +533 -0
  157. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +213 -0
  158. package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +432 -0
  159. package/Tests/Server/Infrastructure/Queue.test.ts +293 -0
  160. package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +1645 -0
  161. package/Tests/Server/Services/AdminRuleEditGuards.test.ts +2848 -0
  162. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1393 -0
  163. package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +1802 -0
  164. package/Tests/Server/Services/EpisodeStateTimelineNote.test.ts +304 -0
  165. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +339 -0
  166. package/Tests/Server/Services/{TelemetryEntityManualCreate.test.ts → InventoryItemManualCreate.test.ts} +27 -27
  167. package/Tests/Server/Services/IpAllowlistSpoofing.test.ts +450 -0
  168. package/Tests/Server/Services/LogAggregationService.test.ts +235 -1
  169. package/Tests/Server/Services/MetricAggregationService.test.ts +231 -0
  170. package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +80 -29
  171. package/Tests/Server/Services/MetricServiceAggregate.test.ts +30 -30
  172. package/Tests/Server/Services/NetworkSiteService.test.ts +18 -3
  173. package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +1728 -0
  174. package/Tests/Server/Services/NotificationDeletionImpact.test.ts +2402 -0
  175. package/Tests/Server/Services/OnCallDutyPolicyExecutionLogTimelineGapFeed.test.ts +394 -0
  176. package/Tests/Server/Services/OnCallNotificationFallback.test.ts +1744 -0
  177. package/Tests/Server/Services/OnCallReadinessService.test.ts +4295 -0
  178. package/Tests/Server/Services/OnCallSetupReminder.test.ts +1272 -0
  179. package/Tests/Server/Services/OnCallWeeklyReadinessDigest.test.ts +1021 -0
  180. package/Tests/Server/Services/ProfileAggregationService.test.ts +296 -0
  181. package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +1536 -0
  182. package/Tests/Server/Services/SeverityRuleBackfill.test.ts +1818 -0
  183. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1845 -0
  184. package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +1394 -0
  185. package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +1166 -0
  186. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1468 -0
  187. package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1457 -0
  188. package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +1546 -0
  189. package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +529 -0
  190. package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +1219 -0
  191. package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1089 -0
  192. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +2 -1
  193. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +190 -0
  194. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +44 -14
  195. package/Tests/Server/Types/Workflow/Components/Email.test.ts +151 -0
  196. package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +98 -0
  197. package/Tests/Server/Types/Workflow/Components/JavaScript.test.ts +51 -0
  198. package/Tests/Server/Utils/AI/AIMetaTools.test.ts +586 -0
  199. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +582 -0
  200. package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +726 -0
  201. package/Tests/Server/Utils/AI/IncidentToolsFilters.test.ts +315 -0
  202. package/Tests/Server/Utils/AI/LLMServiceStopReason.test.ts +314 -0
  203. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +26 -3
  204. package/Tests/Server/Utils/AI/NoteWriteTools.test.ts +268 -0
  205. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +169 -0
  206. package/Tests/Server/Utils/AI/OnCallTools.test.ts +664 -0
  207. package/Tests/Server/Utils/AI/RunbookTools.test.ts +325 -0
  208. package/Tests/Server/Utils/AI/SloTools.test.ts +306 -0
  209. package/Tests/Server/Utils/AI/StatusPageTools.test.ts +391 -0
  210. package/Tests/Server/Utils/AI/TeamTools.test.ts +257 -0
  211. package/Tests/Server/Utils/AI/TimelineTools.test.ts +472 -0
  212. package/Tests/Server/Utils/AI/WorkflowProbeTools.test.ts +428 -0
  213. package/Tests/Server/Utils/ClientIp.test.ts +438 -0
  214. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +171 -0
  215. package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +383 -0
  216. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +23 -25
  217. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +6 -0
  218. package/Tests/Server/Utils/Monitor/Criteria/DnssecMonitorCriteria.test.ts +307 -0
  219. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +468 -0
  220. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorTelemetryDeepLinks.test.ts +460 -0
  221. package/Tests/Server/Utils/ResponseRateLimitStatusCodes.test.ts +137 -0
  222. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +40 -8
  223. package/Tests/Server/Utils/SSRFProtectionUserInfo.test.ts +351 -0
  224. package/Tests/Server/Utils/Telemetry/EntityRegistryRetirement.test.ts +531 -0
  225. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +15 -15
  226. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
  227. package/Tests/Types/IP/IP.test.ts +263 -0
  228. package/Tests/Types/IP/IPWhitelist.test.ts +197 -0
  229. package/Tests/Types/IP/IPv6.test.ts +12 -1
  230. package/Tests/Types/Monitor/SnmpOid.test.ts +64 -0
  231. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +110 -0
  232. package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +106 -0
  233. package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeDifferential.test.ts +511 -0
  234. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageEndToEnd.test.ts +489 -0
  235. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageGapTolerance.test.ts +479 -0
  236. package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageState.test.ts +822 -0
  237. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +6 -6
  238. package/Tests/Types/Workflow/BaseModelComponents.test.ts +429 -0
  239. package/Tests/Types/Workflow/Components/BaseModel.test.ts +225 -0
  240. package/Tests/Types/Workflow/IntegrationCredentialMetadata.test.ts +100 -0
  241. package/Tests/Types/Workflow/TemplateSyntax.test.ts +112 -0
  242. package/Tests/Types/Workflow/Templates.test.ts +916 -101
  243. package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
  244. package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
  245. package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
  246. package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
  247. package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
  248. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +913 -0
  249. package/Tests/UI/Components/SimpleLogViewer.test.tsx +228 -0
  250. package/Tests/UI/Components/TableRowSelectability.test.tsx +312 -0
  251. package/Tests/UI/Components/Workflow/GraphLint.test.ts +72 -0
  252. package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
  253. package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +242 -7
  254. package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +15 -7
  255. package/Tests/UI/Components/Workflow/ModelSchema.test.ts +242 -28
  256. package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +59 -1
  257. package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +256 -0
  258. package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +665 -0
  259. package/Tests/UI/Components/Workflow/WorkflowIssuesModal.test.tsx +485 -0
  260. package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +478 -0
  261. package/Tests/UI/Components/Workflow/WorkflowStatusBar.test.tsx +379 -0
  262. package/Tests/UI/EsbuildConfig.test.ts +607 -0
  263. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
  264. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +11 -4
  265. package/Tests/UI/Utils/ModelAPICreateMiscData.test.ts +94 -0
  266. package/Tests/UI/Utils/Platform.test.ts +147 -0
  267. package/Tests/UI/Utils/ProjectInvitationDisplay.test.ts +357 -0
  268. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +198 -0
  269. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +487 -0
  270. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
  271. package/Tests/__mocks__/bullmq.js +55 -0
  272. package/Types/AI/AIChatMessageStatus.ts +8 -1
  273. package/Types/AI/AIChatTypes.ts +12 -0
  274. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +88 -0
  275. package/Types/Exception/ExceptionCode.ts +2 -0
  276. package/Types/Exception/ServiceUnavailableException.ts +8 -0
  277. package/Types/Exception/TooManyRequestsException.ts +8 -0
  278. package/Types/IP/IP.ts +93 -47
  279. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +49 -3
  280. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +55 -0
  281. package/Types/OnCallDutyPolicy/Layer.ts +203 -149
  282. package/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.ts +13 -0
  283. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +155 -10
  284. package/Types/Permission.ts +193 -0
  285. package/Types/Telemetry/EntityRelationshipType.ts +1 -1
  286. package/Types/Telemetry/EntitySource.ts +1 -1
  287. package/Types/Telemetry/EntityType.ts +1 -1
  288. package/Types/Telemetry/EntityTypeGroups.ts +1 -1
  289. package/Types/Workflow/Components/BaseModel.ts +75 -29
  290. package/Types/Workflow/Components/Discord.ts +1 -0
  291. package/Types/Workflow/Components/Email.ts +12 -3
  292. package/Types/Workflow/Components/JavaScript.ts +7 -0
  293. package/Types/Workflow/Components/MicrosoftTeams.ts +3 -2
  294. package/Types/Workflow/Components/Slack.ts +1 -0
  295. package/Types/Workflow/Components/Telegram.ts +1 -0
  296. package/Types/Workflow/TemplateSyntax.ts +44 -0
  297. package/Types/Workflow/Templates.ts +2097 -45
  298. package/UI/Components/Calendar/Calendar.css +43 -0
  299. package/UI/Components/Calendar/Calendar.tsx +8 -0
  300. package/UI/Components/Card/Card.tsx +2 -2
  301. package/UI/Components/Checkbox/Checkbox.tsx +16 -0
  302. package/UI/Components/Dictionary/Dictionary.tsx +48 -9
  303. package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
  304. package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
  305. package/UI/Components/Input/Input.tsx +1 -0
  306. package/UI/Components/KeyboardShortcut/KeyboardKey.ts +185 -0
  307. package/UI/Components/KeyboardShortcut/KeyboardShortcut.tsx +87 -0
  308. package/UI/Components/LogsViewer/LogsViewer.tsx +28 -0
  309. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +31 -0
  310. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -18
  311. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +363 -14
  312. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +11 -0
  313. package/UI/Components/LogsViewer/components/LogsTable.tsx +155 -12
  314. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +29 -0
  315. package/UI/Components/LogsViewer/types.ts +23 -0
  316. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +9 -2
  317. package/UI/Components/Navbar/NavBarMenuModal.tsx +15 -30
  318. package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +442 -0
  319. package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +23 -1
  320. package/UI/Components/Table/Table.tsx +49 -16
  321. package/UI/Components/Table/TableBody.tsx +53 -28
  322. package/UI/Components/Table/TableHeader.tsx +13 -0
  323. package/UI/Components/Table/TableRow.tsx +58 -26
  324. package/UI/Components/Workflow/ArgumentsForm.tsx +155 -9
  325. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
  326. package/UI/Components/Workflow/ComponentSettingsModal.tsx +10 -1
  327. package/UI/Components/Workflow/ComponentValuePickerModal.tsx +135 -7
  328. package/UI/Components/Workflow/ComponentsModal.tsx +116 -22
  329. package/UI/Components/Workflow/DocumentationViewer.tsx +59 -9
  330. package/UI/Components/Workflow/GraphLint.ts +42 -5
  331. package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
  332. package/UI/Components/Workflow/ModelColumnEditor.tsx +154 -22
  333. package/UI/Components/Workflow/ModelSchema.ts +115 -33
  334. package/UI/Components/Workflow/RunStatusWatcher.ts +1 -1
  335. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  336. package/UI/Components/Workflow/UseRunWatch.ts +212 -0
  337. package/UI/Components/Workflow/VariableModal.tsx +6 -2
  338. package/UI/Components/Workflow/Workflow.tsx +49 -3
  339. package/UI/Components/Workflow/WorkflowIssuesModal.tsx +255 -0
  340. package/UI/Components/Workflow/WorkflowLogModal.tsx +128 -0
  341. package/UI/Components/Workflow/WorkflowStatusBar.tsx +224 -0
  342. package/UI/Utils/AIChatExport/ConversationMarkdown.ts +10 -0
  343. package/UI/Utils/ModelAPI/ModelAPI.ts +7 -1
  344. package/UI/Utils/Platform.ts +149 -0
  345. package/UI/Utils/ProjectInvitationDisplay.ts +118 -0
  346. package/UI/esbuild-config.js +22 -1
  347. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +187 -0
  348. package/Utils/Monitor/NetworkTopologyUtil.ts +888 -164
  349. package/Utils/Telemetry/CrossSignalScope.ts +502 -0
  350. package/Utils/Telemetry/EntityKey.ts +5 -5
  351. package/Utils/Telemetry/EntityRelationship.ts +1 -1
  352. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +1 -1
  353. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +1 -1
  354. package/build/dist/Models/DatabaseModels/AIConversation.js +32 -0
  355. package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
  356. package/build/dist/Models/DatabaseModels/AIConversationMessage.js +42 -0
  357. package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -1
  358. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +28 -0
  359. package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
  360. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +29 -0
  361. package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
  362. package/build/dist/Models/DatabaseModels/Index.js +12 -4
  363. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  364. package/build/dist/Models/DatabaseModels/{TelemetryEntity.js → InventoryItem.js} +167 -31
  365. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -0
  366. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +454 -0
  367. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -0
  368. package/build/dist/Models/DatabaseModels/{TelemetryEntityRelationship.js → InventoryItemRelationship.js} +27 -27
  369. package/build/dist/Models/DatabaseModels/InventoryItemRelationship.js.map +1 -0
  370. package/build/dist/Models/DatabaseModels/NetworkDevice.js +141 -0
  371. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  372. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +719 -0
  373. package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -0
  374. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +475 -0
  375. package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -0
  376. package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js +446 -0
  377. package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js.map +1 -0
  378. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js +9 -0
  379. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js.map +1 -1
  380. package/build/dist/Models/DatabaseModels/Project.js +80 -0
  381. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  382. package/build/dist/Models/DatabaseModels/UserCall.js +46 -2
  383. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  384. package/build/dist/Models/DatabaseModels/UserEmail.js +48 -2
  385. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  386. package/build/dist/Models/DatabaseModels/UserNotificationRule.js +424 -55
  387. package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
  388. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +24 -2
  389. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  390. package/build/dist/Models/DatabaseModels/UserPush.js +51 -1
  391. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/UserSMS.js +47 -2
  393. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/UserTelegram.js +65 -3
  395. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/UserWebhook.js +56 -2
  397. package/build/dist/Models/DatabaseModels/UserWebhook.js.map +1 -1
  398. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +45 -2
  399. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  400. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +12 -0
  401. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  402. package/build/dist/Server/API/AIChatAPI.js +237 -1
  403. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  404. package/build/dist/Server/API/DashboardAPI.js +165 -13
  405. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  406. package/build/dist/Server/API/OnCallReadinessAPI.js +599 -0
  407. package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -0
  408. package/build/dist/Server/API/TeamComplianceAPI.js +68 -9
  409. package/build/dist/Server/API/TeamComplianceAPI.js.map +1 -1
  410. package/build/dist/Server/API/TelemetryAPI.js +129 -18
  411. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  412. package/build/dist/Server/EnvironmentConfig.js +45 -0
  413. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  414. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +22 -0
  415. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  416. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +4 -4
  417. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js +18 -0
  418. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js.map +1 -0
  419. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js +39 -0
  420. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js.map +1 -0
  421. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js +38 -0
  422. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js.map +1 -0
  423. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js +22 -0
  424. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js.map +1 -0
  425. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js +150 -0
  426. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js.map +1 -0
  427. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js +57 -0
  428. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js.map +1 -0
  429. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js +69 -0
  430. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js.map +1 -0
  431. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js +32 -0
  432. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js.map +1 -0
  433. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js +26 -0
  434. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js.map +1 -0
  435. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js +48 -0
  436. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js.map +1 -0
  437. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
  438. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  439. package/build/dist/Server/Infrastructure/Queue.js +72 -13
  440. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  441. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +399 -0
  442. package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -0
  443. package/build/dist/Server/Services/AIService.js +1 -0
  444. package/build/dist/Server/Services/AIService.js.map +1 -1
  445. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +24 -3
  446. package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
  447. package/build/dist/Server/Services/AlertSeverityService.js +54 -0
  448. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  449. package/build/dist/Server/Services/DashboardService.js +10 -9
  450. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  451. package/build/dist/Server/Services/DatabaseService.js +24 -2
  452. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  453. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +24 -3
  454. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  455. package/build/dist/Server/Services/IncidentSeverityService.js +67 -0
  456. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  457. package/build/dist/Server/Services/Index.js +12 -4
  458. package/build/dist/Server/Services/Index.js.map +1 -1
  459. package/build/dist/Server/Services/InventoryItemCustomFieldService.js +9 -0
  460. package/build/dist/Server/Services/InventoryItemCustomFieldService.js.map +1 -0
  461. package/build/dist/Server/Services/{TelemetryEntityRelationshipService.js → InventoryItemRelationshipService.js} +6 -6
  462. package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
  463. package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +68 -23
  464. package/build/dist/Server/Services/InventoryItemService.js.map +1 -0
  465. package/build/dist/Server/Services/LogAggregationService.js +27 -8
  466. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  467. package/build/dist/Server/Services/MetricAggregationService.js +80 -0
  468. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  469. package/build/dist/Server/Services/MetricService.js +6 -6
  470. package/build/dist/Server/Services/MetricService.js.map +1 -1
  471. package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js +9 -0
  472. package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js.map +1 -0
  473. package/build/dist/Server/Services/NetworkDeviceLinkService.js +71 -0
  474. package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -0
  475. package/build/dist/Server/Services/NetworkDeviceService.js +113 -0
  476. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  477. package/build/dist/Server/Services/NetworkSiteService.js +53 -13
  478. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  479. package/build/dist/Server/Services/NetworkTopologySuppressionService.js +85 -0
  480. package/build/dist/Server/Services/NetworkTopologySuppressionService.js.map +1 -0
  481. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +48 -32
  482. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  483. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +8 -0
  484. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
  485. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -12
  486. package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
  487. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +57 -13
  488. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  489. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +548 -0
  490. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -0
  491. package/build/dist/Server/Services/OnCallReadinessService.js +1961 -0
  492. package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -0
  493. package/build/dist/Server/Services/OnCallSetupReminderService.js +738 -0
  494. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -0
  495. package/build/dist/Server/Services/ProfileAggregationService.js +68 -4
  496. package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
  497. package/build/dist/Server/Services/StatusPageService.js +11 -10
  498. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  499. package/build/dist/Server/Services/TeamComplianceService.js +312 -160
  500. package/build/dist/Server/Services/TeamComplianceService.js.map +1 -1
  501. package/build/dist/Server/Services/UserCallService.js +24 -1
  502. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  503. package/build/dist/Server/Services/UserEmailService.js +24 -1
  504. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  505. package/build/dist/Server/Services/UserNotificationRuleAdminService.js +858 -0
  506. package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -0
  507. package/build/dist/Server/Services/UserNotificationRuleService.js +2830 -175
  508. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  509. package/build/dist/Server/Services/UserOnCallLogService.js +488 -43
  510. package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
  511. package/build/dist/Server/Services/UserPushService.js +26 -0
  512. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  513. package/build/dist/Server/Services/UserService.js +10 -0
  514. package/build/dist/Server/Services/UserService.js.map +1 -1
  515. package/build/dist/Server/Services/UserSmsService.js +24 -1
  516. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  517. package/build/dist/Server/Services/UserTelegramService.js +22 -1
  518. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  519. package/build/dist/Server/Services/UserWebhookService.js +25 -1
  520. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  521. package/build/dist/Server/Services/UserWhatsAppService.js +22 -1
  522. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  523. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +12 -1
  524. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  525. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +126 -0
  526. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  527. package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js +254 -0
  528. package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js.map +1 -0
  529. package/build/dist/Server/Types/Database/Permissions/QueryPermission.js +47 -2
  530. package/build/dist/Server/Types/Database/Permissions/QueryPermission.js.map +1 -1
  531. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +7 -0
  532. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  533. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +1 -1
  534. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  535. package/build/dist/Server/Types/Workflow/Components/API/Get.js +1 -1
  536. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  537. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +1 -1
  538. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  539. package/build/dist/Server/Types/Workflow/Components/API/Post.js +1 -1
  540. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  541. package/build/dist/Server/Types/Workflow/Components/API/Put.js +1 -1
  542. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  543. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +21 -5
  544. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  545. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +14 -10
  546. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  547. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +31 -0
  548. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -1
  549. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +3 -9
  550. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  551. package/build/dist/Server/Types/Workflow/Components/Email.js +15 -4
  552. package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
  553. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +7 -2
  554. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  555. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +1 -1
  556. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  557. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +514 -56
  558. package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
  559. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +20 -3
  560. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  561. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +19 -6
  562. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  563. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +7 -0
  564. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  565. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +2 -2
  566. package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
  567. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +692 -0
  568. package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -0
  569. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +148 -12
  570. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  571. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +157 -10
  572. package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
  573. package/build/dist/Server/Utils/AI/Toolbox/Index.js +37 -0
  574. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  575. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +259 -14
  576. package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
  577. package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js +235 -0
  578. package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js.map +1 -0
  579. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +1000 -0
  580. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -0
  581. package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js +356 -0
  582. package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js.map +1 -0
  583. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +394 -0
  584. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -0
  585. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +465 -0
  586. package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -0
  587. package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js +280 -0
  588. package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js.map +1 -0
  589. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +527 -0
  590. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -0
  591. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +548 -0
  592. package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -0
  593. package/build/dist/Server/Utils/ClientIp.js +137 -0
  594. package/build/dist/Server/Utils/ClientIp.js.map +1 -0
  595. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +38 -0
  596. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
  597. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +89 -0
  598. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -0
  599. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +77 -0
  600. package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -0
  601. package/build/dist/Server/Utils/Express.js +12 -12
  602. package/build/dist/Server/Utils/Express.js.map +1 -1
  603. package/build/dist/Server/Utils/LLM/LLMService.js +70 -7
  604. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  605. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +121 -11
  606. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  607. package/build/dist/Server/Utils/SSRFProtection.js +82 -21
  608. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  609. package/build/dist/Server/Utils/StartServer.js +12 -4
  610. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  611. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +165 -18
  612. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  613. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +11 -11
  614. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
  615. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +122 -47
  616. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  617. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +7 -3
  618. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  619. package/build/dist/Types/AI/AIChatMessageStatus.js +8 -1
  620. package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -1
  621. package/build/dist/Types/AI/AIChatTypes.js +12 -0
  622. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  623. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +60 -0
  624. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -0
  625. package/build/dist/Types/Exception/ExceptionCode.js +2 -0
  626. package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
  627. package/build/dist/Types/Exception/ServiceUnavailableException.js +8 -0
  628. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -0
  629. package/build/dist/Types/Exception/TooManyRequestsException.js +8 -0
  630. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -0
  631. package/build/dist/Types/IP/IP.js +87 -43
  632. package/build/dist/Types/IP/IP.js.map +1 -1
  633. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +50 -0
  634. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -0
  635. package/build/dist/Types/OnCallDutyPolicy/Layer.js +186 -123
  636. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  637. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js +13 -0
  638. package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js.map +1 -1
  639. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +105 -11
  640. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  641. package/build/dist/Types/Permission.js +174 -0
  642. package/build/dist/Types/Permission.js.map +1 -1
  643. package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
  644. package/build/dist/Types/Telemetry/EntitySource.js +1 -1
  645. package/build/dist/Types/Telemetry/EntityType.js +1 -1
  646. package/build/dist/Types/Telemetry/EntityTypeGroups.js +1 -1
  647. package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -1
  648. package/build/dist/Types/Workflow/Components/BaseModel.js +66 -28
  649. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  650. package/build/dist/Types/Workflow/Components/Discord.js +1 -0
  651. package/build/dist/Types/Workflow/Components/Discord.js.map +1 -1
  652. package/build/dist/Types/Workflow/Components/Email.js +12 -3
  653. package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
  654. package/build/dist/Types/Workflow/Components/JavaScript.js +7 -0
  655. package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
  656. package/build/dist/Types/Workflow/Components/MicrosoftTeams.js +3 -2
  657. package/build/dist/Types/Workflow/Components/MicrosoftTeams.js.map +1 -1
  658. package/build/dist/Types/Workflow/Components/Slack.js +1 -0
  659. package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
  660. package/build/dist/Types/Workflow/Components/Telegram.js +1 -0
  661. package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -1
  662. package/build/dist/Types/Workflow/TemplateSyntax.js +12 -0
  663. package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -1
  664. package/build/dist/Types/Workflow/Templates.js +1931 -38
  665. package/build/dist/Types/Workflow/Templates.js.map +1 -1
  666. package/build/dist/UI/Components/Calendar/Calendar.js +1 -1
  667. package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
  668. package/build/dist/UI/Components/Checkbox/Checkbox.js +1 -1
  669. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  670. package/build/dist/UI/Components/Dictionary/Dictionary.js +25 -11
  671. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  672. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  673. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +27 -4
  674. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  675. package/build/dist/UI/Components/Input/Input.js +1 -0
  676. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  677. package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js +163 -0
  678. package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js.map +1 -0
  679. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js +47 -0
  680. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js.map +1 -0
  681. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +4 -4
  682. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  683. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +11 -1
  684. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  685. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +10 -8
  686. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  687. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +227 -14
  688. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  689. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +5 -0
  690. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  691. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +69 -5
  692. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  693. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +8 -0
  694. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  695. package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
  696. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +9 -2
  697. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  698. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +8 -21
  699. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  700. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +251 -0
  701. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -0
  702. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +9 -2
  703. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
  704. package/build/dist/UI/Components/Table/Table.js +27 -15
  705. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  706. package/build/dist/UI/Components/Table/TableBody.js +24 -18
  707. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  708. package/build/dist/UI/Components/Table/TableHeader.js +9 -1
  709. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  710. package/build/dist/UI/Components/Table/TableRow.js +29 -21
  711. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  712. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +130 -12
  713. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  714. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +10 -1
  715. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  716. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +4 -4
  717. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  718. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +57 -7
  719. package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +1 -1
  720. package/build/dist/UI/Components/Workflow/ComponentsModal.js +53 -18
  721. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  722. package/build/dist/UI/Components/Workflow/DocumentationViewer.js +19 -6
  723. package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
  724. package/build/dist/UI/Components/Workflow/GraphLint.js +33 -4
  725. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
  726. package/build/dist/UI/Components/Workflow/GraphLintSummary.js +231 -0
  727. package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -0
  728. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +116 -21
  729. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
  730. package/build/dist/UI/Components/Workflow/ModelSchema.js +72 -34
  731. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
  732. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +1 -1
  733. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -1
  734. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  735. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  736. package/build/dist/UI/Components/Workflow/UseRunWatch.js +123 -0
  737. package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -0
  738. package/build/dist/UI/Components/Workflow/VariableModal.js +3 -2
  739. package/build/dist/UI/Components/Workflow/VariableModal.js.map +1 -1
  740. package/build/dist/UI/Components/Workflow/Workflow.js +41 -1
  741. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  742. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +99 -0
  743. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -0
  744. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +56 -0
  745. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -0
  746. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +92 -0
  747. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -0
  748. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +9 -0
  749. package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -1
  750. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +1 -1
  751. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  752. package/build/dist/UI/Utils/Platform.js +118 -0
  753. package/build/dist/UI/Utils/Platform.js.map +1 -0
  754. package/build/dist/UI/Utils/ProjectInvitationDisplay.js +106 -0
  755. package/build/dist/UI/Utils/ProjectInvitationDisplay.js.map +1 -0
  756. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +108 -0
  757. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -0
  758. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +642 -136
  759. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  760. package/build/dist/Utils/Telemetry/CrossSignalScope.js +328 -0
  761. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -0
  762. package/build/dist/Utils/Telemetry/EntityKey.js +5 -5
  763. package/build/dist/Utils/Telemetry/EntityRelationship.js +1 -1
  764. package/jest.config.json +1 -0
  765. package/package.json +1 -1
  766. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +0 -1
  767. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +0 -1
  768. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +0 -1
  769. package/build/dist/Server/Services/TelemetryEntityService.js.map +0 -1
@@ -10,10 +10,14 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import DatabaseService from "./DatabaseService";
11
11
  import IncidentService from "./IncidentService";
12
12
  import OnCallDutyPolicyExecutionLogTimelineService from "./OnCallDutyPolicyExecutionLogTimelineService";
13
- import UserNotificationRuleService from "./UserNotificationRuleService";
13
+ import OnCallNotificationAlertingService from "./OnCallNotificationAlertingService";
14
+ import ProjectService from "./ProjectService";
15
+ import UserService from "./UserService";
16
+ import UserNotificationRuleService, { FallbackNotificationOutcome, } from "./UserNotificationRuleService";
14
17
  import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
15
18
  import BadDataException from "../../Types/Exception/BadDataException";
16
19
  import NotificationRuleType from "../../Types/NotificationRule/NotificationRuleType";
20
+ import QueryHelper from "../Types/Database/QueryHelper";
17
21
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
18
22
  import OnCallDutyExecutionLogTimelineStatus from "../../Types/OnCallDutyPolicy/OnCalDutyExecutionLogTimelineStatus";
19
23
  import PositiveNumber from "../../Types/PositiveNumber";
@@ -26,6 +30,50 @@ import AlertEpisodeService from "./AlertEpisodeService";
26
30
  import IncidentEpisodeService from "./IncidentEpisodeService";
27
31
  import OneUptimeDate from "../../Types/Date";
28
32
  import logger from "../Utils/Logger";
33
+ /*
34
+ * The status message the zero-rule dead-end wrote before the fallback existed,
35
+ * kept verbatim. A project that sets `disableOnCallNotificationFallback` is
36
+ * asking for precisely the old behaviour, so it must still receive precisely
37
+ * the old words - operators grep their execution logs for this sentence, and a
38
+ * characterisation test pins it character for character.
39
+ */
40
+ export const NO_NOTIFICATION_RULES_STATUS_MESSAGE = "No notification rules found for this user. User should add the rules in User Settings > On-Call Rules.";
41
+ /*
42
+ * "This row is not an opt-out row" - the predicate that EVERY query which
43
+ * counts notification rules or picks one to execute has to carry.
44
+ *
45
+ * An opt-out row is a UserNotificationRule that exists in order to send
46
+ * nothing. It carries exactly the columns those queries filter on - userId,
47
+ * projectId, ruleType and the severity - and holds no notification method at
48
+ * all. Without this predicate it is therefore indistinguishable from a real
49
+ * rule, and the damage is not a missing filter, it is a silent lie:
50
+ *
51
+ * - the count comes back 1, so the zero-rule branch is never entered. Both
52
+ * the opt-out handling and the whole fallback below become unreachable
53
+ * code - the opt-out feature would be dead the day it shipped;
54
+ * - the immediate-rule lookup then SELECTS the opt-out row and "executes"
55
+ * it. There is no method on it, so nothing is sent - and yet the
56
+ * escalation timeline is stamped Notification Sent / "Alert Sent",
57
+ * because that write happens unconditionally after the loop. The
58
+ * responder is never paged and the log tells the person reading it
59
+ * afterwards that they were.
60
+ *
61
+ * The predicate has to mean "not true", NULL included. `isOptOut` is NULLABLE
62
+ * and was added long after these rows started existing, so it is NULL on every
63
+ * rule written before the column and stays NULL on any row created through a
64
+ * path that does not mention it. A plain `isOptOut: false` compares NULL =
65
+ * false, which evaluates to NULL rather than true, so it would exclude every
66
+ * pre-existing rule in every existing install - it would not merely fail to
67
+ * fix this, it would stop all paging. QueryHelper.notInOrNull emits
68
+ * `(col NOT IN ($1) OR col IS NULL)`, which is the NULL-safe not-equals; it is
69
+ * the same helper Probe:UpdateConnectionStatus uses for exactly this reason
70
+ * (its tests pin the choice of notInOrNull over notEquals on that grounds).
71
+ * QueryHelper takes its values as strings and Postgres resolves the bound
72
+ * literal against the column's own boolean type.
73
+ */
74
+ export const notOptOutRuleQuery = () => {
75
+ return QueryHelper.notInOrNull(["true"]);
76
+ };
29
77
  export class Service extends DatabaseService {
30
78
  constructor() {
31
79
  super(Model);
@@ -34,27 +82,48 @@ export class Service extends DatabaseService {
34
82
  }
35
83
  }
36
84
  /**
37
- * Atomically claim the right to execute ONE notification rule for this on-call
38
- * log. Overlapping UserOnCallLog:ExecutePendingExecutions runs (a tick that
39
- * exceeds the 1-minute cadence, a stalled-job re-delivery, or a burst release
40
- * across worker replicas) could both read executedNotificationRules without a
41
- * given delayed rule's key, both write it, and both send — double-paging the
42
- * responder for a single escalation (audit F7). This mirrors
43
- * OnCallDutyPolicyExecutionLogService.claimEscalationAdvance: a single
44
- * conditional UPDATE that sets executedNotificationRules[ruleId] only when the
45
- * key is absent and RETURNs the affected row, so exactly one concurrent run
46
- * wins and the loser skips.
47
- *
48
- * Fail-safe: if the atomic statement errors for any reason, fall back to the
49
- * previous non-atomic read-modify-write so the rule is still marked and sent.
50
- * For an on-call system a rare duplicate page (the pre-fix behavior) is far
51
- * better than a missed page, so this never makes paging less reliable.
85
+ * Atomically claim the right to execute ONE notification rule for this
86
+ * on-call log. Rules are claimed under their own id; see
87
+ * claimNotificationExecution below for what the claim actually guarantees and
88
+ * why it is keyed by a string.
52
89
  *
53
90
  * Returns true when THIS call claimed the rule (caller should send), false when
54
91
  * it was already executed/claimed (caller should skip) or the log is missing.
55
92
  */
56
93
  async claimNotificationRuleExecution(data) {
57
- const ruleKey = data.userNotificationRuleId.toString();
94
+ return await this.claimNotificationExecution({
95
+ userOnCallLogId: data.userOnCallLogId,
96
+ claimKey: data.userNotificationRuleId.toString(),
97
+ });
98
+ }
99
+ /**
100
+ * Atomically claim ONE delivery attempt against this on-call log, keyed by an
101
+ * arbitrary string. Overlapping UserOnCallLog:ExecutePendingExecutions runs (a
102
+ * tick that exceeds the 1-minute cadence, a stalled-job re-delivery, or a
103
+ * burst release across worker replicas) could both read
104
+ * executedNotificationRules without a given key, both write it, and both send
105
+ * — double-paging the responder for a single escalation (audit F7). This
106
+ * mirrors OnCallDutyPolicyExecutionLogService.claimEscalationAdvance: a single
107
+ * conditional UPDATE that sets executedNotificationRules[key] only when the
108
+ * key is absent and RETURNs the affected row, so exactly one concurrent run
109
+ * wins and the loser skips.
110
+ *
111
+ * The key is a string rather than a rule id because not every delivery attempt
112
+ * has a rule behind it. The verified-method fallback runs precisely BECAUSE no
113
+ * rule matched, so it has nothing to claim under and instead claims a reserved
114
+ * literal ("__fallback__"). executedNotificationRules is a jsonb map keyed by
115
+ * arbitrary text, so a reserved literal sits happily beside real rule uuids and
116
+ * can never collide with one. Keeping a single claim implementation means the
117
+ * fallback inherits this atomicity, its fail-safe and its audited SQL exactly,
118
+ * rather than growing a second, subtly different guard.
119
+ *
120
+ * Fail-safe: if the atomic statement errors for any reason, fall back to the
121
+ * previous non-atomic read-modify-write so the attempt is still marked and
122
+ * sent. For an on-call system a rare duplicate page (the pre-fix behavior) is
123
+ * far better than a missed page, so this never makes paging less reliable.
124
+ */
125
+ async claimNotificationExecution(data) {
126
+ const ruleKey = data.claimKey;
58
127
  try {
59
128
  const nowIso = OneUptimeDate.getCurrentDate().toISOString();
60
129
  const rows = await this.getRepository().manager.query(`UPDATE "UserOnCallLog"
@@ -157,6 +226,7 @@ export class Service extends DatabaseService {
157
226
  return onUpdate;
158
227
  }
159
228
  async onCreateSuccess(_onCreate, createdItem) {
229
+ var _a, _b, _c, _d;
160
230
  // update this item to be processed.
161
231
  await this.updateOneById({
162
232
  id: createdItem.id,
@@ -180,6 +250,17 @@ export class Service extends DatabaseService {
180
250
  },
181
251
  select: {
182
252
  incidentSeverityId: true,
253
+ /*
254
+ * The severity NAME is only ever read on the no-rule path, where every
255
+ * message the responder or the operator sees has to say which severity
256
+ * had no rule ("no rule configured for Sev4"). It rides along on this
257
+ * lookup rather than being fetched separately because the join is free
258
+ * next to a second round trip, and because the no-rule path is already
259
+ * the slow, unhappy one.
260
+ */
261
+ incidentSeverity: {
262
+ name: true,
263
+ },
183
264
  },
184
265
  });
185
266
  // Check if there are any rules .
@@ -189,6 +270,14 @@ export class Service extends DatabaseService {
189
270
  projectId: createdItem.projectId,
190
271
  ruleType: notificationRuleType,
191
272
  incidentSeverityId: incident === null || incident === void 0 ? void 0 : incident.incidentSeverityId,
273
+ /*
274
+ * An opt-out row would otherwise be counted as a rule here, and a
275
+ * count of 1 sends this log down the "you have rules, execute them"
276
+ * path where the only thing it can find to execute is the opt-out
277
+ * row itself: nothing is sent and the timeline says Alert Sent. See
278
+ * notOptOutRuleQuery above for the full consequence.
279
+ */
280
+ isOptOut: notOptOutRuleQuery(),
192
281
  },
193
282
  skip: 0,
194
283
  limit: LIMIT_PER_PROJECT,
@@ -206,6 +295,9 @@ export class Service extends DatabaseService {
206
295
  },
207
296
  select: {
208
297
  alertSeverityId: true,
298
+ alertSeverity: {
299
+ name: true,
300
+ },
209
301
  },
210
302
  });
211
303
  ruleCount = await UserNotificationRuleService.countBy({
@@ -214,6 +306,8 @@ export class Service extends DatabaseService {
214
306
  projectId: createdItem.projectId,
215
307
  ruleType: notificationRuleType,
216
308
  alertSeverityId: alert === null || alert === void 0 ? void 0 : alert.alertSeverityId,
309
+ // Opt-out rows are not rules. See notOptOutRuleQuery above.
310
+ isOptOut: notOptOutRuleQuery(),
217
311
  },
218
312
  skip: 0,
219
313
  limit: LIMIT_PER_PROJECT,
@@ -231,6 +325,9 @@ export class Service extends DatabaseService {
231
325
  },
232
326
  select: {
233
327
  alertSeverityId: true,
328
+ alertSeverity: {
329
+ name: true,
330
+ },
234
331
  },
235
332
  });
236
333
  ruleCount = await UserNotificationRuleService.countBy({
@@ -239,6 +336,8 @@ export class Service extends DatabaseService {
239
336
  projectId: createdItem.projectId,
240
337
  ruleType: notificationRuleType,
241
338
  alertSeverityId: alertEpisode === null || alertEpisode === void 0 ? void 0 : alertEpisode.alertSeverityId,
339
+ // Opt-out rows are not rules. See notOptOutRuleQuery above.
340
+ isOptOut: notOptOutRuleQuery(),
242
341
  },
243
342
  skip: 0,
244
343
  limit: LIMIT_PER_PROJECT,
@@ -257,6 +356,9 @@ export class Service extends DatabaseService {
257
356
  },
258
357
  select: {
259
358
  incidentSeverityId: true,
359
+ incidentSeverity: {
360
+ name: true,
361
+ },
260
362
  },
261
363
  });
262
364
  ruleCount = await UserNotificationRuleService.countBy({
@@ -265,6 +367,8 @@ export class Service extends DatabaseService {
265
367
  projectId: createdItem.projectId,
266
368
  ruleType: notificationRuleType,
267
369
  incidentSeverityId: incidentEpisode === null || incidentEpisode === void 0 ? void 0 : incidentEpisode.incidentSeverityId,
370
+ // Opt-out rows are not rules. See notOptOutRuleQuery above.
371
+ isOptOut: notOptOutRuleQuery(),
268
372
  },
269
373
  skip: 0,
270
374
  limit: LIMIT_PER_PROJECT,
@@ -273,35 +377,15 @@ export class Service extends DatabaseService {
273
377
  },
274
378
  });
275
379
  }
276
- if (ruleCount.toNumber() === 0) {
277
- // update this item to be processed.
278
- await this.updateOneById({
279
- id: createdItem.id,
280
- data: {
281
- status: UserNotificationExecutionStatus.Error, // now the worker will pick this up and complete this or mark this as failed.
282
- statusMessage: "No notification rules found for this user. User should add the rules in User Settings > On-Call Rules.",
283
- },
284
- props: {
285
- isRoot: true,
286
- },
287
- });
288
- // update oncall timeline item as well.
289
- await OnCallDutyPolicyExecutionLogTimelineService.updateOneById({
290
- id: createdItem.onCallDutyPolicyExecutionLogTimelineId,
291
- data: {
292
- status: OnCallDutyExecutionLogTimelineStatus.Error,
293
- statusMessage: "No notification rules found for this user. User should add the rules in User Settings > On-Call Rules.",
294
- },
295
- props: {
296
- isRoot: true,
297
- },
298
- });
299
- return createdItem;
300
- }
301
380
  /*
302
- * find immediate notification rule and alert the user.
303
381
  * Determine the alertSeverityId - can come from alert or alertEpisode
304
382
  * Determine the incidentSeverityId - can come from incident or incidentEpisode
383
+ *
384
+ * Resolved here, above the zero-rule branch, because BOTH paths need the
385
+ * same answer: the immediate-rule lookup below queries on it, and the
386
+ * no-rule handling has to look for an opt-out row against exactly the same
387
+ * (ruleType x severity) cell the count just came up empty for. Resolving it
388
+ * twice would be an invitation for the two to drift apart.
305
389
  */
306
390
  const alertSeverityIdForQuery = alert && alert.alertSeverityId
307
391
  ? alert.alertSeverityId
@@ -313,6 +397,29 @@ export class Service extends DatabaseService {
313
397
  : incidentEpisode && incidentEpisode.incidentSeverityId
314
398
  ? incidentEpisode.incidentSeverityId
315
399
  : undefined;
400
+ /*
401
+ * Purely for prose. Every no-rule message names the severity, and an
402
+ * operator reading "no rule configured for Sev4" learns something that "no
403
+ * rule configured for 8f2c-..." does not. A parent entity whose severity row
404
+ * was deleted, or a mocked read that never selected the relation, leaves
405
+ * this blank, so there is a neutral phrase to fall back on.
406
+ */
407
+ const severityNameForMessage = ((_a = incident === null || incident === void 0 ? void 0 : incident.incidentSeverity) === null || _a === void 0 ? void 0 : _a.name) ||
408
+ ((_b = incidentEpisode === null || incidentEpisode === void 0 ? void 0 : incidentEpisode.incidentSeverity) === null || _b === void 0 ? void 0 : _b.name) ||
409
+ ((_c = alert === null || alert === void 0 ? void 0 : alert.alertSeverity) === null || _c === void 0 ? void 0 : _c.name) ||
410
+ ((_d = alertEpisode === null || alertEpisode === void 0 ? void 0 : alertEpisode.alertSeverity) === null || _d === void 0 ? void 0 : _d.name) ||
411
+ "this severity";
412
+ if (ruleCount.toNumber() === 0) {
413
+ await this.handleNoMatchingNotificationRule({
414
+ createdItem: createdItem,
415
+ notificationRuleType: notificationRuleType,
416
+ incidentSeverityId: incidentSeverityIdForQuery,
417
+ alertSeverityId: alertSeverityIdForQuery,
418
+ severityName: severityNameForMessage,
419
+ });
420
+ return createdItem;
421
+ }
422
+ // find immediate notification rule and alert the user.
316
423
  const immediateNotificationRule = await UserNotificationRuleService.findBy({
317
424
  query: {
318
425
  userId: createdItem.userId,
@@ -321,6 +428,14 @@ export class Service extends DatabaseService {
321
428
  ruleType: notificationRuleType,
322
429
  incidentSeverityId: incidentSeverityIdForQuery,
323
430
  alertSeverityId: alertSeverityIdForQuery,
431
+ /*
432
+ * The predicate matters most here. An opt-out row has
433
+ * notifyAfterMinutes 0 like any immediate rule, so without it this
434
+ * lookup returns the row that exists to send nothing, hands it to
435
+ * executeNotificationRuleItem, and the unconditional "Alert Sent"
436
+ * write below then reports a page that was never dispatched.
437
+ */
438
+ isOptOut: notOptOutRuleQuery(),
324
439
  },
325
440
  select: {
326
441
  _id: true,
@@ -371,6 +486,330 @@ export class Service extends DatabaseService {
371
486
  });
372
487
  return createdItem;
373
488
  }
489
+ /**
490
+ * Nothing matched (ruleType x severity) for this responder.
491
+ *
492
+ * That state used to be treated as a single thing - "misconfigured" - and
493
+ * written off with an Error row nobody reads while the escalation timer ran
494
+ * down as though the responder had simply declined to acknowledge. It is
495
+ * actually three different situations wearing the same clothes, and telling
496
+ * them apart is the whole of Phase 1:
497
+ *
498
+ * 1. The responder said, out loud, "do not page me for this". That is an
499
+ * opt-out row: same ruleType, same severity, isOptOut true, no method.
500
+ * It is checked FIRST, before the project setting and before any
501
+ * delivery, and it ends the execution successfully - deliberate silence
502
+ * is not a failure.
503
+ * 2. The project asked for the old behaviour wholesale, via
504
+ * disableOnCallNotificationFallback. It gets the old behaviour exactly:
505
+ * the same status, the same terminal Error, the same sentence.
506
+ * 3. Everything else - overwhelmingly a severity created after the
507
+ * responder joined, or an episode rule type they never opened the page
508
+ * for. Somebody is expecting this page to arrive, so it is delivered on
509
+ * whatever verified method the responder does have.
510
+ *
511
+ * Note what "notified" can and cannot mean here. Every send downstream is
512
+ * fire-and-forget with a .catch that flips its own timeline row, so nothing
513
+ * on this path can observe whether a phone actually rang. `notified` means "a
514
+ * delivery was dispatched on at least one channel", and the per-channel
515
+ * timeline rows remain the record of what happened after that.
516
+ *
517
+ * Case 3 then splits again on WHY a fallback did not deliver, because the
518
+ * status this method writes is the difference between a log that is finished
519
+ * and a log that is merely unlucky - see the branch below. And every case 3
520
+ * ending, delivered or not, is reported to the humans who can fix the
521
+ * configuration through OnCallNotificationAlertingService; cases 1 and 2
522
+ * return before that, because neither is a surprise to anybody.
523
+ */
524
+ async handleNoMatchingNotificationRule(data) {
525
+ var _a;
526
+ const createdItem = data.createdItem;
527
+ const optOutRule = await UserNotificationRuleService.findOneBy({
528
+ query: {
529
+ userId: createdItem.userId,
530
+ projectId: createdItem.projectId,
531
+ ruleType: data.notificationRuleType,
532
+ incidentSeverityId: data.incidentSeverityId,
533
+ alertSeverityId: data.alertSeverityId,
534
+ isOptOut: true,
535
+ },
536
+ select: {
537
+ _id: true,
538
+ },
539
+ props: {
540
+ isRoot: true,
541
+ },
542
+ });
543
+ if (optOutRule) {
544
+ const optOutMessage = `You have opted out of notifications for ${data.severityName} ${this.getRuleTypeLabelForMessage(data.notificationRuleType)}.`;
545
+ /*
546
+ * Completed, not Error: the system did exactly what it was told to do.
547
+ * The timeline says Skipped rather than Notification Sent because nothing
548
+ * was in fact sent, and an operator scanning the escalation needs to see
549
+ * the difference between "muted on purpose" and "delivered".
550
+ */
551
+ await this.writeNoRuleOutcome({
552
+ createdItem: createdItem,
553
+ status: UserNotificationExecutionStatus.Completed,
554
+ timelineStatus: OnCallDutyExecutionLogTimelineStatus.Skipped,
555
+ statusMessage: optOutMessage,
556
+ });
557
+ return;
558
+ }
559
+ const project = await ProjectService.findOneById({
560
+ id: createdItem.projectId,
561
+ select: {
562
+ disableOnCallNotificationFallback: true,
563
+ },
564
+ props: {
565
+ isRoot: true,
566
+ },
567
+ });
568
+ if (project === null || project === void 0 ? void 0 : project.disableOnCallNotificationFallback) {
569
+ await this.writeNoRuleOutcome({
570
+ createdItem: createdItem,
571
+ status: UserNotificationExecutionStatus.Error,
572
+ timelineStatus: OnCallDutyExecutionLogTimelineStatus.Error,
573
+ statusMessage: NO_NOTIFICATION_RULES_STATUS_MESSAGE,
574
+ });
575
+ /*
576
+ * Alert the humans BEFORE returning. A project that has turned the
577
+ * fallback off is not a project with nothing to report - it is the one
578
+ * population still losing pages exactly the way they were lost before any
579
+ * of this existed, because it has explicitly opted back into the old
580
+ * dead-end. Returning early here would have made the owner notification
581
+ * reach every project except the one that needs it most.
582
+ */
583
+ this.alertOfUndeliverablePage({
584
+ createdItem: createdItem,
585
+ notificationRuleType: data.notificationRuleType,
586
+ severityName: data.severityName,
587
+ fallbackChannelsUsed: [],
588
+ });
589
+ return;
590
+ }
591
+ let fallbackResult = null;
592
+ let fallbackThrew = false;
593
+ try {
594
+ fallbackResult =
595
+ await UserNotificationRuleService.executeFallbackNotification({
596
+ userId: createdItem.userId,
597
+ projectId: createdItem.projectId,
598
+ userOnCallLogId: createdItem.id,
599
+ ruleType: data.notificationRuleType,
600
+ severityName: data.severityName,
601
+ userNotificationLogId: createdItem.id,
602
+ triggeredByIncidentId: createdItem.triggeredByIncidentId,
603
+ triggeredByAlertId: createdItem.triggeredByAlertId,
604
+ triggeredByAlertEpisodeId: createdItem.triggeredByAlertEpisodeId,
605
+ triggeredByIncidentEpisodeId: createdItem.triggeredByIncidentEpisodeId,
606
+ userNotificationEventType: createdItem.userNotificationEventType,
607
+ onCallPolicyExecutionLogId: createdItem.onCallDutyPolicyExecutionLogId,
608
+ onCallPolicyId: createdItem.onCallDutyPolicyId,
609
+ onCallPolicyEscalationRuleId: createdItem.onCallDutyPolicyEscalationRuleId,
610
+ userBelongsToTeamId: createdItem.userBelongsToTeamId,
611
+ onCallDutyPolicyExecutionLogTimelineId: createdItem.onCallDutyPolicyExecutionLogTimelineId,
612
+ onCallScheduleId: createdItem.onCallDutyScheduleId,
613
+ });
614
+ }
615
+ catch (err) {
616
+ /*
617
+ * The caller is part-way through paging an entire escalation level. A
618
+ * throw out of here would abort the responders queued behind this one, so
619
+ * a fallback that fails is recorded against THIS log and no further.
620
+ */
621
+ fallbackThrew = true;
622
+ logger.error(`On-call notification fallback failed for UserOnCallLog ${(_a = createdItem.id) === null || _a === void 0 ? void 0 : _a.toString()}`);
623
+ logger.error(err);
624
+ }
625
+ if (fallbackResult && fallbackResult.notified) {
626
+ const notifiedMessage = `No notification rule configured for ${data.severityName}; notified via fallback (${fallbackResult.channelsUsed.join(", ")}).`;
627
+ /*
628
+ * Executing, matching the normal path: there are no further rules to fire,
629
+ * so UserOnCallLog:ExecutePendingExecutions will find an empty rule list on
630
+ * its next tick and close the log out as Completed.
631
+ */
632
+ await this.writeNoRuleOutcome({
633
+ createdItem: createdItem,
634
+ status: UserNotificationExecutionStatus.Executing,
635
+ timelineStatus: OnCallDutyExecutionLogTimelineStatus.NotificationSent,
636
+ statusMessage: notifiedMessage,
637
+ });
638
+ }
639
+ else {
640
+ const responderLabel = await this.getResponderLabelForMessage(createdItem.userId);
641
+ /*
642
+ * Nothing was delivered, and every reason for that ends the same way:
643
+ * terminally, saying so.
644
+ *
645
+ * The tempting alternative is to treat a raised delivery attempt as
646
+ * transient and leave the log Executing for a retry, mirroring
647
+ * App/FeatureSet/Workers/Jobs/UserOnCallLog/ExecutePendingExecutions,
648
+ * which deliberately marks Error only for permanent bad-data failures.
649
+ * That analogy does not hold here, and following it produces a worse bug
650
+ * than the one it avoids.
651
+ *
652
+ * ExecutePendingExecutions re-enters ITSELF: it selects logs in Executing
653
+ * every minute and re-fires their still-due rules, so a log left live
654
+ * genuinely gets another attempt. This function does not. It is called
655
+ * from onCreateSuccess, once, at the moment the log row is written, and
656
+ * nothing re-enters it - so "leave it Executing for the next tick" buys
657
+ * no retry at all. What it actually buys is this: on the next tick
658
+ * ExecutePendingExecutions picks the log up, queries for due rules, finds
659
+ * none (there were none to begin with - that is why we are here), takes
660
+ * its all-executed path and marks the log Completed. onUpdateSuccess then
661
+ * translates Completed into NotificationSent on the escalation timeline,
662
+ * and within a minute the record reads "Alert Sent" for a page that was
663
+ * never delivered.
664
+ *
665
+ * That is precisely the silent lie the opt-out exclusion was fixed to
666
+ * remove, reintroduced through a different door. So both endings are
667
+ * terminal, and only the message differs: a responder with no verified
668
+ * method needs a different action than a delivery that blew up, and
669
+ * whoever reads the log deserves to be told which happened.
670
+ */
671
+ const isPermanentlyUndeliverable = !fallbackThrew &&
672
+ fallbackResult !== null &&
673
+ fallbackResult.outcome ===
674
+ FallbackNotificationOutcome.NoUsableNotificationMethod;
675
+ await this.writeNoRuleOutcome({
676
+ createdItem: createdItem,
677
+ status: UserNotificationExecutionStatus.Error,
678
+ timelineStatus: OnCallDutyExecutionLogTimelineStatus.Error,
679
+ statusMessage: isPermanentlyUndeliverable
680
+ ? `${responderLabel} has no verified notification method, so this page could not be delivered. Ask them to add one in User Settings > Notification Methods.`
681
+ : `${responderLabel} has no notification rule for ${data.severityName} and the fallback delivery attempt failed, so this page was not delivered. Check the worker logs, then add a rule in User Settings > On-Call Rules.`,
682
+ });
683
+ }
684
+ /*
685
+ * Section 5: tell the humans who can fix this. The policy's owners own the
686
+ * configuration that is wrong; the responder owns the rules that are
687
+ * missing. Neither of them is reading execution logs.
688
+ *
689
+ * One call site rather than one per branch, because every path that reaches
690
+ * here is worth reporting and the difference between them is already
691
+ * carried by fallbackChannelsUsed: a non-empty list means "your
692
+ * configuration is wrong but nobody was dropped", an empty one means this
693
+ * responder was not reached at all - which is equally true of the
694
+ * no-verified-method ending and of the attempt that raised. The service
695
+ * throttles per (project, user, ruleType) per 24h, so a page storm down this
696
+ * branch cannot become a mail storm.
697
+ *
698
+ * Fire-and-forget with a .catch, exactly as
699
+ * startUserNotificationRulesExecution treats its workspace rules:
700
+ * notifyOfUndeliverablePage already swallows its own failures, and the
701
+ * .catch is the guarantee that even a bug in the explanation can never
702
+ * propagate into - or delay - the paging path that called it.
703
+ */
704
+ this.alertOfUndeliverablePage({
705
+ createdItem: createdItem,
706
+ notificationRuleType: data.notificationRuleType,
707
+ severityName: data.severityName,
708
+ fallbackChannelsUsed: fallbackResult ? fallbackResult.channelsUsed : [],
709
+ });
710
+ }
711
+ /*
712
+ * Fire-and-forget, exactly as startUserNotificationRulesExecution treats its
713
+ * workspace rules: notifyOfUndeliverablePage already swallows its own
714
+ * failures, and the .catch is the guarantee that even a bug in the
715
+ * explanation can never propagate into - or delay - the paging path that
716
+ * called it. Extracted to a helper because there are two callers now, and a
717
+ * second inline copy is how one of them ends up silently drifting from the
718
+ * other.
719
+ */
720
+ alertOfUndeliverablePage(data) {
721
+ OnCallNotificationAlertingService.notifyOfUndeliverablePage({
722
+ projectId: data.createdItem.projectId,
723
+ userId: data.createdItem.userId,
724
+ ruleType: data.notificationRuleType,
725
+ severityName: data.severityName,
726
+ onCallDutyPolicyId: data.createdItem.onCallDutyPolicyId,
727
+ fallbackChannelsUsed: data.fallbackChannelsUsed,
728
+ }).catch((err) => {
729
+ logger.error(err);
730
+ });
731
+ }
732
+ /*
733
+ * Both writes the no-rule path makes, in the order the pre-fallback code made
734
+ * them: the log first, then the on-call timeline. The log update's own
735
+ * onUpdateSuccess hook already maps the execution status onto the timeline, so
736
+ * the explicit second write is what lets this path say something the mapping
737
+ * cannot - Skipped for an opt-out, Notification Sent for a fallback that went
738
+ * out under an Executing log.
739
+ */
740
+ async writeNoRuleOutcome(data) {
741
+ await this.updateOneById({
742
+ id: data.createdItem.id,
743
+ data: {
744
+ status: data.status,
745
+ statusMessage: data.statusMessage,
746
+ },
747
+ props: {
748
+ isRoot: true,
749
+ },
750
+ });
751
+ await OnCallDutyPolicyExecutionLogTimelineService.updateOneById({
752
+ id: data.createdItem.onCallDutyPolicyExecutionLogTimelineId,
753
+ data: {
754
+ status: data.timelineStatus,
755
+ statusMessage: data.statusMessage,
756
+ },
757
+ props: {
758
+ isRoot: true,
759
+ },
760
+ });
761
+ }
762
+ /*
763
+ * NotificationRuleType's values are whole sentences ("When incident on-call
764
+ * policy is executed"), which read badly mid-sentence. These are the noun
765
+ * forms for the messages this file writes. An unrecognised type falls back to
766
+ * the raw value rather than throwing - a status message is never worth losing
767
+ * a page over.
768
+ */
769
+ getRuleTypeLabelForMessage(ruleType) {
770
+ switch (ruleType) {
771
+ case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT:
772
+ return "incidents";
773
+ case NotificationRuleType.ON_CALL_EXECUTED_ALERT:
774
+ return "alerts";
775
+ case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE:
776
+ return "incident episodes";
777
+ case NotificationRuleType.ON_CALL_EXECUTED_ALERT_EPISODE:
778
+ return "alert episodes";
779
+ default:
780
+ return ruleType;
781
+ }
782
+ }
783
+ /*
784
+ * "Jane Doe has no verified notification method" is actionable; "This user
785
+ * has no verified notification method" is a support ticket. The lookup is
786
+ * best-effort in every sense - it only feeds a string, so a missing user or a
787
+ * failed read degrades to a neutral phrase rather than propagating.
788
+ */
789
+ async getResponderLabelForMessage(userId) {
790
+ var _a, _b;
791
+ if (!userId) {
792
+ return "This responder";
793
+ }
794
+ try {
795
+ const user = await UserService.findOneById({
796
+ id: userId,
797
+ select: {
798
+ name: true,
799
+ email: true,
800
+ },
801
+ props: {
802
+ isRoot: true,
803
+ },
804
+ });
805
+ const label = ((_a = user === null || user === void 0 ? void 0 : user.name) === null || _a === void 0 ? void 0 : _a.toString()) || ((_b = user === null || user === void 0 ? void 0 : user.email) === null || _b === void 0 ? void 0 : _b.toString());
806
+ return label || "This responder";
807
+ }
808
+ catch (err) {
809
+ logger.error(err);
810
+ return "This responder";
811
+ }
812
+ }
374
813
  getNotificationRuleType(userNotificationEventType) {
375
814
  if (userNotificationEventType === UserNotificationEventType.IncidentCreated) {
376
815
  return NotificationRuleType.ON_CALL_EXECUTED_INCIDENT;
@@ -396,6 +835,12 @@ __decorate([
396
835
  __metadata("design:paramtypes", [Object]),
397
836
  __metadata("design:returntype", Promise)
398
837
  ], Service.prototype, "claimNotificationRuleExecution", null);
838
+ __decorate([
839
+ CaptureSpan(),
840
+ __metadata("design:type", Function),
841
+ __metadata("design:paramtypes", [Object]),
842
+ __metadata("design:returntype", Promise)
843
+ ], Service.prototype, "claimNotificationExecution", null);
399
844
  __decorate([
400
845
  CaptureSpan(),
401
846
  __metadata("design:type", Function),