@oneuptime/common 12.0.8 → 12.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +1 -1
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +1 -1
- package/Models/DatabaseModels/AIConversation.ts +32 -0
- package/Models/DatabaseModels/AIConversationMessage.ts +41 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +27 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +28 -0
- package/Models/DatabaseModels/Index.ts +12 -4
- package/Models/DatabaseModels/{TelemetryEntity.ts → InventoryItem.ts} +139 -9
- package/Models/DatabaseModels/InventoryItemCustomField.ts +434 -0
- package/Models/DatabaseModels/{TelemetryEntityRelationship.ts → InventoryItemRelationship.ts} +8 -8
- package/Models/DatabaseModels/NetworkDevice.ts +141 -0
- package/Models/DatabaseModels/NetworkDeviceLink.ts +699 -0
- package/Models/DatabaseModels/NetworkDeviceLinkRule.ts +467 -0
- package/Models/DatabaseModels/NetworkTopologySuppression.ts +429 -0
- package/Models/DatabaseModels/OnCallDutyPolicyFeed.ts +9 -0
- package/Models/DatabaseModels/Project.ts +78 -0
- package/Models/DatabaseModels/UserCall.ts +42 -0
- package/Models/DatabaseModels/UserEmail.ts +44 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +425 -55
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +24 -2
- package/Models/DatabaseModels/UserPush.ts +49 -0
- package/Models/DatabaseModels/UserSMS.ts +43 -0
- package/Models/DatabaseModels/UserTelegram.ts +59 -0
- package/Models/DatabaseModels/UserWebhook.ts +52 -0
- package/Models/DatabaseModels/UserWhatsApp.ts +41 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +12 -0
- package/Server/API/AIChatAPI.ts +315 -1
- package/Server/API/DashboardAPI.ts +217 -1
- package/Server/API/OnCallReadinessAPI.ts +841 -0
- package/Server/API/TeamComplianceAPI.ts +69 -17
- package/Server/API/TelemetryAPI.ts +220 -12
- package/Server/EnvironmentConfig.ts +52 -0
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +22 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +4 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +5 -5
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.ts +82 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.ts +255 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.ts +107 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.ts +90 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Infrastructure/Queue.ts +78 -13
- package/Server/Middleware/PublicDashboardRateLimit.ts +593 -0
- package/Server/Services/AIService.ts +7 -0
- package/Server/Services/AlertEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/AlertSeverityService.ts +63 -0
- package/Server/Services/DashboardService.ts +9 -10
- package/Server/Services/DatabaseService.ts +32 -2
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +29 -0
- package/Server/Services/IncidentSeverityService.ts +76 -0
- package/Server/Services/Index.ts +12 -4
- package/Server/Services/InventoryItemCustomFieldService.ts +9 -0
- package/Server/Services/{TelemetryEntityRelationshipService.ts → InventoryItemRelationshipService.ts} +4 -4
- package/Server/Services/{TelemetryEntityService.ts → InventoryItemService.ts} +89 -20
- package/Server/Services/LogAggregationService.ts +45 -8
- package/Server/Services/MetricAggregationService.ts +121 -0
- package/Server/Services/MetricService.ts +7 -7
- package/Server/Services/NetworkDeviceLinkRuleService.ts +10 -0
- package/Server/Services/NetworkDeviceLinkService.ts +84 -0
- package/Server/Services/NetworkDeviceService.ts +140 -0
- package/Server/Services/NetworkSiteService.ts +77 -25
- package/Server/Services/NetworkTopologySuppressionService.ts +84 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +41 -29
- package/Server/Services/OnCallDutyPolicyExecutionLogService.ts +8 -0
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +62 -13
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +61 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +742 -0
- package/Server/Services/OnCallReadinessService.ts +2803 -0
- package/Server/Services/OnCallSetupReminderService.ts +955 -0
- package/Server/Services/ProfileAggregationService.ts +123 -0
- package/Server/Services/StatusPageService.ts +9 -10
- package/Server/Services/TeamComplianceService.ts +429 -252
- package/Server/Services/UserCallService.ts +26 -1
- package/Server/Services/UserEmailService.ts +26 -1
- package/Server/Services/UserNotificationRuleAdminService.ts +1183 -0
- package/Server/Services/UserNotificationRuleService.ts +3812 -333
- package/Server/Services/UserOnCallLogService.ts +561 -48
- package/Server/Services/UserPushService.ts +29 -0
- package/Server/Services/UserService.ts +11 -0
- package/Server/Services/UserSmsService.ts +26 -1
- package/Server/Services/UserTelegramService.ts +24 -1
- package/Server/Services/UserWebhookService.ts +28 -1
- package/Server/Services/UserWhatsAppService.ts +24 -1
- package/Server/Types/Database/Permissions/BasePermission.ts +19 -0
- package/Server/Types/Database/Permissions/CreatePermission.ts +164 -0
- package/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.ts +340 -0
- package/Server/Types/Database/Permissions/QueryPermission.ts +48 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +8 -1
- package/Server/Types/Workflow/Components/API/Delete.ts +1 -1
- package/Server/Types/Workflow/Components/API/Get.ts +1 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +1 -1
- package/Server/Types/Workflow/Components/API/Post.ts +1 -1
- package/Server/Types/Workflow/Components/API/Put.ts +1 -1
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +29 -5
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +18 -10
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +55 -0
- package/Server/Types/Workflow/Components/Conditions/IfElse.ts +3 -17
- package/Server/Types/Workflow/Components/Email.ts +25 -7
- package/Server/Types/Workflow/Components/JavaScript.ts +10 -3
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +1 -1
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +643 -48
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +32 -3
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +20 -6
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +7 -0
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +2 -2
- package/Server/Utils/AI/Toolbox/AIMetaTools.ts +863 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +177 -15
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +191 -10
- package/Server/Utils/AI/Toolbox/Index.ts +48 -0
- package/Server/Utils/AI/Toolbox/MonitorTools.ts +298 -11
- package/Server/Utils/AI/Toolbox/NoteWriteTools.ts +295 -0
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +1246 -0
- package/Server/Utils/AI/Toolbox/RunbookTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +456 -0
- package/Server/Utils/AI/Toolbox/StatusPageTools.ts +559 -0
- package/Server/Utils/AI/Toolbox/TeamTools.ts +327 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +615 -0
- package/Server/Utils/AI/Toolbox/WorkflowProbeTools.ts +664 -0
- package/Server/Utils/ClientIp.ts +221 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +47 -0
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +163 -0
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +147 -0
- package/Server/Utils/Express.ts +12 -17
- package/Server/Utils/LLM/LLMService.ts +85 -8
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +204 -10
- package/Server/Utils/SSRFProtection.ts +98 -23
- package/Server/Utils/StartServer.ts +12 -3
- package/Server/Utils/Telemetry/EntityRegistry.ts +205 -18
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +25 -25
- package/Server/Utils/Telemetry/TelemetryEntity.ts +160 -52
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +7 -3
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +2146 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +561 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +2470 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +1897 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3606 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +784 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +1119 -0
- package/Tests/App/Dashboard/SloWidgetFetching.test.tsx +531 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +1312 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +1390 -0
- package/Tests/Models/InventoryItemModel.test.ts +174 -0
- package/Tests/Models/InventoryItemNaming.test.ts +302 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +437 -0
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +659 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +18 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +880 -0
- package/Tests/Server/API/Helpers.ts +24 -15
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +2680 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +915 -0
- package/Tests/Server/Infrastructure/Postgres/EpisodeMemberNotifyIndexesMigration.test.ts +533 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +213 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +432 -0
- package/Tests/Server/Infrastructure/Queue.test.ts +293 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +1645 -0
- package/Tests/Server/Services/AdminRuleEditGuards.test.ts +2848 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1393 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +1802 -0
- package/Tests/Server/Services/EpisodeStateTimelineNote.test.ts +304 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +339 -0
- package/Tests/Server/Services/{TelemetryEntityManualCreate.test.ts → InventoryItemManualCreate.test.ts} +27 -27
- package/Tests/Server/Services/IpAllowlistSpoofing.test.ts +450 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +235 -1
- package/Tests/Server/Services/MetricAggregationService.test.ts +231 -0
- package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +80 -29
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +30 -30
- package/Tests/Server/Services/NetworkSiteService.test.ts +18 -3
- package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +1728 -0
- package/Tests/Server/Services/NotificationDeletionImpact.test.ts +2402 -0
- package/Tests/Server/Services/OnCallDutyPolicyExecutionLogTimelineGapFeed.test.ts +394 -0
- package/Tests/Server/Services/OnCallNotificationFallback.test.ts +1744 -0
- package/Tests/Server/Services/OnCallReadinessService.test.ts +4295 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +1272 -0
- package/Tests/Server/Services/OnCallWeeklyReadinessDigest.test.ts +1021 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +296 -0
- package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +1536 -0
- package/Tests/Server/Services/SeverityRuleBackfill.test.ts +1818 -0
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1845 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +1394 -0
- package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +1166 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1468 -0
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1457 -0
- package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +1546 -0
- package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +529 -0
- package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +1219 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1089 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +2 -1
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +190 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +44 -14
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +151 -0
- package/Tests/Server/Types/Workflow/Components/IfElse.test.ts +98 -0
- package/Tests/Server/Types/Workflow/Components/JavaScript.test.ts +51 -0
- package/Tests/Server/Utils/AI/AIMetaTools.test.ts +586 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +582 -0
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +726 -0
- package/Tests/Server/Utils/AI/IncidentToolsFilters.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceStopReason.test.ts +314 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +26 -3
- package/Tests/Server/Utils/AI/NoteWriteTools.test.ts +268 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +169 -0
- package/Tests/Server/Utils/AI/OnCallTools.test.ts +664 -0
- package/Tests/Server/Utils/AI/RunbookTools.test.ts +325 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +306 -0
- package/Tests/Server/Utils/AI/StatusPageTools.test.ts +391 -0
- package/Tests/Server/Utils/AI/TeamTools.test.ts +257 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +472 -0
- package/Tests/Server/Utils/AI/WorkflowProbeTools.test.ts +428 -0
- package/Tests/Server/Utils/ClientIp.test.ts +438 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +171 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +383 -0
- package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +23 -25
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnssecMonitorCriteria.test.ts +307 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +468 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorTelemetryDeepLinks.test.ts +460 -0
- package/Tests/Server/Utils/ResponseRateLimitStatusCodes.test.ts +137 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +40 -8
- package/Tests/Server/Utils/SSRFProtectionUserInfo.test.ts +351 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistryRetirement.test.ts +531 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +15 -15
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +356 -39
- package/Tests/Types/IP/IP.test.ts +263 -0
- package/Tests/Types/IP/IPWhitelist.test.ts +197 -0
- package/Tests/Types/IP/IPv6.test.ts +12 -1
- package/Tests/Types/Monitor/SnmpOid.test.ts +64 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +110 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeAudit.test.ts +106 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilMergeDifferential.test.ts +511 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageEndToEnd.test.ts +489 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageGapTolerance.test.ts +479 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleCoverageState.test.ts +822 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +6 -6
- package/Tests/Types/Workflow/BaseModelComponents.test.ts +429 -0
- package/Tests/Types/Workflow/Components/BaseModel.test.ts +225 -0
- package/Tests/Types/Workflow/IntegrationCredentialMetadata.test.ts +100 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +112 -0
- package/Tests/Types/Workflow/Templates.test.ts +916 -101
- package/Tests/UI/Components/ActiveFilterChipsOpenRoute.test.tsx +82 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +564 -7
- package/Tests/UI/Components/KeyboardShortcut.test.tsx +95 -0
- package/Tests/UI/Components/LogDetailsPanelCrossSignal.test.tsx +448 -0
- package/Tests/UI/Components/LogsTableCrossLinks.test.tsx +263 -0
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +913 -0
- package/Tests/UI/Components/SimpleLogViewer.test.tsx +228 -0
- package/Tests/UI/Components/TableRowSelectability.test.tsx +312 -0
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +72 -0
- package/Tests/UI/Components/Workflow/GraphLintSummary.test.ts +755 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +242 -7
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +15 -7
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +242 -28
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +59 -1
- package/Tests/UI/Components/Workflow/StepTraceViewer.test.tsx +256 -0
- package/Tests/UI/Components/Workflow/UseRunWatch.test.tsx +665 -0
- package/Tests/UI/Components/Workflow/WorkflowIssuesModal.test.tsx +485 -0
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +478 -0
- package/Tests/UI/Components/Workflow/WorkflowStatusBar.test.tsx +379 -0
- package/Tests/UI/EsbuildConfig.test.ts +607 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +11 -4
- package/Tests/UI/Utils/ModelAPICreateMiscData.test.ts +94 -0
- package/Tests/UI/Utils/Platform.test.ts +147 -0
- package/Tests/UI/Utils/ProjectInvitationDisplay.test.ts +357 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +198 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +487 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +698 -0
- package/Tests/__mocks__/bullmq.js +55 -0
- package/Types/AI/AIChatMessageStatus.ts +8 -1
- package/Types/AI/AIChatTypes.ts +12 -0
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +88 -0
- package/Types/Exception/ExceptionCode.ts +2 -0
- package/Types/Exception/ServiceUnavailableException.ts +8 -0
- package/Types/Exception/TooManyRequestsException.ts +8 -0
- package/Types/IP/IP.ts +93 -47
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +49 -3
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +55 -0
- package/Types/OnCallDutyPolicy/Layer.ts +203 -149
- package/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.ts +13 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +155 -10
- package/Types/Permission.ts +193 -0
- package/Types/Telemetry/EntityRelationshipType.ts +1 -1
- package/Types/Telemetry/EntitySource.ts +1 -1
- package/Types/Telemetry/EntityType.ts +1 -1
- package/Types/Telemetry/EntityTypeGroups.ts +1 -1
- package/Types/Workflow/Components/BaseModel.ts +75 -29
- package/Types/Workflow/Components/Discord.ts +1 -0
- package/Types/Workflow/Components/Email.ts +12 -3
- package/Types/Workflow/Components/JavaScript.ts +7 -0
- package/Types/Workflow/Components/MicrosoftTeams.ts +3 -2
- package/Types/Workflow/Components/Slack.ts +1 -0
- package/Types/Workflow/Components/Telegram.ts +1 -0
- package/Types/Workflow/TemplateSyntax.ts +44 -0
- package/Types/Workflow/Templates.ts +2097 -45
- package/UI/Components/Calendar/Calendar.css +43 -0
- package/UI/Components/Calendar/Calendar.tsx +8 -0
- package/UI/Components/Card/Card.tsx +2 -2
- package/UI/Components/Checkbox/Checkbox.tsx +16 -0
- package/UI/Components/Dictionary/Dictionary.tsx +48 -9
- package/UI/Components/FormModal/BasicFormModal.tsx +2 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +53 -3
- package/UI/Components/Input/Input.tsx +1 -0
- package/UI/Components/KeyboardShortcut/KeyboardKey.ts +185 -0
- package/UI/Components/KeyboardShortcut/KeyboardShortcut.tsx +87 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +28 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +31 -0
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -18
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +363 -14
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +11 -0
- package/UI/Components/LogsViewer/components/LogsTable.tsx +155 -12
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +29 -0
- package/UI/Components/LogsViewer/types.ts +23 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +15 -30
- package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +442 -0
- package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +23 -1
- package/UI/Components/Table/Table.tsx +49 -16
- package/UI/Components/Table/TableBody.tsx +53 -28
- package/UI/Components/Table/TableHeader.tsx +13 -0
- package/UI/Components/Table/TableRow.tsx +58 -26
- package/UI/Components/Workflow/ArgumentsForm.tsx +155 -9
- package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +26 -0
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +10 -1
- package/UI/Components/Workflow/ComponentValuePickerModal.tsx +135 -7
- package/UI/Components/Workflow/ComponentsModal.tsx +116 -22
- package/UI/Components/Workflow/DocumentationViewer.tsx +59 -9
- package/UI/Components/Workflow/GraphLint.ts +42 -5
- package/UI/Components/Workflow/GraphLintSummary.ts +390 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +154 -22
- package/UI/Components/Workflow/ModelSchema.ts +115 -33
- package/UI/Components/Workflow/RunStatusWatcher.ts +1 -1
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Components/Workflow/UseRunWatch.ts +212 -0
- package/UI/Components/Workflow/VariableModal.tsx +6 -2
- package/UI/Components/Workflow/Workflow.tsx +49 -3
- package/UI/Components/Workflow/WorkflowIssuesModal.tsx +255 -0
- package/UI/Components/Workflow/WorkflowLogModal.tsx +128 -0
- package/UI/Components/Workflow/WorkflowStatusBar.tsx +224 -0
- package/UI/Utils/AIChatExport/ConversationMarkdown.ts +10 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +7 -1
- package/UI/Utils/Platform.ts +149 -0
- package/UI/Utils/ProjectInvitationDisplay.ts +118 -0
- package/UI/esbuild-config.js +22 -1
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +187 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +888 -164
- package/Utils/Telemetry/CrossSignalScope.ts +502 -0
- package/Utils/Telemetry/EntityKey.ts +5 -5
- package/Utils/Telemetry/EntityRelationship.ts +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +1 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js +32 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js +42 -0
- package/build/dist/Models/DatabaseModels/AIConversationMessage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +28 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +29 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{TelemetryEntity.js → InventoryItem.js} +167 -31
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +454 -0
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{TelemetryEntityRelationship.js → InventoryItemRelationship.js} +27 -27
- package/build/dist/Models/DatabaseModels/InventoryItemRelationship.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +141 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js +719 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLink.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js +475 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js +446 -0
- package/build/dist/Models/DatabaseModels/NetworkTopologySuppression.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js +9 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +80 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +46 -2
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +48 -2
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +424 -55
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +24 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +51 -1
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +47 -2
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +65 -3
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebhook.js +56 -2
- package/build/dist/Models/DatabaseModels/UserWebhook.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +45 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +12 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +237 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +165 -13
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +599 -0
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -0
- package/build/dist/Server/API/TeamComplianceAPI.js +68 -9
- package/build/dist/Server/API/TeamComplianceAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +129 -18
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +45 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +4 -4
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786625176831-AddMonitoringMethodToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786634985763-AddNetworkDeviceLink.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639512056-AddNetworkDeviceLinkRule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786639972982-AddNetworkTopologySuppression.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js +150 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786800000000-RenameTelemetryEntityToInventoryItem.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786900000000-AddInventoryItemArchiveAndCustomFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js +69 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787000000000-AddOnCallNotificationFallbackColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787100000000-AddAIConversationPageContext.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787200000000-AddAIChatMessageFeedback.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js +48 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787300000000-AddEpisodeMemberNotifyIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +72 -13
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +399 -0
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AIService.js +1 -0
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +54 -0
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +10 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +24 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +24 -3
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +67 -0
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js +9 -0
- package/build/dist/Server/Services/InventoryItemCustomFieldService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityRelationshipService.js → InventoryItemRelationshipService.js} +6 -6
- package/build/dist/Server/Services/InventoryItemRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/{TelemetryEntityService.js → InventoryItemService.js} +68 -23
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +27 -8
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +80 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +6 -6
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js +9 -0
- package/build/dist/Server/Services/NetworkDeviceLinkRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceLinkService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +113 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +53 -13
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js +85 -0
- package/build/dist/Server/Services/NetworkTopologySuppressionService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +48 -32
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js +8 -0
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +51 -12
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +57 -13
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +548 -0
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -0
- package/build/dist/Server/Services/OnCallReadinessService.js +1961 -0
- package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js +738 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -0
- package/build/dist/Server/Services/ProfileAggregationService.js +68 -4
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +11 -10
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceService.js +312 -160
- package/build/dist/Server/Services/TeamComplianceService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +24 -1
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +24 -1
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +858 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +2830 -175
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallLogService.js +488 -43
- package/build/dist/Server/Services/UserOnCallLogService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +26 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +24 -1
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +22 -1
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +25 -1
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +22 -1
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +12 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +126 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js +254 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerOnlyColumnPermission.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js +47 -2
- package/build/dist/Server/Types/Database/Permissions/QueryPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +7 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +21 -5
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +14 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +31 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +3 -9
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +15 -4
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +7 -2
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +1 -1
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +514 -56
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +20 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +19 -6
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +7 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js +692 -0
- package/build/dist/Server/Utils/AI/Toolbox/AIMetaTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +148 -12
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +157 -10
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +37 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js +259 -14
- package/build/dist/Server/Utils/AI/Toolbox/MonitorTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js +235 -0
- package/build/dist/Server/Utils/AI/Toolbox/NoteWriteTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +1000 -0
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js +356 -0
- package/build/dist/Server/Utils/AI/Toolbox/RunbookTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +394 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js +465 -0
- package/build/dist/Server/Utils/AI/Toolbox/StatusPageTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js +280 -0
- package/build/dist/Server/Utils/AI/Toolbox/TeamTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +527 -0
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js +548 -0
- package/build/dist/Server/Utils/AI/Toolbox/WorkflowProbeTools.js.map +1 -0
- package/build/dist/Server/Utils/ClientIp.js +137 -0
- package/build/dist/Server/Utils/ClientIp.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +38 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +89 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +77 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -0
- package/build/dist/Server/Utils/Express.js +12 -12
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +70 -7
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +121 -11
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +82 -21
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +165 -18
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +11 -11
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +122 -47
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +7 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js +8 -1
- package/build/dist/Types/AI/AIChatMessageStatus.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +12 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +60 -0
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +2 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +8 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js +8 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -0
- package/build/dist/Types/IP/IP.js +87 -43
- package/build/dist/Types/IP/IP.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +50 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +186 -123
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js +13 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallDutyPolicyStatus.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +105 -11
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/Permission.js +174 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +66 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Discord.js +1 -0
- package/build/dist/Types/Workflow/Components/Discord.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Email.js +12 -3
- package/build/dist/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Types/Workflow/Components/JavaScript.js +7 -0
- package/build/dist/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js +3 -2
- package/build/dist/Types/Workflow/Components/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Slack.js +1 -0
- package/build/dist/Types/Workflow/Components/Slack.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Telegram.js +1 -0
- package/build/dist/Types/Workflow/Components/Telegram.js.map +1 -1
- package/build/dist/Types/Workflow/TemplateSyntax.js +12 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -1
- package/build/dist/Types/Workflow/Templates.js +1931 -38
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/Dictionary.js +25 -11
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +27 -4
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -0
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js +163 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardKey.js.map +1 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js +47 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +4 -4
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +11 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +10 -8
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +227 -14
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +5 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +69 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +8 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +9 -2
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +8 -21
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +251 -0
- package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -0
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +9 -2
- package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +27 -15
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +24 -18
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +9 -1
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +29 -21
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +130 -12
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +10 -1
- package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +4 -4
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js +57 -7
- package/build/dist/UI/Components/Workflow/ComponentValuePickerModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +53 -18
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js +19 -6
- package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +33 -4
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js +231 -0
- package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +116 -21
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelSchema.js +72 -34
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Components/Workflow/UseRunWatch.js +123 -0
- package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -0
- package/build/dist/UI/Components/Workflow/VariableModal.js +3 -2
- package/build/dist/UI/Components/Workflow/VariableModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +41 -1
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +99 -0
- package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +56 -0
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +92 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js +9 -0
- package/build/dist/UI/Utils/AIChatExport/ConversationMarkdown.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Platform.js +118 -0
- package/build/dist/UI/Utils/Platform.js.map +1 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js +106 -0
- package/build/dist/UI/Utils/ProjectInvitationDisplay.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +108 -0
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +642 -136
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +328 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +5 -5
- package/build/dist/Utils/Telemetry/EntityRelationship.js +1 -1
- package/jest.config.json +1 -0
- package/package.json +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +0 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +0 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +0 -1
|
@@ -1517,181 +1517,237 @@ export default class LayerUtil {
|
|
|
1517
1517
|
events: PriorityCalendarEvents[],
|
|
1518
1518
|
): CalendarEvent[] {
|
|
1519
1519
|
/*
|
|
1520
|
-
*
|
|
1521
|
-
*
|
|
1522
|
-
*
|
|
1520
|
+
* Flatten overlapping events by priority. A LOWER priority number wins: an
|
|
1521
|
+
* event is trimmed back so it does not overlap any higher-priority (lower
|
|
1522
|
+
* numbered) event, and where a lower-priority event straddles a
|
|
1523
|
+
* higher-priority one it is split into a leading and a trailing segment.
|
|
1524
|
+
* Segments are separated by a 1-second seam.
|
|
1525
|
+
*
|
|
1526
|
+
* This runs on the browser's main thread on the on-call schedule screen,
|
|
1527
|
+
* over every event in the coverage window — an hourly rotation over three
|
|
1528
|
+
* months is thousands of events. The previous implementation had three
|
|
1529
|
+
* separate problems here, in increasing order of severity:
|
|
1530
|
+
*
|
|
1531
|
+
* - CONSTANT FACTOR. Every comparison went through `OneUptimeDate.*`,
|
|
1532
|
+
* which wraps each operand in a moment object (via `fromString`) —
|
|
1533
|
+
* roughly 8 allocations per overlap test, and it dominated the profile.
|
|
1534
|
+
* All comparisons below are numeric `getTime()` instead. Timestamps are
|
|
1535
|
+
* normalised once, up front, so string-typed inputs are still accepted.
|
|
1536
|
+
* - COMPLEXITY. The inner scan walked the whole of `finalEvents` for every
|
|
1537
|
+
* event placed, which is O(n^2): ~1000 hourly events took over a minute,
|
|
1538
|
+
* and every re-render of the schedule screen paid it again.
|
|
1539
|
+
* `activeEventIndexes` keeps the scan off events that can no longer
|
|
1540
|
+
* match. Events are processed in ascending start order and an event's
|
|
1541
|
+
* start only ever moves forward, so once a placed event ends at or
|
|
1542
|
+
* before the current start it cannot overlap this event or any later
|
|
1543
|
+
* one, and is dropped from the scan for good.
|
|
1544
|
+
* - TERMINATION. On some inputs it never finished at all — see the
|
|
1545
|
+
* exhausted-event break inside the scan below. That was the real bug;
|
|
1546
|
+
* the two above only made the schedule screen slow.
|
|
1523
1547
|
*/
|
|
1524
1548
|
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1549
|
+
/*
|
|
1550
|
+
* Normalise to real Dates once. Everything below reads `.getTime()`
|
|
1551
|
+
* directly, which is only safe if these are Date instances — callers may
|
|
1552
|
+
* hand us JSON-deserialised events whose start/end are strings, which the
|
|
1553
|
+
* old `OneUptimeDate.*` comparisons coerced on every single call.
|
|
1554
|
+
*/
|
|
1555
|
+
for (const event of events) {
|
|
1556
|
+
event.start = OneUptimeDate.fromString(event.start);
|
|
1557
|
+
event.end = OneUptimeDate.fromString(event.end);
|
|
1558
|
+
}
|
|
1530
1559
|
|
|
1560
|
+
// Drop zero-length and inverted events; the merge below assumes end > start.
|
|
1531
1561
|
events = events.filter((event: PriorityCalendarEvents) => {
|
|
1532
|
-
return
|
|
1562
|
+
return event.end.getTime() > event.start.getTime();
|
|
1533
1563
|
});
|
|
1534
1564
|
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1565
|
+
/*
|
|
1566
|
+
* Ascending start time. Array.prototype.sort is stable, so events that share
|
|
1567
|
+
* a start stay in insertion order — which is layer order, i.e. ascending
|
|
1568
|
+
* priority. The merge below depends on this ordering in both directions:
|
|
1569
|
+
* ascending starts let the active-set pruning work, and the priority tie
|
|
1570
|
+
* order decides which of two same-start events is the one that gets trimmed.
|
|
1571
|
+
*/
|
|
1572
|
+
events.sort((a: CalendarEvent, b: CalendarEvent) => {
|
|
1573
|
+
return a.start.getTime() - b.start.getTime();
|
|
1538
1574
|
});
|
|
1539
1575
|
|
|
1540
1576
|
const finalEvents: PriorityCalendarEvents[] = [];
|
|
1541
1577
|
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
return 1;
|
|
1551
|
-
}
|
|
1578
|
+
/*
|
|
1579
|
+
* Indexes into finalEvents that may still overlap the event being placed,
|
|
1580
|
+
* in ascending index order — the same order the old full scan visited them
|
|
1581
|
+
* in. Order is load-bearing, not incidental: trimming a lower-priority final
|
|
1582
|
+
* event uses the current event's start, which a higher-priority final event
|
|
1583
|
+
* visited earlier in the same scan may already have pushed forward.
|
|
1584
|
+
*/
|
|
1585
|
+
const activeEventIndexes: number[] = [];
|
|
1552
1586
|
|
|
1553
|
-
|
|
1554
|
-
|
|
1587
|
+
// Tombstones. Splicing finalEvents mid-merge would invalidate these indexes.
|
|
1588
|
+
const removedEventIndexes: Set<number> = new Set<number>();
|
|
1555
1589
|
|
|
1556
1590
|
for (const event of events) {
|
|
1557
|
-
|
|
1591
|
+
const eventEndTime: number = event.end.getTime();
|
|
1558
1592
|
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
}
|
|
1593
|
+
/*
|
|
1594
|
+
* Retire everything that ends at or before this event's start. Events
|
|
1595
|
+
* arrive in ascending start order, so nothing retired here can overlap any
|
|
1596
|
+
* later event either. Each index is examined once more after it stops
|
|
1597
|
+
* matching, making this O(1) amortised per placed event.
|
|
1598
|
+
*/
|
|
1599
|
+
const eventStartTime: number = event.start.getTime();
|
|
1600
|
+
let keptCount: number = 0;
|
|
1568
1601
|
|
|
1569
|
-
for (let i: number = 0; i <
|
|
1570
|
-
const
|
|
1602
|
+
for (let i: number = 0; i < activeEventIndexes.length; i++) {
|
|
1603
|
+
const index: number = activeEventIndexes[i]!;
|
|
1571
1604
|
|
|
1572
|
-
if (
|
|
1605
|
+
if (removedEventIndexes.has(index)) {
|
|
1573
1606
|
continue;
|
|
1574
1607
|
}
|
|
1575
1608
|
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
OneUptimeDate.isOverlapping(
|
|
1579
|
-
finalEvent.start,
|
|
1580
|
-
finalEvent.end,
|
|
1581
|
-
event.start,
|
|
1582
|
-
event.end,
|
|
1583
|
-
)
|
|
1584
|
-
) {
|
|
1585
|
-
// if the current event has a higher priority than the final event, we need to trim the final event
|
|
1586
|
-
if (event.priority < finalEvent.priority) {
|
|
1587
|
-
/*
|
|
1588
|
-
* trim the final event based on the current event
|
|
1589
|
-
* end time of the final event will be the start time of the current event - 1 second
|
|
1590
|
-
*/
|
|
1591
|
-
const tempFinalEventEnd: Date = finalEvent.end;
|
|
1592
|
-
|
|
1593
|
-
/*
|
|
1594
|
-
* Reconstruct the trailing tail FIRST, before the front-collapse
|
|
1595
|
-
* removal below. If the lower-priority (fallback) event originally
|
|
1596
|
-
* extended past the higher-priority event, the portion AFTER the
|
|
1597
|
-
* higher-priority window must survive as its own segment — even when
|
|
1598
|
-
* the FRONT of the final event collapses to zero/negative length
|
|
1599
|
-
* (which happens when the higher-priority event starts at or before
|
|
1600
|
-
* the final event's start, e.g. two back-to-back higher-priority
|
|
1601
|
-
* rotation windows over a 24/7 fallback layer). Previously this block
|
|
1602
|
-
* ran only AFTER the collapse checks, whose `continue` skipped it,
|
|
1603
|
-
* silently deleting the fallback layer's coverage after the higher-
|
|
1604
|
-
* priority window and leaving on-call gaps where nobody is paged.
|
|
1605
|
-
*/
|
|
1606
|
-
if (OneUptimeDate.isAfter(tempFinalEventEnd, event.end)) {
|
|
1607
|
-
// add the trailing segment of the lower-priority event
|
|
1608
|
-
const trimmedEvent: PriorityCalendarEvents = {
|
|
1609
|
-
...finalEvent,
|
|
1610
|
-
priority: finalEvent.priority,
|
|
1611
|
-
start: OneUptimeDate.addRemoveSeconds(event.end, 1),
|
|
1612
|
-
end: tempFinalEventEnd,
|
|
1613
|
-
};
|
|
1614
|
-
|
|
1615
|
-
// only keep it if it has positive length
|
|
1616
|
-
if (OneUptimeDate.isAfter(trimmedEvent.end, trimmedEvent.start)) {
|
|
1617
|
-
finalEvents.push(trimmedEvent);
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
|
|
1621
|
-
finalEvent.end = OneUptimeDate.addRemoveSeconds(event.start, -1);
|
|
1622
|
-
|
|
1623
|
-
/*
|
|
1624
|
-
* check if the final event end time is before the start time of the current event
|
|
1625
|
-
* if it is, we need to remove the final event from the final events array
|
|
1626
|
-
* (the trailing tail, if any, was already preserved above)
|
|
1627
|
-
*/
|
|
1628
|
-
if (OneUptimeDate.isBefore(finalEvent.end, finalEvent.start)) {
|
|
1629
|
-
finalEvents.splice(i, 1);
|
|
1630
|
-
i--; // Adjust index after removal
|
|
1631
|
-
continue;
|
|
1632
|
-
}
|
|
1633
|
-
|
|
1634
|
-
// if end and start time of the final event is same, we need to remove it
|
|
1635
|
-
if (OneUptimeDate.isSame(finalEvent.start, finalEvent.end)) {
|
|
1636
|
-
finalEvents.splice(i, 1);
|
|
1637
|
-
i--; // Adjust index after removal
|
|
1638
|
-
continue;
|
|
1639
|
-
}
|
|
1640
|
-
} else {
|
|
1641
|
-
/*
|
|
1642
|
-
* Trim the current (lower-priority) event: push its start past this
|
|
1643
|
-
* higher-priority window. Use getGreaterDate (a monotonic max)
|
|
1644
|
-
* instead of a bare assignment so the result does NOT depend on the
|
|
1645
|
-
* order finalEvents are visited. That makes it safe to hoist the
|
|
1646
|
-
* per-iteration finalEvents.sort() out of the loop (audit H2): with
|
|
1647
|
-
* the old in-loop ascending sort, successive overlaps already had
|
|
1648
|
-
* monotonically increasing ends, so max equals the old assignment and
|
|
1649
|
-
* the output is unchanged.
|
|
1650
|
-
*/
|
|
1651
|
-
event.start = OneUptimeDate.getGreaterDate(
|
|
1652
|
-
event.start,
|
|
1653
|
-
OneUptimeDate.addRemoveSeconds(finalEvent.end, 1),
|
|
1654
|
-
);
|
|
1655
|
-
}
|
|
1609
|
+
if (finalEvents[index]!.end.getTime() <= eventStartTime) {
|
|
1610
|
+
continue;
|
|
1656
1611
|
}
|
|
1657
|
-
}
|
|
1658
1612
|
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
finalEvents.push(event);
|
|
1613
|
+
activeEventIndexes[keptCount] = index;
|
|
1614
|
+
keptCount++;
|
|
1662
1615
|
}
|
|
1663
1616
|
|
|
1617
|
+
activeEventIndexes.length = keptCount;
|
|
1618
|
+
|
|
1664
1619
|
/*
|
|
1665
|
-
*
|
|
1666
|
-
*
|
|
1667
|
-
*
|
|
1668
|
-
*
|
|
1669
|
-
* trim above now uses a monotonic max), so sorting once at the end yields
|
|
1670
|
-
* the same result. Audit H2.
|
|
1620
|
+
* Length is re-read each pass: trailing segments appended below join the
|
|
1621
|
+
* scan, exactly as they did when this walked finalEvents directly. They
|
|
1622
|
+
* start after this event ends, so they never match it — but the scan is
|
|
1623
|
+
* kept faithful rather than relying on that.
|
|
1671
1624
|
*/
|
|
1625
|
+
for (let i: number = 0; i < activeEventIndexes.length; i++) {
|
|
1626
|
+
const currentStart: number = event.start.getTime();
|
|
1672
1627
|
|
|
1673
|
-
|
|
1628
|
+
/*
|
|
1629
|
+
* Nothing left of this event. The else-branch below pushes its start
|
|
1630
|
+
* forward past each higher-priority window it meets, and that can
|
|
1631
|
+
* consume the event entirely — at which point it covers no time, will
|
|
1632
|
+
* not be placed, and must stop trimming other events.
|
|
1633
|
+
*
|
|
1634
|
+
* WITHOUT this stop the merge does not terminate, which is the bug this
|
|
1635
|
+
* whole rewrite exists to fix. `OneUptimeDate.isOverlapping` reports a
|
|
1636
|
+
* zero-length or inverted interval as overlapping anything that shares
|
|
1637
|
+
* an endpoint with it (its moment `isBetween` bounds are exclusive, but
|
|
1638
|
+
* it also has explicit start===start / end===end arms). So an exhausted
|
|
1639
|
+
* event kept matching the very tail segment it had just created, split
|
|
1640
|
+
* it again, matched the new tail, and so on forever. Empirically an
|
|
1641
|
+
* hourly grid with 3 priorities settled at 14 events and never returned
|
|
1642
|
+
* at 16.
|
|
1643
|
+
*
|
|
1644
|
+
* Stopping here is also the correct answer rather than merely a
|
|
1645
|
+
* terminating one: an event with no remaining duration represents nobody
|
|
1646
|
+
* on call, so letting it carve a second out of a lower-priority event
|
|
1647
|
+
* opened a 1-second hole in the fallback coverage for no reason.
|
|
1648
|
+
*/
|
|
1649
|
+
if (currentStart >= eventEndTime) {
|
|
1650
|
+
break;
|
|
1651
|
+
}
|
|
1674
1652
|
|
|
1675
|
-
|
|
1676
|
-
const finalEvent: PriorityCalendarEvents | undefined =
|
|
1677
|
-
finalEvents[index];
|
|
1653
|
+
const finalEventIndex: number = activeEventIndexes[i]!;
|
|
1678
1654
|
|
|
1679
|
-
if (
|
|
1655
|
+
if (removedEventIndexes.has(finalEventIndex)) {
|
|
1680
1656
|
continue;
|
|
1681
1657
|
}
|
|
1682
1658
|
|
|
1683
|
-
|
|
1684
|
-
finalEvents
|
|
1685
|
-
|
|
1659
|
+
const finalEvent: PriorityCalendarEvents =
|
|
1660
|
+
finalEvents[finalEventIndex]!;
|
|
1661
|
+
|
|
1662
|
+
const finalStart: number = finalEvent.start.getTime();
|
|
1663
|
+
const finalEnd: number = finalEvent.end.getTime();
|
|
1664
|
+
|
|
1665
|
+
/*
|
|
1666
|
+
* Half-open overlap: touching endpoints do not overlap. Both intervals
|
|
1667
|
+
* are guaranteed positive-length here — final events are length-checked
|
|
1668
|
+
* before being placed, and the current event is checked by the break
|
|
1669
|
+
* above — and over positive-length intervals this is exactly equivalent
|
|
1670
|
+
* to the OneUptimeDate.isOverlapping it replaces.
|
|
1671
|
+
*/
|
|
1672
|
+
if (currentStart >= finalEnd || finalStart >= eventEndTime) {
|
|
1686
1673
|
continue;
|
|
1687
1674
|
}
|
|
1688
1675
|
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1676
|
+
if (event.priority < finalEvent.priority) {
|
|
1677
|
+
/*
|
|
1678
|
+
* The current event outranks this one. Trim the final event back to
|
|
1679
|
+
* end 1s before the current event starts.
|
|
1680
|
+
*/
|
|
1681
|
+
const tempFinalEventEnd: Date = finalEvent.end;
|
|
1682
|
+
|
|
1683
|
+
/*
|
|
1684
|
+
* Reconstruct the trailing tail FIRST, before the front-collapse
|
|
1685
|
+
* removal below. If the lower-priority (fallback) event originally
|
|
1686
|
+
* extended past the higher-priority event, the portion AFTER the
|
|
1687
|
+
* higher-priority window must survive as its own segment — even when
|
|
1688
|
+
* the FRONT of the final event collapses to zero/negative length
|
|
1689
|
+
* (which happens when the higher-priority event starts at or before
|
|
1690
|
+
* the final event's start, e.g. two back-to-back higher-priority
|
|
1691
|
+
* rotation windows over a 24/7 fallback layer). Previously this block
|
|
1692
|
+
* ran only AFTER the collapse checks, whose `continue` skipped it,
|
|
1693
|
+
* silently deleting the fallback layer's coverage after the higher-
|
|
1694
|
+
* priority window and leaving on-call gaps where nobody is paged.
|
|
1695
|
+
*/
|
|
1696
|
+
if (tempFinalEventEnd.getTime() > eventEndTime) {
|
|
1697
|
+
// add the trailing segment of the lower-priority event
|
|
1698
|
+
const trimmedEvent: PriorityCalendarEvents = {
|
|
1699
|
+
...finalEvent,
|
|
1700
|
+
priority: finalEvent.priority,
|
|
1701
|
+
start: new Date(eventEndTime + 1000),
|
|
1702
|
+
end: tempFinalEventEnd,
|
|
1703
|
+
};
|
|
1704
|
+
|
|
1705
|
+
// only keep it if it has positive length
|
|
1706
|
+
if (trimmedEvent.end.getTime() > trimmedEvent.start.getTime()) {
|
|
1707
|
+
activeEventIndexes.push(finalEvents.length);
|
|
1708
|
+
finalEvents.push(trimmedEvent);
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
finalEvent.end = new Date(currentStart - 1000);
|
|
1713
|
+
|
|
1714
|
+
/*
|
|
1715
|
+
* If the front collapsed to zero or negative length, drop it. The
|
|
1716
|
+
* trailing tail, if any, was already preserved above.
|
|
1717
|
+
*/
|
|
1718
|
+
if (finalEvent.end.getTime() <= finalStart) {
|
|
1719
|
+
removedEventIndexes.add(finalEventIndex);
|
|
1720
|
+
}
|
|
1721
|
+
} else {
|
|
1722
|
+
/*
|
|
1723
|
+
* Trim the current (lower-priority) event: push its start past this
|
|
1724
|
+
* higher-priority window. This is a monotonic max rather than a bare
|
|
1725
|
+
* assignment so the result does NOT depend on the order finalEvents
|
|
1726
|
+
* are visited. That is what made it safe to hoist the per-iteration
|
|
1727
|
+
* finalEvents.sort() out of the loop (audit H2).
|
|
1728
|
+
*/
|
|
1729
|
+
const trimmedStart: number = finalEnd + 1000;
|
|
1730
|
+
|
|
1731
|
+
if (trimmedStart > currentStart) {
|
|
1732
|
+
event.start = new Date(trimmedStart);
|
|
1733
|
+
}
|
|
1693
1734
|
}
|
|
1694
1735
|
}
|
|
1736
|
+
|
|
1737
|
+
// Whatever is left of the current event, if anything, is placed.
|
|
1738
|
+
if (eventEndTime > event.start.getTime()) {
|
|
1739
|
+
activeEventIndexes.push(finalEvents.length);
|
|
1740
|
+
finalEvents.push(event);
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
/*
|
|
1744
|
+
* The sweep that used to run HERE — rescanning all of finalEvents for
|
|
1745
|
+
* zero-length and inverted entries after every placement — was O(n^2) on
|
|
1746
|
+
* its own and could never find anything. Every event reaching finalEvents
|
|
1747
|
+
* is length-checked at the moment it is pushed, and the only field mutated
|
|
1748
|
+
* afterwards is `end` in the trim branch above, which drops the event on
|
|
1749
|
+
* the spot when it collapses.
|
|
1750
|
+
*/
|
|
1695
1751
|
}
|
|
1696
1752
|
|
|
1697
1753
|
/*
|
|
@@ -1699,16 +1755,14 @@ export default class LayerUtil {
|
|
|
1699
1755
|
* audit H2). Downstream consumers (getEvents id assignment, the schedule
|
|
1700
1756
|
* service's current/next selection) expect events in start order.
|
|
1701
1757
|
*/
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
return
|
|
1705
|
-
}
|
|
1706
|
-
|
|
1707
|
-
if (OneUptimeDate.isAfter(a.start, b.start)) {
|
|
1708
|
-
return 1;
|
|
1709
|
-
}
|
|
1758
|
+
const keptEvents: PriorityCalendarEvents[] = finalEvents.filter(
|
|
1759
|
+
(_event: PriorityCalendarEvents, index: number) => {
|
|
1760
|
+
return !removedEventIndexes.has(index);
|
|
1761
|
+
},
|
|
1762
|
+
);
|
|
1710
1763
|
|
|
1711
|
-
|
|
1764
|
+
keptEvents.sort((a: CalendarEvent, b: CalendarEvent) => {
|
|
1765
|
+
return a.start.getTime() - b.start.getTime();
|
|
1712
1766
|
});
|
|
1713
1767
|
|
|
1714
1768
|
// convert PriorityCalendarEvents to CalendarEvents
|
|
@@ -1716,7 +1770,7 @@ export default class LayerUtil {
|
|
|
1716
1770
|
const calendarEvents: CalendarEvent[] = [];
|
|
1717
1771
|
let id: number = 1;
|
|
1718
1772
|
|
|
1719
|
-
for (const event of
|
|
1773
|
+
for (const event of keptEvents) {
|
|
1720
1774
|
const calendarEvent: CalendarEvent = {
|
|
1721
1775
|
...event,
|
|
1722
1776
|
id: id,
|
|
@@ -3,6 +3,19 @@ enum OnCallDutyPolicyStatus {
|
|
|
3
3
|
Started = "Started",
|
|
4
4
|
Executing = "Executing",
|
|
5
5
|
Completed = "Execution Completed",
|
|
6
|
+
/*
|
|
7
|
+
* Terminal, like Completed, but the policy walked every escalation rule
|
|
8
|
+
* without paging a single person — typically because every rule targeted an
|
|
9
|
+
* on-call schedule that had nobody on call. Kept distinct from Completed
|
|
10
|
+
* because the two used to be indistinguishable: an incident that notified
|
|
11
|
+
* nobody closed out with the same green "Execution Completed" as one that
|
|
12
|
+
* successfully paged the on-call engineer, so a policy could silently notify
|
|
13
|
+
* no one indefinitely.
|
|
14
|
+
*
|
|
15
|
+
* `status` is a varchar column (not a Postgres enum type), so adding this
|
|
16
|
+
* value needs no schema migration.
|
|
17
|
+
*/
|
|
18
|
+
CompletedWithNoNotifications = "Execution Completed - No One Notified",
|
|
6
19
|
Error = "Error",
|
|
7
20
|
}
|
|
8
21
|
|
|
@@ -49,13 +49,55 @@ export interface CurrentAndNextShift {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
52
|
+
* Why a schedule currently has (or does not have) somebody on call. The four
|
|
53
|
+
* states are mutually exclusive and ordered by how early the misconfiguration
|
|
54
|
+
* happens, so a caller can render the most specific remedy it knows about:
|
|
55
|
+
*
|
|
56
|
+
* - NoLayers the schedule has no layers at all -> "add a layer"
|
|
57
|
+
* - NoUsers layers exist but nobody is assigned to any of them, so the
|
|
58
|
+
* engine emits zero events and NOBODY is ever on call. This is
|
|
59
|
+
* a permanent 100% gap, not an off-hours one, and it needs its
|
|
60
|
+
* own remedy ("assign users") — telling someone to widen their
|
|
61
|
+
* active hours here would be wrong.
|
|
62
|
+
* - UncoveredNow users are assigned and shifts exist, but none covers `now`
|
|
63
|
+
* - Covered somebody is on call at this instant
|
|
57
64
|
*/
|
|
58
|
-
|
|
65
|
+
export enum ScheduleCoverageStatus {
|
|
66
|
+
NoLayers = "NoLayers",
|
|
67
|
+
NoUsers = "NoUsers",
|
|
68
|
+
UncoveredNow = "UncoveredNow",
|
|
69
|
+
Covered = "Covered",
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface ScheduleCoverageState {
|
|
73
|
+
status: ScheduleCoverageStatus;
|
|
74
|
+
current: OnCallShift | null;
|
|
75
|
+
next: OnCallShift | null;
|
|
76
|
+
gaps: Array<CoverageGap>;
|
|
77
|
+
// Total uncovered seconds inside [now, windowEnd].
|
|
78
|
+
uncoveredSeconds: number;
|
|
79
|
+
/*
|
|
80
|
+
* Fraction of [now, windowEnd] that somebody is on call for, 0..1. 0 for both
|
|
81
|
+
* NoLayers and NoUsers; 1 for a schedule with no gaps at all.
|
|
82
|
+
*/
|
|
83
|
+
coverageRatio: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* Two coverage segments belong to the same continuous shift when the hole
|
|
88
|
+
* between them is at or below this threshold. LayerUtil starts each following
|
|
89
|
+
* segment exactly one second after the previous one ends (Layer.ts advances
|
|
90
|
+
* with addRemoveSeconds(end, 1)) and the multi-layer priority merge leaves
|
|
91
|
+
* seams of the same ±1s magnitude, so a few seconds of slack is all that is
|
|
92
|
+
* needed to absorb the engine's own artifacts.
|
|
93
|
+
*
|
|
94
|
+
* This used to be 90 seconds, which silently swallowed genuine sub-minute
|
|
95
|
+
* coverage holes — a schedule whose layers were misaligned by a minute
|
|
96
|
+
* reported full coverage. Anything above the engine artifact is a real hole and
|
|
97
|
+
* is now reported; callers that consider very short holes to be display noise
|
|
98
|
+
* filter them at the render layer (see getCoverageGaps' minimumGapSeconds).
|
|
99
|
+
*/
|
|
100
|
+
const CONTIGUITY_TOLERANCE_SECONDS: number = 5;
|
|
59
101
|
|
|
60
102
|
export default class ScheduleShiftUtil {
|
|
61
103
|
/*
|
|
@@ -191,6 +233,7 @@ export default class ScheduleShiftUtil {
|
|
|
191
233
|
shifts: Array<OnCallShift>,
|
|
192
234
|
windowStart: Date,
|
|
193
235
|
windowEnd: Date,
|
|
236
|
+
options?: { minimumGapSeconds?: number | undefined } | undefined,
|
|
194
237
|
): Array<CoverageGap> {
|
|
195
238
|
const gaps: Array<CoverageGap> = [];
|
|
196
239
|
|
|
@@ -199,18 +242,24 @@ export default class ScheduleShiftUtil {
|
|
|
199
242
|
}
|
|
200
243
|
|
|
201
244
|
/*
|
|
202
|
-
* A
|
|
245
|
+
* A hole only "counts" as a gap when it is longer than the threshold, so
|
|
203
246
|
* the one-second boundaries LayerUtil leaves between segments never show up
|
|
204
|
-
* as spurious coverage holes.
|
|
247
|
+
* as spurious coverage holes. Callers that treat short holes as display
|
|
248
|
+
* noise (rather than as a misconfiguration worth reporting) raise
|
|
249
|
+
* minimumGapSeconds instead of relying on the detector to hide them.
|
|
205
250
|
*/
|
|
251
|
+
const minimumGapSeconds: number =
|
|
252
|
+
options?.minimumGapSeconds === undefined
|
|
253
|
+
? CONTIGUITY_TOLERANCE_SECONDS
|
|
254
|
+
: options.minimumGapSeconds;
|
|
255
|
+
|
|
206
256
|
const isRealGap: (start: Date, end: Date) => boolean = (
|
|
207
257
|
start: Date,
|
|
208
258
|
end: Date,
|
|
209
259
|
): boolean => {
|
|
210
260
|
return (
|
|
211
261
|
OneUptimeDate.isAfter(end, start) &&
|
|
212
|
-
OneUptimeDate.getDifferenceInSeconds(end, start) >
|
|
213
|
-
CONTIGUITY_TOLERANCE_SECONDS
|
|
262
|
+
OneUptimeDate.getDifferenceInSeconds(end, start) > minimumGapSeconds
|
|
214
263
|
);
|
|
215
264
|
};
|
|
216
265
|
|
|
@@ -254,4 +303,100 @@ export default class ScheduleShiftUtil {
|
|
|
254
303
|
|
|
255
304
|
return gaps;
|
|
256
305
|
}
|
|
306
|
+
|
|
307
|
+
/*
|
|
308
|
+
* The single source of truth for "does this schedule have anybody on call,
|
|
309
|
+
* and if not, why not". Every surface that renders coverage derives its state
|
|
310
|
+
* from here rather than inventing its own condition.
|
|
311
|
+
*
|
|
312
|
+
* This exists because the UI used to gate its gap warnings on
|
|
313
|
+
* `assignedUserCount > 0` — a condition that is exactly INVERTED, since zero
|
|
314
|
+
* assigned users IS the total-gap state. The one screen that would have said
|
|
315
|
+
* "nobody is on call" was therefore the one screen that never rendered.
|
|
316
|
+
* Returning an explicit status makes that class of mistake impossible: a
|
|
317
|
+
* caller must handle NoUsers, it cannot accidentally fall into "covered".
|
|
318
|
+
*/
|
|
319
|
+
public static getCoverageState(data: {
|
|
320
|
+
layerCount: number;
|
|
321
|
+
assignedUserCount: number;
|
|
322
|
+
shifts: Array<OnCallShift>;
|
|
323
|
+
now: Date;
|
|
324
|
+
windowEnd: Date;
|
|
325
|
+
minimumGapSeconds?: number | undefined;
|
|
326
|
+
}): ScheduleCoverageState {
|
|
327
|
+
const { current, next }: CurrentAndNextShift = this.getCurrentAndNextShift(
|
|
328
|
+
data.shifts,
|
|
329
|
+
data.now,
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
const gaps: Array<CoverageGap> = this.getCoverageGaps(
|
|
333
|
+
data.shifts,
|
|
334
|
+
data.now,
|
|
335
|
+
data.windowEnd,
|
|
336
|
+
{ minimumGapSeconds: data.minimumGapSeconds },
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
const uncoveredSeconds: number = gaps.reduce(
|
|
340
|
+
(total: number, gap: CoverageGap) => {
|
|
341
|
+
return total + OneUptimeDate.getDifferenceInSeconds(gap.end, gap.start);
|
|
342
|
+
},
|
|
343
|
+
0,
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
let status: ScheduleCoverageStatus = ScheduleCoverageStatus.Covered;
|
|
347
|
+
|
|
348
|
+
if (data.layerCount <= 0) {
|
|
349
|
+
status = ScheduleCoverageStatus.NoLayers;
|
|
350
|
+
} else if (data.assignedUserCount <= 0) {
|
|
351
|
+
status = ScheduleCoverageStatus.NoUsers;
|
|
352
|
+
} else if (!current) {
|
|
353
|
+
status = ScheduleCoverageStatus.UncoveredNow;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* Test the window's ORDER explicitly rather than inferring it from the sign
|
|
358
|
+
* of the difference: OneUptimeDate.getDifferenceInSeconds returns an
|
|
359
|
+
* ABSOLUTE value, so an inverted window (windowEnd before now) yields a
|
|
360
|
+
* positive windowSeconds. Combined with getCoverageGaps bailing out on such
|
|
361
|
+
* a window and returning no gaps, the ratio then computed to a confident
|
|
362
|
+
* 1 — the function whose entire job is to surface missing coverage would
|
|
363
|
+
* report 100% covered. Fail to 0, never to "everything is fine".
|
|
364
|
+
*/
|
|
365
|
+
const hasUsableWindow: boolean = OneUptimeDate.isBefore(
|
|
366
|
+
data.now,
|
|
367
|
+
data.windowEnd,
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
const windowSeconds: number = hasUsableWindow
|
|
371
|
+
? OneUptimeDate.getDifferenceInSeconds(data.windowEnd, data.now)
|
|
372
|
+
: 0;
|
|
373
|
+
|
|
374
|
+
/*
|
|
375
|
+
* A schedule with no layers, or with layers but nobody assigned to them,
|
|
376
|
+
* can never put anyone on call — its coverage is 0 by definition, whatever
|
|
377
|
+
* shifts a caller happened to pass in. Deriving the ratio purely from those
|
|
378
|
+
* shifts would let a stale set report "100% covered" next to "no layers
|
|
379
|
+
* configured".
|
|
380
|
+
*/
|
|
381
|
+
const canEverCover: boolean =
|
|
382
|
+
status !== ScheduleCoverageStatus.NoLayers &&
|
|
383
|
+
status !== ScheduleCoverageStatus.NoUsers;
|
|
384
|
+
|
|
385
|
+
const coverageRatio: number =
|
|
386
|
+
!hasUsableWindow || !canEverCover
|
|
387
|
+
? 0
|
|
388
|
+
: Math.min(
|
|
389
|
+
1,
|
|
390
|
+
Math.max(0, (windowSeconds - uncoveredSeconds) / windowSeconds),
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
status,
|
|
395
|
+
current,
|
|
396
|
+
next,
|
|
397
|
+
gaps,
|
|
398
|
+
uncoveredSeconds,
|
|
399
|
+
coverageRatio,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
257
402
|
}
|