@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
|
@@ -1,22 +1,26 @@
|
|
|
1
|
+
import OnCallReadinessService, {
|
|
2
|
+
ReadinessCoverageCell,
|
|
3
|
+
ReadinessSummary,
|
|
4
|
+
UserReadiness,
|
|
5
|
+
} from "./OnCallReadinessService";
|
|
1
6
|
import TeamComplianceSettingService from "./TeamComplianceSettingService";
|
|
2
7
|
import TeamMemberService from "./TeamMemberService";
|
|
3
8
|
import UserEmailService from "./UserEmailService";
|
|
4
9
|
import UserSmsService from "./UserSmsService";
|
|
5
10
|
import UserCallService from "./UserCallService";
|
|
6
11
|
import UserPushService from "./UserPushService";
|
|
7
|
-
import IncidentSeverityService from "./IncidentSeverityService";
|
|
8
|
-
import AlertSeverityService from "./AlertSeverityService";
|
|
9
|
-
import UserNotificationRuleService from "./UserNotificationRuleService";
|
|
10
12
|
import UserService from "./UserService";
|
|
11
13
|
import TeamService from "./TeamService";
|
|
12
14
|
import ObjectID from "../../Types/ObjectID";
|
|
13
15
|
import ComplianceRuleType from "../../Types/Team/ComplianceRuleType";
|
|
16
|
+
import NotificationRuleType from "../../Types/NotificationRule/NotificationRuleType";
|
|
14
17
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
15
18
|
import Includes from "../../Types/BaseDatabase/Includes";
|
|
19
|
+
import logger from "../Utils/Logger";
|
|
16
20
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
17
21
|
import Team from "../../Models/DatabaseModels/Team";
|
|
18
|
-
import
|
|
19
|
-
import
|
|
22
|
+
import User from "../../Models/DatabaseModels/User";
|
|
23
|
+
import TeamMember from "../../Models/DatabaseModels/TeamMember";
|
|
20
24
|
|
|
21
25
|
export interface UserComplianceStatus {
|
|
22
26
|
userId: ObjectID;
|
|
@@ -40,14 +44,70 @@ export interface TeamComplianceStatus {
|
|
|
40
44
|
userComplianceStatuses: Array<UserComplianceStatus>;
|
|
41
45
|
}
|
|
42
46
|
|
|
47
|
+
/*
|
|
48
|
+
* How many members' channel checks may be in flight at once. Each member costs
|
|
49
|
+
* one small indexed existence check per enabled channel rule (four at most), so
|
|
50
|
+
* twenty members in flight is up to eighty concurrent queries - enough to keep
|
|
51
|
+
* the page quick on a large team, and nowhere near enough to matter to a
|
|
52
|
+
* connection pool shared with the rest of the product. The number is a ceiling
|
|
53
|
+
* on the burst, not a target: a five-member team still issues five.
|
|
54
|
+
*/
|
|
55
|
+
const MAX_CONCURRENT_MEMBER_CHECKS: number = 20;
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* Teams > View > Compliance. The route (`/team/compliance-status/:teamId`) and
|
|
59
|
+
* every field of the payload above are unchanged, because
|
|
60
|
+
* TeamComplianceStatusTable.tsx renders them verbatim - including the reason
|
|
61
|
+
* strings, which are printed as prose rather than mapped through any lookup.
|
|
62
|
+
*
|
|
63
|
+
* What changed in Phase 2 is where the answers come from. The two "does this
|
|
64
|
+
* user have on-call rules?" questions used to be answered here, by walking every
|
|
65
|
+
* severity in the project and issuing one findBy per severity per user; that
|
|
66
|
+
* walk got four things wrong (it ignored ruleType, so an off-call rule counted
|
|
67
|
+
* as incident coverage; it read only four of the seven channel columns, so a
|
|
68
|
+
* Telegram/WhatsApp/Webhook responder was reported unreachable; it capped alert
|
|
69
|
+
* severities at 100 while capping incident severities at LIMIT_PER_PROJECT; and
|
|
70
|
+
* it was quadratic). All four are now OnCallReadinessService's problem, answered
|
|
71
|
+
* from AT MOST TWO batched, cached computations for the whole team - which also
|
|
72
|
+
* means this page and the on-call readiness surfaces can no longer disagree
|
|
73
|
+
* about whether a given responder is covered.
|
|
74
|
+
*
|
|
75
|
+
* The four "does this user have a verified <channel>?" questions stay here, as
|
|
76
|
+
* direct existence checks. ComplianceRuleType names one specific channel per
|
|
77
|
+
* rule, so there is nothing to batch across severities and nothing for the
|
|
78
|
+
* readiness service to reconcile: both surfaces are asking the same table the
|
|
79
|
+
* same question and necessarily agree already.
|
|
80
|
+
*
|
|
81
|
+
* TENANT SCOPING. Every read below - including the team row itself - carries the
|
|
82
|
+
* projectId the caller was authorised for, and every read is made with
|
|
83
|
+
* `isRoot: true` because this page deliberately reports on people the reader may
|
|
84
|
+
* have no permission to read individually. Root reads mean the projectId in the
|
|
85
|
+
* QUERY is the only tenant boundary there is: the team was previously fetched by
|
|
86
|
+
* id alone, so a team id belonging to another project resolved and its members'
|
|
87
|
+
* reachability was described to a caller from outside that project. The id and
|
|
88
|
+
* the project are now asked for together, in one query, so a foreign team simply
|
|
89
|
+
* does not exist as far as this service is concerned.
|
|
90
|
+
*/
|
|
43
91
|
export default class TeamComplianceService {
|
|
44
92
|
public static async getTeamComplianceStatus(
|
|
45
93
|
teamId: ObjectID,
|
|
46
94
|
projectId: ObjectID,
|
|
47
95
|
): Promise<TeamComplianceStatus> {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
96
|
+
/*
|
|
97
|
+
* The team is looked up BY ID AND BY PROJECT, together. Splitting those into
|
|
98
|
+
* "read by id, then compare projectId" would work just as well when written
|
|
99
|
+
* correctly, but the comparison is a line somebody can delete without the
|
|
100
|
+
* query looking wrong; a query that names both columns cannot be half-right.
|
|
101
|
+
*
|
|
102
|
+
* A team from another project therefore comes back null and is answered with
|
|
103
|
+
* the same "Team not found" a nonexistent id gets - deliberately identical,
|
|
104
|
+
* so this endpoint cannot be used to learn which team ids exist elsewhere.
|
|
105
|
+
*/
|
|
106
|
+
const team: Partial<Team> | null = await TeamService.findOneBy({
|
|
107
|
+
query: {
|
|
108
|
+
_id: teamId.toString(),
|
|
109
|
+
projectId: projectId,
|
|
110
|
+
},
|
|
51
111
|
select: {
|
|
52
112
|
name: true,
|
|
53
113
|
_id: true,
|
|
@@ -61,7 +121,14 @@ export default class TeamComplianceService {
|
|
|
61
121
|
throw new BadDataException("Team not found");
|
|
62
122
|
}
|
|
63
123
|
|
|
64
|
-
|
|
124
|
+
/*
|
|
125
|
+
* LIMIT_PER_PROJECT, not 100, at all three sites below. The old cap was the
|
|
126
|
+
* worst kind of bug for a compliance page: a truncated list does not render
|
|
127
|
+
* as an error or as a warning, it renders as fewer rows - and a member who
|
|
128
|
+
* is simply absent from the table reads exactly like a member with nothing
|
|
129
|
+
* wrong. TeamComplianceSetting is one row per rule type today so its cap was
|
|
130
|
+
* harmless, but it is the same mistake and is fixed with the other two.
|
|
131
|
+
*/
|
|
65
132
|
const complianceSettings: Array<{
|
|
66
133
|
ruleType?: ComplianceRuleType;
|
|
67
134
|
enabled?: boolean;
|
|
@@ -74,7 +141,7 @@ export default class TeamComplianceService {
|
|
|
74
141
|
ruleType: true,
|
|
75
142
|
enabled: true,
|
|
76
143
|
},
|
|
77
|
-
limit:
|
|
144
|
+
limit: LIMIT_PER_PROJECT,
|
|
78
145
|
skip: 0,
|
|
79
146
|
props: {
|
|
80
147
|
isRoot: true,
|
|
@@ -82,31 +149,45 @@ export default class TeamComplianceService {
|
|
|
82
149
|
});
|
|
83
150
|
|
|
84
151
|
// Get team members
|
|
85
|
-
const teamMembers: Array<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
152
|
+
const teamMembers: Array<TeamMember> = await TeamMemberService.findBy({
|
|
153
|
+
query: {
|
|
154
|
+
teamId: teamId,
|
|
155
|
+
projectId: projectId,
|
|
156
|
+
},
|
|
157
|
+
select: {
|
|
158
|
+
userId: true,
|
|
159
|
+
_id: true,
|
|
160
|
+
},
|
|
161
|
+
limit: LIMIT_PER_PROJECT,
|
|
162
|
+
skip: 0,
|
|
163
|
+
props: {
|
|
164
|
+
isRoot: true,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* LIMIT_PER_PROJECT is a ceiling, not a promise, and a page that hits it
|
|
170
|
+
* renders as fewer rows rather than as a warning - the 10,001st member is
|
|
171
|
+
* not reported non-compliant, they are absent, and an absent row reads as
|
|
172
|
+
* "no problem here". Ten thousand members on one team is not a shape any
|
|
173
|
+
* install has, which is why this is a log rather than a paging loop, but the
|
|
174
|
+
* day it happens the operator gets a sentence saying the page is incomplete
|
|
175
|
+
* instead of a table that quietly is.
|
|
176
|
+
*/
|
|
177
|
+
if (teamMembers.length >= LIMIT_PER_PROJECT) {
|
|
178
|
+
logger.error(
|
|
179
|
+
`TeamComplianceService read ${LIMIT_PER_PROJECT} members of team ${teamId.toString()} in project ${projectId.toString()} and stopped. The compliance page for this team is INCOMPLETE: members past that ceiling are absent from it entirely, and absence reads as compliance.`,
|
|
180
|
+
);
|
|
181
|
+
}
|
|
101
182
|
|
|
102
183
|
const userIds: Array<ObjectID> = teamMembers
|
|
103
|
-
.map((member:
|
|
184
|
+
.map((member: TeamMember): ObjectID => {
|
|
104
185
|
return member.userId!;
|
|
105
186
|
})
|
|
106
187
|
.filter(Boolean);
|
|
107
188
|
|
|
108
189
|
// Get user details
|
|
109
|
-
const users:
|
|
190
|
+
const users: Array<User> = await UserService.findBy({
|
|
110
191
|
query: {
|
|
111
192
|
_id: new Includes(userIds),
|
|
112
193
|
},
|
|
@@ -116,60 +197,242 @@ export default class TeamComplianceService {
|
|
|
116
197
|
_id: true,
|
|
117
198
|
profilePictureId: true,
|
|
118
199
|
},
|
|
119
|
-
limit:
|
|
200
|
+
limit: LIMIT_PER_PROJECT,
|
|
120
201
|
skip: 0,
|
|
121
202
|
props: {
|
|
122
203
|
isRoot: true,
|
|
123
204
|
},
|
|
124
205
|
});
|
|
125
206
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
207
|
+
const settings: Array<{ ruleType: ComplianceRuleType; enabled: boolean }> =
|
|
208
|
+
complianceSettings.map(
|
|
209
|
+
(setting: {
|
|
210
|
+
ruleType?: ComplianceRuleType;
|
|
211
|
+
enabled?: boolean;
|
|
212
|
+
}): { ruleType: ComplianceRuleType; enabled: boolean } => {
|
|
213
|
+
return {
|
|
214
|
+
ruleType: setting.ruleType!,
|
|
215
|
+
enabled: setting.enabled || false,
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const readinessByUserId: Map<string, UserReadiness> =
|
|
221
|
+
await this.getReadinessByUserId(
|
|
222
|
+
users.map((user: User): ObjectID => {
|
|
223
|
+
return user.id!;
|
|
224
|
+
}),
|
|
138
225
|
projectId,
|
|
139
|
-
|
|
140
|
-
(setting: { ruleType?: ComplianceRuleType; enabled?: boolean }) => {
|
|
141
|
-
return {
|
|
142
|
-
ruleType: setting.ruleType!,
|
|
143
|
-
enabled: setting.enabled || false,
|
|
144
|
-
};
|
|
145
|
-
},
|
|
146
|
-
),
|
|
226
|
+
settings,
|
|
147
227
|
);
|
|
148
|
-
userComplianceStatuses.push({
|
|
149
|
-
userId: user.id!,
|
|
150
|
-
userName:
|
|
151
|
-
user.name?.toString() || user.email?.toString() || "Unknown User",
|
|
152
|
-
userEmail: user.email?.toString() || "",
|
|
153
|
-
userProfilePictureId: user.profilePictureId,
|
|
154
|
-
...complianceStatus,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
228
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
229
|
+
/*
|
|
230
|
+
* Users are checked concurrently rather than one at a time - there is no
|
|
231
|
+
* reason for Ada's lookups to wait on Grace's - but concurrently is not the
|
|
232
|
+
* same as all at once. Each user's channel rules cost up to four existence
|
|
233
|
+
* checks, so a bare Promise.all over a 5,000-member team opens twenty
|
|
234
|
+
* thousand simultaneous queries and the page that was meant to be faster
|
|
235
|
+
* takes the pool down with it. The bounded map keeps the parallelism and
|
|
236
|
+
* caps the burst, and it assigns results by index so the table's rows do not
|
|
237
|
+
* shuffle.
|
|
238
|
+
*/
|
|
239
|
+
const userComplianceStatuses: Array<UserComplianceStatus> =
|
|
240
|
+
await this.mapWithBoundedConcurrency(
|
|
241
|
+
users,
|
|
242
|
+
MAX_CONCURRENT_MEMBER_CHECKS,
|
|
243
|
+
async (user: User): Promise<UserComplianceStatus> => {
|
|
244
|
+
const complianceStatus: {
|
|
245
|
+
isCompliant: boolean;
|
|
246
|
+
nonCompliantRules: Array<{
|
|
247
|
+
ruleType: ComplianceRuleType;
|
|
248
|
+
reason: string;
|
|
249
|
+
}>;
|
|
250
|
+
} = await this.checkUserCompliance(
|
|
251
|
+
user.id!,
|
|
252
|
+
projectId,
|
|
253
|
+
settings,
|
|
254
|
+
readinessByUserId.get(user.id!.toString()),
|
|
255
|
+
);
|
|
256
|
+
|
|
163
257
|
return {
|
|
164
|
-
|
|
165
|
-
|
|
258
|
+
userId: user.id!,
|
|
259
|
+
userName:
|
|
260
|
+
user.name?.toString() || user.email?.toString() || "Unknown User",
|
|
261
|
+
userEmail: user.email?.toString() || "",
|
|
262
|
+
userProfilePictureId: user.profilePictureId,
|
|
263
|
+
...complianceStatus,
|
|
166
264
|
};
|
|
167
265
|
},
|
|
168
|
-
)
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
teamId: teamId,
|
|
270
|
+
teamName: team.name || "Unknown Team",
|
|
271
|
+
complianceSettings: settings,
|
|
169
272
|
userComplianceStatuses,
|
|
170
273
|
};
|
|
171
274
|
}
|
|
172
275
|
|
|
276
|
+
/*
|
|
277
|
+
* Readiness for a whole team, in AT MOST TWO readiness computations however
|
|
278
|
+
* many members the team has.
|
|
279
|
+
*
|
|
280
|
+
* The project-scope summary is asked for first and used as the source for
|
|
281
|
+
* everyone it happens to contain. It resolves every responder on every policy
|
|
282
|
+
* in the project in one batched pass, so for a team that exists because its
|
|
283
|
+
* members are on call - which is the only kind of team this page is really
|
|
284
|
+
* about - it answers for all of them at once, and it is very likely already
|
|
285
|
+
* warm in the readiness service's 60s cache because the On-Call banner and the
|
|
286
|
+
* readiness page request that same scope.
|
|
287
|
+
*
|
|
288
|
+
* Members the summary does not cover are those on no policy at all. They are
|
|
289
|
+
* still subject to the team's compliance rules, so they cannot be skipped -
|
|
290
|
+
* and they are now resolved in ONE batched `getReadinessForUsers` call rather
|
|
291
|
+
* than one `getReadinessForUser` per member.
|
|
292
|
+
*
|
|
293
|
+
* That distinction is the whole point of this function. `getReadinessForUser`
|
|
294
|
+
* resolves the project's ENTIRE responder set on every call, purely to work
|
|
295
|
+
* out which policies reach the one user it was asked about, so a 40-member
|
|
296
|
+
* team with 38 members on no policy used to cost 38 full project resolutions -
|
|
297
|
+
* hundreds of queries - to render one page. The batched entry point pays for
|
|
298
|
+
* that resolution once and answers for every member from it.
|
|
299
|
+
*
|
|
300
|
+
* A member the batch cannot resolve - somebody removed from the project
|
|
301
|
+
* between the member read above and this call - is simply absent from the map.
|
|
302
|
+
* They are NOT an error: one person leaving a team must not blank the page for
|
|
303
|
+
* the other thirty-nine. checkHasOnCallRules reports their on-call rules as
|
|
304
|
+
* unverified rather than as fine, because "we could not check" and "there is
|
|
305
|
+
* nothing wrong" are different answers and only one of them is true.
|
|
306
|
+
*
|
|
307
|
+
* Nothing is computed when neither on-call-rule setting is enabled: the
|
|
308
|
+
* channel rules do not consult readiness, so a team that only checks "has a
|
|
309
|
+
* verified email" must not pay for a project-wide readiness pass.
|
|
310
|
+
*/
|
|
311
|
+
private static async getReadinessByUserId(
|
|
312
|
+
userIds: Array<ObjectID>,
|
|
313
|
+
projectId: ObjectID,
|
|
314
|
+
settings: Array<{ ruleType: ComplianceRuleType; enabled: boolean }>,
|
|
315
|
+
): Promise<Map<string, UserReadiness>> {
|
|
316
|
+
const readinessByUserId: Map<string, UserReadiness> = new Map<
|
|
317
|
+
string,
|
|
318
|
+
UserReadiness
|
|
319
|
+
>();
|
|
320
|
+
|
|
321
|
+
if (userIds.length === 0) {
|
|
322
|
+
return readinessByUserId;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const needsReadiness: boolean = settings.some(
|
|
326
|
+
(setting: {
|
|
327
|
+
ruleType: ComplianceRuleType;
|
|
328
|
+
enabled: boolean;
|
|
329
|
+
}): boolean => {
|
|
330
|
+
return (
|
|
331
|
+
setting.enabled &&
|
|
332
|
+
(setting.ruleType === ComplianceRuleType.HasIncidentOnCallRules ||
|
|
333
|
+
setting.ruleType === ComplianceRuleType.HasAlertOnCallRules)
|
|
334
|
+
);
|
|
335
|
+
},
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
if (!needsReadiness) {
|
|
339
|
+
return readinessByUserId;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const wanted: Set<string> = new Set<string>(
|
|
343
|
+
userIds.map((userId: ObjectID): string => {
|
|
344
|
+
return userId.toString();
|
|
345
|
+
}),
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
const summary: ReadinessSummary =
|
|
349
|
+
await OnCallReadinessService.getReadinessForProject(projectId);
|
|
350
|
+
|
|
351
|
+
for (const readiness of summary.users) {
|
|
352
|
+
const key: string = readiness.userId.toString();
|
|
353
|
+
if (wanted.has(key)) {
|
|
354
|
+
readinessByUserId.set(key, readiness);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const missing: Array<ObjectID> = userIds.filter(
|
|
359
|
+
(userId: ObjectID): boolean => {
|
|
360
|
+
return !readinessByUserId.has(userId.toString());
|
|
361
|
+
},
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
if (missing.length === 0) {
|
|
365
|
+
return readinessByUserId;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/*
|
|
369
|
+
* One call, whatever `missing.length` is. The batch answers only for the
|
|
370
|
+
* users it can resolve, so its result is keyed back onto the ids it carries
|
|
371
|
+
* rather than zipped against `missing` by position - a batch that dropped a
|
|
372
|
+
* user would otherwise shift everybody after them onto the wrong readiness,
|
|
373
|
+
* which is the single worst thing this page could do.
|
|
374
|
+
*/
|
|
375
|
+
const filled: Array<UserReadiness> =
|
|
376
|
+
await OnCallReadinessService.getReadinessForUsers(missing, projectId);
|
|
377
|
+
|
|
378
|
+
for (const readiness of filled) {
|
|
379
|
+
readinessByUserId.set(readiness.userId.toString(), readiness);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return readinessByUserId;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/*
|
|
386
|
+
* Promise.all with a ceiling.
|
|
387
|
+
*
|
|
388
|
+
* Results are written into a pre-sized array by index rather than pushed, so
|
|
389
|
+
* the output order matches the input order no matter what order the workers
|
|
390
|
+
* happen to finish in. The table's rows are rendered in this order and a page
|
|
391
|
+
* whose rows reshuffle between renders is unreadable.
|
|
392
|
+
*
|
|
393
|
+
* Rejections are deliberately NOT swallowed here. A member whose data is
|
|
394
|
+
* merely absent is handled where that absence has meaning (see
|
|
395
|
+
* checkHasOnCallRules); a query that actually FAILS is an infrastructure
|
|
396
|
+
* fault, and turning it into "every member is non-compliant" would dress a
|
|
397
|
+
* database outage up as forty people misconfiguring their phones.
|
|
398
|
+
*/
|
|
399
|
+
private static async mapWithBoundedConcurrency<TInput, TOutput>(
|
|
400
|
+
items: Array<TInput>,
|
|
401
|
+
maxConcurrency: number,
|
|
402
|
+
mapper: (item: TInput) => Promise<TOutput>,
|
|
403
|
+
): Promise<Array<TOutput>> {
|
|
404
|
+
const results: Array<TOutput> = new Array<TOutput>(items.length);
|
|
405
|
+
let cursor: number = 0;
|
|
406
|
+
|
|
407
|
+
const runWorker: () => Promise<void> = async (): Promise<void> => {
|
|
408
|
+
while (cursor < items.length) {
|
|
409
|
+
const index: number = cursor;
|
|
410
|
+
cursor++;
|
|
411
|
+
results[index] = await mapper(items[index]!);
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
const workers: Array<Promise<void>> = [];
|
|
416
|
+
|
|
417
|
+
for (
|
|
418
|
+
let worker: number = 0;
|
|
419
|
+
worker < Math.min(maxConcurrency, items.length);
|
|
420
|
+
worker++
|
|
421
|
+
) {
|
|
422
|
+
workers.push(runWorker());
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
await Promise.all(workers);
|
|
426
|
+
|
|
427
|
+
return results;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* `readiness` is required and may be undefined, matching checkRuleCompliance:
|
|
432
|
+
* undefined is the answer "the batch could not resolve this member", and an
|
|
433
|
+
* OPTIONAL parameter would let a future caller forget to thread it through and
|
|
434
|
+
* silently turn every member into that case.
|
|
435
|
+
*/
|
|
173
436
|
private static async checkUserCompliance(
|
|
174
437
|
userId: ObjectID,
|
|
175
438
|
projectId: ObjectID,
|
|
@@ -177,6 +440,7 @@ export default class TeamComplianceService {
|
|
|
177
440
|
ruleType: ComplianceRuleType;
|
|
178
441
|
enabled: boolean;
|
|
179
442
|
}>,
|
|
443
|
+
readiness: UserReadiness | undefined,
|
|
180
444
|
): Promise<{
|
|
181
445
|
isCompliant: boolean;
|
|
182
446
|
nonCompliantRules: Array<{ ruleType: ComplianceRuleType; reason: string }>;
|
|
@@ -193,7 +457,12 @@ export default class TeamComplianceService {
|
|
|
193
457
|
}
|
|
194
458
|
|
|
195
459
|
const isCompliant: { compliant: boolean; reason: string } =
|
|
196
|
-
await this.checkRuleCompliance(
|
|
460
|
+
await this.checkRuleCompliance(
|
|
461
|
+
userId,
|
|
462
|
+
projectId,
|
|
463
|
+
setting.ruleType,
|
|
464
|
+
readiness,
|
|
465
|
+
);
|
|
197
466
|
|
|
198
467
|
if (!isCompliant.compliant) {
|
|
199
468
|
nonCompliantRules.push({
|
|
@@ -209,10 +478,23 @@ export default class TeamComplianceService {
|
|
|
209
478
|
};
|
|
210
479
|
}
|
|
211
480
|
|
|
481
|
+
/*
|
|
482
|
+
* `readiness` is the caller's already-resolved UserReadiness for this user.
|
|
483
|
+
*
|
|
484
|
+
* It is a required parameter that may be undefined, rather than an optional
|
|
485
|
+
* one, and the difference matters: undefined means "the batch could not
|
|
486
|
+
* resolve this person", which is an answer, whereas an omitted argument would
|
|
487
|
+
* mean "the caller forgot" and used to be repaired by fetching readiness right
|
|
488
|
+
* here. That repair was a per-user, per-RULE fan-out hiding inside a function
|
|
489
|
+
* that looks like a pure predicate - the on-call rules are two of the six, so
|
|
490
|
+
* a team with both enabled paid for it twice per member - and it is gone. The
|
|
491
|
+
* only source of readiness is now the batch in getReadinessByUserId.
|
|
492
|
+
*/
|
|
212
493
|
private static async checkRuleCompliance(
|
|
213
494
|
userId: ObjectID,
|
|
214
495
|
projectId: ObjectID,
|
|
215
496
|
ruleType: ComplianceRuleType,
|
|
497
|
+
readiness: UserReadiness | undefined,
|
|
216
498
|
): Promise<{ compliant: boolean; reason: string }> {
|
|
217
499
|
switch (ruleType) {
|
|
218
500
|
case ComplianceRuleType.HasNotificationEmailMethod:
|
|
@@ -227,11 +509,24 @@ export default class TeamComplianceService {
|
|
|
227
509
|
case ComplianceRuleType.HasNotificationPushMethod:
|
|
228
510
|
return await this.checkHasNotificationPush(userId, projectId);
|
|
229
511
|
|
|
512
|
+
/*
|
|
513
|
+
* Not awaited: checkHasOnCallRules reads an array it was handed and makes
|
|
514
|
+
* no query at all, so there is nothing to wait for. An async wrapper would
|
|
515
|
+
* only make it look as though there were.
|
|
516
|
+
*/
|
|
230
517
|
case ComplianceRuleType.HasIncidentOnCallRules:
|
|
231
|
-
return
|
|
518
|
+
return this.checkHasOnCallRules({
|
|
519
|
+
notificationRuleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT,
|
|
520
|
+
severityKind: "incident",
|
|
521
|
+
readiness: readiness,
|
|
522
|
+
});
|
|
232
523
|
|
|
233
524
|
case ComplianceRuleType.HasAlertOnCallRules:
|
|
234
|
-
return
|
|
525
|
+
return this.checkHasOnCallRules({
|
|
526
|
+
notificationRuleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT,
|
|
527
|
+
severityKind: "alert",
|
|
528
|
+
readiness: readiness,
|
|
529
|
+
});
|
|
235
530
|
|
|
236
531
|
default:
|
|
237
532
|
return { compliant: true, reason: "" };
|
|
@@ -352,199 +647,81 @@ export default class TeamComplianceService {
|
|
|
352
647
|
};
|
|
353
648
|
}
|
|
354
649
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
props: {
|
|
409
|
-
isRoot: true,
|
|
410
|
-
},
|
|
411
|
-
limit: 1,
|
|
412
|
-
skip: 0,
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
// Check if user has at least one notification method configured for this severity
|
|
416
|
-
const hasNotificationMethod: boolean = notificationRules.some(
|
|
417
|
-
(rule: {
|
|
418
|
-
_id?: string;
|
|
419
|
-
userCallId?: ObjectID;
|
|
420
|
-
userSmsId?: ObjectID;
|
|
421
|
-
userEmailId?: ObjectID;
|
|
422
|
-
userPushId?: ObjectID;
|
|
423
|
-
}) => {
|
|
424
|
-
return (
|
|
425
|
-
rule.userCallId ||
|
|
426
|
-
rule.userSmsId ||
|
|
427
|
-
rule.userEmailId ||
|
|
428
|
-
rule.userPushId
|
|
429
|
-
);
|
|
430
|
-
},
|
|
431
|
-
);
|
|
432
|
-
|
|
433
|
-
if (!hasNotificationMethod) {
|
|
434
|
-
const severity: Partial<IncidentSeverity> | undefined =
|
|
435
|
-
incidentSeverities.find((s: Partial<IncidentSeverity>) => {
|
|
436
|
-
return s._id?.toString() === severityId.toString();
|
|
437
|
-
});
|
|
438
|
-
const severityName: string = severity?.name || severityId.toString();
|
|
439
|
-
missingSeverities.push(severityName);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
if (missingSeverities.length > 0) {
|
|
650
|
+
/*
|
|
651
|
+
* Both on-call-rule compliance rules, answered off one readiness coverage
|
|
652
|
+
* array. A coverage cell is one (ruleType, severity) pair with the readiness
|
|
653
|
+
* service's verdict on it, which is what closes all four defects at once:
|
|
654
|
+
*
|
|
655
|
+
* - the cell is keyed BY ruleType, so a rule that only fires when the user
|
|
656
|
+
* goes off call can no longer be counted as incident coverage;
|
|
657
|
+
* - `hasRule` is true for a rule on any of the seven channels, so a responder
|
|
658
|
+
* whose only method is Telegram, WhatsApp or a webhook is no longer
|
|
659
|
+
* reported as having nothing;
|
|
660
|
+
* - the severities behind the cells are read with LIMIT_PER_PROJECT for both
|
|
661
|
+
* kinds, so the incident and alert halves can no longer disagree about how
|
|
662
|
+
* many severities a project may have;
|
|
663
|
+
* - and the whole array arrives from one batched read, rather than one findBy
|
|
664
|
+
* per severity per user.
|
|
665
|
+
*
|
|
666
|
+
* `isOptOut` is honoured as coverage, not as a gap. An opt-out row is the user
|
|
667
|
+
* saying "never notify me for this" on purpose; reporting that as a compliance
|
|
668
|
+
* failure would send an owner to fix something that is already the way it was
|
|
669
|
+
* asked to be. It matches the readiness contract, where Ready means every cell
|
|
670
|
+
* is covered OR explicitly muted.
|
|
671
|
+
*
|
|
672
|
+
* Readiness also reports cells for the two EPISODE rule types, and the
|
|
673
|
+
* ruleType filter drops them here. That is not an oversight: ComplianceRuleType
|
|
674
|
+
* has no episode rule, so the team's compliance settings never ask about
|
|
675
|
+
* episode coverage, and silently folding it into the incident or alert verdict
|
|
676
|
+
* would fail a team against a rule its owner never turned on. Episode coverage
|
|
677
|
+
* is visible on the readiness surfaces, where it is not gated by an opt-in
|
|
678
|
+
* per-team setting at all.
|
|
679
|
+
*
|
|
680
|
+
* The reason string names the missing severities in the order the readiness
|
|
681
|
+
* service reports them and falls back to the severity id when a severity has
|
|
682
|
+
* no name, because the owner reading it has to be able to act on it without
|
|
683
|
+
* opening anyone's settings.
|
|
684
|
+
*
|
|
685
|
+
* NO READINESS AT ALL is its own answer, and it is deliberately not a pass.
|
|
686
|
+
* The batch omits a user when it cannot resolve them - the ordinary cause
|
|
687
|
+
* being that they were removed from the project between the member read and
|
|
688
|
+
* the readiness read - and there are only two honest things to do with that:
|
|
689
|
+
* fail the whole page for everybody, or report the one row as unchecked. This
|
|
690
|
+
* feature exists because a responder can be silently unreachable, so reporting
|
|
691
|
+
* an unchecked responder as compliant would be the exact failure it was built
|
|
692
|
+
* to prevent, and failing the page over one departed member would take the
|
|
693
|
+
* other thirty-nine rows with it.
|
|
694
|
+
*/
|
|
695
|
+
private static checkHasOnCallRules(data: {
|
|
696
|
+
notificationRuleType: NotificationRuleType;
|
|
697
|
+
severityKind: string;
|
|
698
|
+
readiness: UserReadiness | undefined;
|
|
699
|
+
}): { compliant: boolean; reason: string } {
|
|
700
|
+
const userReadiness: UserReadiness | undefined = data.readiness;
|
|
701
|
+
|
|
702
|
+
if (!userReadiness) {
|
|
444
703
|
return {
|
|
445
704
|
compliant: false,
|
|
446
|
-
reason: `
|
|
705
|
+
reason: `Could not check ${data.severityKind} notification rules for this user - they may no longer be a member of this project`,
|
|
447
706
|
};
|
|
448
707
|
}
|
|
449
708
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
// Get all alert severities for the project
|
|
461
|
-
const alertSeverities: Array<Partial<AlertSeverity>> =
|
|
462
|
-
await AlertSeverityService.findBy({
|
|
463
|
-
query: {
|
|
464
|
-
projectId: projectId,
|
|
465
|
-
},
|
|
466
|
-
select: {
|
|
467
|
-
_id: true,
|
|
468
|
-
name: true,
|
|
469
|
-
},
|
|
470
|
-
props: {
|
|
471
|
-
isRoot: true,
|
|
472
|
-
},
|
|
473
|
-
limit: 100, // Assuming reasonable limit for severities
|
|
474
|
-
skip: 0,
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
if (alertSeverities.length === 0) {
|
|
478
|
-
return { compliant: true, reason: "" }; // No alert severities configured
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// Check if user has notification rules for all alert severities
|
|
482
|
-
const severityIds: Array<string> = alertSeverities.map(
|
|
483
|
-
(severity: Partial<AlertSeverity>) => {
|
|
484
|
-
return severity._id!;
|
|
485
|
-
},
|
|
486
|
-
);
|
|
487
|
-
const missingSeverities: Array<string> = [];
|
|
488
|
-
|
|
489
|
-
for (const severityId of severityIds) {
|
|
490
|
-
const notificationRules: Array<{
|
|
491
|
-
_id?: string;
|
|
492
|
-
userCallId?: ObjectID;
|
|
493
|
-
userSmsId?: ObjectID;
|
|
494
|
-
userEmailId?: ObjectID;
|
|
495
|
-
userPushId?: ObjectID;
|
|
496
|
-
}> = await UserNotificationRuleService.findBy({
|
|
497
|
-
query: {
|
|
498
|
-
userId: userId,
|
|
499
|
-
projectId: projectId,
|
|
500
|
-
alertSeverityId: severityId,
|
|
501
|
-
},
|
|
502
|
-
select: {
|
|
503
|
-
_id: true,
|
|
504
|
-
userCallId: true,
|
|
505
|
-
userSmsId: true,
|
|
506
|
-
userEmailId: true,
|
|
507
|
-
userPushId: true,
|
|
508
|
-
},
|
|
509
|
-
props: {
|
|
510
|
-
isRoot: true,
|
|
511
|
-
},
|
|
512
|
-
limit: 1,
|
|
513
|
-
skip: 0,
|
|
709
|
+
const missingSeverities: Array<string> = userReadiness.coverage
|
|
710
|
+
.filter((cell: ReadinessCoverageCell): boolean => {
|
|
711
|
+
return (
|
|
712
|
+
cell.ruleType === data.notificationRuleType &&
|
|
713
|
+
!cell.hasRule &&
|
|
714
|
+
!cell.isOptOut
|
|
715
|
+
);
|
|
716
|
+
})
|
|
717
|
+
.map((cell: ReadinessCoverageCell): string => {
|
|
718
|
+
return cell.severityName || cell.severityId?.toString() || "";
|
|
514
719
|
});
|
|
515
720
|
|
|
516
|
-
// Check if user has at least one notification method configured for this severity
|
|
517
|
-
const hasNotificationMethod: boolean = notificationRules.some(
|
|
518
|
-
(rule: {
|
|
519
|
-
_id?: string;
|
|
520
|
-
userCallId?: ObjectID;
|
|
521
|
-
userSmsId?: ObjectID;
|
|
522
|
-
userEmailId?: ObjectID;
|
|
523
|
-
userPushId?: ObjectID;
|
|
524
|
-
}) => {
|
|
525
|
-
return (
|
|
526
|
-
rule.userCallId ||
|
|
527
|
-
rule.userSmsId ||
|
|
528
|
-
rule.userEmailId ||
|
|
529
|
-
rule.userPushId
|
|
530
|
-
);
|
|
531
|
-
},
|
|
532
|
-
);
|
|
533
|
-
|
|
534
|
-
if (!hasNotificationMethod) {
|
|
535
|
-
const severity: Partial<AlertSeverity> | undefined =
|
|
536
|
-
alertSeverities.find((s: Partial<AlertSeverity>) => {
|
|
537
|
-
return s._id?.toString() === severityId.toString();
|
|
538
|
-
});
|
|
539
|
-
const severityName: string = severity?.name || severityId.toString();
|
|
540
|
-
missingSeverities.push(severityName);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
|
|
544
721
|
if (missingSeverities.length > 0) {
|
|
545
722
|
return {
|
|
546
723
|
compliant: false,
|
|
547
|
-
reason: `Missing notification rules for
|
|
724
|
+
reason: `Missing notification rules for ${data.severityKind} severities: ${missingSeverities.join(", ")}`,
|
|
548
725
|
};
|
|
549
726
|
}
|
|
550
727
|
|