@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
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { TrustedProxyHops } from "../EnvironmentConfig";
|
|
2
|
+
import IP from "../../Types/IP/IP";
|
|
3
|
+
import express from "express";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Resolving the client IP address of an inbound request.
|
|
7
|
+
*
|
|
8
|
+
* `X-Forwarded-For` is a list, and only its RIGHT-hand end is trustworthy.
|
|
9
|
+
* Every proxy in the chain APPENDS the address of the peer it accepted the
|
|
10
|
+
* connection from -- our own Nginx uses `$proxy_add_x_forwarded_for` (see
|
|
11
|
+
* Nginx/default.conf.template) -- so the leftmost entries are whatever the
|
|
12
|
+
* original caller chose to send, verbatim.
|
|
13
|
+
*
|
|
14
|
+
* Reading the header left-to-right therefore reads attacker-supplied data. A
|
|
15
|
+
* caller who sends `X-Forwarded-For: <address-they-want-to-be>` arrives at the
|
|
16
|
+
* app as `["<address-they-want-to-be>", "<their-real-address>"]`, and anything
|
|
17
|
+
* that trusts the first entry -- or, worse, accepts a match against ANY entry
|
|
18
|
+
* -- can be told any address at all. That is a straight bypass of every
|
|
19
|
+
* IP-based control: dashboard and status page allowlists, and IP-keyed rate
|
|
20
|
+
* limits.
|
|
21
|
+
*
|
|
22
|
+
* Counting in from the right instead pins the read to an entry one of OUR
|
|
23
|
+
* proxies wrote. With the standard single-Nginx deployment the last entry is
|
|
24
|
+
* the address Nginx saw the connection come from, which is the real client.
|
|
25
|
+
* Each additional reverse proxy that we control and that appends to the header
|
|
26
|
+
* shifts the client one position further left, hence the configurable hop
|
|
27
|
+
* count.
|
|
28
|
+
*
|
|
29
|
+
* The trust boundary this relies on is the network one: the app must only be
|
|
30
|
+
* reachable through the proxies counted here. A caller who can open a
|
|
31
|
+
* connection to the app port directly is the peer, and no header discipline
|
|
32
|
+
* can help. Keep the app ports private.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
export type ClientIpRequestLike = Pick<express.Request, "headers"> & {
|
|
36
|
+
socket?: Partial<express.Request["socket"]> | undefined;
|
|
37
|
+
ip?: string | undefined;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* Characters that may legitimately appear in a bare IPv4 or IPv6 literal.
|
|
42
|
+
* Anything else in a candidate means it is not an address we should try to
|
|
43
|
+
* interpret -- notably Nginx's `unknown` placeholder and RFC 7239's `_hidden`
|
|
44
|
+
* / `unknown` obfuscated identifiers.
|
|
45
|
+
*/
|
|
46
|
+
const IP_LITERAL_CHARACTERS: RegExp = /^[0-9a-fA-F:.]+$/;
|
|
47
|
+
|
|
48
|
+
const IPV4_MAPPED_IPV6_PREFIX: RegExp = /^::ffff:(?=\d{1,3}(\.\d{1,3}){3}$)/i;
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* No address is longer than this -- 45 is a full IPv4-mapped IPv6 literal,
|
|
52
|
+
* plus a little room for brackets and a port. Anything longer is not an
|
|
53
|
+
* address, and rejecting it up front keeps arbitrarily long header values away
|
|
54
|
+
* from IP.isIPv6's alternation-heavy pattern.
|
|
55
|
+
*/
|
|
56
|
+
const MAX_IP_CANDIDATE_LENGTH: number = 64;
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Normalize one X-Forwarded-For / socket address into a bare IP literal, or
|
|
60
|
+
* null when the value is not an address at all.
|
|
61
|
+
*
|
|
62
|
+
* Handles the shapes that legitimately reach us:
|
|
63
|
+
* - surrounding whitespace and (non-standard, but seen) double quotes
|
|
64
|
+
* - `[2001:db8::1]:443` -- bracketed IPv6 with a port
|
|
65
|
+
* - `203.0.113.7:51234` -- IPv4 with a port, which some proxies emit
|
|
66
|
+
* - `::ffff:203.0.113.7` -- the IPv4-mapped IPv6 form Node reports for
|
|
67
|
+
* `socket.remoteAddress` on a dual-stack listener. Left as-is it would
|
|
68
|
+
* never match an IPv4 allowlist entry or CIDR.
|
|
69
|
+
*/
|
|
70
|
+
export const normalizeIpCandidate: (
|
|
71
|
+
candidate: string | undefined | null,
|
|
72
|
+
) => string | null = (candidate: string | undefined | null): string | null => {
|
|
73
|
+
if (!candidate || candidate.length > MAX_IP_CANDIDATE_LENGTH) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let value: string = candidate.trim().replace(/^"|"$/g, "").trim();
|
|
78
|
+
|
|
79
|
+
if (!value) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// `[2001:db8::1]` or `[2001:db8::1]:443`
|
|
84
|
+
const bracketed: RegExpMatchArray | null = value.match(
|
|
85
|
+
/^\[([^\]]+)\](:\d+)?$/,
|
|
86
|
+
);
|
|
87
|
+
if (bracketed && bracketed[1]) {
|
|
88
|
+
value = bracketed[1];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/*
|
|
92
|
+
* `203.0.113.7:51234`. Only strip when there is exactly one colon --
|
|
93
|
+
* more than one means IPv6, where a trailing `:<port>` is ambiguous
|
|
94
|
+
* without brackets and is not stripped.
|
|
95
|
+
*/
|
|
96
|
+
if (value.split(":").length === 2 && value.includes(".")) {
|
|
97
|
+
value = value.split(":")[0] || "";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
value = value.replace(IPV4_MAPPED_IPV6_PREFIX, "");
|
|
101
|
+
|
|
102
|
+
if (!value || !IP_LITERAL_CHARACTERS.test(value)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* IP.isIP is the final arbiter, but its IPv6 pattern is unanchored, so the
|
|
108
|
+
* character-class guard above is what stops a substring match from letting
|
|
109
|
+
* junk through.
|
|
110
|
+
*/
|
|
111
|
+
if (!IP.isIP(value)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return value;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* Split X-Forwarded-For into positional entries WITHOUT dropping anything.
|
|
120
|
+
*
|
|
121
|
+
* Position is the whole point: entries are counted from the right, and
|
|
122
|
+
* silently discarding an unparseable entry would shift every entry to its left
|
|
123
|
+
* one place closer to the right-hand end. An attacker chooses the left-hand
|
|
124
|
+
* entries, so filtering here would hand them a way to slide their own value
|
|
125
|
+
* into the position we read.
|
|
126
|
+
*/
|
|
127
|
+
const getForwardedForEntries: (req: ClientIpRequestLike) => Array<string> = (
|
|
128
|
+
req: ClientIpRequestLike,
|
|
129
|
+
): Array<string> => {
|
|
130
|
+
const header: string | Array<string> | undefined = req.headers?.[
|
|
131
|
+
"x-forwarded-for"
|
|
132
|
+
] as string | Array<string> | undefined;
|
|
133
|
+
|
|
134
|
+
if (header === undefined || header === null) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/*
|
|
139
|
+
* Node exposes a repeated header as an array. Repeated X-Forwarded-For
|
|
140
|
+
* headers are equivalent to one comma-joined header (RFC 7230 3.2.2), and
|
|
141
|
+
* they join in wire order -- so the rightmost entry of the last header is
|
|
142
|
+
* still the entry our proxy appended.
|
|
143
|
+
*/
|
|
144
|
+
const raw: string = Array.isArray(header) ? header.join(",") : header;
|
|
145
|
+
|
|
146
|
+
if (!raw.trim()) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return raw.split(",");
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export interface ResolveClientIpOptions {
|
|
154
|
+
/*
|
|
155
|
+
* How many proxies that we control sit in front of this process and append
|
|
156
|
+
* to X-Forwarded-For. Defaults to the TRUSTED_PROXY_HOPS environment
|
|
157
|
+
* variable. 0 disables the header entirely and uses only the transport peer.
|
|
158
|
+
*/
|
|
159
|
+
trustedProxyHops?: number | undefined;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* The address to attribute a request to for SECURITY decisions -- allowlists,
|
|
164
|
+
* blocklists, IP-keyed rate limits.
|
|
165
|
+
*
|
|
166
|
+
* Returns undefined when no address can be established. Callers making a
|
|
167
|
+
* security decision must treat undefined as "deny": there is no safe default
|
|
168
|
+
* address.
|
|
169
|
+
*/
|
|
170
|
+
export const resolveClientIp: (
|
|
171
|
+
req: ClientIpRequestLike,
|
|
172
|
+
options?: ResolveClientIpOptions,
|
|
173
|
+
) => string | undefined = (
|
|
174
|
+
req: ClientIpRequestLike,
|
|
175
|
+
options?: ResolveClientIpOptions,
|
|
176
|
+
): string | undefined => {
|
|
177
|
+
const configuredHops: number =
|
|
178
|
+
options?.trustedProxyHops === undefined
|
|
179
|
+
? TrustedProxyHops
|
|
180
|
+
: options.trustedProxyHops;
|
|
181
|
+
|
|
182
|
+
const hops: number =
|
|
183
|
+
Number.isFinite(configuredHops) && configuredHops > 0
|
|
184
|
+
? Math.floor(configuredHops)
|
|
185
|
+
: 0;
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* The transport peer. Never forgeable, but it is the closest proxy rather
|
|
189
|
+
* than the client whenever the request actually came through one.
|
|
190
|
+
*/
|
|
191
|
+
const peer: string | null =
|
|
192
|
+
normalizeIpCandidate(req.socket?.remoteAddress) ||
|
|
193
|
+
normalizeIpCandidate(req.ip);
|
|
194
|
+
|
|
195
|
+
if (hops === 0) {
|
|
196
|
+
return peer || undefined;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const entries: Array<string> = getForwardedForEntries(req);
|
|
200
|
+
|
|
201
|
+
if (entries.length >= hops) {
|
|
202
|
+
/*
|
|
203
|
+
* Count in from the right: with one trusted proxy this is the last entry,
|
|
204
|
+
* the one Nginx appended from $remote_addr.
|
|
205
|
+
*
|
|
206
|
+
* Fail closed on an unparseable entry rather than walking further left --
|
|
207
|
+
* everything to the left of this position is caller-supplied.
|
|
208
|
+
*/
|
|
209
|
+
return normalizeIpCandidate(entries[entries.length - hops]) || undefined;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* Fewer entries than there are trusted proxies: this request did not
|
|
214
|
+
* traverse the expected chain (a direct call to the app port, an internal
|
|
215
|
+
* health check, a misconfigured deployment). Nothing in the header is
|
|
216
|
+
* corroborated, so use only the peer.
|
|
217
|
+
*/
|
|
218
|
+
return peer || undefined;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
export default resolveClientIp;
|
|
@@ -10,6 +10,9 @@ import DashboardVariable, {
|
|
|
10
10
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
11
11
|
import { JSONObject, JSONValue } from "../../../Types/JSON";
|
|
12
12
|
import JSONFunctions from "../../../Types/JSONFunctions";
|
|
13
|
+
import PublicDashboardSloWidget, {
|
|
14
|
+
PublicDashboardSloWidgetConfig,
|
|
15
|
+
} from "./PublicDashboardSloWidget";
|
|
13
16
|
import {
|
|
14
17
|
LogFilter,
|
|
15
18
|
queryStringToFilter,
|
|
@@ -473,6 +476,24 @@ export default class PublicDashboardResourceListPolicy {
|
|
|
473
476
|
severityText: true,
|
|
474
477
|
body: true,
|
|
475
478
|
};
|
|
479
|
+
/*
|
|
480
|
+
* Exactly the seven display fields the SLO widget renders. Everything
|
|
481
|
+
* else the model carries — description, slug, the bound monitors and
|
|
482
|
+
* labels, the metric query config, the evaluation schedule, createdBy —
|
|
483
|
+
* stays private: an SLO's headline numbers are publishable, its
|
|
484
|
+
* definition is not.
|
|
485
|
+
*/
|
|
486
|
+
case DashboardComponentType.Slo:
|
|
487
|
+
return {
|
|
488
|
+
_id: true,
|
|
489
|
+
name: true,
|
|
490
|
+
targetPercentage: true,
|
|
491
|
+
currentSliPercentage: true,
|
|
492
|
+
errorBudgetRemainingPercentage: true,
|
|
493
|
+
errorBudgetRemainingSeconds: true,
|
|
494
|
+
currentBurnRate: true,
|
|
495
|
+
sloStatus: true,
|
|
496
|
+
};
|
|
476
497
|
default:
|
|
477
498
|
throw new BadDataException(
|
|
478
499
|
"This dashboard widget cannot list public resources.",
|
|
@@ -676,6 +697,10 @@ export default class PublicDashboardResourceListPolicy {
|
|
|
676
697
|
argumentsObject,
|
|
677
698
|
requestedQuery,
|
|
678
699
|
});
|
|
700
|
+
case DashboardComponentType.Slo:
|
|
701
|
+
return PublicDashboardResourceListPolicy.buildSloPolicy(
|
|
702
|
+
argumentsObject,
|
|
703
|
+
);
|
|
679
704
|
default:
|
|
680
705
|
throw new BadDataException(
|
|
681
706
|
`Unsupported public dashboard resource widget: ${componentType}`,
|
|
@@ -1394,6 +1419,28 @@ export default class PublicDashboardResourceListPolicy {
|
|
|
1394
1419
|
};
|
|
1395
1420
|
}
|
|
1396
1421
|
|
|
1422
|
+
/*
|
|
1423
|
+
* The SLO widget renders exactly one SLO — the one its author picked — so
|
|
1424
|
+
* the stored id IS the whole query. Pinning `_id` to it and capping the
|
|
1425
|
+
* read at a single row means the route can return that SLO's headline
|
|
1426
|
+
* numbers and nothing else: it can neither be walked across the project's
|
|
1427
|
+
* other SLOs nor turned into a filter oracle, because it accepts no filter
|
|
1428
|
+
* at all.
|
|
1429
|
+
*/
|
|
1430
|
+
private static buildSloPolicy(
|
|
1431
|
+
argumentsObject: Record<string, unknown>,
|
|
1432
|
+
): PolicyDraft {
|
|
1433
|
+
const config: PublicDashboardSloWidgetConfig =
|
|
1434
|
+
PublicDashboardSloWidget.readConfigFromArguments(argumentsObject);
|
|
1435
|
+
|
|
1436
|
+
return {
|
|
1437
|
+
resourceType: "slo",
|
|
1438
|
+
query: { _id: config.serviceLevelObjectiveId },
|
|
1439
|
+
sort: { name: SortOrder.Ascending },
|
|
1440
|
+
limit: 1,
|
|
1441
|
+
};
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1397
1444
|
private static listDraft(data: {
|
|
1398
1445
|
resourceType: string;
|
|
1399
1446
|
query: Record<string, unknown>;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import AggregationInterval from "../../../Types/BaseDatabase/AggregationInterval";
|
|
2
|
+
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
3
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
4
|
+
import { SloWidgetDisplayType } from "../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
|
|
5
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
6
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
7
|
+
import {
|
|
8
|
+
getSloChartAggregationInterval,
|
|
9
|
+
getSloHistoryMetricName,
|
|
10
|
+
} from "../../../Utils/Slo/SloWidgetFormat";
|
|
11
|
+
import PublicDashboardSloWidget, {
|
|
12
|
+
PublicDashboardSloWidgetConfig,
|
|
13
|
+
} from "./PublicDashboardSloWidget";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* Server-owned policy for the unauthenticated SLO history aggregation.
|
|
17
|
+
*
|
|
18
|
+
* Same contract as PublicDashboardResourceListPolicy: nothing the caller
|
|
19
|
+
* sends becomes part of the query except the time window. WHICH SLO and
|
|
20
|
+
* WHICH of its three series are read come from the stored widget alone, the
|
|
21
|
+
* aggregation columns are fixed, and the bucket size is recomputed from the
|
|
22
|
+
* window with the very same helper the widget uses — so a public viewer's
|
|
23
|
+
* only lever is "which slice of the series the dashboard already publishes
|
|
24
|
+
* do I want to see".
|
|
25
|
+
*/
|
|
26
|
+
export interface PublicDashboardSloHistoryPolicyResult {
|
|
27
|
+
serviceLevelObjectiveId: ObjectID;
|
|
28
|
+
/** SloHistory.metricName for the widget's chosen series. */
|
|
29
|
+
metricName: string;
|
|
30
|
+
startDate: Date;
|
|
31
|
+
endDate: Date;
|
|
32
|
+
aggregationInterval: AggregationInterval;
|
|
33
|
+
limit: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface BuildPublicDashboardSloHistoryPolicyData {
|
|
37
|
+
widget: unknown;
|
|
38
|
+
/** The caller's `aggregateBy`, already JSONFunctions.deserialize'd. */
|
|
39
|
+
requestedAggregateBy: unknown;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* The furthest back a window is allowed to reach. 400 days is SloHistory's
|
|
44
|
+
* own TTL (see the ttlExpression on the model), so anything older can only
|
|
45
|
+
* return empty buckets anyway — bounding it here is what stops a hand-rolled
|
|
46
|
+
* request from asking ClickHouse to grid out centuries.
|
|
47
|
+
*
|
|
48
|
+
* A longer window is CLAMPED, not refused. The range picker on a public
|
|
49
|
+
* dashboard offers an unbounded custom range, and the sibling widgets — the
|
|
50
|
+
* metric charts on the very same page — just render whatever that range
|
|
51
|
+
* holds. Throwing here would make one widget show a server error string
|
|
52
|
+
* while its neighbours drew fine, purely because the viewer is anonymous.
|
|
53
|
+
*/
|
|
54
|
+
const MAX_WINDOW_IN_DAYS: number = 400;
|
|
55
|
+
const MAX_WINDOW_IN_MINUTES: number = MAX_WINDOW_IN_DAYS * 24 * 60;
|
|
56
|
+
|
|
57
|
+
export default class PublicDashboardSloHistoryPolicy {
|
|
58
|
+
public static build(
|
|
59
|
+
data: BuildPublicDashboardSloHistoryPolicyData,
|
|
60
|
+
): PublicDashboardSloHistoryPolicyResult {
|
|
61
|
+
const config: PublicDashboardSloWidgetConfig =
|
|
62
|
+
PublicDashboardSloWidget.readConfig(data.widget);
|
|
63
|
+
|
|
64
|
+
/*
|
|
65
|
+
* Only a Chart widget publishes the SERIES. A Tile widget publishes the
|
|
66
|
+
* SLO's current numbers and nothing more, so serving 400 days of history
|
|
67
|
+
* for one would hand out history its author never put on the page.
|
|
68
|
+
*/
|
|
69
|
+
if (config.displayType !== SloWidgetDisplayType.Chart) {
|
|
70
|
+
throw new BadDataException(
|
|
71
|
+
"This dashboard widget does not chart SLO history.",
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const requestedAggregateBy: Record<string, unknown> =
|
|
76
|
+
PublicDashboardSloHistoryPolicy.requireObject(
|
|
77
|
+
data.requestedAggregateBy,
|
|
78
|
+
"aggregateBy",
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const startDate: Date = PublicDashboardSloHistoryPolicy.validDate(
|
|
82
|
+
requestedAggregateBy["startTimestamp"],
|
|
83
|
+
"startTimestamp",
|
|
84
|
+
);
|
|
85
|
+
const endDate: Date = PublicDashboardSloHistoryPolicy.validDate(
|
|
86
|
+
requestedAggregateBy["endTimestamp"],
|
|
87
|
+
"endTimestamp",
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* An inverted or zero-length window is not a range the picker can
|
|
92
|
+
* produce — it only ever comes from a hand-rolled request, and there is
|
|
93
|
+
* no sensible slice of history to answer it with.
|
|
94
|
+
*/
|
|
95
|
+
if (startDate.getTime() >= endDate.getTime()) {
|
|
96
|
+
throw new BadDataException(
|
|
97
|
+
"Public dashboard SLO history range is invalid.",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const clampedStartDate: Date =
|
|
102
|
+
OneUptimeDate.getMinutesBetweenTwoDates(startDate, endDate) >
|
|
103
|
+
MAX_WINDOW_IN_MINUTES
|
|
104
|
+
? new Date(endDate.getTime() - MAX_WINDOW_IN_MINUTES * 60 * 1000)
|
|
105
|
+
: startDate;
|
|
106
|
+
|
|
107
|
+
const rangeInMinutes: number = OneUptimeDate.getMinutesBetweenTwoDates(
|
|
108
|
+
clampedStartDate,
|
|
109
|
+
endDate,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
serviceLevelObjectiveId: config.serviceLevelObjectiveId,
|
|
114
|
+
metricName: getSloHistoryMetricName(config.sloMetric),
|
|
115
|
+
startDate: clampedStartDate,
|
|
116
|
+
endDate,
|
|
117
|
+
/*
|
|
118
|
+
* Recomputed, never copied. The widget derives its bucket size from
|
|
119
|
+
* the same window with the same helper, so the client still gets the
|
|
120
|
+
* grid it drew its x-axis for — without being able to choose one.
|
|
121
|
+
*/
|
|
122
|
+
aggregationInterval: getSloChartAggregationInterval(rangeInMinutes),
|
|
123
|
+
limit: LIMIT_PER_PROJECT,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private static validDate(value: unknown, key: string): Date {
|
|
128
|
+
if (value instanceof Date && Number.isFinite(value.getTime())) {
|
|
129
|
+
return new Date(value.getTime());
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (typeof value === "string" && value.length <= 128) {
|
|
133
|
+
const date: Date = new Date(value);
|
|
134
|
+
|
|
135
|
+
if (Number.isFinite(date.getTime())) {
|
|
136
|
+
return date;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
throw new BadDataException(
|
|
141
|
+
`Public dashboard SLO history ${key} is not a valid date.`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/*
|
|
146
|
+
* Returns an OWN-properties copy. JSON.parse turns a literal "__proto__"
|
|
147
|
+
* member into a real own key and JSONFunctions.deserialize copies it with
|
|
148
|
+
* `newVal[key] = …`, which fires Object.prototype's __proto__ setter — so a
|
|
149
|
+
* plain `object["startTimestamp"]` lookup would walk the prototype chain
|
|
150
|
+
* and read something the caller never sent as an own key. Copying first
|
|
151
|
+
* means every field this policy reads is a field that was really there.
|
|
152
|
+
*/
|
|
153
|
+
private static requireObject(
|
|
154
|
+
value: unknown,
|
|
155
|
+
label: string,
|
|
156
|
+
): Record<string, unknown> {
|
|
157
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
158
|
+
throw new BadDataException(`${label} must be an object.`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return { ...(value as Record<string, unknown>) };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SloWidgetDisplayType,
|
|
3
|
+
SloWidgetMetric,
|
|
4
|
+
} from "../../../Types/Dashboard/DashboardComponents/DashboardSloComponent";
|
|
5
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
6
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The stored configuration of ONE SLO widget, read back from the dashboard's
|
|
10
|
+
* JSON column.
|
|
11
|
+
*
|
|
12
|
+
* Two unauthenticated routes are driven by this config — the resource-list
|
|
13
|
+
* read that returns the SLO's current numbers, and the SloHistory aggregation
|
|
14
|
+
* that returns its series — so both must agree on exactly which SLO and which
|
|
15
|
+
* series the widget's author published. Parsing it once here is what keeps
|
|
16
|
+
* them from drifting apart.
|
|
17
|
+
*
|
|
18
|
+
* Everything here comes out of a JSONB column that an older (or hand-edited)
|
|
19
|
+
* client may have written, so nothing is trusted to be well typed.
|
|
20
|
+
*/
|
|
21
|
+
export interface PublicDashboardSloWidgetConfig {
|
|
22
|
+
serviceLevelObjectiveId: ObjectID;
|
|
23
|
+
sloMetric: SloWidgetMetric;
|
|
24
|
+
displayType: SloWidgetDisplayType;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default class PublicDashboardSloWidget {
|
|
28
|
+
/** Read the config off a whole stored widget (`{ arguments: { … } }`). */
|
|
29
|
+
public static readConfig(widget: unknown): PublicDashboardSloWidgetConfig {
|
|
30
|
+
return PublicDashboardSloWidget.readConfigFromArguments(
|
|
31
|
+
PublicDashboardSloWidget.readArguments(widget),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Read the config off a widget's already-extracted `arguments` object. */
|
|
36
|
+
public static readConfigFromArguments(
|
|
37
|
+
argumentsObject: Record<string, unknown>,
|
|
38
|
+
): PublicDashboardSloWidgetConfig {
|
|
39
|
+
return {
|
|
40
|
+
serviceLevelObjectiveId:
|
|
41
|
+
PublicDashboardSloWidget.readServiceLevelObjectiveId(argumentsObject),
|
|
42
|
+
sloMetric: PublicDashboardSloWidget.readSloMetric(argumentsObject),
|
|
43
|
+
displayType: PublicDashboardSloWidget.readDisplayType(argumentsObject),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private static readArguments(widget: unknown): Record<string, unknown> {
|
|
48
|
+
if (!widget || typeof widget !== "object" || Array.isArray(widget)) {
|
|
49
|
+
throw new BadDataException("Dashboard widget must be an object.");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const argumentsObject: unknown = (widget as Record<string, unknown>)[
|
|
53
|
+
"arguments"
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
if (
|
|
57
|
+
!argumentsObject ||
|
|
58
|
+
typeof argumentsObject !== "object" ||
|
|
59
|
+
Array.isArray(argumentsObject)
|
|
60
|
+
) {
|
|
61
|
+
throw new BadDataException(
|
|
62
|
+
"Dashboard widget arguments must be an object.",
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return argumentsObject as Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* The SLO the widget's author picked IS the authorization decision: the id
|
|
71
|
+
* comes only from stored config, never from the request, so this endpoint
|
|
72
|
+
* can never be pointed at another SLO in the project.
|
|
73
|
+
*/
|
|
74
|
+
private static readServiceLevelObjectiveId(
|
|
75
|
+
argumentsObject: Record<string, unknown>,
|
|
76
|
+
): ObjectID {
|
|
77
|
+
const serviceLevelObjectiveId: unknown =
|
|
78
|
+
argumentsObject["serviceLevelObjectiveId"];
|
|
79
|
+
|
|
80
|
+
if (
|
|
81
|
+
typeof serviceLevelObjectiveId !== "string" ||
|
|
82
|
+
serviceLevelObjectiveId.trim().length === 0
|
|
83
|
+
) {
|
|
84
|
+
throw new BadDataException(
|
|
85
|
+
"This dashboard widget has no Service Level Objective selected.",
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const trimmed: string = serviceLevelObjectiveId.trim();
|
|
90
|
+
|
|
91
|
+
ObjectID.validateUUID(trimmed);
|
|
92
|
+
|
|
93
|
+
return new ObjectID(trimmed);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* Sli is the widget's own default, and these arguments come out of a JSONB
|
|
98
|
+
* column that a dashboard created through the CRUD API — or hand-edited —
|
|
99
|
+
* may simply have written without them, so an absent value is not an error.
|
|
100
|
+
* An unrecognised value IS, rather than silently falling back: a stored
|
|
101
|
+
* string that is not one of the three series should never be able to
|
|
102
|
+
* quietly become "SLI" on a public page.
|
|
103
|
+
*/
|
|
104
|
+
private static readSloMetric(
|
|
105
|
+
argumentsObject: Record<string, unknown>,
|
|
106
|
+
): SloWidgetMetric {
|
|
107
|
+
const sloMetric: unknown = argumentsObject["sloMetric"];
|
|
108
|
+
|
|
109
|
+
if (sloMetric === undefined || sloMetric === null || sloMetric === "") {
|
|
110
|
+
return SloWidgetMetric.Sli;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (
|
|
114
|
+
typeof sloMetric !== "string" ||
|
|
115
|
+
!(Object.values(SloWidgetMetric) as Array<string>).includes(sloMetric)
|
|
116
|
+
) {
|
|
117
|
+
throw new BadDataException("Dashboard widget sloMetric is invalid.");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return sloMetric as SloWidgetMetric;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private static readDisplayType(
|
|
124
|
+
argumentsObject: Record<string, unknown>,
|
|
125
|
+
): SloWidgetDisplayType {
|
|
126
|
+
const displayType: unknown = argumentsObject["displayType"];
|
|
127
|
+
|
|
128
|
+
if (
|
|
129
|
+
displayType === undefined ||
|
|
130
|
+
displayType === null ||
|
|
131
|
+
displayType === ""
|
|
132
|
+
) {
|
|
133
|
+
return SloWidgetDisplayType.Tile;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (
|
|
137
|
+
typeof displayType !== "string" ||
|
|
138
|
+
!(Object.values(SloWidgetDisplayType) as Array<string>).includes(
|
|
139
|
+
displayType,
|
|
140
|
+
)
|
|
141
|
+
) {
|
|
142
|
+
throw new BadDataException("Dashboard widget displayType is invalid.");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return displayType as SloWidgetDisplayType;
|
|
146
|
+
}
|
|
147
|
+
}
|
package/Server/Utils/Express.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logger from "./Logger";
|
|
2
|
+
import { resolveClientIp } from "./ClientIp";
|
|
2
3
|
import GracefulShutdown, { ShutdownPriority } from "./GracefulShutdown";
|
|
3
4
|
import Dictionary from "../../Types/Dictionary";
|
|
4
5
|
import GenericFunction from "../../Types/GenericFunction";
|
|
@@ -233,24 +234,18 @@ export const extractDeviceInfo: (req: ExpressRequest) => RequestDeviceInfo = (
|
|
|
233
234
|
return result;
|
|
234
235
|
};
|
|
235
236
|
|
|
237
|
+
/*
|
|
238
|
+
* The client address for a request.
|
|
239
|
+
*
|
|
240
|
+
* This used to return the leftmost X-Forwarded-For entry, which is the one
|
|
241
|
+
* value in the header that the caller writes themselves -- so every session
|
|
242
|
+
* row and audit record built from it recorded whatever address the caller
|
|
243
|
+
* chose. It now delegates to resolveClientIp, which reads in from the trusted
|
|
244
|
+
* (right-hand) end instead. See Utils/ClientIp for the reasoning and the
|
|
245
|
+
* TRUSTED_PROXY_HOPS knob.
|
|
246
|
+
*/
|
|
236
247
|
export const getClientIp: (req: ExpressRequest) => string | undefined = (
|
|
237
248
|
req: ExpressRequest,
|
|
238
249
|
): string | undefined => {
|
|
239
|
-
|
|
240
|
-
"x-forwarded-for"
|
|
241
|
-
] as string | Array<string> | undefined;
|
|
242
|
-
|
|
243
|
-
if (Array.isArray(forwarded) && forwarded.length > 0) {
|
|
244
|
-
return forwarded[0]?.split(",")[0]?.trim();
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (typeof forwarded === "string" && forwarded.trim().length > 0) {
|
|
248
|
-
return forwarded.split(",")[0]?.trim();
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
if (req.socket?.remoteAddress) {
|
|
252
|
-
return req.socket.remoteAddress;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return req.ip;
|
|
250
|
+
return resolveClientIp(req);
|
|
256
251
|
};
|