@oneuptime/common 12.0.29 → 12.0.31
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/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +13 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +250 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +394 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Date.ts +39 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +13 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +185 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import CalendarEvent from "../Calendar/CalendarEvent";
|
|
2
2
|
import OneUptimeDate from "../Date";
|
|
3
|
+
import { ROTATION_PERIOD_START_KEY } from "./Layer";
|
|
4
|
+
import UserOverrideUtil, { OverrideEventMeta } from "./UserOverrideUtil";
|
|
3
5
|
|
|
4
6
|
/*
|
|
5
7
|
* Turns the low-level calendar events produced by LayerUtil into the
|
|
@@ -36,6 +38,38 @@ export interface OnCallShift {
|
|
|
36
38
|
* coverage ("40h across the week") instead of the misleading span ("4d 8h").
|
|
37
39
|
*/
|
|
38
40
|
coverageSeconds: number;
|
|
41
|
+
/*
|
|
42
|
+
* Metadata carried over from the FIRST raw segment folded into this shift:
|
|
43
|
+
* the override that produced it (UserOverrideUtil stamps it on the event)
|
|
44
|
+
* and the layer it came from (LayerUtil stamps layerId/layerName when the
|
|
45
|
+
* caller identified the layer). Only present when the segment carried them.
|
|
46
|
+
*
|
|
47
|
+
* With the default grouping (by user id) a shift can span segments from
|
|
48
|
+
* several layers or override windows, so these describe the first segment
|
|
49
|
+
* only. Callers that need them to hold for the WHOLE shift pass a groupKey
|
|
50
|
+
* that includes them (see groupKeyByUserOverrideAndLayer), which is what the
|
|
51
|
+
* on-call calendar feed does.
|
|
52
|
+
*/
|
|
53
|
+
override?: OverrideEventMeta;
|
|
54
|
+
layerId?: string;
|
|
55
|
+
layerName?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Decides which raw segments may be folded into the same shift. Two adjacent
|
|
60
|
+
* segments are merged only when their keys are equal (and they touch, or the
|
|
61
|
+
* caller asked to merge across gaps).
|
|
62
|
+
*/
|
|
63
|
+
export type ShiftGroupKeyFunction = (event: CalendarEvent) => string;
|
|
64
|
+
|
|
65
|
+
export interface GroupEventsIntoShiftsOptions {
|
|
66
|
+
mergeAcrossGaps?: boolean | undefined;
|
|
67
|
+
/*
|
|
68
|
+
* Defaults to the on-call user id (event.title), which is what every
|
|
69
|
+
* schedule summary in the dashboard wants: "Alice, Mon 09:00 -> Fri 17:00"
|
|
70
|
+
* regardless of which layer or override put her there.
|
|
71
|
+
*/
|
|
72
|
+
groupKey?: ShiftGroupKeyFunction | undefined;
|
|
39
73
|
}
|
|
40
74
|
|
|
41
75
|
export interface CoverageGap {
|
|
@@ -116,13 +150,15 @@ export default class ScheduleShiftUtil {
|
|
|
116
150
|
*/
|
|
117
151
|
public static groupEventsIntoShifts(
|
|
118
152
|
events: Array<CalendarEvent>,
|
|
119
|
-
options?:
|
|
153
|
+
options?: GroupEventsIntoShiftsOptions | undefined,
|
|
120
154
|
): Array<OnCallShift> {
|
|
121
155
|
if (!events || events.length === 0) {
|
|
122
156
|
return [];
|
|
123
157
|
}
|
|
124
158
|
|
|
125
159
|
const mergeAcrossGaps: boolean = Boolean(options?.mergeAcrossGaps);
|
|
160
|
+
const groupKey: ShiftGroupKeyFunction =
|
|
161
|
+
options?.groupKey ?? ScheduleShiftUtil.defaultGroupKey;
|
|
126
162
|
|
|
127
163
|
// Work on a copy sorted by start time; never mutate the caller's array.
|
|
128
164
|
const sorted: Array<CalendarEvent> = [...events]
|
|
@@ -142,16 +178,18 @@ export default class ScheduleShiftUtil {
|
|
|
142
178
|
});
|
|
143
179
|
|
|
144
180
|
const shifts: Array<OnCallShift> = [];
|
|
181
|
+
let lastKey: string | null = null;
|
|
145
182
|
|
|
146
183
|
for (const event of sorted) {
|
|
147
184
|
const userId: string = event.title;
|
|
185
|
+
const key: string = groupKey(event);
|
|
148
186
|
const eventSeconds: number = OneUptimeDate.getDifferenceInSeconds(
|
|
149
187
|
event.end,
|
|
150
188
|
event.start,
|
|
151
189
|
);
|
|
152
190
|
const last: OnCallShift | undefined = shifts[shifts.length - 1];
|
|
153
191
|
|
|
154
|
-
const sameUser: boolean = Boolean(last) &&
|
|
192
|
+
const sameUser: boolean = Boolean(last) && lastKey === key;
|
|
155
193
|
|
|
156
194
|
const isContiguous: boolean =
|
|
157
195
|
Boolean(last) &&
|
|
@@ -175,17 +213,134 @@ export default class ScheduleShiftUtil {
|
|
|
175
213
|
continue;
|
|
176
214
|
}
|
|
177
215
|
|
|
178
|
-
|
|
216
|
+
const shift: OnCallShift = {
|
|
179
217
|
userId,
|
|
180
218
|
start: event.start,
|
|
181
219
|
end: event.end,
|
|
182
220
|
coverageSeconds: eventSeconds,
|
|
183
|
-
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* Only add the metadata keys when the segment carries them, so callers
|
|
225
|
+
* that never stamp them (every dashboard summary) get the exact shift
|
|
226
|
+
* objects they always did.
|
|
227
|
+
*/
|
|
228
|
+
const override: OverrideEventMeta | null =
|
|
229
|
+
UserOverrideUtil.getOverrideMeta(event);
|
|
230
|
+
if (override) {
|
|
231
|
+
shift.override = override;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const layerId: string | undefined =
|
|
235
|
+
ScheduleShiftUtil.getEventLayerId(event);
|
|
236
|
+
if (layerId !== undefined) {
|
|
237
|
+
shift.layerId = layerId;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const layerName: string | undefined =
|
|
241
|
+
ScheduleShiftUtil.getEventLayerName(event);
|
|
242
|
+
if (layerName !== undefined) {
|
|
243
|
+
shift.layerName = layerName;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
shifts.push(shift);
|
|
247
|
+
lastKey = key;
|
|
184
248
|
}
|
|
185
249
|
|
|
186
250
|
return shifts;
|
|
187
251
|
}
|
|
188
252
|
|
|
253
|
+
// The default grouping: one shift per run of the same on-call user.
|
|
254
|
+
public static defaultGroupKey(event: CalendarEvent): string {
|
|
255
|
+
return event.title;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/*
|
|
259
|
+
* Grouping that keeps a shift inside ONE layer, ONE override window and ONE
|
|
260
|
+
* rotation period: the user id, plus the override identity (original user +
|
|
261
|
+
* window) when the segment was produced by an override, plus the layer id
|
|
262
|
+
* when known, plus the rotation period the engine stamped on the event. This
|
|
263
|
+
* is the key the on-call calendar feed groups with, so an override split
|
|
264
|
+
* yields A / B / A as three events and a layer handover is visible as a
|
|
265
|
+
* boundary instead of being folded into a single shift.
|
|
266
|
+
*
|
|
267
|
+
* The rotation period matters because two consecutive turns held by the SAME
|
|
268
|
+
* user (a single-user layer, or [A, A, B]) are contiguous across the engine's
|
|
269
|
+
* 1 s seam and would otherwise fold into one block whose start and end are
|
|
270
|
+
* decided by how far the expansion window reached — the block would slide
|
|
271
|
+
* forward every time the feed window did, changing the event's UID and
|
|
272
|
+
* DTSTART for every subscriber. Override segments deliberately ignore the
|
|
273
|
+
* period: an override that spans a rotation boundary is ONE stretch of cover
|
|
274
|
+
* and stays one event.
|
|
275
|
+
*/
|
|
276
|
+
public static groupKeyByUserOverrideAndLayer(event: CalendarEvent): string {
|
|
277
|
+
const override: OverrideEventMeta | null =
|
|
278
|
+
UserOverrideUtil.getOverrideMeta(event);
|
|
279
|
+
|
|
280
|
+
const overridePart: string = override
|
|
281
|
+
? `${override.originalUserId}@${override.overrideStartsAt.getTime()}-${override.overrideEndsAt.getTime()}`
|
|
282
|
+
: "";
|
|
283
|
+
|
|
284
|
+
const periodStart: number | undefined = override
|
|
285
|
+
? undefined
|
|
286
|
+
: ScheduleShiftUtil.getEventRotationPeriodStart(event);
|
|
287
|
+
|
|
288
|
+
const periodPart: string =
|
|
289
|
+
periodStart === undefined ? "" : periodStart.toString();
|
|
290
|
+
|
|
291
|
+
return `${event.title}|${overridePart}|${ScheduleShiftUtil.getEventLayerId(event) ?? ""}|${periodPart}`;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/*
|
|
295
|
+
* LayerUtil stamps layerId/layerName onto merged events (see
|
|
296
|
+
* PriorityCalendarEvents). CalendarEvent is a JSONObject, so the keys are
|
|
297
|
+
* read through the index signature and type-checked here.
|
|
298
|
+
*/
|
|
299
|
+
public static getEventLayerId(event: CalendarEvent): string | undefined {
|
|
300
|
+
const value: unknown = (event as unknown as Record<string, unknown>)[
|
|
301
|
+
"layerId"
|
|
302
|
+
];
|
|
303
|
+
return typeof value === "string" ? value : undefined;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
public static getEventLayerName(event: CalendarEvent): string | undefined {
|
|
307
|
+
const value: unknown = (event as unknown as Record<string, unknown>)[
|
|
308
|
+
"layerName"
|
|
309
|
+
];
|
|
310
|
+
return typeof value === "string" ? value : undefined;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
* Epoch milliseconds of the rotation period an engine event belongs to (see
|
|
315
|
+
* ROTATION_PERIOD_START_KEY in Layer.ts). Undefined for hand-built events and
|
|
316
|
+
* for anything that did not come out of LayerUtil — those simply group as
|
|
317
|
+
* they always did. Dates and ISO strings are accepted so a JSON round trip
|
|
318
|
+
* does not silently drop the period.
|
|
319
|
+
*/
|
|
320
|
+
public static getEventRotationPeriodStart(
|
|
321
|
+
event: CalendarEvent,
|
|
322
|
+
): number | undefined {
|
|
323
|
+
const value: unknown = (event as unknown as Record<string, unknown>)[
|
|
324
|
+
ROTATION_PERIOD_START_KEY
|
|
325
|
+
];
|
|
326
|
+
|
|
327
|
+
if (typeof value === "number") {
|
|
328
|
+
return Number.isFinite(value) ? value : undefined;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (value instanceof Date) {
|
|
332
|
+
const time: number = value.getTime();
|
|
333
|
+
return Number.isNaN(time) ? undefined : time;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (typeof value === "string") {
|
|
337
|
+
const parsed: number = Date.parse(value);
|
|
338
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
|
|
189
344
|
/*
|
|
190
345
|
* The shift that contains `now` (the person on call right now) and the first
|
|
191
346
|
* shift that starts after `now` (up next). Either can be null: `current` is
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Seam normalisation for resolved on-call segments.
|
|
3
|
+
*
|
|
4
|
+
* The rotation engine and its post-processors leave one-second artefacts at
|
|
5
|
+
* every boundary: LayerUtil resumes each segment one second after the
|
|
6
|
+
* previous one ends (Layer.ts advances with addRemoveSeconds(end, 1)), the
|
|
7
|
+
* multi-layer priority merge trims to `start - 1s` / `end + 1s`, and the
|
|
8
|
+
* override splitter cuts at the exact instant. Fed straight into a calendar
|
|
9
|
+
* that renders as 09:00:01 -> 16:59:59, with adjacent shifts that neither
|
|
10
|
+
* touch nor overlap — which Google's week view draws side by side.
|
|
11
|
+
*
|
|
12
|
+
* Handoff and restriction times are minute-granular by construction, so the
|
|
13
|
+
* artefacts are unambiguous: a start on second 1 means the minute, an end on
|
|
14
|
+
* second 59 means the next minute, and two segments a second apart are
|
|
15
|
+
* meant to touch. Everything else is left alone.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface TimeSegment {
|
|
19
|
+
start: Date;
|
|
20
|
+
end: Date;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Segments this close together (in ms) are made to touch exactly.
|
|
24
|
+
export const SEAM_TOLERANCE_MILLISECONDS: number = 1000;
|
|
25
|
+
|
|
26
|
+
const MILLISECONDS_PER_MINUTE: number = 60 * 1000;
|
|
27
|
+
|
|
28
|
+
export default class ShiftSeamUtil {
|
|
29
|
+
/*
|
|
30
|
+
* Returns a NEW array (sorted by start, then end) of NEW segment objects
|
|
31
|
+
* with the seams normalised; neither the input array nor its segments are
|
|
32
|
+
* mutated. Any extra properties on the segments are preserved, so this can
|
|
33
|
+
* run on OnCallShift / MaterializedShift objects directly.
|
|
34
|
+
*
|
|
35
|
+
* Rules, in order:
|
|
36
|
+
* 1. a start whose seconds == 1 snaps DOWN to the minute;
|
|
37
|
+
* 2. an end whose seconds == 59 snaps UP to the next minute;
|
|
38
|
+
* 3. walking in start order, when the next segment starts 0..1 s after
|
|
39
|
+
* this one ends, this one's end becomes exactly the next one's start.
|
|
40
|
+
* Snapping only ever widens a segment, so it cannot create an empty or
|
|
41
|
+
* inverted one; a segment that is already empty or inverted is left alone.
|
|
42
|
+
*/
|
|
43
|
+
public static normalizeSeams<T extends TimeSegment>(
|
|
44
|
+
segments: Array<T>,
|
|
45
|
+
): Array<T> {
|
|
46
|
+
const normalized: Array<T> = segments.map((segment: T) => {
|
|
47
|
+
const snappedStart: Date = ShiftSeamUtil.snapStart(segment.start);
|
|
48
|
+
const snappedEnd: Date = ShiftSeamUtil.snapEnd(segment.end);
|
|
49
|
+
|
|
50
|
+
const keepSnaps: boolean =
|
|
51
|
+
segment.end.getTime() > segment.start.getTime() &&
|
|
52
|
+
snappedEnd.getTime() > snappedStart.getTime();
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
...segment,
|
|
56
|
+
start: keepSnaps ? snappedStart : new Date(segment.start.getTime()),
|
|
57
|
+
end: keepSnaps ? snappedEnd : new Date(segment.end.getTime()),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
normalized.sort((a: T, b: T) => {
|
|
62
|
+
const byStart: number = a.start.getTime() - b.start.getTime();
|
|
63
|
+
if (byStart !== 0) {
|
|
64
|
+
return byStart;
|
|
65
|
+
}
|
|
66
|
+
return a.end.getTime() - b.end.getTime();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
for (let i: number = 0; i < normalized.length - 1; i++) {
|
|
70
|
+
const segment: T = normalized[i]!;
|
|
71
|
+
const next: T = normalized[i + 1]!;
|
|
72
|
+
|
|
73
|
+
const delta: number = next.start.getTime() - segment.end.getTime();
|
|
74
|
+
|
|
75
|
+
if (delta >= 0 && delta <= SEAM_TOLERANCE_MILLISECONDS) {
|
|
76
|
+
segment.end = new Date(next.start.getTime());
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return normalized;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 10:00:01(.xxx) -> 10:00:00.000; anything else is returned as a copy.
|
|
84
|
+
public static snapStart(date: Date): Date {
|
|
85
|
+
if (date.getUTCSeconds() === 1) {
|
|
86
|
+
return new Date(
|
|
87
|
+
Math.floor(date.getTime() / MILLISECONDS_PER_MINUTE) *
|
|
88
|
+
MILLISECONDS_PER_MINUTE,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return new Date(date.getTime());
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 16:59:59(.xxx) -> 17:00:00.000; anything else is returned as a copy.
|
|
96
|
+
public static snapEnd(date: Date): Date {
|
|
97
|
+
if (date.getUTCSeconds() === 59) {
|
|
98
|
+
return new Date(
|
|
99
|
+
(Math.floor(date.getTime() / MILLISECONDS_PER_MINUTE) + 1) *
|
|
100
|
+
MILLISECONDS_PER_MINUTE,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return new Date(date.getTime());
|
|
105
|
+
}
|
|
106
|
+
}
|
package/Types/Permission.ts
CHANGED
|
@@ -101,6 +101,25 @@ enum Permission {
|
|
|
101
101
|
TelemetryMember = "TelemetryMember",
|
|
102
102
|
TelemetryViewer = "TelemetryViewer",
|
|
103
103
|
|
|
104
|
+
/*
|
|
105
|
+
* SIEM data is its own domain, not a fourth telemetry signal. Security
|
|
106
|
+
* events, the Sigma detection rules over them, the threat-intel feeds and
|
|
107
|
+
* their indicators, and the SecOps connector credentials all read through
|
|
108
|
+
* these three tiers and through nothing else that is handed out broadly -
|
|
109
|
+
* not ProjectMember, not the project-wide Viewer, not the Telemetry tiers.
|
|
110
|
+
*
|
|
111
|
+
* That exclusion is the whole point of the family. A SIEM holds authentication
|
|
112
|
+
* failures, privilege escalations and the analyst's own investigation trail;
|
|
113
|
+
* "everyone who can open a dashboard can read it" is not an access policy an
|
|
114
|
+
* organisation deploying one can accept. Whoever should see it is given a
|
|
115
|
+
* Security tier deliberately, the same way BillingViewer is given
|
|
116
|
+
* deliberately, and everybody else - including a Telemetry Admin with the run
|
|
117
|
+
* of every log, metric and trace in the project - sees nothing.
|
|
118
|
+
*/
|
|
119
|
+
SecurityAdmin = "SecurityAdmin",
|
|
120
|
+
SecurityMember = "SecurityMember",
|
|
121
|
+
SecurityViewer = "SecurityViewer",
|
|
122
|
+
|
|
104
123
|
SettingsAdmin = "SettingsAdmin",
|
|
105
124
|
SettingsMember = "SettingsMember",
|
|
106
125
|
SettingsViewer = "SettingsViewer",
|
|
@@ -617,6 +636,11 @@ enum Permission {
|
|
|
617
636
|
EditNetworkDeviceAutoImportRule = "EditNetworkDeviceAutoImportRule",
|
|
618
637
|
ReadNetworkDeviceAutoImportRule = "ReadNetworkDeviceAutoImportRule",
|
|
619
638
|
|
|
639
|
+
CreateNetworkDeviceOidTemplate = "CreateNetworkDeviceOidTemplate",
|
|
640
|
+
DeleteNetworkDeviceOidTemplate = "DeleteNetworkDeviceOidTemplate",
|
|
641
|
+
EditNetworkDeviceOidTemplate = "EditNetworkDeviceOidTemplate",
|
|
642
|
+
ReadNetworkDeviceOidTemplate = "ReadNetworkDeviceOidTemplate",
|
|
643
|
+
|
|
620
644
|
// Podman Host Label Rule Permissions
|
|
621
645
|
CreatePodmanHostLabelRule = "CreatePodmanHostLabelRule",
|
|
622
646
|
DeletePodmanHostLabelRule = "DeletePodmanHostLabelRule",
|
|
@@ -2371,6 +2395,36 @@ export class PermissionHelper {
|
|
|
2371
2395
|
isRolePermission: true,
|
|
2372
2396
|
group: PermissionGroup.Telemetry,
|
|
2373
2397
|
},
|
|
2398
|
+
{
|
|
2399
|
+
permission: Permission.SecurityAdmin,
|
|
2400
|
+
title: "Security Admin",
|
|
2401
|
+
description:
|
|
2402
|
+
"Full control over the SIEM: security events, Sigma detection rules, threat intelligence feeds and indicators, and Google SecOps connections. Security data is not readable through any other role.",
|
|
2403
|
+
isAssignableToTenant: true,
|
|
2404
|
+
isAccessControlPermission: false,
|
|
2405
|
+
isRolePermission: true,
|
|
2406
|
+
group: PermissionGroup.Security,
|
|
2407
|
+
},
|
|
2408
|
+
{
|
|
2409
|
+
permission: Permission.SecurityMember,
|
|
2410
|
+
title: "Security Member",
|
|
2411
|
+
description:
|
|
2412
|
+
"Can read security events and threat intelligence, and create, edit, and delete detection rules and threat intel feeds. Cannot configure Google SecOps connections.",
|
|
2413
|
+
isAssignableToTenant: true,
|
|
2414
|
+
isAccessControlPermission: false,
|
|
2415
|
+
isRolePermission: true,
|
|
2416
|
+
group: PermissionGroup.Security,
|
|
2417
|
+
},
|
|
2418
|
+
{
|
|
2419
|
+
permission: Permission.SecurityViewer,
|
|
2420
|
+
title: "Security Viewer",
|
|
2421
|
+
description:
|
|
2422
|
+
"Read-only access to security events, detection rules, threat intelligence feeds, and indicators.",
|
|
2423
|
+
isAssignableToTenant: true,
|
|
2424
|
+
isAccessControlPermission: false,
|
|
2425
|
+
isRolePermission: true,
|
|
2426
|
+
group: PermissionGroup.Security,
|
|
2427
|
+
},
|
|
2374
2428
|
{
|
|
2375
2429
|
permission: Permission.SettingsAdmin,
|
|
2376
2430
|
title: "Settings Admin",
|
|
@@ -12341,6 +12395,48 @@ export class PermissionHelper {
|
|
|
12341
12395
|
group: PermissionGroup.Telemetry,
|
|
12342
12396
|
},
|
|
12343
12397
|
|
|
12398
|
+
// OID Collection Template Permissions
|
|
12399
|
+
{
|
|
12400
|
+
permission: Permission.CreateNetworkDeviceOidTemplate,
|
|
12401
|
+
title: "Create OID Collection Template",
|
|
12402
|
+
description:
|
|
12403
|
+
"This permission can create OID Collection Templates in this project.",
|
|
12404
|
+
isAssignableToTenant: true,
|
|
12405
|
+
isAccessControlPermission: false,
|
|
12406
|
+
isRolePermission: false,
|
|
12407
|
+
group: PermissionGroup.Telemetry,
|
|
12408
|
+
},
|
|
12409
|
+
{
|
|
12410
|
+
permission: Permission.DeleteNetworkDeviceOidTemplate,
|
|
12411
|
+
title: "Delete OID Collection Template",
|
|
12412
|
+
description:
|
|
12413
|
+
"This permission can delete OID Collection Templates of this project.",
|
|
12414
|
+
isAssignableToTenant: true,
|
|
12415
|
+
isAccessControlPermission: false,
|
|
12416
|
+
isRolePermission: false,
|
|
12417
|
+
group: PermissionGroup.Telemetry,
|
|
12418
|
+
},
|
|
12419
|
+
{
|
|
12420
|
+
permission: Permission.EditNetworkDeviceOidTemplate,
|
|
12421
|
+
title: "Edit OID Collection Template",
|
|
12422
|
+
description:
|
|
12423
|
+
"This permission can edit OID Collection Templates of this project. Editing a template changes what every linked device collects on its next poll.",
|
|
12424
|
+
isAssignableToTenant: true,
|
|
12425
|
+
isAccessControlPermission: false,
|
|
12426
|
+
isRolePermission: false,
|
|
12427
|
+
group: PermissionGroup.Telemetry,
|
|
12428
|
+
},
|
|
12429
|
+
{
|
|
12430
|
+
permission: Permission.ReadNetworkDeviceOidTemplate,
|
|
12431
|
+
title: "Read OID Collection Template",
|
|
12432
|
+
description:
|
|
12433
|
+
"This permission can read OID Collection Templates of this project.",
|
|
12434
|
+
isAssignableToTenant: true,
|
|
12435
|
+
isAccessControlPermission: false,
|
|
12436
|
+
isRolePermission: false,
|
|
12437
|
+
group: PermissionGroup.Telemetry,
|
|
12438
|
+
},
|
|
12439
|
+
|
|
12344
12440
|
// Podman Host Label Rule Permissions
|
|
12345
12441
|
{
|
|
12346
12442
|
permission: Permission.CreatePodmanHostLabelRule,
|
|
@@ -35,6 +35,27 @@ export const MAX_SESSION_REPLAY_CHUNK_BYTES: number = 2 * 1024 * 1024;
|
|
|
35
35
|
/* Frames a single catch-up request may concatenate. */
|
|
36
36
|
export const MAX_SESSION_REPLAY_CHUNKS_PER_REQUEST: number = 8;
|
|
37
37
|
|
|
38
|
+
/*
|
|
39
|
+
* Largest DECOMPRESSED payload the ingest worker will inflate for one frame,
|
|
40
|
+
* and therefore the largest single indivisible rrweb event the recorder may
|
|
41
|
+
* put on the wire.
|
|
42
|
+
*
|
|
43
|
+
* The two numbers have to be the same number, which is why this lives in
|
|
44
|
+
* Common rather than in either side. A FullSnapshot is one rrweb event: it
|
|
45
|
+
* cannot be cut in half and still parse, so when it is bigger than the flush
|
|
46
|
+
* threshold the recorder posts it whole in a chunk of its own rather than
|
|
47
|
+
* cutting it. That is only safe while the recorder's ceiling is exactly the
|
|
48
|
+
* worker's — a recorder willing to send more than the worker will inflate
|
|
49
|
+
* produces a chunk that is accepted, queued, and then dropped at decode time,
|
|
50
|
+
* leaving a hole in the chunk sequence with nothing anywhere reporting it.
|
|
51
|
+
*
|
|
52
|
+
* Compression is what makes the number affordable: a snapshot this size gzips
|
|
53
|
+
* to a small fraction of MAX_SESSION_REPLAY_CHUNK_BYTES, which is the cap on
|
|
54
|
+
* the bytes actually posted.
|
|
55
|
+
*/
|
|
56
|
+
export const SESSION_REPLAY_MAX_DECOMPRESSED_FRAME_BYTES: number =
|
|
57
|
+
8 * 1024 * 1024;
|
|
58
|
+
|
|
38
59
|
/*
|
|
39
60
|
* Hard stop per session. At the 15s flush cadence this is ~2 hours of
|
|
40
61
|
* continuous recording, comfortably past the 4-hour session cap once
|
|
@@ -53,4 +53,12 @@ export interface ResolveStackTraceResult {
|
|
|
53
53
|
resolvedCount: number;
|
|
54
54
|
/** Number of source maps found for the (service, release) pair. */
|
|
55
55
|
sourceMapCount: number;
|
|
56
|
+
/**
|
|
57
|
+
* Maps that a frame matched but that were not loaded, because loading them
|
|
58
|
+
* would have exceeded the resolver's per-request byte budget
|
|
59
|
+
* (SOURCE_MAP_MAX_BYTES_PER_RESOLVE). Non-zero means symbols are missing
|
|
60
|
+
* for a reason an operator can fix by raising the budget — as opposed to
|
|
61
|
+
* the maps simply never having been uploaded.
|
|
62
|
+
*/
|
|
63
|
+
sourceMapsSkippedForSize: number;
|
|
56
64
|
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
|
|
3
|
+
import { AnnotationHover } from "./ChartAnnotationLayer";
|
|
4
|
+
import { clampHoverCardLeft, getMarkerColor } from "./AnnotationLayout";
|
|
5
|
+
import { cx } from "../Utils/Cx";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Wide enough for an incident title at 12px without wrapping to three
|
|
9
|
+
* lines, narrow enough that two cards could sit side by side on a
|
|
10
|
+
* dashboard widget.
|
|
11
|
+
*/
|
|
12
|
+
export const HOVER_CARD_WIDTH: number = 288;
|
|
13
|
+
|
|
14
|
+
/** Clear of the chip's ring, so the card never covers what opened it. */
|
|
15
|
+
const HOVER_CARD_TOP_GAP: number = 6;
|
|
16
|
+
|
|
17
|
+
export interface AnnotationHoverCardProps {
|
|
18
|
+
hover: AnnotationHover;
|
|
19
|
+
/** Keeps the card open while the pointer travels from chip to card. */
|
|
20
|
+
onMouseEnter: () => void;
|
|
21
|
+
onMouseLeave: () => void;
|
|
22
|
+
/** Closes the card; Escape and an activated row both use it. */
|
|
23
|
+
onDismiss: () => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The card behind a rail chip or a region pill.
|
|
28
|
+
*
|
|
29
|
+
* This is where an event's label lives now. The old inline labels had to
|
|
30
|
+
* fit in the plot, which is why they were rotated, truncated, and hidden
|
|
31
|
+
* outright past six markers; an HTML card over the chart has none of those
|
|
32
|
+
* limits, so the full title, its subtitle and its link all fit.
|
|
33
|
+
*/
|
|
34
|
+
const AnnotationHoverCard: React.FunctionComponent<AnnotationHoverCardProps> = (
|
|
35
|
+
props: AnnotationHoverCardProps,
|
|
36
|
+
): React.ReactElement => {
|
|
37
|
+
const { hover } = props;
|
|
38
|
+
|
|
39
|
+
const left: number = clampHoverCardLeft({
|
|
40
|
+
anchorX: hover.anchorX,
|
|
41
|
+
cardWidth: HOVER_CARD_WIDTH,
|
|
42
|
+
chartWidth: hover.chartWidth,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const regionSubtitle: string | undefined = hover.region?.original.subtitle;
|
|
46
|
+
const rows: Array<FormattedTimeReferenceLine> = hover.markers;
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* A card opened from the keyboard takes focus, so a cluster's events are
|
|
50
|
+
* reachable by Tab; one opened by hover leaves focus where it was, so a
|
|
51
|
+
* passing pointer never yanks it.
|
|
52
|
+
*/
|
|
53
|
+
const firstRowRef: React.RefObject<HTMLButtonElement> =
|
|
54
|
+
React.useRef<HTMLButtonElement>(null);
|
|
55
|
+
const shouldTakeFocus: boolean = Boolean(hover.takeFocus);
|
|
56
|
+
|
|
57
|
+
React.useEffect((): void => {
|
|
58
|
+
if (shouldTakeFocus) {
|
|
59
|
+
firstRowRef.current?.focus();
|
|
60
|
+
}
|
|
61
|
+
}, [shouldTakeFocus, hover.id]);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div
|
|
65
|
+
data-testid="chart-annotation-hover-card"
|
|
66
|
+
className={cx(
|
|
67
|
+
"pointer-events-auto absolute z-20 rounded-md border text-sm shadow-md",
|
|
68
|
+
"border-gray-200",
|
|
69
|
+
"bg-white",
|
|
70
|
+
)}
|
|
71
|
+
style={{
|
|
72
|
+
left: `${left}px`,
|
|
73
|
+
top: `${hover.anchorY + HOVER_CARD_TOP_GAP}px`,
|
|
74
|
+
width: `${HOVER_CARD_WIDTH}px`,
|
|
75
|
+
}}
|
|
76
|
+
onMouseEnter={props.onMouseEnter}
|
|
77
|
+
onMouseLeave={props.onMouseLeave}
|
|
78
|
+
/*
|
|
79
|
+
* Focus moving into the card blurs the chip that opened it, and the
|
|
80
|
+
* chip's blur schedules the close. These cancel and re-arm that on
|
|
81
|
+
* the card's own terms, which is what makes a clustered event
|
|
82
|
+
* reachable by keyboard at all: without them the card would shut
|
|
83
|
+
* 140ms after taking focus, taking the focus with it.
|
|
84
|
+
*/
|
|
85
|
+
onFocus={props.onMouseEnter}
|
|
86
|
+
onBlur={props.onMouseLeave}
|
|
87
|
+
onKeyDown={(event: React.KeyboardEvent): void => {
|
|
88
|
+
if (event.key === "Escape") {
|
|
89
|
+
event.stopPropagation();
|
|
90
|
+
props.onDismiss();
|
|
91
|
+
}
|
|
92
|
+
}}
|
|
93
|
+
>
|
|
94
|
+
<div className={cx("border-b border-inherit px-3 py-2")}>
|
|
95
|
+
<p className={cx("truncate font-medium", "text-gray-900")}>
|
|
96
|
+
{hover.heading}
|
|
97
|
+
</p>
|
|
98
|
+
{rows.length > 1 ? (
|
|
99
|
+
<p className={cx("text-xs", "text-gray-500")}>{rows.length} events</p>
|
|
100
|
+
) : null}
|
|
101
|
+
{regionSubtitle ? (
|
|
102
|
+
<p className={cx("truncate text-xs", "text-gray-500")}>
|
|
103
|
+
{regionSubtitle}
|
|
104
|
+
</p>
|
|
105
|
+
) : null}
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
{/*
|
|
109
|
+
* The row list is capped tight: the card sits over the plot while it
|
|
110
|
+
* is open, and every pixel of it is a pixel the reader cannot
|
|
111
|
+
* drag-select or hover for a value. A long cluster scrolls.
|
|
112
|
+
*/}
|
|
113
|
+
{rows.length > 0 ? (
|
|
114
|
+
<div className={cx("max-h-44 overflow-y-auto py-1")}>
|
|
115
|
+
{rows.map(
|
|
116
|
+
(
|
|
117
|
+
marker: FormattedTimeReferenceLine,
|
|
118
|
+
index: number,
|
|
119
|
+
): React.ReactElement => {
|
|
120
|
+
const onClick: (() => void) | undefined = marker.original.onClick;
|
|
121
|
+
const label: string = marker.original.label || "Event";
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<button
|
|
125
|
+
key={`annotation-row-${index}`}
|
|
126
|
+
ref={index === 0 ? firstRowRef : undefined}
|
|
127
|
+
type="button"
|
|
128
|
+
data-testid="chart-annotation-hover-row"
|
|
129
|
+
disabled={!onClick}
|
|
130
|
+
className={cx(
|
|
131
|
+
"flex w-full items-start gap-2 px-3 py-1.5 text-left",
|
|
132
|
+
onClick
|
|
133
|
+
? "cursor-pointer hover:bg-gray-50"
|
|
134
|
+
: "cursor-default",
|
|
135
|
+
)}
|
|
136
|
+
onClick={(event: React.MouseEvent): void => {
|
|
137
|
+
event.stopPropagation();
|
|
138
|
+
onClick?.();
|
|
139
|
+
}}
|
|
140
|
+
>
|
|
141
|
+
<span
|
|
142
|
+
aria-hidden="true"
|
|
143
|
+
className={cx("mt-1 h-2 w-2 shrink-0 rounded-full")}
|
|
144
|
+
style={{ backgroundColor: getMarkerColor(marker) }}
|
|
145
|
+
/>
|
|
146
|
+
<span className={cx("min-w-0 flex-1")}>
|
|
147
|
+
<span
|
|
148
|
+
className={cx(
|
|
149
|
+
"block text-xs font-medium",
|
|
150
|
+
"text-gray-900",
|
|
151
|
+
)}
|
|
152
|
+
>
|
|
153
|
+
{label}
|
|
154
|
+
</span>
|
|
155
|
+
{marker.original.subtitle ? (
|
|
156
|
+
<span
|
|
157
|
+
className={cx(
|
|
158
|
+
"block truncate text-xs",
|
|
159
|
+
"text-gray-500",
|
|
160
|
+
)}
|
|
161
|
+
>
|
|
162
|
+
{marker.original.subtitle}
|
|
163
|
+
</span>
|
|
164
|
+
) : null}
|
|
165
|
+
</span>
|
|
166
|
+
</button>
|
|
167
|
+
);
|
|
168
|
+
},
|
|
169
|
+
)}
|
|
170
|
+
</div>
|
|
171
|
+
) : null}
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
export default AnnotationHoverCard;
|