@oneuptime/common 12.0.23 → 12.0.25
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/Span.ts +101 -0
- package/Models/DatabaseModels/DetectionRule.ts +55 -0
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +27 -7
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +67 -0
- package/Models/DatabaseModels/Project.ts +68 -0
- package/Models/DatabaseModels/User.ts +68 -0
- package/Server/API/BaseAPI.ts +0 -24
- package/Server/API/SlackAPI.ts +0 -2
- package/Server/API/TelemetryAPI.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/GzipRequestBody.ts +311 -0
- package/Server/Middleware/MultipartFormData.ts +87 -3
- package/Server/Middleware/SlackAuthorization.ts +96 -18
- package/Server/Services/DetectionRuleService.ts +73 -6
- package/Server/Services/Index.ts +205 -0
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
- package/Server/Services/NetworkDeviceService.ts +148 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
- package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
- package/Server/Services/ProjectService.ts +29 -19
- package/Server/Services/SecurityEventService.ts +90 -13
- package/Server/Services/StatusPageResourceService.ts +223 -0
- package/Server/Services/TelemetryAttributeService.ts +17 -0
- package/Server/Services/UserService.ts +4 -6
- package/Server/Types/Markdown.ts +161 -67
- package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
- package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
- package/Server/Utils/Attribution.ts +4 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
- package/Server/Utils/StartServer.ts +12 -32
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
- package/Server/Utils/Telemetry/LlmMetricSpend.ts +181 -0
- package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
- package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
- package/Server/Views/Partials/Head.ejs +2 -1
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
- package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
- package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
- package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
- package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
- package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
- package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
- package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
- package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
- package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
- package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
- package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
- package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
- package/Tests/Server/API/BaseAPI.test.ts +41 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
- package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
- package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
- package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
- package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
- package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
- package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
- package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +387 -4
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +386 -0
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
- package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
- package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
- package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
- package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +584 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
- package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
- package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
- package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
- package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
- package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
- package/Tests/UI/Components/SideOver.test.tsx +1 -1
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
- package/Tests/UI/Components/Toggle.test.tsx +25 -0
- package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
- package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
- package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +770 -0
- package/Types/Code/YamlSyntax.ts +396 -0
- package/Types/Exception/ExceptionCode.ts +1 -0
- package/Types/Exception/PayloadTooLargeException.ts +8 -0
- package/Types/Marketing/Attribution.ts +10 -0
- package/Types/Marketing/MarketingEvent.ts +4 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
- package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
- package/Types/Telemetry/LlmConventions.ts +255 -0
- package/Types/Telemetry/LlmMetricConventions.ts +329 -0
- package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
- package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
- package/UI/Components/Detail/Detail.tsx +10 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
- package/UI/Components/Forms/Fields/FormField.tsx +31 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
- package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
- package/UI/Components/Forms/Validation.ts +46 -0
- package/UI/Components/Input/Input.tsx +3 -0
- package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
- package/UI/Components/ModelTable/Column.ts +8 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
- package/UI/Components/SideOver/SideOver.tsx +5 -5
- package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
- package/UI/Components/StatusPage/ResourceList.tsx +197 -38
- package/UI/Components/Toggle/Toggle.tsx +9 -1
- package/UI/Components/Types/FieldType.ts +1 -0
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
- package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
- package/Utils/StatusPage/ResourceExplorer.ts +258 -0
- package/Utils/Telemetry/LlmMetricQuery.ts +287 -0
- package/build/dist/Models/AnalyticsModels/Span.js +89 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +27 -7
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +69 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +76 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +76 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +3 -19
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +0 -2
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +17 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.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/GzipRequestBody.js +224 -0
- package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
- package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +49 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +204 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +25 -45
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +57 -5
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +2 -12
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +147 -61
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
- package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -21
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +151 -0
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Types/Code/YamlSyntax.js +212 -0
- package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js +1 -0
- package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +10 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +290 -0
- package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
- package/build/dist/UI/Components/Detail/Detail.js +9 -0
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
- package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
- package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +27 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
- package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Types/FieldType.js +1 -0
- package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
- package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js +175 -0
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/tsconfig.json +2 -1
- package/Tests/UI/Components/Toast.test.tsx +0 -197
- package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
- package/UI/Components/Toast/Toast.tsx +0 -189
- package/UI/Components/Toast/ToastInit.tsx +0 -110
- package/build/dist/UI/Components/Toast/Toast.js +0 -123
- package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
- package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
|
@@ -1150,6 +1150,80 @@ export default class Span extends AnalyticsBaseModel {
|
|
|
1150
1150
|
accessControl: llmColumnAccessControl,
|
|
1151
1151
|
});
|
|
1152
1152
|
|
|
1153
|
+
/*
|
|
1154
|
+
* Employee identity columns. Denormalized at ingest from the OTel general
|
|
1155
|
+
* semantic-convention identity attributes (user.id / user.email / team.id)
|
|
1156
|
+
* and the gateway + coding-agent fallbacks — see
|
|
1157
|
+
* LlmUserIdAttributeKeys in Common/Types/Telemetry/LlmConventions.ts.
|
|
1158
|
+
*
|
|
1159
|
+
* These answer the question the trace-only LLM feature could not: which
|
|
1160
|
+
* PERSON, and which cost centre, does this spend belong to. They are
|
|
1161
|
+
* populated only on LLM spans (the extractor gates them on isLlmSpan), so
|
|
1162
|
+
* the RUM and HTTP fleet — which also carries user.id — pays nothing for
|
|
1163
|
+
* them.
|
|
1164
|
+
*
|
|
1165
|
+
* They hold real identifying data, so TraceScrubRuleService.scrubSpan
|
|
1166
|
+
* applies the project's Attributes-scoped scrub rules to them just as it
|
|
1167
|
+
* does to the attribute they were derived from.
|
|
1168
|
+
*/
|
|
1169
|
+
const llmUserIdColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
|
|
1170
|
+
key: "llmUserId",
|
|
1171
|
+
isLowCardinality: true,
|
|
1172
|
+
title: "LLM User ID",
|
|
1173
|
+
description:
|
|
1174
|
+
"Id of the employee / internal actor who made this LLM call (user.id, enduser.id, or the gateway / coding-agent equivalent). NOT the caller's own downstream customer — that identity is deliberately never mapped here. '' when the instrumentation reports none.",
|
|
1175
|
+
required: false,
|
|
1176
|
+
type: TableColumnType.Text,
|
|
1177
|
+
/*
|
|
1178
|
+
* Set index sized like idx_llm_request_model: a project's employee
|
|
1179
|
+
* roster is in the hundreds-to-low-thousands, so 1000 distinct values
|
|
1180
|
+
* per granule keeps the index useful for the "one person's spend"
|
|
1181
|
+
* query without degenerating into a per-granule scan.
|
|
1182
|
+
*/
|
|
1183
|
+
skipIndex: {
|
|
1184
|
+
name: "idx_llm_user_id",
|
|
1185
|
+
type: SkipIndexType.Set,
|
|
1186
|
+
params: [1000],
|
|
1187
|
+
granularity: 4,
|
|
1188
|
+
},
|
|
1189
|
+
accessControl: llmColumnAccessControl,
|
|
1190
|
+
});
|
|
1191
|
+
|
|
1192
|
+
const llmUserEmailColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
|
|
1193
|
+
key: "llmUserEmail",
|
|
1194
|
+
isLowCardinality: true,
|
|
1195
|
+
title: "LLM User Email",
|
|
1196
|
+
description:
|
|
1197
|
+
"Email of the employee / internal actor who made this LLM call (user.email, emitted natively by Claude Code, Gemini CLI and Codex). Subject to the project's Attributes-scoped trace scrub rules. '' when the instrumentation reports none.",
|
|
1198
|
+
required: false,
|
|
1199
|
+
type: TableColumnType.Text,
|
|
1200
|
+
// Same sizing rationale as idx_llm_user_id — one row per employee.
|
|
1201
|
+
skipIndex: {
|
|
1202
|
+
name: "idx_llm_user_email",
|
|
1203
|
+
type: SkipIndexType.Set,
|
|
1204
|
+
params: [1000],
|
|
1205
|
+
granularity: 4,
|
|
1206
|
+
},
|
|
1207
|
+
accessControl: llmColumnAccessControl,
|
|
1208
|
+
});
|
|
1209
|
+
|
|
1210
|
+
const llmTeamColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
|
|
1211
|
+
key: "llmTeam",
|
|
1212
|
+
isLowCardinality: true,
|
|
1213
|
+
title: "LLM Team",
|
|
1214
|
+
description:
|
|
1215
|
+
"Team / cost centre the LLM spend charges to (team.id, cost_center, department — conventionally set via OTEL_RESOURCE_ATTRIBUTES). '' when none is reported.",
|
|
1216
|
+
required: false,
|
|
1217
|
+
type: TableColumnType.Text,
|
|
1218
|
+
/*
|
|
1219
|
+
* No skip index, mirroring llmResponseModel. Teams number in the tens:
|
|
1220
|
+
* a Set index would match nearly every granule and cost more to read
|
|
1221
|
+
* than the filter it saves, and the LowCardinality dictionary already
|
|
1222
|
+
* makes the column cheap to scan.
|
|
1223
|
+
*/
|
|
1224
|
+
accessControl: llmColumnAccessControl,
|
|
1225
|
+
});
|
|
1226
|
+
|
|
1153
1227
|
const retentionDateColumn: AnalyticsTableColumn = new AnalyticsTableColumn({
|
|
1154
1228
|
key: "retentionDate",
|
|
1155
1229
|
codec: [{ codec: "DoubleDelta" }, { codec: "ZSTD", level: 1 }],
|
|
@@ -1245,6 +1319,9 @@ export default class Span extends AnalyticsBaseModel {
|
|
|
1245
1319
|
llmTotalTokensColumn,
|
|
1246
1320
|
llmCostColumn,
|
|
1247
1321
|
llmConversationIdColumn,
|
|
1322
|
+
llmUserIdColumn,
|
|
1323
|
+
llmUserEmailColumn,
|
|
1324
|
+
llmTeamColumn,
|
|
1248
1325
|
retentionDateColumn,
|
|
1249
1326
|
],
|
|
1250
1327
|
projections: [
|
|
@@ -1574,4 +1651,28 @@ export default class Span extends AnalyticsBaseModel {
|
|
|
1574
1651
|
public set llmConversationId(v: string | undefined) {
|
|
1575
1652
|
this.setColumnValue("llmConversationId", v);
|
|
1576
1653
|
}
|
|
1654
|
+
|
|
1655
|
+
public get llmUserId(): string | undefined {
|
|
1656
|
+
return this.getColumnValue("llmUserId") as string | undefined;
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
public set llmUserId(v: string | undefined) {
|
|
1660
|
+
this.setColumnValue("llmUserId", v);
|
|
1661
|
+
}
|
|
1662
|
+
|
|
1663
|
+
public get llmUserEmail(): string | undefined {
|
|
1664
|
+
return this.getColumnValue("llmUserEmail") as string | undefined;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
public set llmUserEmail(v: string | undefined) {
|
|
1668
|
+
this.setColumnValue("llmUserEmail", v);
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
public get llmTeam(): string | undefined {
|
|
1672
|
+
return this.getColumnValue("llmTeam") as string | undefined;
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
public set llmTeam(v: string | undefined) {
|
|
1676
|
+
this.setColumnValue("llmTeam", v);
|
|
1677
|
+
}
|
|
1577
1678
|
}
|
|
@@ -253,6 +253,61 @@ export default class DetectionRule extends BaseModel {
|
|
|
253
253
|
})
|
|
254
254
|
public groupByField?: string = undefined;
|
|
255
255
|
|
|
256
|
+
/*
|
|
257
|
+
* The correlation pair: distinctCountField switches what the threshold
|
|
258
|
+
* counts (unique field values instead of raw events — the difference
|
|
259
|
+
* between brute-force and one user retyping a password), and
|
|
260
|
+
* matchCountThreshold holds the rule back until a group reaches N in
|
|
261
|
+
* one evaluation window. Threshold 1 preserves fire-on-any-match, so
|
|
262
|
+
* every rule saved before these columns existed behaves unchanged.
|
|
263
|
+
*/
|
|
264
|
+
@ColumnAccessControl({
|
|
265
|
+
create: createPermissions,
|
|
266
|
+
read: readPermissions,
|
|
267
|
+
update: updatePermissions,
|
|
268
|
+
})
|
|
269
|
+
@TableColumn({
|
|
270
|
+
title: "Distinct Count Field",
|
|
271
|
+
required: false,
|
|
272
|
+
type: TableColumnType.ShortText,
|
|
273
|
+
canReadOnRelationQuery: true,
|
|
274
|
+
description:
|
|
275
|
+
"Optional security-event field (e.g. principalUser, principalIp) whose distinct values are counted instead of raw matching events. The match count threshold then applies to that distinct count. Empty values are not counted. Names that are not typed event columns are looked up in the event's attributes map.",
|
|
276
|
+
})
|
|
277
|
+
@Column({
|
|
278
|
+
nullable: true,
|
|
279
|
+
type: ColumnType.ShortText,
|
|
280
|
+
length: ColumnLength.ShortText,
|
|
281
|
+
})
|
|
282
|
+
public distinctCountField?: string = undefined;
|
|
283
|
+
|
|
284
|
+
@ColumnAccessControl({
|
|
285
|
+
create: createPermissions,
|
|
286
|
+
read: readPermissions,
|
|
287
|
+
update: updatePermissions,
|
|
288
|
+
})
|
|
289
|
+
@TableColumn({
|
|
290
|
+
title: "Match Count Threshold",
|
|
291
|
+
required: true,
|
|
292
|
+
type: TableColumnType.Number,
|
|
293
|
+
canReadOnRelationQuery: true,
|
|
294
|
+
description:
|
|
295
|
+
"Fire only when a group's count — distinct values when a distinct count field is set, matching events otherwise — reaches this number within one evaluation window. 1 fires on any match.",
|
|
296
|
+
defaultValue: 1,
|
|
297
|
+
/*
|
|
298
|
+
* Same reason as shouldCreateIncident: without this,
|
|
299
|
+
* checkRequiredFields 400s every create payload written before the
|
|
300
|
+
* column existed, and the DB DEFAULT 1 can never apply.
|
|
301
|
+
*/
|
|
302
|
+
isDefaultValueColumn: true,
|
|
303
|
+
})
|
|
304
|
+
@Column({
|
|
305
|
+
type: ColumnType.Number,
|
|
306
|
+
nullable: false,
|
|
307
|
+
default: 1,
|
|
308
|
+
})
|
|
309
|
+
public matchCountThreshold?: number = undefined;
|
|
310
|
+
|
|
256
311
|
@ColumnAccessControl({
|
|
257
312
|
create: createPermissions,
|
|
258
313
|
read: readPermissions,
|
|
@@ -78,6 +78,17 @@ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
|
78
78
|
tableDescription:
|
|
79
79
|
"Automatically import matching hosts from network device discovery scan results as Network Devices, with no manual review step",
|
|
80
80
|
})
|
|
81
|
+
/*
|
|
82
|
+
* The index and foreign-key names below are written out rather than left to
|
|
83
|
+
* TypeORM's generated hashes, because this table's migration
|
|
84
|
+
* (1789100000000-AddNetworkDeviceAutoImportRule) was hand-written and created
|
|
85
|
+
* them with readable names. TypeORM compares constraint NAMES when it diffs a
|
|
86
|
+
* database against these entities, so an entity that does not spell them out
|
|
87
|
+
* reports the whole table as schema drift on every run of the Postgres Schema
|
|
88
|
+
* Drift check — which is what it did until these were added. Naming them here
|
|
89
|
+
* keeps the readable names and costs no migration; the alternative was an
|
|
90
|
+
* ALTER that renamed seven objects on every installation to hashes.
|
|
91
|
+
*/
|
|
81
92
|
export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
82
93
|
@ColumnAccessControl({
|
|
83
94
|
create: [
|
|
@@ -112,7 +123,10 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
112
123
|
orphanedRowAction: "nullify",
|
|
113
124
|
},
|
|
114
125
|
)
|
|
115
|
-
@JoinColumn({
|
|
126
|
+
@JoinColumn({
|
|
127
|
+
name: "projectId",
|
|
128
|
+
foreignKeyConstraintName: "FK_nd_auto_import_rule_projectId",
|
|
129
|
+
})
|
|
116
130
|
public project?: Project = undefined;
|
|
117
131
|
|
|
118
132
|
@ColumnAccessControl({
|
|
@@ -130,7 +144,7 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
130
144
|
],
|
|
131
145
|
update: [],
|
|
132
146
|
})
|
|
133
|
-
@Index()
|
|
147
|
+
@Index("IDX_network_device_auto_import_rule_projectId")
|
|
134
148
|
@TableColumn({
|
|
135
149
|
type: TableColumnType.ObjectID,
|
|
136
150
|
required: true,
|
|
@@ -164,7 +178,7 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
164
178
|
Permission.EditNetworkDeviceAutoImportRule,
|
|
165
179
|
],
|
|
166
180
|
})
|
|
167
|
-
@Index()
|
|
181
|
+
@Index("IDX_network_device_auto_import_rule_name")
|
|
168
182
|
@TableColumn({
|
|
169
183
|
required: true,
|
|
170
184
|
type: TableColumnType.ShortText,
|
|
@@ -230,7 +244,7 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
230
244
|
Permission.EditNetworkDeviceAutoImportRule,
|
|
231
245
|
],
|
|
232
246
|
})
|
|
233
|
-
@Index()
|
|
247
|
+
@Index("IDX_network_device_auto_import_rule_isEnabled")
|
|
234
248
|
@TableColumn({
|
|
235
249
|
required: true,
|
|
236
250
|
type: TableColumnType.Boolean,
|
|
@@ -434,7 +448,7 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
434
448
|
Permission.EditNetworkDeviceAutoImportRule,
|
|
435
449
|
],
|
|
436
450
|
})
|
|
437
|
-
@Index()
|
|
451
|
+
@Index("IDX_network_device_auto_import_rule_isExclusion")
|
|
438
452
|
@TableColumn({
|
|
439
453
|
required: true,
|
|
440
454
|
type: TableColumnType.Boolean,
|
|
@@ -485,7 +499,10 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
485
499
|
orphanedRowAction: "nullify",
|
|
486
500
|
},
|
|
487
501
|
)
|
|
488
|
-
@JoinColumn({
|
|
502
|
+
@JoinColumn({
|
|
503
|
+
name: "createdByUserId",
|
|
504
|
+
foreignKeyConstraintName: "FK_nd_auto_import_rule_createdByUserId",
|
|
505
|
+
})
|
|
489
506
|
public createdByUser?: User = undefined;
|
|
490
507
|
|
|
491
508
|
@ColumnAccessControl({
|
|
@@ -541,7 +558,10 @@ export default class NetworkDeviceAutoImportRule extends BaseModel {
|
|
|
541
558
|
orphanedRowAction: "nullify",
|
|
542
559
|
},
|
|
543
560
|
)
|
|
544
|
-
@JoinColumn({
|
|
561
|
+
@JoinColumn({
|
|
562
|
+
name: "deletedByUserId",
|
|
563
|
+
foreignKeyConstraintName: "FK_nd_auto_import_rule_deletedByUserId",
|
|
564
|
+
})
|
|
545
565
|
public deletedByUser?: User = undefined;
|
|
546
566
|
|
|
547
567
|
@ColumnAccessControl({
|
|
@@ -250,6 +250,73 @@ export default class NetworkDeviceDiscoveryScan extends BaseModel {
|
|
|
250
250
|
})
|
|
251
251
|
public probeId?: ObjectID = undefined;
|
|
252
252
|
|
|
253
|
+
@ColumnAccessControl({
|
|
254
|
+
create: [
|
|
255
|
+
Permission.ProjectOwner,
|
|
256
|
+
Permission.ProjectAdmin,
|
|
257
|
+
Permission.ProjectMember,
|
|
258
|
+
Permission.SettingsAdmin,
|
|
259
|
+
Permission.SettingsMember,
|
|
260
|
+
Permission.CreateNetworkDeviceDiscoveryScan,
|
|
261
|
+
],
|
|
262
|
+
read: [
|
|
263
|
+
Permission.ProjectOwner,
|
|
264
|
+
Permission.ProjectAdmin,
|
|
265
|
+
Permission.ProjectMember,
|
|
266
|
+
Permission.Viewer,
|
|
267
|
+
Permission.SettingsAdmin,
|
|
268
|
+
Permission.SettingsMember,
|
|
269
|
+
Permission.SettingsViewer,
|
|
270
|
+
Permission.ReadNetworkDeviceDiscoveryScan,
|
|
271
|
+
],
|
|
272
|
+
/*
|
|
273
|
+
* Updatable, unlike everything that describes the sweep itself: changing
|
|
274
|
+
* the target or the credentials of a scan mid-flight would mean the stored
|
|
275
|
+
* row no longer described the sweep that ran, so those grant no update at
|
|
276
|
+
* all. (The recurrence pair is updatable too — it describes the NEXT run
|
|
277
|
+
* rather than the one that happened.)
|
|
278
|
+
*
|
|
279
|
+
* A name describes nothing but itself, and the whole point of it is to be
|
|
280
|
+
* fixable after the fact: a scan mislabelled "Region 1100" is worse than
|
|
281
|
+
* an unnamed one, and deleting a scan to rename it would throw away its
|
|
282
|
+
* results.
|
|
283
|
+
*/
|
|
284
|
+
update: [
|
|
285
|
+
Permission.ProjectOwner,
|
|
286
|
+
Permission.ProjectAdmin,
|
|
287
|
+
Permission.ProjectMember,
|
|
288
|
+
Permission.SettingsAdmin,
|
|
289
|
+
Permission.SettingsMember,
|
|
290
|
+
Permission.EditNetworkDeviceDiscoveryScan,
|
|
291
|
+
],
|
|
292
|
+
})
|
|
293
|
+
/*
|
|
294
|
+
* What this scan is FOR, in the operator's own words — "Router Discovery —
|
|
295
|
+
* Region 1100", "Switch Discovery — WB Units". Optional, not unique, and
|
|
296
|
+
* never used to look a scan up: it exists so the Discovery Scans list can be
|
|
297
|
+
* read at a glance instead of by matching octet ranges against a subnet plan
|
|
298
|
+
* kept somewhere else (OneUptime issue #3391).
|
|
299
|
+
*
|
|
300
|
+
* Nullable, and every scan created before this column existed is null — so
|
|
301
|
+
* every surface that renders it falls back to the scan target. See
|
|
302
|
+
* Common/Utils/NetworkDiscovery/ScanNameUtil.
|
|
303
|
+
*/
|
|
304
|
+
@TableColumn({
|
|
305
|
+
required: false,
|
|
306
|
+
type: TableColumnType.ShortText,
|
|
307
|
+
canReadOnRelationQuery: true,
|
|
308
|
+
title: "Name",
|
|
309
|
+
description:
|
|
310
|
+
"Optional name for this scan, so it can be told apart from other scans at a glance. Falls back to the scan target when empty.",
|
|
311
|
+
example: "Router Discovery - Region 1100",
|
|
312
|
+
})
|
|
313
|
+
@Column({
|
|
314
|
+
nullable: true,
|
|
315
|
+
type: ColumnType.ShortText,
|
|
316
|
+
length: ColumnLength.ShortText,
|
|
317
|
+
})
|
|
318
|
+
public name?: string = undefined;
|
|
319
|
+
|
|
253
320
|
@ColumnAccessControl({
|
|
254
321
|
create: [
|
|
255
322
|
Permission.ProjectOwner,
|
|
@@ -2576,6 +2576,74 @@ export default class Project extends TenantModel {
|
|
|
2576
2576
|
})
|
|
2577
2577
|
public utmContent?: string = undefined;
|
|
2578
2578
|
|
|
2579
|
+
@ColumnAccessControl({
|
|
2580
|
+
create: [Permission.User],
|
|
2581
|
+
read: [],
|
|
2582
|
+
update: [],
|
|
2583
|
+
})
|
|
2584
|
+
@TableColumn({
|
|
2585
|
+
type: TableColumnType.LongText,
|
|
2586
|
+
hideColumnInDocumentation: true,
|
|
2587
|
+
})
|
|
2588
|
+
@Column({
|
|
2589
|
+
type: ColumnType.LongText,
|
|
2590
|
+
length: ColumnLength.LongText,
|
|
2591
|
+
nullable: true,
|
|
2592
|
+
unique: false,
|
|
2593
|
+
})
|
|
2594
|
+
public utmId?: string = undefined;
|
|
2595
|
+
|
|
2596
|
+
@ColumnAccessControl({
|
|
2597
|
+
create: [Permission.User],
|
|
2598
|
+
read: [],
|
|
2599
|
+
update: [],
|
|
2600
|
+
})
|
|
2601
|
+
@TableColumn({
|
|
2602
|
+
type: TableColumnType.LongText,
|
|
2603
|
+
hideColumnInDocumentation: true,
|
|
2604
|
+
})
|
|
2605
|
+
@Column({
|
|
2606
|
+
type: ColumnType.LongText,
|
|
2607
|
+
length: ColumnLength.LongText,
|
|
2608
|
+
nullable: true,
|
|
2609
|
+
unique: false,
|
|
2610
|
+
})
|
|
2611
|
+
public utmSourcePlatform?: string = undefined;
|
|
2612
|
+
|
|
2613
|
+
@ColumnAccessControl({
|
|
2614
|
+
create: [Permission.User],
|
|
2615
|
+
read: [],
|
|
2616
|
+
update: [],
|
|
2617
|
+
})
|
|
2618
|
+
@TableColumn({
|
|
2619
|
+
type: TableColumnType.LongText,
|
|
2620
|
+
hideColumnInDocumentation: true,
|
|
2621
|
+
})
|
|
2622
|
+
@Column({
|
|
2623
|
+
type: ColumnType.LongText,
|
|
2624
|
+
length: ColumnLength.LongText,
|
|
2625
|
+
nullable: true,
|
|
2626
|
+
unique: false,
|
|
2627
|
+
})
|
|
2628
|
+
public utmCreativeFormat?: string = undefined;
|
|
2629
|
+
|
|
2630
|
+
@ColumnAccessControl({
|
|
2631
|
+
create: [Permission.User],
|
|
2632
|
+
read: [],
|
|
2633
|
+
update: [],
|
|
2634
|
+
})
|
|
2635
|
+
@TableColumn({
|
|
2636
|
+
type: TableColumnType.LongText,
|
|
2637
|
+
hideColumnInDocumentation: true,
|
|
2638
|
+
})
|
|
2639
|
+
@Column({
|
|
2640
|
+
type: ColumnType.LongText,
|
|
2641
|
+
length: ColumnLength.LongText,
|
|
2642
|
+
nullable: true,
|
|
2643
|
+
unique: false,
|
|
2644
|
+
})
|
|
2645
|
+
public utmMarketingTactic?: string = undefined;
|
|
2646
|
+
|
|
2579
2647
|
@ColumnAccessControl({
|
|
2580
2648
|
create: [Permission.User],
|
|
2581
2649
|
read: [],
|
|
@@ -634,6 +634,74 @@ class User extends UserModel {
|
|
|
634
634
|
})
|
|
635
635
|
public utmContent?: string = undefined;
|
|
636
636
|
|
|
637
|
+
@ColumnAccessControl({
|
|
638
|
+
create: [Permission.Public],
|
|
639
|
+
read: [],
|
|
640
|
+
update: [],
|
|
641
|
+
})
|
|
642
|
+
@TableColumn({
|
|
643
|
+
type: TableColumnType.LongText,
|
|
644
|
+
hideColumnInDocumentation: true,
|
|
645
|
+
})
|
|
646
|
+
@Column({
|
|
647
|
+
type: ColumnType.LongText,
|
|
648
|
+
length: ColumnLength.LongText,
|
|
649
|
+
nullable: true,
|
|
650
|
+
unique: false,
|
|
651
|
+
})
|
|
652
|
+
public utmId?: string = undefined;
|
|
653
|
+
|
|
654
|
+
@ColumnAccessControl({
|
|
655
|
+
create: [Permission.Public],
|
|
656
|
+
read: [],
|
|
657
|
+
update: [],
|
|
658
|
+
})
|
|
659
|
+
@TableColumn({
|
|
660
|
+
type: TableColumnType.LongText,
|
|
661
|
+
hideColumnInDocumentation: true,
|
|
662
|
+
})
|
|
663
|
+
@Column({
|
|
664
|
+
type: ColumnType.LongText,
|
|
665
|
+
length: ColumnLength.LongText,
|
|
666
|
+
nullable: true,
|
|
667
|
+
unique: false,
|
|
668
|
+
})
|
|
669
|
+
public utmSourcePlatform?: string = undefined;
|
|
670
|
+
|
|
671
|
+
@ColumnAccessControl({
|
|
672
|
+
create: [Permission.Public],
|
|
673
|
+
read: [],
|
|
674
|
+
update: [],
|
|
675
|
+
})
|
|
676
|
+
@TableColumn({
|
|
677
|
+
type: TableColumnType.LongText,
|
|
678
|
+
hideColumnInDocumentation: true,
|
|
679
|
+
})
|
|
680
|
+
@Column({
|
|
681
|
+
type: ColumnType.LongText,
|
|
682
|
+
length: ColumnLength.LongText,
|
|
683
|
+
nullable: true,
|
|
684
|
+
unique: false,
|
|
685
|
+
})
|
|
686
|
+
public utmCreativeFormat?: string = undefined;
|
|
687
|
+
|
|
688
|
+
@ColumnAccessControl({
|
|
689
|
+
create: [Permission.Public],
|
|
690
|
+
read: [],
|
|
691
|
+
update: [],
|
|
692
|
+
})
|
|
693
|
+
@TableColumn({
|
|
694
|
+
type: TableColumnType.LongText,
|
|
695
|
+
hideColumnInDocumentation: true,
|
|
696
|
+
})
|
|
697
|
+
@Column({
|
|
698
|
+
type: ColumnType.LongText,
|
|
699
|
+
length: ColumnLength.LongText,
|
|
700
|
+
nullable: true,
|
|
701
|
+
unique: false,
|
|
702
|
+
})
|
|
703
|
+
public utmMarketingTactic?: string = undefined;
|
|
704
|
+
|
|
637
705
|
@ColumnAccessControl({
|
|
638
706
|
create: [Permission.Public],
|
|
639
707
|
read: [],
|
package/Server/API/BaseAPI.ts
CHANGED
|
@@ -147,18 +147,6 @@ export default class BaseAPI<
|
|
|
147
147
|
},
|
|
148
148
|
);
|
|
149
149
|
|
|
150
|
-
router.get(
|
|
151
|
-
`${new this.entityType().getCrudApiPath()?.toString()}/:id/update-item`,
|
|
152
|
-
UserMiddleware.getUserMiddleware,
|
|
153
|
-
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
154
|
-
try {
|
|
155
|
-
await this.updateItem(req, res);
|
|
156
|
-
} catch (err) {
|
|
157
|
-
next(err);
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
);
|
|
161
|
-
|
|
162
150
|
// Delete
|
|
163
151
|
router.delete(
|
|
164
152
|
`${new this.entityType().getCrudApiPath()?.toString()}/:id`,
|
|
@@ -184,18 +172,6 @@ export default class BaseAPI<
|
|
|
184
172
|
},
|
|
185
173
|
);
|
|
186
174
|
|
|
187
|
-
router.get(
|
|
188
|
-
`${new this.entityType().getCrudApiPath()?.toString()}/:id/delete-item`,
|
|
189
|
-
UserMiddleware.getUserMiddleware,
|
|
190
|
-
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
191
|
-
try {
|
|
192
|
-
await this.deleteItem(req, res);
|
|
193
|
-
} catch (err) {
|
|
194
|
-
next(err);
|
|
195
|
-
}
|
|
196
|
-
},
|
|
197
|
-
);
|
|
198
|
-
|
|
199
175
|
this.router = router;
|
|
200
176
|
this.service = service;
|
|
201
177
|
}
|
package/Server/API/SlackAPI.ts
CHANGED
|
@@ -592,7 +592,6 @@ export default class SlackAPI {
|
|
|
592
592
|
"Slack Interactive Auth Result: ",
|
|
593
593
|
getLogAttributesFromRequest(req as any),
|
|
594
594
|
);
|
|
595
|
-
logger.debug(authResult, getLogAttributesFromRequest(req as any));
|
|
596
595
|
|
|
597
596
|
// if slack uninstall app then,
|
|
598
597
|
if (authResult.payloadType === "app_uninstall") {
|
|
@@ -886,7 +885,6 @@ export default class SlackAPI {
|
|
|
886
885
|
"Slack Events API Request received",
|
|
887
886
|
getLogAttributesFromRequest(req as any),
|
|
888
887
|
);
|
|
889
|
-
logger.debug(req.body, getLogAttributesFromRequest(req as any));
|
|
890
888
|
|
|
891
889
|
const payload: JSONObject = req.body;
|
|
892
890
|
|
|
@@ -204,6 +204,13 @@ const requireExceptionReadAccess: Array<RequestHandler> =
|
|
|
204
204
|
const requireProfileReadAccess: Array<RequestHandler> =
|
|
205
205
|
createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceProfiles);
|
|
206
206
|
|
|
207
|
+
/*
|
|
208
|
+
* Mirrors the read access control declared on the SecurityEvent analytics
|
|
209
|
+
* model.
|
|
210
|
+
*/
|
|
211
|
+
const requireSecurityEventReadAccess: Array<RequestHandler> =
|
|
212
|
+
createTelemetryReadAccessGuard(Permission.ReadSecurityEvent);
|
|
213
|
+
|
|
207
214
|
router.post(
|
|
208
215
|
"/telemetry/metrics/get-attributes",
|
|
209
216
|
...requireMetricReadAccess,
|
|
@@ -268,6 +275,28 @@ router.post(
|
|
|
268
275
|
},
|
|
269
276
|
);
|
|
270
277
|
|
|
278
|
+
/*
|
|
279
|
+
* Security events flatten their whole source payload into `attributes`, so
|
|
280
|
+
* these are what backs the "add an attribute column" picker on the security
|
|
281
|
+
* events table — the keys differ per event class and per source, so there is
|
|
282
|
+
* no fixed list the UI could ship.
|
|
283
|
+
*/
|
|
284
|
+
router.post(
|
|
285
|
+
"/telemetry/security-events/get-attributes",
|
|
286
|
+
...requireSecurityEventReadAccess,
|
|
287
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
288
|
+
return getAttributes(req, res, next, TelemetryType.SecurityEvent);
|
|
289
|
+
},
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
router.post(
|
|
293
|
+
"/telemetry/security-events/get-attribute-values",
|
|
294
|
+
...requireSecurityEventReadAccess,
|
|
295
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
296
|
+
return getAttributeValues(req, res, next, TelemetryType.SecurityEvent);
|
|
297
|
+
},
|
|
298
|
+
);
|
|
299
|
+
|
|
271
300
|
type GetAttributesFunction = (
|
|
272
301
|
req: ExpressRequest,
|
|
273
302
|
res: ExpressResponse,
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* An optional operator-supplied name on a discovery scan (issue #3391), so the
|
|
5
|
+
* Discovery Scans list can be read by purpose — "Router Discovery — Region
|
|
6
|
+
* 1100" — instead of only by the raw address range it sweeps.
|
|
7
|
+
*
|
|
8
|
+
* Nullable with no default and no backfill: every scan that already exists
|
|
9
|
+
* stays unnamed, and every surface that renders the name falls back to the
|
|
10
|
+
* scan target exactly as it did before this column existed.
|
|
11
|
+
*/
|
|
12
|
+
export class AddNameToNetworkDeviceDiscoveryScan1789400000000
|
|
13
|
+
implements MigrationInterface
|
|
14
|
+
{
|
|
15
|
+
public name: string = "AddNameToNetworkDeviceDiscoveryScan1789400000000";
|
|
16
|
+
|
|
17
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
18
|
+
await queryRunner.query(
|
|
19
|
+
`ALTER TABLE "NetworkDeviceDiscoveryScan" ADD "name" character varying(100)`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
24
|
+
await queryRunner.query(
|
|
25
|
+
`ALTER TABLE "NetworkDeviceDiscoveryScan" DROP COLUMN "name"`,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* GA4's second tier of campaign parameters, on the two tables that already
|
|
5
|
+
* carry the first five.
|
|
6
|
+
*
|
|
7
|
+
* `utm_id`, `utm_source_platform`, `utm_creative_format` and
|
|
8
|
+
* `utm_marketing_tactic` arrive on the landing URL from Google Ads auto-tagging
|
|
9
|
+
* and the GA4 URL builder. Until now the browser captured them nowhere and the
|
|
10
|
+
* signup door dropped them, so a campaign that distinguished its creatives
|
|
11
|
+
* only by `utm_creative_format` was reportable as one undifferentiated
|
|
12
|
+
* campaign.
|
|
13
|
+
*
|
|
14
|
+
* Nullable with no default, matching utmSource..utmContent beside them: an
|
|
15
|
+
* existing row has no campaign to backfill, and NULL says "not known" rather
|
|
16
|
+
* than claiming an empty campaign.
|
|
17
|
+
*/
|
|
18
|
+
export class AddCampaignUtmFields1789500000000 implements MigrationInterface {
|
|
19
|
+
public name: string = "AddCampaignUtmFields1789500000000";
|
|
20
|
+
|
|
21
|
+
private static readonly columns: Array<string> = [
|
|
22
|
+
"utmId",
|
|
23
|
+
"utmSourcePlatform",
|
|
24
|
+
"utmCreativeFormat",
|
|
25
|
+
"utmMarketingTactic",
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
private static readonly tables: Array<string> = ["User", "Project"];
|
|
29
|
+
|
|
30
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
31
|
+
for (const table of AddCampaignUtmFields1789500000000.tables) {
|
|
32
|
+
for (const column of AddCampaignUtmFields1789500000000.columns) {
|
|
33
|
+
await queryRunner.query(
|
|
34
|
+
`ALTER TABLE "${table}" ADD "${column}" character varying(500)`,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
41
|
+
for (const table of AddCampaignUtmFields1789500000000.tables) {
|
|
42
|
+
for (const column of AddCampaignUtmFields1789500000000.columns) {
|
|
43
|
+
await queryRunner.query(
|
|
44
|
+
`ALTER TABLE "${table}" DROP COLUMN "${column}"`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|