@oneuptime/common 12.0.6 → 12.0.8
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/AIInsight.ts +1 -1
- package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
- package/Models/DatabaseModels/DeletedProject.ts +595 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/Monitor.ts +111 -0
- package/Models/DatabaseModels/Project.ts +3 -3
- package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
- package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
- package/Models/DatabaseModels/WorkflowLog.ts +38 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
- package/Server/API/FileAPI.ts +15 -2
- package/Server/API/MicrosoftTeamsAPI.ts +6 -1
- package/Server/API/ProjectAPI.ts +214 -0
- package/Server/API/StatusPageAPI.ts +39 -6
- package/Server/API/UserAPI.ts +16 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
- package/Server/Services/AIAgentService.ts +20 -0
- package/Server/Services/DashboardDomainService.ts +73 -28
- package/Server/Services/DatabaseService.ts +1 -0
- package/Server/Services/DeletedProjectService.ts +138 -0
- package/Server/Services/FileService.ts +61 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
- package/Server/Services/IncidentPublicNoteService.ts +18 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +311 -0
- package/Server/Services/ProbeService.ts +20 -0
- package/Server/Services/ProjectService.ts +297 -1
- package/Server/Services/PushNotificationService.ts +71 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
- package/Server/Services/StatusPageAnnouncementService.ts +53 -0
- package/Server/Services/StatusPageDomainService.ts +73 -28
- package/Server/Services/TeamMemberService.ts +117 -12
- package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
- package/Server/Services/TelemetryEntityService.ts +114 -1
- package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
- package/Server/Services/UserWebhookService.ts +34 -109
- package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
- package/Server/Types/Database/DeleteById.ts +2 -0
- package/Server/Types/Database/DeleteOneBy.ts +6 -0
- package/Server/Types/Domain.ts +41 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
- package/Server/Types/Workflow/Components/API/Get.ts +2 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
- package/Server/Types/Workflow/Components/API/Post.ts +2 -1
- package/Server/Types/Workflow/Components/API/Put.ts +2 -1
- package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
- package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
- package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
- package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
- package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
- package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
- package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
- package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
- package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
- package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
- package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
- package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
- package/Server/Types/Workflow/TriggerCode.ts +12 -0
- package/Server/Types/Workflow/Workflow.ts +5 -0
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
- package/Server/Utils/DataSource/EgressGuard.ts +176 -16
- package/Server/Utils/DataSource/HttpFetch.ts +6 -45
- package/Server/Utils/Execute.ts +8 -0
- package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
- package/Server/Utils/LLM/LLMService.ts +57 -12
- package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
- package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
- package/Server/Utils/Monitor/MonitorResource.ts +36 -0
- package/Server/Utils/Response.ts +142 -6
- package/Server/Utils/SSRFProtection.ts +273 -60
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
- package/Server/Utils/VM/VMAPI.ts +56 -8
- package/Server/Utils/VM/VMRunner.ts +88 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
- package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
- package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
- package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
- package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
- package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
- package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
- package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
- package/Tests/Server/API/ProjectAPI.test.ts +299 -1
- package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
- package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
- package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
- package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
- package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
- package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
- package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
- package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
- package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
- package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
- package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
- package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
- package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
- package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
- package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
- package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
- package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
- package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
- package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
- package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
- package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
- package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
- package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
- package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
- package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
- package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
- package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
- package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
- package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
- package/Tests/Types/JSONFunctions.test.ts +252 -1
- package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
- package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
- package/Tests/Types/Workflow/Templates.test.ts +403 -0
- package/Tests/UI/Components/404.test.tsx +1 -1
- package/Tests/UI/Components/Alert.test.tsx +1 -1
- package/Tests/UI/Components/Badge.test.tsx +1 -1
- package/Tests/UI/Components/BasicForm.test.tsx +39 -10
- package/Tests/UI/Components/Button.test.tsx +1 -1
- package/Tests/UI/Components/Card.test.tsx +1 -1
- package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
- package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
- package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
- package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
- package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +1 -1
- package/Tests/UI/Components/FilePicker.test.tsx +1 -1
- package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
- package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
- package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
- package/Tests/UI/Components/HiddenText.test.tsx +1 -1
- package/Tests/UI/Components/Input.test.tsx +1 -1
- package/Tests/UI/Components/Loader.test.tsx +1 -1
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
- package/Tests/UI/Components/NavBar.test.tsx +1 -1
- package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
- package/Tests/UI/Components/Pagination.test.tsx +1 -1
- package/Tests/UI/Components/Pill.test.tsx +1 -1
- package/Tests/UI/Components/Probe.test.tsx +1 -1
- package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
- package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
- package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
- package/Tests/UI/Components/SideOver.test.tsx +500 -6
- package/Tests/UI/Components/Tabs.test.tsx +1 -1
- package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
- package/Tests/UI/Components/TextArea.test.tsx +1 -1
- package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
- package/Tests/UI/Components/Toast.test.tsx +1 -1
- package/Tests/UI/Components/Toggle.test.tsx +1 -1
- package/Tests/UI/Components/TopSection.test.tsx +1 -1
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
- package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
- package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
- package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
- package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
- package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
- package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
- package/Tests/Utils/Realtime.test.ts +78 -0
- package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
- package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
- package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
- package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
- package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
- package/Types/AI/FixPullRequestCiStatus.ts +1 -1
- package/Types/AI/FixVerificationStatus.ts +2 -2
- package/Types/API/Hostname.ts +92 -4
- package/Types/API/URL.ts +43 -25
- package/Types/Billing/BalanceAdjustmentType.ts +14 -0
- package/Types/Billing/ProjectBalanceType.ts +13 -0
- package/Types/Domain.ts +26 -0
- package/Types/File/MimeType.ts +11 -0
- package/Types/JSONFunctions.ts +15 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
- package/Types/SerializableObjectDictionary.ts +133 -39
- package/Types/Telemetry/EntitySource.ts +40 -0
- package/Types/Telemetry/EntityType.ts +27 -0
- package/Types/Telemetry/EntityTypeGroups.ts +65 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
- package/Types/Workflow/Component.ts +29 -0
- package/Types/Workflow/Components/API.ts +35 -0
- package/Types/Workflow/Components/BaseModel.ts +96 -28
- package/Types/Workflow/StepTrace.ts +181 -0
- package/Types/Workflow/TemplateSyntax.ts +499 -0
- package/Types/Workflow/Templates.ts +316 -0
- package/Typings/Index.d.ts +12 -0
- package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
- package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
- package/UI/Components/Dictionary/Dictionary.tsx +23 -6
- package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
- package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
- package/UI/Components/Forms/Types/Field.ts +7 -0
- package/UI/Components/Forms/Validation.ts +63 -1
- package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
- package/UI/Components/Input/Input.tsx +31 -3
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
- package/UI/Components/Modal/ConfirmModal.tsx +10 -5
- package/UI/Components/Modal/Modal.tsx +64 -51
- package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
- package/UI/Components/SideOver/SideOver.tsx +195 -68
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
- package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
- package/UI/Components/Workflow/Component.tsx +28 -26
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
- package/UI/Components/Workflow/GraphLint.ts +591 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
- package/UI/Components/Workflow/ModelSchema.ts +196 -0
- package/UI/Components/Workflow/RunForm.tsx +41 -7
- package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
- package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
- package/UI/Components/Workflow/Utils.ts +93 -1
- package/UI/Components/Workflow/Workflow.tsx +77 -4
- package/UI/Types/LayeredDismissal.ts +31 -0
- package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
- package/UI/Utils/PageScrollLock.ts +66 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
- package/Utils/Dashboard/VariableInterpolation.ts +19 -1
- package/Utils/LegacySerializedArray.ts +60 -0
- package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
- package/Utils/Telemetry/EntityKey.ts +66 -0
- package/Utils/Telemetry/SavedViewFilters.ts +88 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
- package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +3 -3
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/FileAPI.js +14 -2
- package/build/dist/Server/API/FileAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +157 -4
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +27 -3
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +16 -1
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +17 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +55 -18
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +1 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DeletedProjectService.js +124 -0
- package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
- package/build/dist/Server/Services/FileService.js +52 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +232 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +17 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +228 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +56 -0
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +97 -6
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +31 -87
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Domain.js +37 -0
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Execute.js +2 -2
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +112 -5
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +219 -53
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
- package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
- package/build/dist/Types/API/Hostname.js +73 -4
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/URL.js +42 -24
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
- package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
- package/build/dist/Types/Domain.js +22 -0
- package/build/dist/Types/Domain.js.map +1 -1
- package/build/dist/Types/File/MimeType.js +11 -0
- package/build/dist/Types/File/MimeType.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +14 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +133 -39
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +39 -0
- package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +27 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
- package/build/dist/Types/Workflow/Component.js +21 -0
- package/build/dist/Types/Workflow/Component.js.map +1 -1
- package/build/dist/Types/Workflow/Components/API.js +35 -0
- package/build/dist/Types/Workflow/Components/API.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/StepTrace.js +104 -0
- package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +218 -0
- package/build/dist/Types/Workflow/Templates.js.map +1 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +44 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +12 -4
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +55 -39
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Component.js +20 -19
- package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
- package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
- package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Utils.js +73 -1
- package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Types/LayeredDismissal.js +21 -0
- package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +52 -0
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
- package/build/dist/Utils/LegacySerializedArray.js +51 -0
- package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
- package/jest.config.json +3 -0
- package/package.json +1 -1
- package/tsconfig.json +3 -1
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
import { NetworkTopologyDeviceRole } from "../../Types/Monitor/SnmpMonitor/NetworkTopology";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Works out what a node on the network topology map DOES — router, switch,
|
|
5
|
+
* firewall, access point, load balancer, server, storage, or one of the
|
|
6
|
+
* leaf roles (printer, camera, phone, plain host).
|
|
7
|
+
*
|
|
8
|
+
* Why derive it rather than store it: nothing in SNMP hands us a role. The
|
|
9
|
+
* evidence we already collect does, though, and it arrives in a strict
|
|
10
|
+
* order of trustworthiness:
|
|
11
|
+
*
|
|
12
|
+
* 1. the product family in sysDescr / model / the CDP platform string
|
|
13
|
+
* ("Catalyst 2960", "FortiGate-60F", "SRX340") — a named family is
|
|
14
|
+
* the closest thing to a declaration of purpose,
|
|
15
|
+
* 2. the sysObjectId enterprise arc, for the vendors whose entire
|
|
16
|
+
* catalogue is one role (Palo Alto, F5, NetApp, ...),
|
|
17
|
+
* 3. the generic words in sysDescr ("... Switch ...", "Load Balancer"),
|
|
18
|
+
* 4. the naming convention in the hostname ("core-sw-1", "edge-fw01"),
|
|
19
|
+
* 5. last and weakest, a general-purpose OS or SNMP agent in sysDescr —
|
|
20
|
+
* "it is a computer", which loses to a hostname that says otherwise
|
|
21
|
+
* because switches and firewalls announce Linux kernels too.
|
|
22
|
+
*
|
|
23
|
+
* Each tier is weaker than the one above it, so they are tried in order
|
|
24
|
+
* and the first answer wins. When nothing matches the answer is "unknown",
|
|
25
|
+
* which is deliberate: a neutral node is honest, and a router drawn as a
|
|
26
|
+
* firewall because its hostname happened to contain "fw" is not. This is
|
|
27
|
+
* also why unmanaged CDP/LLDP peers — for which we have a platform string
|
|
28
|
+
* and a name and nothing else — mostly come back "unknown", and should.
|
|
29
|
+
*
|
|
30
|
+
* Pure and dependency-free so it runs identically in the topology builder
|
|
31
|
+
* on the server and in the unit tests.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/** Everything the classifier is allowed to look at. All best-effort. */
|
|
35
|
+
export interface DeviceRoleSignals {
|
|
36
|
+
sysDescr?: string | undefined;
|
|
37
|
+
sysObjectId?: string | undefined;
|
|
38
|
+
vendor?: string | undefined;
|
|
39
|
+
/** NetworkDevice.deviceModel for managed nodes. */
|
|
40
|
+
deviceModel?: string | undefined;
|
|
41
|
+
/** The CDP platform string an unmanaged peer advertises about itself. */
|
|
42
|
+
platform?: string | undefined;
|
|
43
|
+
name?: string | undefined;
|
|
44
|
+
sysName?: string | undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** What a discovered (ARP/FDB) endpoint tells us about itself. */
|
|
48
|
+
export interface EndpointRoleSignals {
|
|
49
|
+
/** User-editable free text: "POS", "Camera", "Printer", ... */
|
|
50
|
+
classification?: string | undefined;
|
|
51
|
+
vendor?: string | undefined;
|
|
52
|
+
name?: string | undefined;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface RoleRule {
|
|
56
|
+
role: NetworkTopologyDeviceRole;
|
|
57
|
+
pattern: RegExp;
|
|
58
|
+
/*
|
|
59
|
+
* Only applied when the vendor evidence matches. This is what keeps
|
|
60
|
+
* Juniper's MX960 (a core router) apart from Meraki's MX64 (a security
|
|
61
|
+
* appliance) — the model strings are otherwise the same shape.
|
|
62
|
+
*/
|
|
63
|
+
vendor?: RegExp | undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Human-readable role names. One source of truth for UI and tests. */
|
|
67
|
+
export const DEVICE_ROLE_LABELS: Record<NetworkTopologyDeviceRole, string> = {
|
|
68
|
+
router: "Router",
|
|
69
|
+
switch: "Switch",
|
|
70
|
+
firewall: "Firewall",
|
|
71
|
+
wirelessAccessPoint: "Wireless AP",
|
|
72
|
+
loadBalancer: "Load balancer",
|
|
73
|
+
server: "Server",
|
|
74
|
+
storage: "Storage",
|
|
75
|
+
printer: "Printer",
|
|
76
|
+
camera: "Camera",
|
|
77
|
+
phone: "IP phone",
|
|
78
|
+
host: "Host",
|
|
79
|
+
unknown: "Unknown type",
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** Every role except "unknown", in the order a legend should list them. */
|
|
83
|
+
export const DEVICE_ROLES_IN_LEGEND_ORDER: ReadonlyArray<NetworkTopologyDeviceRole> =
|
|
84
|
+
[
|
|
85
|
+
"router",
|
|
86
|
+
"switch",
|
|
87
|
+
"firewall",
|
|
88
|
+
"wirelessAccessPoint",
|
|
89
|
+
"loadBalancer",
|
|
90
|
+
"server",
|
|
91
|
+
"storage",
|
|
92
|
+
"printer",
|
|
93
|
+
"camera",
|
|
94
|
+
"phone",
|
|
95
|
+
"host",
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* Tier 1 — named product families. Ordered most specific first, because
|
|
100
|
+
* the first match wins: the leaf roles come before the infrastructure
|
|
101
|
+
* ones so "Cisco IP Phone 7961" is a phone rather than being swallowed by
|
|
102
|
+
* a later Cisco rule.
|
|
103
|
+
*
|
|
104
|
+
* A note on the boundaries. Every pattern is anchored with a LEADING \b
|
|
105
|
+
* and, for the model-code alternatives, deliberately no trailing one:
|
|
106
|
+
* real model strings run straight on into suffixes ("AIR-CAP3702I-A-K9",
|
|
107
|
+
* "C9300L-24P", "DCS-7050SX3-48YC8"), and a closing \b silently refuses
|
|
108
|
+
* to match every one of them. Alternatives that are ordinary words keep
|
|
109
|
+
* their own trailing \b, so "nas" cannot match "nasa".
|
|
110
|
+
*/
|
|
111
|
+
const PRODUCT_RULES: ReadonlyArray<RoleRule> = [
|
|
112
|
+
// --- leaf devices that also speak SNMP ---
|
|
113
|
+
{
|
|
114
|
+
role: "camera",
|
|
115
|
+
pattern:
|
|
116
|
+
/\b(?:ip[- ]?camera|network camera|cctv\b|nvr\b|hikvision|dahua|axis [pqmf]\d{4})/,
|
|
117
|
+
},
|
|
118
|
+
{ role: "camera", pattern: /\bmv\d{2}/, vendor: /meraki|cisco/ },
|
|
119
|
+
{
|
|
120
|
+
role: "phone",
|
|
121
|
+
pattern:
|
|
122
|
+
/\b(?:ip phone|voip phone|desk phone|polycom|yealink|grandstream|snom\b|spa\d{3}|cp-\d{4})/,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
role: "printer",
|
|
126
|
+
pattern:
|
|
127
|
+
/\b(?:laserjet|officejet|deskjet|designjet|jetdirect|imagerunner|workcentre|workcenter|bizhub|kyocera|lexmark|mfp\b|multifunction printer)/,
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
// --- firewalls / security appliances ---
|
|
131
|
+
{ role: "firewall", pattern: /\b(?:fortigate|fortiwifi|forti-gate)/ },
|
|
132
|
+
{
|
|
133
|
+
role: "firewall",
|
|
134
|
+
pattern: /\b(?:palo alto|pan-?os\b|pa-\d{3,4})/,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
role: "firewall",
|
|
138
|
+
pattern:
|
|
139
|
+
/\b(?:adaptive security appliance|cisco asa\b|asa\d{4}|firepower|ftd\b|pix\b)/,
|
|
140
|
+
},
|
|
141
|
+
{ role: "firewall", pattern: /\bsrx ?\d{2,4}|\bsrx\b/ },
|
|
142
|
+
{
|
|
143
|
+
role: "firewall",
|
|
144
|
+
pattern:
|
|
145
|
+
/\b(?:sonicwall|watchguard|check ?point|gaia\b|pfsense|opnsense|untangle|barracuda)/,
|
|
146
|
+
},
|
|
147
|
+
{ role: "firewall", pattern: /\bsophos (?:xg|xgs|utm|sg)\b/ },
|
|
148
|
+
{
|
|
149
|
+
role: "firewall",
|
|
150
|
+
pattern: /\bmx\d{2,3}|\bz\d{1,2}\b/,
|
|
151
|
+
vendor: /meraki/,
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
// --- load balancers / application delivery ---
|
|
155
|
+
{
|
|
156
|
+
role: "loadBalancer",
|
|
157
|
+
pattern:
|
|
158
|
+
/\b(?:big-?ip|f5 networks|tmos\b|netscaler|citrix adc|a10 thunder|ax\d{4}|loadmaster|avi vantage|haproxy)/,
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
// --- wireless ---
|
|
162
|
+
{
|
|
163
|
+
role: "wirelessAccessPoint",
|
|
164
|
+
pattern:
|
|
165
|
+
/\b(?:aironet|air-(?:cap|ap|lap|sap|ct)|wlc\b|wireless lan controller|wireless controller)/,
|
|
166
|
+
},
|
|
167
|
+
/*
|
|
168
|
+
* Cisco recycled "Catalyst" across three roles, so the two that are not
|
|
169
|
+
* switches have to be claimed before the blanket Catalyst rule below:
|
|
170
|
+
* a 9800 is a wireless controller and an 8000 is a router.
|
|
171
|
+
*/
|
|
172
|
+
{
|
|
173
|
+
role: "wirelessAccessPoint",
|
|
174
|
+
pattern: /\b(?:catalyst 98\d{2}|c98\d{2})/,
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
role: "wirelessAccessPoint",
|
|
178
|
+
pattern:
|
|
179
|
+
/\b(?:unifi ap|uap[- ]|u6-|nanostation|instant ap|iap\b|aruba ap|ap-\d{3}|fortiap|omada|eap\d{3}|cw9\d{3})/,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
role: "wirelessAccessPoint",
|
|
183
|
+
pattern: /\bmr\d{2,3}/,
|
|
184
|
+
vendor: /meraki/,
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* --- switches ---
|
|
189
|
+
* First, the other half of the Catalyst disambiguation above.
|
|
190
|
+
*/
|
|
191
|
+
{
|
|
192
|
+
role: "router",
|
|
193
|
+
pattern: /\b(?:catalyst 8\d{3}|c8\d{3})/,
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
role: "switch",
|
|
197
|
+
pattern:
|
|
198
|
+
/\b(?:catalyst|nexus|ws-c\d|c9[2345]\d{2}|c1000|c2960|c3[578]\d{2}|me-\d{4})/,
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
role: "switch",
|
|
202
|
+
pattern: /\b(?:ex\d{4}|qfx\d{4})/,
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
role: "switch",
|
|
206
|
+
pattern: /\bms\d{2,3}/,
|
|
207
|
+
vendor: /meraki/,
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
role: "switch",
|
|
211
|
+
pattern:
|
|
212
|
+
/\b(?:fortiswitch|procurve|powerconnect|force10|dcs-\d{4}|icx\d{4}|edgeswitch|unifi switch|usw-|crs\d{3}|css\d{3}|sg\d{3}|gs\d{3}|jl\d{3}[a-z]|s\d{4}-on|n\d{4}-on)/,
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
// --- routers ---
|
|
216
|
+
{
|
|
217
|
+
role: "router",
|
|
218
|
+
pattern: /\b(?:isr ?\d{3,4}|isr\b|asr ?\d{3,4}|c11\d{2}|c89\d\b|csr1000v)/,
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
role: "router",
|
|
222
|
+
pattern: /\b(?:mx\d{2,4}|ptx\d{4}|acx\d{4})/,
|
|
223
|
+
vendor: /juniper|junos/,
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
role: "router",
|
|
227
|
+
pattern:
|
|
228
|
+
/\b(?:routeros|mikrotik|ccr\d{4}|rb\d{3,4}|edgerouter|vyos\b|vsr\b)/,
|
|
229
|
+
},
|
|
230
|
+
|
|
231
|
+
// --- storage ---
|
|
232
|
+
{
|
|
233
|
+
role: "storage",
|
|
234
|
+
pattern:
|
|
235
|
+
/\b(?:netapp|data ontap|isilon|powerstore|powervault|unity xt|synology|qnap|truenas|freenas|pure ?storage|nimble storage|storwize|nas\b|san\b)/,
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
// --- servers / hypervisors / lights-out controllers ---
|
|
239
|
+
{
|
|
240
|
+
role: "server",
|
|
241
|
+
pattern:
|
|
242
|
+
/\b(?:esxi|vmware|proxmox|hyper-?v\b|xenserver|idrac\b|ilo\b|integrated lights-out|cimc\b|poweredge|proliant|thinksystem|primergy)/,
|
|
243
|
+
},
|
|
244
|
+
];
|
|
245
|
+
|
|
246
|
+
/*
|
|
247
|
+
* Tier 3 — the generic words. Only consulted when no product family
|
|
248
|
+
* matched, and only against sysDescr, which is the one field vendors
|
|
249
|
+
* write a sentence into.
|
|
250
|
+
*/
|
|
251
|
+
const GENERIC_RULES: ReadonlyArray<RoleRule> = [
|
|
252
|
+
{
|
|
253
|
+
role: "firewall",
|
|
254
|
+
pattern: /\b(firewall|security appliance|utm appliance)\b/,
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
role: "loadBalancer",
|
|
258
|
+
pattern: /\b(load ?balancer|application delivery controller)\b/,
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
role: "wirelessAccessPoint",
|
|
262
|
+
pattern: /\b(access point|wireless|wi-?fi|wlan)\b/,
|
|
263
|
+
},
|
|
264
|
+
{ role: "printer", pattern: /\b(printer|print server|copier|scanner)\b/ },
|
|
265
|
+
{ role: "camera", pattern: /\bcamera\b/ },
|
|
266
|
+
{ role: "phone", pattern: /\b(phone|voip)\b/ },
|
|
267
|
+
{ role: "switch", pattern: /\b(switch|switching)\b/ },
|
|
268
|
+
{ role: "router", pattern: /\b(router|routing|gateway)\b/ },
|
|
269
|
+
{ role: "storage", pattern: /\b(storage array|storage system|filer)\b/ },
|
|
270
|
+
];
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
* The weakest evidence there is: a general-purpose operating system in
|
|
274
|
+
* sysDescr. It says the box is a computer, not what job it does — plenty
|
|
275
|
+
* of switches and firewalls announce a Linux kernel — so it is consulted
|
|
276
|
+
* only after the hostname has had its say. A machine called "gw-1" that
|
|
277
|
+
* runs Linux is a router; a machine called "app-3" that runs Linux is a
|
|
278
|
+
* server.
|
|
279
|
+
*/
|
|
280
|
+
const OPERATING_SYSTEM_RULES: ReadonlyArray<RoleRule> = [
|
|
281
|
+
{
|
|
282
|
+
role: "server",
|
|
283
|
+
pattern:
|
|
284
|
+
/\b(linux|windows|ubuntu|debian|centos|red ?hat|freebsd|solaris|net-snmp|\bserver\b)\b/,
|
|
285
|
+
},
|
|
286
|
+
];
|
|
287
|
+
|
|
288
|
+
/*
|
|
289
|
+
* Tier 2 — sysObjectId enterprise arcs, for vendors that only make one
|
|
290
|
+
* kind of box. Deliberately short: a vendor with a mixed catalogue (Cisco,
|
|
291
|
+
* Juniper, HPE, Ubiquiti) tells us nothing here, and a wrong shape is
|
|
292
|
+
* worse than a neutral one. Matched on dotted-prefix boundaries so
|
|
293
|
+
* ".1.3.6.1.4.1.11" cannot swallow ".1.3.6.1.4.1.1124".
|
|
294
|
+
*/
|
|
295
|
+
const SYS_OBJECT_ID_RULES: ReadonlyArray<{
|
|
296
|
+
prefix: string;
|
|
297
|
+
role: NetworkTopologyDeviceRole;
|
|
298
|
+
}> = [
|
|
299
|
+
// Printers, most specific arcs first (HP's printer arc sits under HP's).
|
|
300
|
+
{ prefix: "1.3.6.1.4.1.11.2.3.9", role: "printer" },
|
|
301
|
+
{ prefix: "1.3.6.1.4.1.641", role: "printer" }, // Lexmark
|
|
302
|
+
{ prefix: "1.3.6.1.4.1.1602", role: "printer" }, // Canon
|
|
303
|
+
{ prefix: "1.3.6.1.4.1.367", role: "printer" }, // Ricoh
|
|
304
|
+
{ prefix: "1.3.6.1.4.1.253", role: "printer" }, // Xerox
|
|
305
|
+
{ prefix: "1.3.6.1.4.1.1248", role: "printer" }, // Epson
|
|
306
|
+
{ prefix: "1.3.6.1.4.1.236", role: "printer" }, // Samsung printers
|
|
307
|
+
// Firewalls.
|
|
308
|
+
{ prefix: "1.3.6.1.4.1.12356", role: "firewall" }, // Fortinet
|
|
309
|
+
{ prefix: "1.3.6.1.4.1.25461", role: "firewall" }, // Palo Alto
|
|
310
|
+
{ prefix: "1.3.6.1.4.1.2620", role: "firewall" }, // Check Point
|
|
311
|
+
{ prefix: "1.3.6.1.4.1.8741", role: "firewall" }, // SonicWall
|
|
312
|
+
{ prefix: "1.3.6.1.4.1.3097", role: "firewall" }, // WatchGuard
|
|
313
|
+
{ prefix: "1.3.6.1.4.1.2604", role: "firewall" }, // Sophos / Astaro
|
|
314
|
+
// Load balancers.
|
|
315
|
+
{ prefix: "1.3.6.1.4.1.3375", role: "loadBalancer" }, // F5
|
|
316
|
+
{ prefix: "1.3.6.1.4.1.5951", role: "loadBalancer" }, // Citrix NetScaler
|
|
317
|
+
{ prefix: "1.3.6.1.4.1.22610", role: "loadBalancer" }, // A10
|
|
318
|
+
// Storage.
|
|
319
|
+
{ prefix: "1.3.6.1.4.1.789", role: "storage" }, // NetApp
|
|
320
|
+
// Switching / routing houses.
|
|
321
|
+
{ prefix: "1.3.6.1.4.1.30065", role: "switch" }, // Arista
|
|
322
|
+
{ prefix: "1.3.6.1.4.1.6027", role: "switch" }, // Force10 / Dell
|
|
323
|
+
{ prefix: "1.3.6.1.4.1.14988", role: "router" }, // MikroTik
|
|
324
|
+
];
|
|
325
|
+
|
|
326
|
+
/*
|
|
327
|
+
* Generic SNMP agents. These identify the AGENT, not the appliance — a
|
|
328
|
+
* Linux firewall answers on Net-SNMP just as readily as a database server
|
|
329
|
+
* does — so, like the OS rules, they are consulted only after the
|
|
330
|
+
* hostname.
|
|
331
|
+
*/
|
|
332
|
+
const GENERIC_AGENT_SYS_OBJECT_ID_RULES: ReadonlyArray<{
|
|
333
|
+
prefix: string;
|
|
334
|
+
role: NetworkTopologyDeviceRole;
|
|
335
|
+
}> = [
|
|
336
|
+
{ prefix: "1.3.6.1.4.1.8072", role: "server" }, // Net-SNMP
|
|
337
|
+
{ prefix: "1.3.6.1.4.1.2021", role: "server" }, // UCD-SNMP
|
|
338
|
+
{ prefix: "1.3.6.1.4.1.311", role: "server" }, // Microsoft
|
|
339
|
+
{ prefix: "1.3.6.1.4.1.6876", role: "server" }, // VMware
|
|
340
|
+
];
|
|
341
|
+
|
|
342
|
+
/*
|
|
343
|
+
* Tier 4 — hostname conventions. Whole tokens only ("core-sw-1" → "sw",
|
|
344
|
+
* "edge-fw01" → "fw01"), never substrings, so "swan" is not a switch and
|
|
345
|
+
* "apex" is not an access point.
|
|
346
|
+
*/
|
|
347
|
+
const NAME_RULES: ReadonlyArray<RoleRule> = [
|
|
348
|
+
{ role: "router", pattern: /^(rtr|router|rt|gw|gwy|gateway)\d*$/ },
|
|
349
|
+
{
|
|
350
|
+
role: "switch",
|
|
351
|
+
pattern: /^(sw|swi|switch|sws|dsw|asw|csw|tor|leaf|spine)\d*$/,
|
|
352
|
+
},
|
|
353
|
+
{ role: "firewall", pattern: /^(fw|fwl|firewall|asa|ngfw|utm)\d*$/ },
|
|
354
|
+
{ role: "wirelessAccessPoint", pattern: /^(ap|wap|wifi|wlan|wlc)\d*$/ },
|
|
355
|
+
{ role: "loadBalancer", pattern: /^(lb|slb|adc|vip)\d*$/ },
|
|
356
|
+
{ role: "server", pattern: /^(srv|server|esx|esxi|vmhost)\d*$/ },
|
|
357
|
+
{ role: "storage", pattern: /^(nas|san|stor|storage|filer)\d*$/ },
|
|
358
|
+
{ role: "camera", pattern: /^(cam|camera|ipcam|cctv)\d*$/ },
|
|
359
|
+
{ role: "printer", pattern: /^(prn|print|printer|mfp)\d*$/ },
|
|
360
|
+
{ role: "phone", pattern: /^(phone|voip|sip)\d*$/ },
|
|
361
|
+
];
|
|
362
|
+
|
|
363
|
+
/*
|
|
364
|
+
* Endpoint classifications are free text a human typed, so they are
|
|
365
|
+
* matched loosely — but still whole-word, and still ordered so the
|
|
366
|
+
* specific ones win.
|
|
367
|
+
*/
|
|
368
|
+
const ENDPOINT_RULES: ReadonlyArray<RoleRule> = [
|
|
369
|
+
{
|
|
370
|
+
role: "camera",
|
|
371
|
+
pattern:
|
|
372
|
+
/\b(camera|cam|cctv|nvr|dvr|hikvision|dahua|axis communications)\b/,
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
role: "printer",
|
|
376
|
+
pattern:
|
|
377
|
+
/\b(printer|print|mfp|copier|scanner|label|zebra|brother|lexmark|kyocera|ricoh|xerox|epson)\b/,
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
role: "phone",
|
|
381
|
+
pattern:
|
|
382
|
+
/\b(phone|voip|sip|handset|intercom|polycom|yealink|avaya|mitel)\b/,
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
role: "wirelessAccessPoint",
|
|
386
|
+
pattern: /\b(access point|\bap\b|wireless|wi-?fi)\b/,
|
|
387
|
+
},
|
|
388
|
+
{ role: "switch", pattern: /\bswitch\b/ },
|
|
389
|
+
{ role: "router", pattern: /\b(router|gateway)\b/ },
|
|
390
|
+
{ role: "server", pattern: /\b(server|nas|hypervisor)\b/ },
|
|
391
|
+
];
|
|
392
|
+
|
|
393
|
+
/** Lowercase, whitespace-collapsed, and safe on undefined. */
|
|
394
|
+
function normalize(value: string | undefined): string {
|
|
395
|
+
return (value || "").toLowerCase().replace(/\s+/g, " ").trim();
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function firstMatch(
|
|
399
|
+
rules: ReadonlyArray<RoleRule>,
|
|
400
|
+
haystack: string,
|
|
401
|
+
vendorText: string,
|
|
402
|
+
): NetworkTopologyDeviceRole | undefined {
|
|
403
|
+
if (!haystack) {
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
for (const rule of rules) {
|
|
407
|
+
if (rule.vendor && !rule.vendor.test(vendorText)) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
if (rule.pattern.test(haystack)) {
|
|
411
|
+
return rule.role;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/*
|
|
418
|
+
* Dotted-prefix containment: the arc must end at a dot or at the end of
|
|
419
|
+
* the OID. Leading dots (".1.3.6.1...", which plenty of agents emit) are
|
|
420
|
+
* stripped first.
|
|
421
|
+
*/
|
|
422
|
+
function roleForSysObjectId(
|
|
423
|
+
sysObjectId: string | undefined,
|
|
424
|
+
rules: ReadonlyArray<{ prefix: string; role: NetworkTopologyDeviceRole }>,
|
|
425
|
+
): NetworkTopologyDeviceRole | undefined {
|
|
426
|
+
const oid: string = normalize(sysObjectId).replace(/^\.+/, "");
|
|
427
|
+
if (!oid) {
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
for (const rule of rules) {
|
|
431
|
+
if (oid === rule.prefix || oid.startsWith(`${rule.prefix}.`)) {
|
|
432
|
+
return rule.role;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return undefined;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function roleForNameText(
|
|
439
|
+
value: string | undefined,
|
|
440
|
+
): NetworkTopologyDeviceRole | undefined {
|
|
441
|
+
const text: string = normalize(value);
|
|
442
|
+
if (!text) {
|
|
443
|
+
return undefined;
|
|
444
|
+
}
|
|
445
|
+
/*
|
|
446
|
+
* Split on anything that is not a letter or a digit, which is how the
|
|
447
|
+
* separators people actually use ("-", ".", "_", " ") all behave.
|
|
448
|
+
*/
|
|
449
|
+
for (const token of text.split(/[^a-z0-9]+/)) {
|
|
450
|
+
if (!token) {
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
for (const rule of NAME_RULES) {
|
|
454
|
+
if (rule.pattern.test(token)) {
|
|
455
|
+
return rule.role;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The role of one network device (managed) or discovery-protocol peer
|
|
464
|
+
* (unmanaged).
|
|
465
|
+
*
|
|
466
|
+
* Total: always returns a role, "unknown" when nothing is conclusive.
|
|
467
|
+
*/
|
|
468
|
+
export function classifyDeviceRole(
|
|
469
|
+
signals: DeviceRoleSignals,
|
|
470
|
+
): NetworkTopologyDeviceRole {
|
|
471
|
+
const model: string = normalize(
|
|
472
|
+
[signals.deviceModel, signals.platform].filter(Boolean).join(" "),
|
|
473
|
+
);
|
|
474
|
+
const sysDescr: string = normalize(signals.sysDescr);
|
|
475
|
+
/*
|
|
476
|
+
* Vendor guards read every identity field, not just `vendor` — the word
|
|
477
|
+
* "Meraki" usually arrives inside sysDescr or the platform string, and
|
|
478
|
+
* `vendor` itself is often empty on an unmanaged peer.
|
|
479
|
+
*/
|
|
480
|
+
const vendorText: string = normalize(
|
|
481
|
+
[signals.vendor, signals.deviceModel, signals.platform, signals.sysDescr]
|
|
482
|
+
.filter(Boolean)
|
|
483
|
+
.join(" "),
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
return (
|
|
487
|
+
firstMatch(PRODUCT_RULES, model, vendorText) ??
|
|
488
|
+
firstMatch(PRODUCT_RULES, sysDescr, vendorText) ??
|
|
489
|
+
roleForSysObjectId(signals.sysObjectId, SYS_OBJECT_ID_RULES) ??
|
|
490
|
+
firstMatch(GENERIC_RULES, sysDescr, vendorText) ??
|
|
491
|
+
roleForNameText(signals.sysName) ??
|
|
492
|
+
roleForNameText(signals.name) ??
|
|
493
|
+
roleForSysObjectId(
|
|
494
|
+
signals.sysObjectId,
|
|
495
|
+
GENERIC_AGENT_SYS_OBJECT_ID_RULES,
|
|
496
|
+
) ??
|
|
497
|
+
firstMatch(OPERATING_SYSTEM_RULES, sysDescr, vendorText) ??
|
|
498
|
+
"unknown"
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* The role of a discovered (ARP/FDB) endpoint.
|
|
504
|
+
*
|
|
505
|
+
* An endpoint is a host until something says otherwise — that is what
|
|
506
|
+
* being on the far side of an access port means — so this never returns
|
|
507
|
+
* "unknown". The classification field is a human's own words about the
|
|
508
|
+
* thing, so it is read first, then the OUI vendor, then the name.
|
|
509
|
+
*/
|
|
510
|
+
export function classifyEndpointRole(
|
|
511
|
+
signals: EndpointRoleSignals,
|
|
512
|
+
): NetworkTopologyDeviceRole {
|
|
513
|
+
const classification: string = normalize(signals.classification);
|
|
514
|
+
const vendor: string = normalize(signals.vendor);
|
|
515
|
+
const name: string = normalize(signals.name);
|
|
516
|
+
|
|
517
|
+
return (
|
|
518
|
+
firstMatch(ENDPOINT_RULES, classification, classification) ??
|
|
519
|
+
firstMatch(ENDPOINT_RULES, vendor, vendor) ??
|
|
520
|
+
firstMatch(ENDPOINT_RULES, name, name) ??
|
|
521
|
+
"host"
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/** Display name for a role. Falls back to the "unknown" label. */
|
|
526
|
+
export function labelForDeviceRole(
|
|
527
|
+
role: NetworkTopologyDeviceRole | undefined,
|
|
528
|
+
): string {
|
|
529
|
+
if (!role) {
|
|
530
|
+
return DEVICE_ROLE_LABELS.unknown;
|
|
531
|
+
}
|
|
532
|
+
return DEVICE_ROLE_LABELS[role] || DEVICE_ROLE_LABELS.unknown;
|
|
533
|
+
}
|
|
@@ -8,6 +8,10 @@ import NetworkTopology, {
|
|
|
8
8
|
import LldpNeighbor from "../../Types/Monitor/SnmpMonitor/LldpNeighbor";
|
|
9
9
|
import CdpNeighbor from "../../Types/Monitor/SnmpMonitor/CdpNeighbor";
|
|
10
10
|
import { normalizeMac } from "./EndpointAttachmentUtil";
|
|
11
|
+
import {
|
|
12
|
+
classifyDeviceRole,
|
|
13
|
+
classifyEndpointRole,
|
|
14
|
+
} from "./NetworkDeviceRoleUtil";
|
|
11
15
|
|
|
12
16
|
export interface TopologyDeviceInput {
|
|
13
17
|
id: string;
|
|
@@ -19,6 +23,12 @@ export interface TopologyDeviceInput {
|
|
|
19
23
|
interfacesDown?: number | undefined;
|
|
20
24
|
vendor?: string | undefined;
|
|
21
25
|
deviceModel?: string | undefined;
|
|
26
|
+
/*
|
|
27
|
+
* SNMP identity, carried purely so the node can be classified into a
|
|
28
|
+
* role (router/switch/firewall/...). Neither is rendered directly.
|
|
29
|
+
*/
|
|
30
|
+
sysDescr?: string | undefined;
|
|
31
|
+
sysObjectId?: string | undefined;
|
|
22
32
|
lldpNeighbors?: Array<LldpNeighbor> | undefined;
|
|
23
33
|
cdpNeighbors?: Array<CdpNeighbor> | undefined;
|
|
24
34
|
}
|
|
@@ -145,6 +155,14 @@ export default class NetworkTopologyUtil {
|
|
|
145
155
|
name: device.name,
|
|
146
156
|
isManaged: true,
|
|
147
157
|
kind: "device",
|
|
158
|
+
role: classifyDeviceRole({
|
|
159
|
+
sysDescr: device.sysDescr,
|
|
160
|
+
sysObjectId: device.sysObjectId,
|
|
161
|
+
vendor: device.vendor,
|
|
162
|
+
deviceModel: device.deviceModel,
|
|
163
|
+
name: device.name,
|
|
164
|
+
sysName: device.sysName || device.hostname,
|
|
165
|
+
}),
|
|
148
166
|
status: NetworkTopologyUtil.deviceStatus(device, now),
|
|
149
167
|
interfacesUp: device.interfacesUp,
|
|
150
168
|
interfacesDown: device.interfacesDown,
|
|
@@ -180,19 +198,33 @@ export default class NetworkTopologyUtil {
|
|
|
180
198
|
const existingUnmanaged: NetworkTopologyNode | undefined =
|
|
181
199
|
unmanagedNodeById.get(toNodeId);
|
|
182
200
|
if (!existingUnmanaged) {
|
|
201
|
+
const unmanagedName: string = claim.displayName || "Unknown device";
|
|
183
202
|
const unmanagedNode: NetworkTopologyNode = {
|
|
184
203
|
id: toNodeId,
|
|
185
|
-
name:
|
|
204
|
+
name: unmanagedName,
|
|
186
205
|
isManaged: false,
|
|
187
206
|
kind: "unmanaged",
|
|
207
|
+
role: classifyDeviceRole({
|
|
208
|
+
platform: claim.remotePlatform,
|
|
209
|
+
name: unmanagedName,
|
|
210
|
+
}),
|
|
188
211
|
status: "unknown",
|
|
189
212
|
deviceModel: claim.remotePlatform,
|
|
190
213
|
};
|
|
191
214
|
unmanagedNodeById.set(toNodeId, unmanagedNode);
|
|
192
215
|
nodes.push(unmanagedNode);
|
|
193
216
|
} else if (!existingUnmanaged.deviceModel && claim.remotePlatform) {
|
|
194
|
-
|
|
217
|
+
/*
|
|
218
|
+
* A later CDP claim may know the platform the first one didn't
|
|
219
|
+
* — which is usually the only evidence a peer's role rests on,
|
|
220
|
+
* so the role is re-derived rather than left at whatever the
|
|
221
|
+
* name alone produced.
|
|
222
|
+
*/
|
|
195
223
|
existingUnmanaged.deviceModel = claim.remotePlatform;
|
|
224
|
+
existingUnmanaged.role = classifyDeviceRole({
|
|
225
|
+
platform: claim.remotePlatform,
|
|
226
|
+
name: existingUnmanaged.name,
|
|
227
|
+
});
|
|
196
228
|
}
|
|
197
229
|
}
|
|
198
230
|
|
|
@@ -348,15 +380,21 @@ export default class NetworkTopologyUtil {
|
|
|
348
380
|
renderedEndpointCount++;
|
|
349
381
|
|
|
350
382
|
const nodeId: string = `endpoint:${endpoint.id}`;
|
|
383
|
+
const endpointName: string =
|
|
384
|
+
endpoint.classification ||
|
|
385
|
+
endpoint.vendor ||
|
|
386
|
+
endpoint.ipAddress ||
|
|
387
|
+
endpoint.macAddress;
|
|
351
388
|
nodes.push({
|
|
352
389
|
id: nodeId,
|
|
353
|
-
name:
|
|
354
|
-
endpoint.classification ||
|
|
355
|
-
endpoint.vendor ||
|
|
356
|
-
endpoint.ipAddress ||
|
|
357
|
-
endpoint.macAddress,
|
|
390
|
+
name: endpointName,
|
|
358
391
|
isManaged: false,
|
|
359
392
|
kind: "endpoint",
|
|
393
|
+
role: classifyEndpointRole({
|
|
394
|
+
classification: endpoint.classification,
|
|
395
|
+
vendor: endpoint.vendor,
|
|
396
|
+
name: endpointName,
|
|
397
|
+
}),
|
|
360
398
|
status: NetworkTopologyUtil.statusFromLastSeen(
|
|
361
399
|
endpoint.lastSeenAt,
|
|
362
400
|
now,
|
|
@@ -202,3 +202,69 @@ export function keyForDockerSwarmCluster(
|
|
|
202
202
|
identifyingAttributes: { "docker.swarm.cluster.name": clusterName },
|
|
203
203
|
});
|
|
204
204
|
}
|
|
205
|
+
|
|
206
|
+
/*
|
|
207
|
+
* ---- Rows without telemetry ----------------------------------------------
|
|
208
|
+
*
|
|
209
|
+
* The helpers above mirror an ingest-side resolver, so their identifying
|
|
210
|
+
* attribute is dictated by semconv — the key MUST byte-match what ingest
|
|
211
|
+
* stamped or the lookup finds nothing. The two below have no ingest-side
|
|
212
|
+
* counterpart to match: nothing about a hand-registered vendor API or an
|
|
213
|
+
* SNMP-polled switch ever flows through an OTLP resource. Their identity is
|
|
214
|
+
* therefore chosen here, and the only real requirement is that it is stable
|
|
215
|
+
* and collision-free within a project.
|
|
216
|
+
*/
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Identity attribute for a manually created CI. Its value is the CI's
|
|
220
|
+
* canonicalized display name, which makes (project, type, name) the natural
|
|
221
|
+
* key — so re-creating a deleted CI under the same name reuses its key, and
|
|
222
|
+
* two CIs of one type cannot share a name.
|
|
223
|
+
*/
|
|
224
|
+
export const MANUAL_ENTITY_IDENTITY_ATTRIBUTE: string = "oneuptime.entity.name";
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Key for a manually created CI. Pass the user-entered display name; it is
|
|
228
|
+
* canonicalized (trimmed + lowercased) exactly like every other identity
|
|
229
|
+
* value, so casing drift on re-entry does not fork identity.
|
|
230
|
+
*/
|
|
231
|
+
export function keyForManualEntity(
|
|
232
|
+
projectId: string,
|
|
233
|
+
entityType: EntityType,
|
|
234
|
+
displayName: string,
|
|
235
|
+
): string {
|
|
236
|
+
return computeEntityKey({
|
|
237
|
+
projectId,
|
|
238
|
+
entityType,
|
|
239
|
+
identifyingAttributes: {
|
|
240
|
+
[MANUAL_ENTITY_IDENTITY_ATTRIBUTE]: displayName,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Identity attribute for an inventory-mirrored CI. The value is the owning
|
|
247
|
+
* row's ObjectID rather than its name: unlike the semconv-derived types,
|
|
248
|
+
* the inventory row IS the identity, and keying on the id means renaming a
|
|
249
|
+
* device in the UI does not orphan its registry row and mint a second one.
|
|
250
|
+
*/
|
|
251
|
+
export const INVENTORY_ENTITY_IDENTITY_ATTRIBUTE: string =
|
|
252
|
+
"oneuptime.resource.id";
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Key for a row mirrored out of a OneUptime inventory table. Pass the
|
|
256
|
+
* owning row's id (e.g. `NetworkDevice.id`).
|
|
257
|
+
*/
|
|
258
|
+
export function keyForInventoryEntity(
|
|
259
|
+
projectId: string,
|
|
260
|
+
entityType: EntityType,
|
|
261
|
+
resourceId: string,
|
|
262
|
+
): string {
|
|
263
|
+
return computeEntityKey({
|
|
264
|
+
projectId,
|
|
265
|
+
entityType,
|
|
266
|
+
identifyingAttributes: {
|
|
267
|
+
[INVENTORY_ENTITY_IDENTITY_ATTRIBUTE]: resourceId,
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
}
|