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