@oneuptime/common 12.0.7 → 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} +184 -9
- package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
- package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +33 -7
- 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/WorkflowLog.ts +38 -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/API/UserAPI.ts +16 -1
- 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/1786551733814-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
- 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 +24 -0
- package/Server/Infrastructure/Queue.ts +78 -13
- package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
- 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} +7 -4
- package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +203 -21
- 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/API/Utils.ts +44 -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/Types/Workflow/TriggerCode.ts +12 -0
- package/Server/Types/Workflow/Workflow.ts +5 -0
- 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 +689 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
- package/Server/Utils/VM/VMAPI.ts +56 -8
- 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/MonitorCriteriaAttributeFilter.test.tsx +574 -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/API/UserProjectsAPI.test.ts +478 -4
- 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/InventoryItemManualCreate.test.ts +248 -0
- 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/ApiComponentHeaders.test.ts +192 -0
- 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/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -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 +322 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
- package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
- 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/SerializableObjectDictionaryImportCycle.test.ts +197 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
- 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/StepTrace.test.ts +235 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +491 -0
- package/Tests/Types/Workflow/Templates.test.ts +1218 -0
- package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
- package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
- package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
- package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
- package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
- package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
- package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +42 -0
- package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +90 -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/TelemetryTimeRangePicker.test.tsx +49 -7
- package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +893 -0
- package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +522 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +193 -0
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +388 -0
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +210 -0
- 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/Utils.test.ts +192 -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/Monitor/MonitorStepCriteriaView.test.tsx +432 -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/NetworkDeviceRoleUtil.test.ts +514 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +727 -0
- package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
- package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
- package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -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 +80 -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/SerializableObjectDictionary.ts +133 -39
- package/Types/Telemetry/EntityRelationshipType.ts +1 -1
- package/Types/Telemetry/EntitySource.ts +40 -0
- package/Types/Telemetry/EntityType.ts +28 -1
- package/Types/Telemetry/EntityTypeGroups.ts +65 -0
- package/Types/Workflow/Component.ts +29 -0
- package/Types/Workflow/Components/API.ts +35 -0
- package/Types/Workflow/Components/BaseModel.ts +77 -27
- 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/StepTrace.ts +181 -0
- package/Types/Workflow/TemplateSyntax.ts +543 -0
- package/Types/Workflow/Templates.ts +2368 -0
- 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/Date/CustomTimeRangeModal.tsx +278 -0
- package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
- package/UI/Components/Dictionary/Dictionary.tsx +71 -15
- package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
- package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
- package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
- package/UI/Components/Forms/Types/Field.ts +7 -0
- package/UI/Components/Forms/Validation.ts +63 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
- package/UI/Components/Input/Input.tsx +32 -3
- 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/LogTimeRangePicker.tsx +11 -216
- 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/Modal/Modal.tsx +37 -4
- 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/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
- package/UI/Components/Workflow/ArgumentsForm.tsx +341 -8
- package/UI/Components/Workflow/Component.tsx +28 -26
- package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +79 -9
- 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 +628 -0
- package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +528 -0
- package/UI/Components/Workflow/ModelSchema.ts +278 -0
- package/UI/Components/Workflow/RunForm.tsx +41 -7
- package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
- package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
- package/UI/Components/Workflow/UseRunWatch.ts +212 -0
- package/UI/Components/Workflow/Utils.ts +93 -1
- package/UI/Components/Workflow/VariableModal.tsx +6 -2
- package/UI/Components/Workflow/Workflow.tsx +126 -7
- 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/Types/LayeredDismissal.ts +31 -0
- package/UI/Types/UseAnchoredFieldPopup.ts +99 -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/NetworkDeviceRoleUtil.ts +533 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +917 -155
- package/Utils/Telemetry/CrossSignalScope.ts +502 -0
- package/Utils/Telemetry/EntityKey.ts +71 -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} +212 -29
- 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} +52 -25
- 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/WorkflowLog.js +39 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.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/API/UserAPI.js +16 -1
- package/build/dist/Server/API/UserAPI.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/1786551733814-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
- 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 +24 -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/MasterAdminAuthorization.js +11 -6
- package/build/dist/Server/Middleware/MasterAdminAuthorization.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} +9 -6
- package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +158 -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/API/Utils.js +28 -0
- package/build/dist/Server/Types/Workflow/Components/API/Utils.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/Types/Workflow/TriggerCode.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 +507 -0
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
- 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/VM/VMAPI.js +51 -4
- package/build/dist/Server/Utils/VM/VMAPI.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/SerializableObjectDictionary.js +133 -39
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +39 -0
- package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +28 -1
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
- package/build/dist/Types/Workflow/Component.js +21 -0
- package/build/dist/Types/Workflow/Component.js.map +1 -1
- package/build/dist/Types/Workflow/Components/API.js +35 -0
- package/build/dist/Types/Workflow/Components/API.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +68 -26
- 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/StepTrace.js +104 -0
- package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js +338 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +2111 -0
- package/build/dist/Types/Workflow/Templates.js.map +1 -0
- 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/Date/CustomTimeRangeModal.js +126 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/Dictionary.js +47 -17
- 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/Forms/Fields/ColorPicker.js +52 -13
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +44 -0
- package/build/dist/UI/Components/Forms/Validation.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 +13 -4
- 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/LogTimeRangePicker.js +5 -108
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.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/Modal/Modal.js +31 -5
- package/build/dist/UI/Components/Modal/Modal.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/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +261 -14
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Component.js +20 -19
- package/build/dist/UI/Components/Workflow/Component.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 +35 -7
- 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 +425 -0
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
- 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 +320 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js +156 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
- package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
- package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
- 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/Utils.js +73 -1
- package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
- 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 +92 -7
- 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/Types/LayeredDismissal.js +21 -0
- package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- 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/NetworkDeviceRoleUtil.js +386 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +661 -126
- 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 +57 -5
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- 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
|
@@ -0,0 +1,742 @@
|
|
|
1
|
+
import DatabaseConfig from "../DatabaseConfig";
|
|
2
|
+
import BaseService from "./BaseService";
|
|
3
|
+
import MailService from "./MailService";
|
|
4
|
+
import OnCallDutyPolicyOwnerTeamService from "./OnCallDutyPolicyOwnerTeamService";
|
|
5
|
+
import OnCallDutyPolicyOwnerUserService from "./OnCallDutyPolicyOwnerUserService";
|
|
6
|
+
import OnCallDutyPolicyService from "./OnCallDutyPolicyService";
|
|
7
|
+
import ProjectService from "./ProjectService";
|
|
8
|
+
import TeamMemberService from "./TeamMemberService";
|
|
9
|
+
import UserService from "./UserService";
|
|
10
|
+
import InProcessMemo from "../Utils/InProcessMemo";
|
|
11
|
+
import logger from "../Utils/Logger";
|
|
12
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
13
|
+
import URL from "../../Types/API/URL";
|
|
14
|
+
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
15
|
+
import Dictionary from "../../Types/Dictionary";
|
|
16
|
+
import EmailTemplateType from "../../Types/Email/EmailTemplateType";
|
|
17
|
+
import NotificationRuleType from "../../Types/NotificationRule/NotificationRuleType";
|
|
18
|
+
import ObjectID from "../../Types/ObjectID";
|
|
19
|
+
import OnCallDutyPolicyOwnerTeam from "../../Models/DatabaseModels/OnCallDutyPolicyOwnerTeam";
|
|
20
|
+
import OnCallDutyPolicyOwnerUser from "../../Models/DatabaseModels/OnCallDutyPolicyOwnerUser";
|
|
21
|
+
import Project from "../../Models/DatabaseModels/Project";
|
|
22
|
+
import User from "../../Models/DatabaseModels/User";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* What the paging path observed when it could not route a page the normal way.
|
|
26
|
+
*
|
|
27
|
+
* `fallbackChannelsUsed` is the whole story in one field: a non-empty array means the
|
|
28
|
+
* fallback reached the responder on those channels and this is a "your configuration is
|
|
29
|
+
* wrong, but nobody was dropped" warning; an empty array means the page was NOT delivered
|
|
30
|
+
* to this responder at all and this is the last-resort alert that somebody has to read.
|
|
31
|
+
*/
|
|
32
|
+
export interface UndeliverablePageNotificationData {
|
|
33
|
+
projectId: ObjectID;
|
|
34
|
+
userId: ObjectID;
|
|
35
|
+
ruleType: NotificationRuleType;
|
|
36
|
+
/** Human-readable severity ("Sev4"), used verbatim in the copy. Escaped before interpolation. */
|
|
37
|
+
severityName: string;
|
|
38
|
+
/** The policy that was executing, when known. Its owners are the closest thing to a responsible party. */
|
|
39
|
+
onCallDutyPolicyId?: ObjectID | undefined;
|
|
40
|
+
/** Channel names the fallback actually used, e.g. ["Email", "Push"]. Empty means nothing was delivered. */
|
|
41
|
+
fallbackChannelsUsed: Array<string>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* One notification per (projectId, userId, ruleType) per 24 hours.
|
|
46
|
+
*
|
|
47
|
+
* The trigger for this service is an on-call page, and pages arrive in storms: a single
|
|
48
|
+
* bad deploy can execute the same policy against the same responder hundreds of times in
|
|
49
|
+
* an hour, and every one of those executions takes exactly the same "no matching rule"
|
|
50
|
+
* branch. Without a window the fix for silent page loss would be a mail storm, which is
|
|
51
|
+
* the same failure wearing better clothes — nobody reads the two hundredth copy either.
|
|
52
|
+
*/
|
|
53
|
+
const NOTIFICATION_WINDOW_IN_MS: number = 24 * 60 * 60 * 1000;
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* Bounded so a large install cannot turn the throttle into a memory leak: the keys are
|
|
57
|
+
* (project, user, ruleType) triples and a busy install has a lot of them. Eviction is
|
|
58
|
+
* oldest-first, and an evicted key simply means one extra email — the durable project
|
|
59
|
+
* flag below still catches the common case.
|
|
60
|
+
*/
|
|
61
|
+
const THROTTLE_MAX_ENTRIES: number = 10_000;
|
|
62
|
+
|
|
63
|
+
export class OnCallNotificationAlertingService extends BaseService {
|
|
64
|
+
/*
|
|
65
|
+
* The fine-grained half of the throttle: exact (projectId, userId, ruleType) semantics,
|
|
66
|
+
* but only within one process.
|
|
67
|
+
*
|
|
68
|
+
* The durable half is Project.onCallFallbackUsedNotificationSentToOwners. A boolean
|
|
69
|
+
* column cannot record WHEN it was set, so it cannot express a 24h window on its own —
|
|
70
|
+
* it can only say "the owners have been told and nothing has cleared the flag yet".
|
|
71
|
+
* The two are combined in shouldNotifyOwners below, and the combination is deliberately
|
|
72
|
+
* biased towards sending: this whole phase exists because pages were being lost
|
|
73
|
+
* silently, and an extra owner email is a much cheaper mistake than a missed one.
|
|
74
|
+
*/
|
|
75
|
+
private ownerNotificationThrottle: InProcessMemo<boolean> =
|
|
76
|
+
new InProcessMemo<boolean>({
|
|
77
|
+
ttlInMs: NOTIFICATION_WINDOW_IN_MS,
|
|
78
|
+
maxEntries: THROTTLE_MAX_ENTRIES,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* The user-facing mail has no durable flag of its own by design. Constraint: the new
|
|
83
|
+
* project column throttles the OWNER mail, and reusing it here would let one responder's
|
|
84
|
+
* quiet period suppress the owners' alert (and vice versa). A per-process window is
|
|
85
|
+
* enough for the user mail because duplicates land in one person's inbox where they are
|
|
86
|
+
* self-evidently the same message, rather than fanning out across every project owner.
|
|
87
|
+
*/
|
|
88
|
+
private userNotificationThrottle: InProcessMemo<boolean> =
|
|
89
|
+
new InProcessMemo<boolean>({
|
|
90
|
+
ttlInMs: NOTIFICATION_WINDOW_IN_MS,
|
|
91
|
+
maxEntries: THROTTLE_MAX_ENTRIES,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Tell the people who can fix it that a page either fell back to a channel nobody chose,
|
|
96
|
+
* or could not be delivered at all.
|
|
97
|
+
*
|
|
98
|
+
* Two audiences, notified independently so a failure to reach one never suppresses the
|
|
99
|
+
* other:
|
|
100
|
+
* - the on-call policy's owners, falling back to the project's owners — they own the
|
|
101
|
+
* configuration that is wrong;
|
|
102
|
+
* - the responder themselves — they own the notification rules that are missing.
|
|
103
|
+
*
|
|
104
|
+
* This never throws. It is called from the on-call delivery path, where an exception
|
|
105
|
+
* raised while explaining a delivery problem would turn a degraded page into a lost one.
|
|
106
|
+
* Every failure is logged instead.
|
|
107
|
+
*/
|
|
108
|
+
@CaptureSpan()
|
|
109
|
+
public async notifyOfUndeliverablePage(
|
|
110
|
+
data: UndeliverablePageNotificationData,
|
|
111
|
+
): Promise<void> {
|
|
112
|
+
try {
|
|
113
|
+
if (!data.projectId || !data.userId) {
|
|
114
|
+
logger.error(
|
|
115
|
+
"OnCallNotificationAlertingService.notifyOfUndeliverablePage called without a projectId or userId. Nobody can be told about this undeliverable page.",
|
|
116
|
+
);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const project: Project | null = await ProjectService.findOneById({
|
|
121
|
+
id: data.projectId,
|
|
122
|
+
select: {
|
|
123
|
+
_id: true,
|
|
124
|
+
name: true,
|
|
125
|
+
onCallFallbackUsedNotificationSentToOwners: true,
|
|
126
|
+
},
|
|
127
|
+
props: {
|
|
128
|
+
isRoot: true,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (!project) {
|
|
133
|
+
logger.error(
|
|
134
|
+
`OnCallNotificationAlertingService: project ${data.projectId.toString()} not found, so nobody can be told that a page to user ${data.userId.toString()} was undeliverable.`,
|
|
135
|
+
);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const user: User | null = await UserService.findOneById({
|
|
140
|
+
id: data.userId,
|
|
141
|
+
select: {
|
|
142
|
+
_id: true,
|
|
143
|
+
name: true,
|
|
144
|
+
email: true,
|
|
145
|
+
},
|
|
146
|
+
props: {
|
|
147
|
+
isRoot: true,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
if (!user) {
|
|
152
|
+
logger.error(
|
|
153
|
+
`OnCallNotificationAlertingService: user ${data.userId.toString()} not found while reporting an undeliverable page in project ${data.projectId.toString()}.`,
|
|
154
|
+
);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/*
|
|
159
|
+
* Owners first. The responder is by definition the person whose notification setup
|
|
160
|
+
* just failed to reach them, so they are the LESS reliable of the two audiences —
|
|
161
|
+
* if the fallback delivered nothing, the user mail below may well go nowhere either.
|
|
162
|
+
*
|
|
163
|
+
* Each audience gets its own try/catch. A DB error while resolving the policy's
|
|
164
|
+
* owners says nothing about whether the responder can be emailed, and letting it
|
|
165
|
+
* cancel the second notification would make one broken lookup silence both halves
|
|
166
|
+
* of the alert.
|
|
167
|
+
*/
|
|
168
|
+
try {
|
|
169
|
+
await this.notifyOwners({
|
|
170
|
+
data: data,
|
|
171
|
+
project: project,
|
|
172
|
+
user: user,
|
|
173
|
+
});
|
|
174
|
+
} catch (err: unknown) {
|
|
175
|
+
logger.error(
|
|
176
|
+
`OnCallNotificationAlertingService: failed to notify the owners of an undeliverable page in project ${data.projectId.toString()}.`,
|
|
177
|
+
);
|
|
178
|
+
logger.error(err);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
await this.notifyAffectedUser({
|
|
183
|
+
data: data,
|
|
184
|
+
project: project,
|
|
185
|
+
user: user,
|
|
186
|
+
});
|
|
187
|
+
} catch (err: unknown) {
|
|
188
|
+
logger.error(
|
|
189
|
+
`OnCallNotificationAlertingService: failed to notify user ${data.userId.toString()} that their page in project ${data.projectId.toString()} was undeliverable.`,
|
|
190
|
+
);
|
|
191
|
+
logger.error(err);
|
|
192
|
+
}
|
|
193
|
+
} catch (err: unknown) {
|
|
194
|
+
logger.error(
|
|
195
|
+
"OnCallNotificationAlertingService.notifyOfUndeliverablePage failed. The page itself is unaffected; only the explanation was lost.",
|
|
196
|
+
);
|
|
197
|
+
logger.error(err);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/*
|
|
202
|
+
* Policy owners, then project owners. Not both: the policy owners are the specific,
|
|
203
|
+
* accountable audience, and mailing the whole ownership chain on every fallback is how
|
|
204
|
+
* owner notifications get filtered into a folder nobody opens.
|
|
205
|
+
*/
|
|
206
|
+
private async notifyOwners(input: {
|
|
207
|
+
data: UndeliverablePageNotificationData;
|
|
208
|
+
project: Project;
|
|
209
|
+
user: User;
|
|
210
|
+
}): Promise<void> {
|
|
211
|
+
const { data, project, user } = input;
|
|
212
|
+
|
|
213
|
+
const throttleKey: string = this.getThrottleKey(data);
|
|
214
|
+
|
|
215
|
+
const shouldNotify: boolean = await this.shouldNotifyOwners({
|
|
216
|
+
project: project,
|
|
217
|
+
throttleKey: throttleKey,
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
if (!shouldNotify) {
|
|
221
|
+
logger.debug(
|
|
222
|
+
`OnCallNotificationAlertingService: owner notification for ${throttleKey} suppressed by the ${NOTIFICATION_WINDOW_IN_MS / (60 * 60 * 1000)}h throttle.`,
|
|
223
|
+
);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const subject: string = this.getOwnerEmailSubject({
|
|
228
|
+
data: data,
|
|
229
|
+
project: project,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
const message: string = await this.getOwnerEmailMessageHtml({
|
|
233
|
+
data: data,
|
|
234
|
+
project: project,
|
|
235
|
+
user: user,
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
const policyOwners: Array<User> = await this.findOnCallDutyPolicyOwners(
|
|
239
|
+
data.onCallDutyPolicyId,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
if (policyOwners.length > 0) {
|
|
243
|
+
for (const owner of policyOwners) {
|
|
244
|
+
await this.sendSimpleMessage({
|
|
245
|
+
toUser: owner,
|
|
246
|
+
projectId: data.projectId,
|
|
247
|
+
subject: subject,
|
|
248
|
+
message: message,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
} else {
|
|
252
|
+
/*
|
|
253
|
+
* getOwners returns [] whenever no team in the project holds
|
|
254
|
+
* Permission.ProjectOwner, and sendEmailToProjectOwners then returns without
|
|
255
|
+
* sending anything and without saying so. That silence is exactly the failure mode
|
|
256
|
+
* this service exists to remove, so the emptiness is checked here and logged loudly:
|
|
257
|
+
* an install with no owner team is one where the last-resort alert has nowhere to
|
|
258
|
+
* go, and that is worth an error line in the logs even though nothing is broken
|
|
259
|
+
* from the code's point of view.
|
|
260
|
+
*
|
|
261
|
+
* The extra getOwners call this costs is deliberate. Re-implementing the send here
|
|
262
|
+
* to avoid it would fork the owner-mail path, and this runs at most once per
|
|
263
|
+
* (project, user, ruleType) per day.
|
|
264
|
+
*/
|
|
265
|
+
const projectOwners: Array<User> = await ProjectService.getOwners(
|
|
266
|
+
data.projectId,
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
if (projectOwners.length === 0) {
|
|
270
|
+
logger.error(
|
|
271
|
+
`OnCallNotificationAlertingService: project ${data.projectId.toString()} has no on-call policy owners and no project owners, so there is nobody to tell that a page to ${user.email?.toString() || data.userId.toString()} was undeliverable. Grant Permission.ProjectOwner to a team so alerts like this one have a destination.`,
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
/*
|
|
275
|
+
* Throttled like a successful send so a page storm produces one loud line per
|
|
276
|
+
* (project, user, ruleType) per day rather than one per page — an error nobody
|
|
277
|
+
* can find in the noise is not better than the silence it replaced. The durable
|
|
278
|
+
* project flag is deliberately left alone: nothing was sent, so "the owners have
|
|
279
|
+
* been told" must stay false.
|
|
280
|
+
*/
|
|
281
|
+
this.ownerNotificationThrottle.set(throttleKey, true);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
await ProjectService.sendEmailToProjectOwners(
|
|
286
|
+
data.projectId,
|
|
287
|
+
subject,
|
|
288
|
+
message,
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
this.ownerNotificationThrottle.set(throttleKey, true);
|
|
293
|
+
|
|
294
|
+
await this.setOwnerNotificationFlag(data.projectId, true);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/*
|
|
298
|
+
* The throttle decision, split out because the interaction between the in-process window
|
|
299
|
+
* and the durable flag is the subtle part of this service.
|
|
300
|
+
*/
|
|
301
|
+
private async shouldNotifyOwners(input: {
|
|
302
|
+
project: Project;
|
|
303
|
+
throttleKey: string;
|
|
304
|
+
}): Promise<boolean> {
|
|
305
|
+
const { project, throttleKey } = input;
|
|
306
|
+
|
|
307
|
+
if (this.ownerNotificationThrottle.get(throttleKey)) {
|
|
308
|
+
// This process mailed the owners about this exact triple inside the window.
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (project.onCallFallbackUsedNotificationSentToOwners) {
|
|
313
|
+
/*
|
|
314
|
+
* Another pod — or this one before a restart — already mailed the owners, and
|
|
315
|
+
* nothing has cleared the flag since. The column cannot tell us whether that was
|
|
316
|
+
* two minutes or two weeks ago, so there is no way to evaluate the window from it.
|
|
317
|
+
*
|
|
318
|
+
* Re-arm rather than guess. This page stays quiet (the owners did hear about the
|
|
319
|
+
* problem at some point) and the very next undeliverable page gets through, which
|
|
320
|
+
* means an install can never be permanently silenced by a latch nobody clears.
|
|
321
|
+
* The in-process key is deliberately NOT stamped here: stamping it would suppress
|
|
322
|
+
* that next page too, and a 24h silence after a pod restart is the one outcome this
|
|
323
|
+
* phase must not produce.
|
|
324
|
+
*
|
|
325
|
+
* The cost is bounded and known: across N pods this can produce up to one owner
|
|
326
|
+
* email per pod per triple per day instead of exactly one. That is the honest limit
|
|
327
|
+
* of what a project-scoped boolean can enforce, and it errs in the safe direction.
|
|
328
|
+
*/
|
|
329
|
+
await this.setOwnerNotificationFlag(project.id!, false);
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private async setOwnerNotificationFlag(
|
|
337
|
+
projectId: ObjectID,
|
|
338
|
+
value: boolean,
|
|
339
|
+
): Promise<void> {
|
|
340
|
+
await ProjectService.updateOneById({
|
|
341
|
+
id: projectId,
|
|
342
|
+
data: {
|
|
343
|
+
onCallFallbackUsedNotificationSentToOwners: value,
|
|
344
|
+
},
|
|
345
|
+
props: {
|
|
346
|
+
isRoot: true,
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
private async notifyAffectedUser(input: {
|
|
352
|
+
data: UndeliverablePageNotificationData;
|
|
353
|
+
project: Project;
|
|
354
|
+
user: User;
|
|
355
|
+
}): Promise<void> {
|
|
356
|
+
const { data, project, user } = input;
|
|
357
|
+
|
|
358
|
+
if (!user.email) {
|
|
359
|
+
logger.error(
|
|
360
|
+
`OnCallNotificationAlertingService: user ${data.userId.toString()} has no account email, so they cannot be told that their page in project ${data.projectId.toString()} was undeliverable.`,
|
|
361
|
+
);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
const throttleKey: string = this.getThrottleKey(data);
|
|
366
|
+
|
|
367
|
+
if (this.userNotificationThrottle.get(throttleKey)) {
|
|
368
|
+
logger.debug(
|
|
369
|
+
`OnCallNotificationAlertingService: user notification for ${throttleKey} suppressed by the ${NOTIFICATION_WINDOW_IN_MS / (60 * 60 * 1000)}h throttle.`,
|
|
370
|
+
);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const projectName: string = project.name || "your project";
|
|
375
|
+
const severity: string = data.severityName || "this severity";
|
|
376
|
+
const eventLabel: string = this.getRuleTypeLabel(data.ruleType);
|
|
377
|
+
|
|
378
|
+
const rulesLink: URL = await this.getNotificationRulesLinkInDashboard(
|
|
379
|
+
data.projectId,
|
|
380
|
+
data.ruleType,
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
const subject: string =
|
|
384
|
+
data.fallbackChannelsUsed.length > 0
|
|
385
|
+
? `You were paged in ${projectName} without a notification rule`
|
|
386
|
+
: `A page in ${projectName} could not reach you`;
|
|
387
|
+
|
|
388
|
+
/*
|
|
389
|
+
* Same raw-HTML rule as the owner message: SimpleMessage.hbs renders `message`
|
|
390
|
+
* through a triple stache, so the project and severity names are escaped here. The
|
|
391
|
+
* channel list is generated by the fallback (["Email", "Push"]) rather than by a user,
|
|
392
|
+
* but it is escaped too so that stays safe if the fallback ever learns to name a
|
|
393
|
+
* channel after a user-supplied label.
|
|
394
|
+
*/
|
|
395
|
+
const escapedLink: string = this.escapeHtml(rulesLink.toString());
|
|
396
|
+
|
|
397
|
+
const lines: Array<string> = [];
|
|
398
|
+
|
|
399
|
+
if (data.fallbackChannelsUsed.length > 0) {
|
|
400
|
+
lines.push(
|
|
401
|
+
`You were paged for a ${this.escapeHtml(severity)} ${this.escapeHtml(eventLabel)} in ${this.escapeHtml(projectName)}, but you have no notification rule configured for it. We reached you on your verified ${this.escapeHtml(this.formatChannelList(data.fallbackChannelsUsed))} instead.`,
|
|
402
|
+
);
|
|
403
|
+
lines.push(
|
|
404
|
+
`That fallback is a safety net, not a setting — it ignores everything you may have configured about how and when you want to be reached.`,
|
|
405
|
+
);
|
|
406
|
+
lines.push(
|
|
407
|
+
`Set up a rule so future pages arrive the way you want them to: <a href="${escapedLink}">${escapedLink}</a>`,
|
|
408
|
+
);
|
|
409
|
+
} else {
|
|
410
|
+
lines.push(
|
|
411
|
+
`You were paged for a ${this.escapeHtml(severity)} ${this.escapeHtml(eventLabel)} in ${this.escapeHtml(projectName)} and we could not deliver it. You have no notification rule for it and no verified notification method to fall back on, so nothing was sent anywhere.`,
|
|
412
|
+
);
|
|
413
|
+
lines.push(
|
|
414
|
+
`Until you add a verified notification method and a rule, every page routed to you is lost: <a href="${escapedLink}">${escapedLink}</a>`,
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
await this.sendSimpleMessage({
|
|
419
|
+
toUser: user,
|
|
420
|
+
projectId: data.projectId,
|
|
421
|
+
subject: subject,
|
|
422
|
+
message: lines.join("<br/><br/>"),
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
this.userNotificationThrottle.set(throttleKey, true);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
private getOwnerEmailSubject(input: {
|
|
429
|
+
data: UndeliverablePageNotificationData;
|
|
430
|
+
project: Project;
|
|
431
|
+
}): string {
|
|
432
|
+
const { data, project } = input;
|
|
433
|
+
|
|
434
|
+
const projectName: string = project.name || "your project";
|
|
435
|
+
|
|
436
|
+
/*
|
|
437
|
+
* The subject is rendered through {{title}} in EmailTitle.hbs, which Handlebars
|
|
438
|
+
* escapes, and is also used verbatim as the SMTP subject header. Escaping it here
|
|
439
|
+
* would double-escape the first and corrupt the second, so raw values belong here and
|
|
440
|
+
* escaped values belong in the message body only.
|
|
441
|
+
*/
|
|
442
|
+
return data.fallbackChannelsUsed.length > 0
|
|
443
|
+
? `On-call fallback used in ${projectName}`
|
|
444
|
+
: `A page in ${projectName} reached nobody`;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
private async getOwnerEmailMessageHtml(input: {
|
|
448
|
+
data: UndeliverablePageNotificationData;
|
|
449
|
+
project: Project;
|
|
450
|
+
user: User;
|
|
451
|
+
}): Promise<string> {
|
|
452
|
+
const { data, project, user } = input;
|
|
453
|
+
|
|
454
|
+
/*
|
|
455
|
+
* Everything below is interpolated into ProjectService.sendEmailToProjectOwners, which
|
|
456
|
+
* hands `message` to SimpleMessage.hbs where InfoBlock renders it through a triple
|
|
457
|
+
* stache ({{{info}}}) — i.e. as RAW HTML. User names, project names and severity names
|
|
458
|
+
* are all user-controlled strings, so every one of them is escaped on the way in.
|
|
459
|
+
*/
|
|
460
|
+
const projectName: string = this.escapeHtml(project.name || "your project");
|
|
461
|
+
const userName: string = this.escapeHtml(
|
|
462
|
+
user.name?.toString() || user.email?.toString() || "A responder",
|
|
463
|
+
);
|
|
464
|
+
const userEmail: string = this.escapeHtml(user.email?.toString() || "");
|
|
465
|
+
const severity: string = this.escapeHtml(
|
|
466
|
+
data.severityName || "this severity",
|
|
467
|
+
);
|
|
468
|
+
const eventLabel: string = this.escapeHtml(
|
|
469
|
+
this.getRuleTypeLabel(data.ruleType),
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
const lines: Array<string> = [];
|
|
473
|
+
|
|
474
|
+
if (data.fallbackChannelsUsed.length > 0) {
|
|
475
|
+
lines.push(
|
|
476
|
+
`${userName}${userEmail ? ` (${userEmail})` : ""} was paged for a ${severity} ${eventLabel} in ${projectName}, but has no notification rule configured for it.`,
|
|
477
|
+
);
|
|
478
|
+
lines.push(
|
|
479
|
+
`The page was delivered on their verified ${this.escapeHtml(this.formatChannelList(data.fallbackChannelsUsed))} as a fallback, so nobody was dropped this time.`,
|
|
480
|
+
);
|
|
481
|
+
} else {
|
|
482
|
+
lines.push(
|
|
483
|
+
`${userName}${userEmail ? ` (${userEmail})` : ""} was paged for a ${severity} ${eventLabel} in ${projectName} and the page could not be delivered.`,
|
|
484
|
+
);
|
|
485
|
+
lines.push(
|
|
486
|
+
`They have no notification rule for it and no verified notification method to fall back on, so this page reached them on no channel at all. If they are the only responder on this escalation level, it reached nobody.`,
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (data.onCallDutyPolicyId) {
|
|
491
|
+
const policyName: string | null =
|
|
492
|
+
await OnCallDutyPolicyService.getOnCallDutyPolicyName({
|
|
493
|
+
onCallDutyPolicyId: data.onCallDutyPolicyId,
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
const policyLink: URL =
|
|
497
|
+
await OnCallDutyPolicyService.getOnCallDutyPolicyLinkInDashboard(
|
|
498
|
+
data.projectId,
|
|
499
|
+
data.onCallDutyPolicyId,
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
lines.push(
|
|
503
|
+
`On-call policy: <a href="${this.escapeHtml(policyLink.toString())}">${this.escapeHtml(policyName || "View policy")}</a>`,
|
|
504
|
+
);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
lines.push(
|
|
508
|
+
`Ask them to add a rule for ${severity} ${eventLabel} in User Settings > On-Call Rules, or remove them from the escalation level if they are not meant to be paged for it.`,
|
|
509
|
+
);
|
|
510
|
+
|
|
511
|
+
return lines.join("<br/><br/>");
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/*
|
|
515
|
+
* The policy's own owners: direct owner users, plus every member of an owner team.
|
|
516
|
+
* Returns [] when no policy id was supplied, which is the caller's signal to fall back
|
|
517
|
+
* to the project owners.
|
|
518
|
+
*/
|
|
519
|
+
private async findOnCallDutyPolicyOwners(
|
|
520
|
+
onCallDutyPolicyId: ObjectID | undefined,
|
|
521
|
+
): Promise<Array<User>> {
|
|
522
|
+
if (!onCallDutyPolicyId) {
|
|
523
|
+
return [];
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
const ownerUsers: Array<OnCallDutyPolicyOwnerUser> =
|
|
527
|
+
await OnCallDutyPolicyOwnerUserService.findBy({
|
|
528
|
+
query: {
|
|
529
|
+
onCallDutyPolicyId: onCallDutyPolicyId,
|
|
530
|
+
},
|
|
531
|
+
select: {
|
|
532
|
+
_id: true,
|
|
533
|
+
user: {
|
|
534
|
+
_id: true,
|
|
535
|
+
name: true,
|
|
536
|
+
email: true,
|
|
537
|
+
},
|
|
538
|
+
},
|
|
539
|
+
skip: 0,
|
|
540
|
+
limit: LIMIT_PER_PROJECT,
|
|
541
|
+
props: {
|
|
542
|
+
isRoot: true,
|
|
543
|
+
},
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
const ownerTeams: Array<OnCallDutyPolicyOwnerTeam> =
|
|
547
|
+
await OnCallDutyPolicyOwnerTeamService.findBy({
|
|
548
|
+
query: {
|
|
549
|
+
onCallDutyPolicyId: onCallDutyPolicyId,
|
|
550
|
+
},
|
|
551
|
+
select: {
|
|
552
|
+
_id: true,
|
|
553
|
+
teamId: true,
|
|
554
|
+
},
|
|
555
|
+
skip: 0,
|
|
556
|
+
limit: LIMIT_PER_PROJECT,
|
|
557
|
+
props: {
|
|
558
|
+
isRoot: true,
|
|
559
|
+
},
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
const users: Array<User> = [];
|
|
563
|
+
const seenUserIds: Set<string> = new Set<string>();
|
|
564
|
+
|
|
565
|
+
const addUser: (user: User | undefined) => void = (
|
|
566
|
+
user: User | undefined,
|
|
567
|
+
): void => {
|
|
568
|
+
if (!user || !user.id || !user.email) {
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const key: string = user.id.toString();
|
|
573
|
+
|
|
574
|
+
if (seenUserIds.has(key)) {
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
seenUserIds.add(key);
|
|
579
|
+
users.push(user);
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
for (const ownerUser of ownerUsers) {
|
|
583
|
+
addUser(ownerUser.user);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
const teamIds: Array<ObjectID> = [];
|
|
587
|
+
|
|
588
|
+
for (const ownerTeam of ownerTeams) {
|
|
589
|
+
if (ownerTeam.teamId) {
|
|
590
|
+
teamIds.push(ownerTeam.teamId);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
if (teamIds.length > 0) {
|
|
595
|
+
const teamUsers: Array<User> =
|
|
596
|
+
await TeamMemberService.getUsersInTeams(teamIds);
|
|
597
|
+
|
|
598
|
+
for (const teamUser of teamUsers) {
|
|
599
|
+
addUser(teamUser);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return users;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
private async sendSimpleMessage(input: {
|
|
607
|
+
toUser: User;
|
|
608
|
+
projectId: ObjectID;
|
|
609
|
+
subject: string;
|
|
610
|
+
message: string;
|
|
611
|
+
}): Promise<void> {
|
|
612
|
+
const { toUser, projectId, subject, message } = input;
|
|
613
|
+
|
|
614
|
+
if (!toUser.email) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const vars: Dictionary<string> = {
|
|
619
|
+
subject: subject,
|
|
620
|
+
message: message,
|
|
621
|
+
};
|
|
622
|
+
|
|
623
|
+
try {
|
|
624
|
+
await MailService.sendMail(
|
|
625
|
+
{
|
|
626
|
+
toEmail: toUser.email,
|
|
627
|
+
templateType: EmailTemplateType.SimpleMessage,
|
|
628
|
+
vars: vars,
|
|
629
|
+
subject: subject,
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
projectId: projectId,
|
|
633
|
+
userId: toUser.id!,
|
|
634
|
+
},
|
|
635
|
+
);
|
|
636
|
+
} catch (err: unknown) {
|
|
637
|
+
/*
|
|
638
|
+
* Swallowed on purpose: one unreachable recipient must not stop the rest of the
|
|
639
|
+
* owner list from hearing about a page that reached nobody.
|
|
640
|
+
*/
|
|
641
|
+
logger.error(
|
|
642
|
+
`OnCallNotificationAlertingService: failed to email ${toUser.email.toString()} about an undeliverable on-call page.`,
|
|
643
|
+
);
|
|
644
|
+
logger.error(err);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
private getThrottleKey(data: UndeliverablePageNotificationData): string {
|
|
649
|
+
return `${data.projectId.toString()}:${data.userId.toString()}:${data.ruleType}`;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/*
|
|
653
|
+
* NotificationRuleType's values are already English sentences ("When incident on-call
|
|
654
|
+
* policy is executed"), which read badly mid-sentence. These are the noun forms.
|
|
655
|
+
*/
|
|
656
|
+
private getRuleTypeLabel(ruleType: NotificationRuleType): string {
|
|
657
|
+
switch (ruleType) {
|
|
658
|
+
case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT:
|
|
659
|
+
return "incident";
|
|
660
|
+
case NotificationRuleType.ON_CALL_EXECUTED_ALERT:
|
|
661
|
+
return "alert";
|
|
662
|
+
case NotificationRuleType.ON_CALL_EXECUTED_ALERT_EPISODE:
|
|
663
|
+
return "alert episode";
|
|
664
|
+
case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE:
|
|
665
|
+
return "incident episode";
|
|
666
|
+
case NotificationRuleType.WHEN_USER_GOES_ON_CALL:
|
|
667
|
+
return "on-call shift start";
|
|
668
|
+
case NotificationRuleType.WHEN_USER_GOES_OFF_CALL:
|
|
669
|
+
return "on-call shift end";
|
|
670
|
+
default:
|
|
671
|
+
return "on-call notification";
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
/*
|
|
676
|
+
* The four severity-scoped rule types each have their own settings page, and sending
|
|
677
|
+
* someone to the wrong one is how a "fix your rules" email gets ignored. The two shift
|
|
678
|
+
* rule types are configured on the incident page alongside everything else.
|
|
679
|
+
*
|
|
680
|
+
* These path segments mirror UserSettingsRoutePath in the Dashboard's RouteMap. They are
|
|
681
|
+
* duplicated rather than imported because Common/Server cannot reach App sources — the
|
|
682
|
+
* same reason OnCallDutyPolicyService.getOnCallDutyPolicyLinkInDashboard spells its
|
|
683
|
+
* route out by hand.
|
|
684
|
+
*/
|
|
685
|
+
private getUserSettingsPathForRuleType(
|
|
686
|
+
ruleType: NotificationRuleType,
|
|
687
|
+
): string {
|
|
688
|
+
switch (ruleType) {
|
|
689
|
+
case NotificationRuleType.ON_CALL_EXECUTED_ALERT:
|
|
690
|
+
return "alert-on-call-rules";
|
|
691
|
+
case NotificationRuleType.ON_CALL_EXECUTED_ALERT_EPISODE:
|
|
692
|
+
return "alert-episode-on-call-rules";
|
|
693
|
+
case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE:
|
|
694
|
+
return "incident-episode-on-call-rules";
|
|
695
|
+
case NotificationRuleType.ON_CALL_EXECUTED_INCIDENT:
|
|
696
|
+
case NotificationRuleType.WHEN_USER_GOES_ON_CALL:
|
|
697
|
+
case NotificationRuleType.WHEN_USER_GOES_OFF_CALL:
|
|
698
|
+
return "incident-on-call-rules";
|
|
699
|
+
default:
|
|
700
|
+
return "notification-methods";
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
private async getNotificationRulesLinkInDashboard(
|
|
705
|
+
projectId: ObjectID,
|
|
706
|
+
ruleType: NotificationRuleType,
|
|
707
|
+
): Promise<URL> {
|
|
708
|
+
const dashboardUrl: URL = await DatabaseConfig.getDashboardUrl();
|
|
709
|
+
|
|
710
|
+
return URL.fromString(dashboardUrl.toString()).addRoute(
|
|
711
|
+
`/${projectId.toString()}/user-settings/${this.getUserSettingsPathForRuleType(ruleType)}`,
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
private formatChannelList(channels: Array<string>): string {
|
|
716
|
+
if (channels.length === 0) {
|
|
717
|
+
return "";
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
if (channels.length === 1) {
|
|
721
|
+
return channels[0]!;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return `${channels.slice(0, -1).join(", ")} and ${channels[channels.length - 1]!}`;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/*
|
|
728
|
+
* ProjectService.sendEmailToProjectOwners hands `message` to a triple-stache Handlebars
|
|
729
|
+
* partial, so nothing between here and the recipient's inbox escapes anything. This is
|
|
730
|
+
* the only escaping in that path.
|
|
731
|
+
*/
|
|
732
|
+
private escapeHtml(value: string): string {
|
|
733
|
+
return value
|
|
734
|
+
.replace(/&/g, "&")
|
|
735
|
+
.replace(/</g, "<")
|
|
736
|
+
.replace(/>/g, ">")
|
|
737
|
+
.replace(/"/g, """)
|
|
738
|
+
.replace(/'/g, "'");
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
export default new OnCallNotificationAlertingService();
|