@oneuptime/common 12.0.23 → 12.0.24
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/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/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/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 +130 -0
- 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/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/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/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 +368 -4
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +245 -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 +193 -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 +472 -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/LlmMetricConventions.ts +124 -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 +204 -0
- 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/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/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 +102 -0
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
- 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/LlmMetricConventions.js +98 -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 +119 -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
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NetworkDeviceDiscoveryScan.name column contract (issue #3391).
|
|
3
|
+
*
|
|
4
|
+
* A discovery scan used to be identified in the product by its target alone,
|
|
5
|
+
* so a list of them read as a column of octet ranges. This column is the
|
|
6
|
+
* operator's own sentence about what the scan is FOR, and everything below
|
|
7
|
+
* pins a property that, quietly changed, either loses that sentence or turns
|
|
8
|
+
* an optional label into something that can refuse a write.
|
|
9
|
+
*
|
|
10
|
+
* Three properties matter more than the rest:
|
|
11
|
+
*
|
|
12
|
+
* - OPTIONAL and un-backfilled. Every scan that already existed has no name,
|
|
13
|
+
* and a NOT NULL column (or a backfilled one) would either fail the
|
|
14
|
+
* migration or invent a name nobody wrote.
|
|
15
|
+
* - UPDATABLE. Almost nothing on this model is: the target and the
|
|
16
|
+
* credentials describe a sweep already handed to a probe. A name describes
|
|
17
|
+
* nothing but itself, and a mislabelled scan is worse than an unlabelled
|
|
18
|
+
* one, so it joins the recurrence pair as the third editable column.
|
|
19
|
+
* - NOT unique and NOT slugged. It is a label for humans, never a key: two
|
|
20
|
+
* scans of the same range may legitimately be called the same thing.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import NetworkDeviceDiscoveryScan from "../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
|
|
24
|
+
import { TableColumnMetadata } from "../../Types/Database/TableColumn";
|
|
25
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
26
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
27
|
+
import Columns from "../../Types/Database/Columns";
|
|
28
|
+
import Permission from "../../Types/Permission";
|
|
29
|
+
import { describe, expect, test } from "@jest/globals";
|
|
30
|
+
import { getMetadataArgsStorage } from "typeorm";
|
|
31
|
+
import { ColumnMetadataArgs } from "typeorm/metadata-args/ColumnMetadataArgs";
|
|
32
|
+
import fs from "fs";
|
|
33
|
+
import path from "path";
|
|
34
|
+
|
|
35
|
+
const COLUMN: string = "name";
|
|
36
|
+
|
|
37
|
+
const MIGRATIONS_DIR: string = path.join(
|
|
38
|
+
__dirname,
|
|
39
|
+
"..",
|
|
40
|
+
"..",
|
|
41
|
+
"Server",
|
|
42
|
+
"Infrastructure",
|
|
43
|
+
"Postgres",
|
|
44
|
+
"SchemaMigrations",
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const MIGRATION_CLASS: string =
|
|
48
|
+
"AddNameToNetworkDeviceDiscoveryScan1789400000000";
|
|
49
|
+
|
|
50
|
+
const MIGRATION_PATH: string = path.join(
|
|
51
|
+
MIGRATIONS_DIR,
|
|
52
|
+
"1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts",
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
function metadata(): TableColumnMetadata {
|
|
56
|
+
return new NetworkDeviceDiscoveryScan().getTableColumnMetadata(COLUMN);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function typeOrmColumn(): ColumnMetadataArgs | undefined {
|
|
60
|
+
return getMetadataArgsStorage().columns.find((column: ColumnMetadataArgs) => {
|
|
61
|
+
return (
|
|
62
|
+
column.target === NetworkDeviceDiscoveryScan &&
|
|
63
|
+
column.propertyName === COLUMN
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
describe("NetworkDeviceDiscoveryScan.name", () => {
|
|
69
|
+
test("exists as a ShortText column", () => {
|
|
70
|
+
expect(metadata()).toBeDefined();
|
|
71
|
+
expect(metadata().type).toBe(TableColumnType.ShortText);
|
|
72
|
+
expect(metadata().title).toBe("Name");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* The whole point of the field. A required name would put a wall in front of
|
|
77
|
+
* the operator sweeping one subnet once, which is the case the Discovery
|
|
78
|
+
* page was built for in the first place.
|
|
79
|
+
*/
|
|
80
|
+
test("is optional, so a scan can still be created without one", () => {
|
|
81
|
+
expect(metadata().required).toBeFalsy();
|
|
82
|
+
expect(typeOrmColumn()).toBeDefined();
|
|
83
|
+
expect(typeOrmColumn()?.options.nullable).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("is stored at the width the shared validator caps names at", () => {
|
|
87
|
+
expect(typeOrmColumn()?.options.length).toBe(ColumnLength.ShortText);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* A default would name every unnamed scan the same thing, which is exactly
|
|
92
|
+
* the state the issue describes as unreadable.
|
|
93
|
+
*/
|
|
94
|
+
test("has no default value", () => {
|
|
95
|
+
expect(typeOrmColumn()?.options.default).toBeUndefined();
|
|
96
|
+
expect(new NetworkDeviceDiscoveryScan().isDefaultValueColumn(COLUMN)).toBe(
|
|
97
|
+
false,
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("is not unique, because a name is a label and not a key", () => {
|
|
102
|
+
expect(typeOrmColumn()?.options.unique).toBeFalsy();
|
|
103
|
+
|
|
104
|
+
const uniqueColumns: Columns =
|
|
105
|
+
new NetworkDeviceDiscoveryScan().getUniqueColumns();
|
|
106
|
+
|
|
107
|
+
expect(uniqueColumns.columns).not.toContain(COLUMN);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* Slugs are opt-in through @SlugifyColumn. A scan is never addressed by
|
|
112
|
+
* name, and slugging one would add a second column to keep in step with a
|
|
113
|
+
* value the operator is expected to rewrite.
|
|
114
|
+
*/
|
|
115
|
+
test("is not slugified", () => {
|
|
116
|
+
expect(new NetworkDeviceDiscoveryScan().getSlugifyColumn()).toBeFalsy();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe("NetworkDeviceDiscoveryScan.name migration", () => {
|
|
121
|
+
test("adds a nullable varchar without backfilling existing scans", () => {
|
|
122
|
+
const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
|
|
123
|
+
|
|
124
|
+
expect(migration).toContain('ALTER TABLE "NetworkDeviceDiscoveryScan"');
|
|
125
|
+
expect(migration).toContain(`ADD "${COLUMN}" character varying(100)`);
|
|
126
|
+
/*
|
|
127
|
+
* No NOT NULL, no DEFAULT and no UPDATE: scans created before this column
|
|
128
|
+
* existed stay unnamed, and every surface falls back to their target.
|
|
129
|
+
*/
|
|
130
|
+
expect(migration).not.toContain("NOT NULL");
|
|
131
|
+
expect(migration).not.toContain("DEFAULT");
|
|
132
|
+
expect(migration).not.toContain("UPDATE");
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("its down() removes the column", () => {
|
|
136
|
+
const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
|
|
137
|
+
|
|
138
|
+
expect(migration).toContain(
|
|
139
|
+
`ALTER TABLE "NetworkDeviceDiscoveryScan" DROP COLUMN "${COLUMN}"`,
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* TypeORM records a migration under its `public name` property, not its
|
|
145
|
+
* class name, and nothing else in the suite compares the two. A rename that
|
|
146
|
+
* updates the class and forgets the literal leaves the deployed identity on
|
|
147
|
+
* the old value.
|
|
148
|
+
*/
|
|
149
|
+
test("its class name, file name and recorded name all agree", () => {
|
|
150
|
+
const migration: string = fs.readFileSync(MIGRATION_PATH, "utf8");
|
|
151
|
+
|
|
152
|
+
expect(migration).toContain(`export class ${MIGRATION_CLASS}`);
|
|
153
|
+
expect(migration).toContain(`public name: string = "${MIGRATION_CLASS}"`);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("is registered, so the column actually exists at runtime", () => {
|
|
157
|
+
const index: string = fs.readFileSync(
|
|
158
|
+
path.join(MIGRATIONS_DIR, "Index.ts"),
|
|
159
|
+
"utf8",
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
// Imported AND listed in the exported array - the import alone does nothing.
|
|
163
|
+
expect(index.match(new RegExp(MIGRATION_CLASS, "g"))?.length).toBe(2);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
describe("NetworkDeviceDiscoveryScan.name access control", () => {
|
|
168
|
+
const CREATORS: Array<Permission> = [
|
|
169
|
+
Permission.ProjectOwner,
|
|
170
|
+
Permission.ProjectAdmin,
|
|
171
|
+
Permission.ProjectMember,
|
|
172
|
+
Permission.SettingsAdmin,
|
|
173
|
+
Permission.SettingsMember,
|
|
174
|
+
Permission.CreateNetworkDeviceDiscoveryScan,
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
const READERS: Array<Permission> = [
|
|
178
|
+
Permission.ProjectOwner,
|
|
179
|
+
Permission.ProjectAdmin,
|
|
180
|
+
Permission.ProjectMember,
|
|
181
|
+
Permission.Viewer,
|
|
182
|
+
Permission.SettingsAdmin,
|
|
183
|
+
Permission.SettingsMember,
|
|
184
|
+
Permission.SettingsViewer,
|
|
185
|
+
Permission.ReadNetworkDeviceDiscoveryScan,
|
|
186
|
+
];
|
|
187
|
+
|
|
188
|
+
const EDITORS: Array<Permission> = [
|
|
189
|
+
Permission.ProjectOwner,
|
|
190
|
+
Permission.ProjectAdmin,
|
|
191
|
+
Permission.ProjectMember,
|
|
192
|
+
Permission.SettingsAdmin,
|
|
193
|
+
Permission.SettingsMember,
|
|
194
|
+
Permission.EditNetworkDeviceDiscoveryScan,
|
|
195
|
+
];
|
|
196
|
+
|
|
197
|
+
test("is set by whoever may create a scan", () => {
|
|
198
|
+
expect(
|
|
199
|
+
new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)
|
|
200
|
+
?.create,
|
|
201
|
+
).toEqual(CREATORS);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("is read by everyone who may read a scan, viewers included", () => {
|
|
205
|
+
expect(
|
|
206
|
+
new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)?.read,
|
|
207
|
+
).toEqual(READERS);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* The Rename dialog on the Discovery page depends on this list being
|
|
212
|
+
* non-empty — ModelForm drops a field whose column grants no update
|
|
213
|
+
* permission, so an empty list here would turn the dialog into a permission
|
|
214
|
+
* error rather than a text box.
|
|
215
|
+
*/
|
|
216
|
+
test("can be edited by whoever may edit the scan", () => {
|
|
217
|
+
expect(
|
|
218
|
+
new NetworkDeviceDiscoveryScan().getColumnAccessControlFor(COLUMN)
|
|
219
|
+
?.update,
|
|
220
|
+
).toEqual(EDITORS);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* And the sweep itself stays read-only. This is the claim worth pinning:
|
|
225
|
+
* adding an editable column must not have made anything that DESCRIBES a
|
|
226
|
+
* sweep editable with it. A target or a credential changed after a probe
|
|
227
|
+
* took the scan would leave the stored row describing a sweep that never
|
|
228
|
+
* ran, and a status or a result changed by hand would be a lie about one
|
|
229
|
+
* that did.
|
|
230
|
+
*
|
|
231
|
+
* (The recurrence pair is editable, and always was — it describes the NEXT
|
|
232
|
+
* run rather than the one that happened.)
|
|
233
|
+
*/
|
|
234
|
+
test("does not make any part of the sweep editable", () => {
|
|
235
|
+
const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
|
|
236
|
+
|
|
237
|
+
const sweepColumns: Array<string> = [
|
|
238
|
+
"cidr",
|
|
239
|
+
"probeId",
|
|
240
|
+
"snmpVersion",
|
|
241
|
+
"snmpCommunityString",
|
|
242
|
+
"snmpPort",
|
|
243
|
+
"snmpV3SecurityLevel",
|
|
244
|
+
"snmpV3Username",
|
|
245
|
+
"snmpV3AuthProtocol",
|
|
246
|
+
"snmpV3AuthKey",
|
|
247
|
+
"snmpV3PrivProtocol",
|
|
248
|
+
"snmpV3PrivKey",
|
|
249
|
+
"status",
|
|
250
|
+
"statusMessage",
|
|
251
|
+
"discoveredDevices",
|
|
252
|
+
"scannedHostCount",
|
|
253
|
+
"respondedHostCount",
|
|
254
|
+
"startedAt",
|
|
255
|
+
"completedAt",
|
|
256
|
+
"nextScanAt",
|
|
257
|
+
];
|
|
258
|
+
|
|
259
|
+
for (const column of sweepColumns) {
|
|
260
|
+
expect({
|
|
261
|
+
column: column,
|
|
262
|
+
update: scan.getColumnAccessControlFor(column)?.update,
|
|
263
|
+
}).toEqual({ column: column, update: [] });
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// ...while the two columns that describe a future run stay editable.
|
|
268
|
+
test("leaves the recurrence pair editable, as it already was", () => {
|
|
269
|
+
const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
|
|
270
|
+
|
|
271
|
+
for (const column of ["isRecurring", "rescanIntervalInMinutes"]) {
|
|
272
|
+
expect(scan.getColumnAccessControlFor(column)?.update).toEqual(EDITORS);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
/*
|
|
277
|
+
* Everything the operator can edit has to be something the table itself
|
|
278
|
+
* accepts an update for, or the row-level check refuses the write before the
|
|
279
|
+
* column-level one is ever consulted.
|
|
280
|
+
*/
|
|
281
|
+
test("its editors are editors of the table too", () => {
|
|
282
|
+
const tableUpdatePermissions: Array<Permission> =
|
|
283
|
+
new NetworkDeviceDiscoveryScan().getUpdatePermissions();
|
|
284
|
+
|
|
285
|
+
for (const permission of EDITORS) {
|
|
286
|
+
expect(tableUpdatePermissions).toContain(permission);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
test("is readable from a relation query, like the target beside it", () => {
|
|
291
|
+
expect(metadata().canReadOnRelationQuery).toBe(true);
|
|
292
|
+
});
|
|
293
|
+
});
|