@oneuptime/common 12.0.5 → 12.0.7
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/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
- package/Models/DatabaseModels/DeletedProject.ts +595 -0
- package/Models/DatabaseModels/Index.ts +5 -0
- package/Models/DatabaseModels/Monitor.ts +111 -0
- package/Models/DatabaseModels/Project.ts +3 -3
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- 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 +50 -7
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- 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/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIAgentService.ts +20 -0
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DashboardDomainService.ts +73 -28
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/DatabaseService.ts +1 -0
- package/Server/Services/DeletedProjectService.ts +138 -0
- package/Server/Services/FileService.ts +61 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
- package/Server/Services/IncidentPublicNoteService.ts +18 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorService.ts +360 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/ProbeService.ts +20 -0
- package/Server/Services/ProjectService.ts +297 -1
- package/Server/Services/PushNotificationService.ts +71 -0
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
- package/Server/Services/StatusPageAnnouncementService.ts +53 -0
- package/Server/Services/StatusPageDomainService.ts +73 -28
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/TeamMemberService.ts +117 -12
- package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Services/UserWebhookService.ts +34 -109
- package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/DeleteById.ts +2 -0
- package/Server/Types/Database/DeleteOneBy.ts +6 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- 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 +41 -2
- 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/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +606 -0
- package/Server/Utils/DataSource/HttpFetch.ts +182 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/Execute.ts +8 -0
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -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/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +50 -0
- package/Server/Utils/Response.ts +154 -7
- package/Server/Utils/SSRFProtection.ts +450 -0
- package/Server/Utils/StartServer.ts +16 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VM/VMRunner.ts +88 -1
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +582 -53
- package/Server/Utils/Workspace/Slack/Slack.ts +30 -2
- package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -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/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
- package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
- package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -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/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- 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/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -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/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -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/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
- 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/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- 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/Dashboard/PublicDashboardResourceListPolicy.test.ts +912 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +714 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -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/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -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/Server/Views/OfflineRender.test.ts +297 -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/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
- package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -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/Password.test.ts +363 -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/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +1 -1
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/FilePicker.test.tsx +1 -1
- 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 +1 -1
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +489 -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/ObjectIdFilterPipeline.test.tsx +396 -0
- 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/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- 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 +1 -1
- package/Tests/UI/Components/TextArea.test.tsx +1 -1
- 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/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/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -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 +165 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
- package/Tests/Utils/Realtime.test.ts +78 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
- package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
- package/Types/AI/AIInsightEvidence.ts +6 -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/Analytics/RevenueEvent.ts +31 -0
- package/Types/Billing/BalanceAdjustmentType.ts +14 -0
- package/Types/Billing/ProjectBalanceType.ts +13 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Domain.ts +26 -0
- package/Types/File/MimeType.ts +11 -0
- package/Types/JSONFunctions.ts +15 -0
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/Types/Workflow/Components/BaseModel.ts +92 -28
- package/Typings/Index.d.ts +12 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +15 -5
- package/UI/Components/Modal/Modal.tsx +247 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/SideOver/SideOver.tsx +195 -68
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/PageScrollLock.ts +66 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
- package/Utils/Dashboard/VariableInterpolation.ts +19 -1
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/LegacySerializedArray.ts +60 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -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/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- 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 +4 -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/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- 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 +38 -4
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- 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/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.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/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.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/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- 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/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.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/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +277 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.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/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.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/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.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/TelemetryIngestionKeyService.js +1 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.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/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.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 +35 -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/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/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- 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/AnalyticsDatabase/InsertDedupContext.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/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +389 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +116 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.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/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- 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/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +46 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +121 -6
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +358 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +14 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.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/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +469 -46
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +23 -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/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- 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/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- 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/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/Types/Workflow/Components/BaseModel.js +83 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.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/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.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 +168 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.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/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.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/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.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/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- 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/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/LegacySerializedArray.js +51 -0
- package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.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/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
- package/jest.config.json +4 -0
- package/package.json +5 -1
- package/tsconfig.json +14 -10
|
@@ -0,0 +1,853 @@
|
|
|
1
|
+
import StatusPageGroup from "../../Models/DatabaseModels/StatusPageGroup";
|
|
2
|
+
import StatusPageResource from "../../Models/DatabaseModels/StatusPageResource";
|
|
3
|
+
import StatusPageGroupViewMode from "../../Types/StatusPage/StatusPageGroupViewMode";
|
|
4
|
+
import StatusPageGroupHierarchyViewUtil, {
|
|
5
|
+
StatusPageGroupHierarchyRow,
|
|
6
|
+
} from "./GroupHierarchyView";
|
|
7
|
+
import StatusPageGroupTreeUtil, {
|
|
8
|
+
StatusPageGroupTreeIndex,
|
|
9
|
+
StatusPageGroupTreeNode,
|
|
10
|
+
} from "./GroupTree";
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* The model behind the Resources tab: the one screen where an operator both
|
|
14
|
+
* builds a status page's group hierarchy and puts monitors into it.
|
|
15
|
+
*
|
|
16
|
+
* That screen used to be a tree of group rows, and opening a row mounted a
|
|
17
|
+
* whole ModelTable - card, title, description, create button, overflow menu,
|
|
18
|
+
* checkbox column, pagination footer - inside it. Nesting a table's worth of
|
|
19
|
+
* chrome inside a row of another tree made a simple question ("what is in this
|
|
20
|
+
* group, and how do I add to it?") read as a stack of half-collapsed
|
|
21
|
+
* dashboards, and it only got worse the deeper the group sat. The groups
|
|
22
|
+
* themselves were managed on a second page entirely, so building a status page
|
|
23
|
+
* meant navigating back and forth between the two halves of one job.
|
|
24
|
+
*
|
|
25
|
+
* So the screen is an explorer now: the hierarchy on the left - to navigate and
|
|
26
|
+
* to edit - and the contents of exactly one selected group on the right. That
|
|
27
|
+
* is the shape every operator already knows from a file browser, and it has a
|
|
28
|
+
* property the old tab could not have - one group is loaded at a time, whatever
|
|
29
|
+
* the hierarchy costs, which is what keeps a fifteen hundred group status page
|
|
30
|
+
* from firing fifteen hundred requests the moment the tab opens (issue #3042).
|
|
31
|
+
*
|
|
32
|
+
* Everything here is the part of that explorer worth pinning down without a
|
|
33
|
+
* renderer: what the navigator draws, which counts each row is allowed to
|
|
34
|
+
* claim, what a selection resolves to, and how a drag turns into the one write
|
|
35
|
+
* the server understands.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* How many resources belong to each group, worked out once from a single list
|
|
40
|
+
* of every resource on the status page rather than one count request per group
|
|
41
|
+
* - fifteen hundred count requests is the same stampede this file exists to
|
|
42
|
+
* remove.
|
|
43
|
+
*/
|
|
44
|
+
export interface StatusPageResourceCountIndex {
|
|
45
|
+
/*
|
|
46
|
+
* Keyed by group id. A group with no resources of its own is absent rather
|
|
47
|
+
* than present with a zero, so callers must read it through
|
|
48
|
+
* getOwnResourceCount.
|
|
49
|
+
*/
|
|
50
|
+
ownCountByGroupId: Map<string, number>;
|
|
51
|
+
/* Resources that belong to no group at all. */
|
|
52
|
+
ungroupedCount: number;
|
|
53
|
+
totalCount: number;
|
|
54
|
+
/*
|
|
55
|
+
* False when the resource list the counts were built from was cut off by the
|
|
56
|
+
* API's row limit. The numbers are then lower bounds, not counts, and the UI
|
|
57
|
+
* has to say nothing rather than say something wrong - an operator deciding
|
|
58
|
+
* which of fifteen hundred groups still needs monitors is going to trust
|
|
59
|
+
* these numbers.
|
|
60
|
+
*/
|
|
61
|
+
isComplete: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/*
|
|
65
|
+
* What the right hand pane is showing. "Ungrouped" is a real place on a status
|
|
66
|
+
* page - the resources that sit above every group - so it is a selection like
|
|
67
|
+
* any other rather than a group with a null id.
|
|
68
|
+
*/
|
|
69
|
+
export enum StatusPageResourceSelectionType {
|
|
70
|
+
Group = "Group",
|
|
71
|
+
Ungrouped = "Ungrouped",
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface StatusPageResourceSelection {
|
|
75
|
+
type: StatusPageResourceSelectionType;
|
|
76
|
+
/* The group's id, or null for the ungrouped bucket. */
|
|
77
|
+
statusPageGroupId: string | null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* One row of the navigator. Everything the row draws is on it: the caller does
|
|
82
|
+
* no tree walking, no counting and no lookups of its own.
|
|
83
|
+
*/
|
|
84
|
+
export interface StatusPageResourceNavigatorRow {
|
|
85
|
+
statusPageGroup: StatusPageGroup;
|
|
86
|
+
id: string;
|
|
87
|
+
name: string;
|
|
88
|
+
depth: number;
|
|
89
|
+
viewMode: StatusPageGroupViewMode | undefined;
|
|
90
|
+
|
|
91
|
+
/* Which ancestor rails are still running down beside this row. */
|
|
92
|
+
ancestorRails: Array<boolean>;
|
|
93
|
+
isLastVisibleSibling: boolean;
|
|
94
|
+
visibleSiblingIndex: number;
|
|
95
|
+
visibleSiblingCount: number;
|
|
96
|
+
|
|
97
|
+
hasSubGroups: boolean;
|
|
98
|
+
subGroupCount: number;
|
|
99
|
+
hasVisibleSubGroups: boolean;
|
|
100
|
+
isExpanded: boolean;
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* Whether the group has a real neighbour to swap places with. The navigator
|
|
104
|
+
* is where groups are reordered now, and `order` is a property of the
|
|
105
|
+
* hierarchy rather than of the current search - so these read the group's
|
|
106
|
+
* actual siblings, not the rows that happen to be on screen.
|
|
107
|
+
*/
|
|
108
|
+
canMoveUp: boolean;
|
|
109
|
+
canMoveDown: boolean;
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* False for a row that is only on screen to give a match its place in the
|
|
113
|
+
* hierarchy. Those rows are context, and are drawn as context.
|
|
114
|
+
*/
|
|
115
|
+
isSearchMatch: boolean;
|
|
116
|
+
|
|
117
|
+
/* What selecting this row puts in the pane. */
|
|
118
|
+
ownResourceCount: number;
|
|
119
|
+
/*
|
|
120
|
+
* What selecting this row and every row under it would put in the pane. Worth
|
|
121
|
+
* showing because it is the number that answers "is there anything down
|
|
122
|
+
* there?" without opening anything.
|
|
123
|
+
*/
|
|
124
|
+
subtreeResourceCount: number;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface StatusPageResourceNavigatorResult {
|
|
128
|
+
rows: Array<StatusPageResourceNavigatorRow>;
|
|
129
|
+
/* How many rows there were before the cap was applied. */
|
|
130
|
+
totalRowCount: number;
|
|
131
|
+
isTruncated: boolean;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* Where a group sits, as something the pane can draw one clickable step at a
|
|
136
|
+
* time rather than as a single "A › B › C" string.
|
|
137
|
+
*/
|
|
138
|
+
export interface StatusPageResourceBreadcrumbStep {
|
|
139
|
+
id: string;
|
|
140
|
+
name: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* A grid group's resources, sorted into the matrix the public status page
|
|
145
|
+
* draws them as - plus the ones that fell outside it.
|
|
146
|
+
*/
|
|
147
|
+
export interface StatusPageResourceGridModel {
|
|
148
|
+
/* Keyed by getGridCellKey. */
|
|
149
|
+
resourcesByCellKey: Map<string, Array<StatusPageResource>>;
|
|
150
|
+
/*
|
|
151
|
+
* Resources whose axis values are not among the group's. Usually the wake of
|
|
152
|
+
* an axis value that was renamed after resources were assigned to it.
|
|
153
|
+
*/
|
|
154
|
+
orphanResources: Array<StatusPageResource>;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export default class StatusPageResourceExplorerUtil {
|
|
158
|
+
/*
|
|
159
|
+
* How many navigator rows are drawn before the list stops and offers to draw
|
|
160
|
+
* more.
|
|
161
|
+
*
|
|
162
|
+
* Collapsing a group already removes its whole subtree from the row list, so
|
|
163
|
+
* the navigator is normally short. One shape gets past that: a status page
|
|
164
|
+
* whose groups are all at the top level, where nothing is nested and so
|
|
165
|
+
* nothing can be collapsed away. Fifteen hundred rows of that is a page that
|
|
166
|
+
* will not scroll, so the list is capped and says so.
|
|
167
|
+
*/
|
|
168
|
+
public static readonly MaxNavigatorRows: number = 200;
|
|
169
|
+
|
|
170
|
+
/*
|
|
171
|
+
* How many more rows each press of "Show more" adds.
|
|
172
|
+
*/
|
|
173
|
+
public static readonly NavigatorRowsPerPage: number = 200;
|
|
174
|
+
|
|
175
|
+
/*
|
|
176
|
+
* A group with more resources than this is not worth drawing all at once.
|
|
177
|
+
* The pane draws this many and offers the rest a page at a time - the list
|
|
178
|
+
* stays scrollable and the DOM stays bounded, without a second request.
|
|
179
|
+
*/
|
|
180
|
+
public static readonly ResourceRowsPerPage: number = 100;
|
|
181
|
+
|
|
182
|
+
/* ------------------------------------------------------------------ */
|
|
183
|
+
/* Counts */
|
|
184
|
+
/* ------------------------------------------------------------------ */
|
|
185
|
+
|
|
186
|
+
/*
|
|
187
|
+
* One pass over every resource on the status page. The caller fetches those
|
|
188
|
+
* resources with only their id and their group id selected, so this stays
|
|
189
|
+
* one small request however many groups exist.
|
|
190
|
+
*
|
|
191
|
+
* `totalCount` is what the API reported the query matched, which is not the
|
|
192
|
+
* same as how many rows came back when the page hit the row limit - see
|
|
193
|
+
* isComplete.
|
|
194
|
+
*/
|
|
195
|
+
public static buildResourceCountIndex(data: {
|
|
196
|
+
statusPageResources: Array<StatusPageResource>;
|
|
197
|
+
totalCount?: number | undefined;
|
|
198
|
+
}): StatusPageResourceCountIndex {
|
|
199
|
+
const ownCountByGroupId: Map<string, number> = new Map<string, number>();
|
|
200
|
+
let ungroupedCount: number = 0;
|
|
201
|
+
|
|
202
|
+
for (const resource of data.statusPageResources) {
|
|
203
|
+
const groupId: string | null =
|
|
204
|
+
resource.statusPageGroupId?.toString() || null;
|
|
205
|
+
|
|
206
|
+
if (!groupId) {
|
|
207
|
+
ungroupedCount = ungroupedCount + 1;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
ownCountByGroupId.set(groupId, (ownCountByGroupId.get(groupId) || 0) + 1);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const fetchedCount: number = data.statusPageResources.length;
|
|
215
|
+
const totalCount: number =
|
|
216
|
+
data.totalCount === undefined ? fetchedCount : data.totalCount;
|
|
217
|
+
|
|
218
|
+
return {
|
|
219
|
+
ownCountByGroupId: ownCountByGroupId,
|
|
220
|
+
ungroupedCount: ungroupedCount,
|
|
221
|
+
totalCount: totalCount,
|
|
222
|
+
isComplete: fetchedCount >= totalCount,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
* The count index a page has before its resource list has come back: no
|
|
228
|
+
* numbers, and honest about it. The navigator does not wait on the counts, so
|
|
229
|
+
* every row has to be drawable without them.
|
|
230
|
+
*/
|
|
231
|
+
public static getEmptyResourceCountIndex(): StatusPageResourceCountIndex {
|
|
232
|
+
return {
|
|
233
|
+
ownCountByGroupId: new Map<string, number>(),
|
|
234
|
+
ungroupedCount: 0,
|
|
235
|
+
totalCount: 0,
|
|
236
|
+
isComplete: false,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/*
|
|
241
|
+
* The index with one group's count replaced by a number that came straight
|
|
242
|
+
* from that group's own pane.
|
|
243
|
+
*
|
|
244
|
+
* This is how the counts stay honest after a change without the page reading
|
|
245
|
+
* every resource on the status page again. The selected group refetches after
|
|
246
|
+
* every create, delete and bulk add and reports what came back; only that
|
|
247
|
+
* group's number can have changed, so only that number is replaced - and the
|
|
248
|
+
* page-wide total is moved by the difference.
|
|
249
|
+
*
|
|
250
|
+
* `statusPageGroupId` of null updates the ungrouped bucket.
|
|
251
|
+
*/
|
|
252
|
+
public static withGroupResourceCount(data: {
|
|
253
|
+
countIndex: StatusPageResourceCountIndex;
|
|
254
|
+
statusPageGroupId: string | null;
|
|
255
|
+
count: number;
|
|
256
|
+
}): StatusPageResourceCountIndex {
|
|
257
|
+
const previousCount: number = data.statusPageGroupId
|
|
258
|
+
? data.countIndex.ownCountByGroupId.get(data.statusPageGroupId) || 0
|
|
259
|
+
: data.countIndex.ungroupedCount;
|
|
260
|
+
|
|
261
|
+
if (previousCount === data.count) {
|
|
262
|
+
/*
|
|
263
|
+
* The same object, so a pane reporting the number the page already had -
|
|
264
|
+
* which is what every ordinary refetch does - does not re-render the
|
|
265
|
+
* whole navigator.
|
|
266
|
+
*/
|
|
267
|
+
return data.countIndex;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const ownCountByGroupId: Map<string, number> = new Map<string, number>(
|
|
271
|
+
data.countIndex.ownCountByGroupId,
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
if (data.statusPageGroupId) {
|
|
275
|
+
ownCountByGroupId.set(data.statusPageGroupId, data.count);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
ownCountByGroupId: ownCountByGroupId,
|
|
280
|
+
ungroupedCount: data.statusPageGroupId
|
|
281
|
+
? data.countIndex.ungroupedCount
|
|
282
|
+
: data.count,
|
|
283
|
+
totalCount: Math.max(
|
|
284
|
+
0,
|
|
285
|
+
data.countIndex.totalCount - previousCount + data.count,
|
|
286
|
+
),
|
|
287
|
+
isComplete: data.countIndex.isComplete,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public static getOwnResourceCount(data: {
|
|
292
|
+
statusPageGroup: StatusPageGroup;
|
|
293
|
+
countIndex: StatusPageResourceCountIndex;
|
|
294
|
+
}): number {
|
|
295
|
+
const groupId: string = data.statusPageGroup._id?.toString() || "";
|
|
296
|
+
|
|
297
|
+
return data.countIndex.ownCountByGroupId.get(groupId) || 0;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/*
|
|
301
|
+
* How many resources sit under each group including every group below it,
|
|
302
|
+
* worked out in one pass up the tree rather than once per row.
|
|
303
|
+
*/
|
|
304
|
+
public static buildSubtreeResourceCountIndex(data: {
|
|
305
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
306
|
+
countIndex: StatusPageResourceCountIndex;
|
|
307
|
+
index?: StatusPageGroupTreeIndex | undefined;
|
|
308
|
+
}): Map<string, number> {
|
|
309
|
+
const subtreeCountByGroupId: Map<string, number> = new Map<
|
|
310
|
+
string,
|
|
311
|
+
number
|
|
312
|
+
>();
|
|
313
|
+
|
|
314
|
+
const tree: Array<StatusPageGroupTreeNode> =
|
|
315
|
+
StatusPageGroupTreeUtil.buildTree({
|
|
316
|
+
statusPageGroups: data.statusPageGroups,
|
|
317
|
+
index: data.index,
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
type VisitFunction = (node: StatusPageGroupTreeNode) => number;
|
|
321
|
+
|
|
322
|
+
const visit: VisitFunction = (node: StatusPageGroupTreeNode): number => {
|
|
323
|
+
const groupId: string = node.group._id?.toString() || "";
|
|
324
|
+
|
|
325
|
+
let total: number = this.getOwnResourceCount({
|
|
326
|
+
statusPageGroup: node.group,
|
|
327
|
+
countIndex: data.countIndex,
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
for (const child of node.children) {
|
|
331
|
+
total = total + visit(child);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (groupId) {
|
|
335
|
+
subtreeCountByGroupId.set(groupId, total);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return total;
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
for (const node of tree) {
|
|
342
|
+
visit(node);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return subtreeCountByGroupId;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* ------------------------------------------------------------------ */
|
|
349
|
+
/* The navigator */
|
|
350
|
+
/* ------------------------------------------------------------------ */
|
|
351
|
+
|
|
352
|
+
/*
|
|
353
|
+
* The rows the navigator draws, in tree order, with collapsed subtrees
|
|
354
|
+
* already gone and the counts already attached.
|
|
355
|
+
*
|
|
356
|
+
* The hierarchy itself - rails, expansion, what a search reveals - comes from
|
|
357
|
+
* StatusPageGroupHierarchyViewUtil, which is also what the public status page
|
|
358
|
+
* lays its groups out from, so a group sits where the operator put it.
|
|
359
|
+
*/
|
|
360
|
+
public static getNavigatorRows(data: {
|
|
361
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
362
|
+
countIndex: StatusPageResourceCountIndex;
|
|
363
|
+
expandedGroupIds?: Set<string> | undefined;
|
|
364
|
+
searchText?: string | undefined;
|
|
365
|
+
maxRows?: number | undefined;
|
|
366
|
+
index?: StatusPageGroupTreeIndex | undefined;
|
|
367
|
+
}): StatusPageResourceNavigatorResult {
|
|
368
|
+
const hierarchyRows: Array<StatusPageGroupHierarchyRow> =
|
|
369
|
+
StatusPageGroupHierarchyViewUtil.getRows({
|
|
370
|
+
statusPageGroups: data.statusPageGroups,
|
|
371
|
+
expandedGroupIds: data.expandedGroupIds,
|
|
372
|
+
searchText: data.searchText,
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
const subtreeCountByGroupId: Map<string, number> =
|
|
376
|
+
this.buildSubtreeResourceCountIndex({
|
|
377
|
+
statusPageGroups: data.statusPageGroups,
|
|
378
|
+
countIndex: data.countIndex,
|
|
379
|
+
index: data.index,
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
const maxRows: number =
|
|
383
|
+
data.maxRows === undefined ? this.MaxNavigatorRows : data.maxRows;
|
|
384
|
+
|
|
385
|
+
const visibleRows: Array<StatusPageGroupHierarchyRow> =
|
|
386
|
+
maxRows >= 0 ? hierarchyRows.slice(0, maxRows) : hierarchyRows;
|
|
387
|
+
|
|
388
|
+
const rows: Array<StatusPageResourceNavigatorRow> = visibleRows.map(
|
|
389
|
+
(row: StatusPageGroupHierarchyRow): StatusPageResourceNavigatorRow => {
|
|
390
|
+
return {
|
|
391
|
+
statusPageGroup: row.statusPageGroup,
|
|
392
|
+
id: row.id,
|
|
393
|
+
name: row.name,
|
|
394
|
+
depth: row.depth,
|
|
395
|
+
viewMode: row.statusPageGroup.viewMode,
|
|
396
|
+
ancestorRails: row.ancestorRails,
|
|
397
|
+
isLastVisibleSibling: row.isLastVisibleSibling,
|
|
398
|
+
visibleSiblingIndex: row.visibleSiblingIndex,
|
|
399
|
+
visibleSiblingCount: row.visibleSiblingCount,
|
|
400
|
+
hasSubGroups: row.hasSubGroups,
|
|
401
|
+
subGroupCount: row.subGroupCount,
|
|
402
|
+
hasVisibleSubGroups: row.hasVisibleSubGroups,
|
|
403
|
+
isExpanded: row.isExpanded,
|
|
404
|
+
canMoveUp: row.canMoveUp,
|
|
405
|
+
canMoveDown: row.canMoveDown,
|
|
406
|
+
isSearchMatch: row.isSearchMatch,
|
|
407
|
+
ownResourceCount: this.getOwnResourceCount({
|
|
408
|
+
statusPageGroup: row.statusPageGroup,
|
|
409
|
+
countIndex: data.countIndex,
|
|
410
|
+
}),
|
|
411
|
+
subtreeResourceCount: subtreeCountByGroupId.get(row.id) || 0,
|
|
412
|
+
};
|
|
413
|
+
},
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
return {
|
|
417
|
+
rows: rows,
|
|
418
|
+
totalRowCount: hierarchyRows.length,
|
|
419
|
+
isTruncated: rows.length < hierarchyRows.length,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/*
|
|
424
|
+
* The groups that have to be open for a group to be visible in the navigator.
|
|
425
|
+
*
|
|
426
|
+
* Selecting a group the operator cannot see - because a create landed in a
|
|
427
|
+
* collapsed branch, or because a link arrived pointing at one - reads exactly
|
|
428
|
+
* like the selection having failed.
|
|
429
|
+
*/
|
|
430
|
+
public static getGroupIdsToReveal(data: {
|
|
431
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
432
|
+
statusPageGroupId: string | null | undefined;
|
|
433
|
+
index?: StatusPageGroupTreeIndex | undefined;
|
|
434
|
+
}): Set<string> {
|
|
435
|
+
const ids: Set<string> = new Set<string>();
|
|
436
|
+
|
|
437
|
+
if (!data.statusPageGroupId) {
|
|
438
|
+
return ids;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
const statusPageGroup: StatusPageGroup | undefined =
|
|
442
|
+
data.statusPageGroups.find((group: StatusPageGroup): boolean => {
|
|
443
|
+
return group._id?.toString() === data.statusPageGroupId;
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
if (!statusPageGroup) {
|
|
447
|
+
return ids;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
const ancestors: Array<StatusPageGroup> =
|
|
451
|
+
StatusPageGroupTreeUtil.getAncestorGroups({
|
|
452
|
+
statusPageGroup: statusPageGroup,
|
|
453
|
+
statusPageGroups: data.statusPageGroups,
|
|
454
|
+
index: data.index,
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
for (const ancestor of ancestors) {
|
|
458
|
+
const ancestorId: string = ancestor._id?.toString() || "";
|
|
459
|
+
|
|
460
|
+
if (ancestorId) {
|
|
461
|
+
ids.add(ancestorId);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
return ids;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/*
|
|
469
|
+
* Every group id in the hierarchy, in tree order. What "expand all" opens.
|
|
470
|
+
*/
|
|
471
|
+
public static getAllGroupIds(data: {
|
|
472
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
473
|
+
index?: StatusPageGroupTreeIndex | undefined;
|
|
474
|
+
}): Array<string> {
|
|
475
|
+
const ids: Array<string> = [];
|
|
476
|
+
|
|
477
|
+
type VisitFunction = (nodes: Array<StatusPageGroupTreeNode>) => void;
|
|
478
|
+
|
|
479
|
+
const visit: VisitFunction = (
|
|
480
|
+
nodes: Array<StatusPageGroupTreeNode>,
|
|
481
|
+
): void => {
|
|
482
|
+
for (const node of nodes) {
|
|
483
|
+
const groupId: string = node.group._id?.toString() || "";
|
|
484
|
+
|
|
485
|
+
if (groupId) {
|
|
486
|
+
ids.push(groupId);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
visit(node.children);
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
visit(
|
|
494
|
+
StatusPageGroupTreeUtil.buildTree({
|
|
495
|
+
statusPageGroups: data.statusPageGroups,
|
|
496
|
+
index: data.index,
|
|
497
|
+
}),
|
|
498
|
+
);
|
|
499
|
+
|
|
500
|
+
return ids;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/*
|
|
504
|
+
* Where the selected group sits, root first, as steps the pane can make
|
|
505
|
+
* clickable. The group itself is not a step - it is the heading the steps
|
|
506
|
+
* lead to.
|
|
507
|
+
*/
|
|
508
|
+
public static getBreadcrumbSteps(data: {
|
|
509
|
+
statusPageGroup: StatusPageGroup;
|
|
510
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
511
|
+
index?: StatusPageGroupTreeIndex | undefined;
|
|
512
|
+
}): Array<StatusPageResourceBreadcrumbStep> {
|
|
513
|
+
const ancestors: Array<StatusPageGroup> =
|
|
514
|
+
StatusPageGroupTreeUtil.getAncestorGroups({
|
|
515
|
+
statusPageGroup: data.statusPageGroup,
|
|
516
|
+
statusPageGroups: data.statusPageGroups,
|
|
517
|
+
index: data.index,
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
/* getAncestorGroups walks upwards; a breadcrumb reads downwards. */
|
|
521
|
+
return ancestors
|
|
522
|
+
.slice()
|
|
523
|
+
.reverse()
|
|
524
|
+
.map((ancestor: StatusPageGroup): StatusPageResourceBreadcrumbStep => {
|
|
525
|
+
return {
|
|
526
|
+
id: ancestor._id?.toString() || "",
|
|
527
|
+
name: ancestor.name || "Untitled group",
|
|
528
|
+
};
|
|
529
|
+
})
|
|
530
|
+
.filter((step: StatusPageResourceBreadcrumbStep): boolean => {
|
|
531
|
+
return step.id.length > 0;
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/*
|
|
536
|
+
* The selection a freshly opened tab starts on.
|
|
537
|
+
*
|
|
538
|
+
* The ungrouped bucket, unless the status page has no ungrouped resources and
|
|
539
|
+
* does have groups - in which case starting there would be an empty pane with
|
|
540
|
+
* a full navigator beside it, which reads as a page that failed to load.
|
|
541
|
+
*/
|
|
542
|
+
public static getInitialSelection(data: {
|
|
543
|
+
statusPageGroups: Array<StatusPageGroup>;
|
|
544
|
+
countIndex: StatusPageResourceCountIndex;
|
|
545
|
+
}): StatusPageResourceSelection {
|
|
546
|
+
const ungroupedSelection: StatusPageResourceSelection = {
|
|
547
|
+
type: StatusPageResourceSelectionType.Ungrouped,
|
|
548
|
+
statusPageGroupId: null,
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
if (data.statusPageGroups.length === 0) {
|
|
552
|
+
return ungroupedSelection;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (!data.countIndex.isComplete || data.countIndex.ungroupedCount > 0) {
|
|
556
|
+
return ungroupedSelection;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const firstGroupId: string | undefined = this.getAllGroupIds({
|
|
560
|
+
statusPageGroups: data.statusPageGroups,
|
|
561
|
+
})[0];
|
|
562
|
+
|
|
563
|
+
if (!firstGroupId) {
|
|
564
|
+
return ungroupedSelection;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return {
|
|
568
|
+
type: StatusPageResourceSelectionType.Group,
|
|
569
|
+
statusPageGroupId: firstGroupId,
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/* ------------------------------------------------------------------ */
|
|
574
|
+
/* Resources in the selected group */
|
|
575
|
+
/* ------------------------------------------------------------------ */
|
|
576
|
+
|
|
577
|
+
/*
|
|
578
|
+
* What a resource is called on this screen.
|
|
579
|
+
*
|
|
580
|
+
* The monitor's name rather than the display name: the display name is what
|
|
581
|
+
* visitors see, and an operator looking for the monitor they just created is
|
|
582
|
+
* looking for the name they created it under. A resource whose monitor was
|
|
583
|
+
* deleted falls back to whatever is left, because a row nobody can identify
|
|
584
|
+
* is a row nobody can clean up.
|
|
585
|
+
*/
|
|
586
|
+
public static getResourceName(resource: StatusPageResource): string {
|
|
587
|
+
return (
|
|
588
|
+
resource.monitor?.name ||
|
|
589
|
+
resource.monitorGroup?.name ||
|
|
590
|
+
resource.displayName ||
|
|
591
|
+
"Unknown resource"
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/*
|
|
596
|
+
* Free text over the two names a resource has. Client side, over the group's
|
|
597
|
+
* own resources, because the group is already loaded - a round trip per
|
|
598
|
+
* keystroke would be slower and would still only be searching the same rows.
|
|
599
|
+
*/
|
|
600
|
+
public static filterResources(data: {
|
|
601
|
+
statusPageResources: Array<StatusPageResource>;
|
|
602
|
+
searchText?: string | undefined;
|
|
603
|
+
}): Array<StatusPageResource> {
|
|
604
|
+
const searchText: string = (data.searchText || "").trim().toLowerCase();
|
|
605
|
+
|
|
606
|
+
if (!searchText) {
|
|
607
|
+
return data.statusPageResources;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
return data.statusPageResources.filter(
|
|
611
|
+
(resource: StatusPageResource): boolean => {
|
|
612
|
+
const haystack: Array<string> = [
|
|
613
|
+
resource.monitor?.name || "",
|
|
614
|
+
resource.monitorGroup?.name || "",
|
|
615
|
+
resource.displayName || "",
|
|
616
|
+
];
|
|
617
|
+
|
|
618
|
+
return haystack.some((value: string): boolean => {
|
|
619
|
+
return value.toLowerCase().includes(searchText);
|
|
620
|
+
});
|
|
621
|
+
},
|
|
622
|
+
);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/*
|
|
626
|
+
* The `order` to write when a resource is dragged from one position to
|
|
627
|
+
* another.
|
|
628
|
+
*
|
|
629
|
+
* The server renumbers the group's siblings around whatever order it is
|
|
630
|
+
* given, so the write is "take the place of the resource currently sitting
|
|
631
|
+
* there" rather than an index - the same write the old table's drag and drop
|
|
632
|
+
* made, and the only one StatusPageResourceService knows how to rebalance.
|
|
633
|
+
*
|
|
634
|
+
* Null when the move is a no-op or the positions are not real.
|
|
635
|
+
*/
|
|
636
|
+
public static getReorderTargetOrder(data: {
|
|
637
|
+
statusPageResources: Array<StatusPageResource>;
|
|
638
|
+
fromIndex: number;
|
|
639
|
+
toIndex: number;
|
|
640
|
+
}): number | null {
|
|
641
|
+
const { statusPageResources, fromIndex, toIndex } = data;
|
|
642
|
+
|
|
643
|
+
if (fromIndex === toIndex) {
|
|
644
|
+
return null;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
if (
|
|
648
|
+
fromIndex < 0 ||
|
|
649
|
+
toIndex < 0 ||
|
|
650
|
+
fromIndex >= statusPageResources.length ||
|
|
651
|
+
toIndex >= statusPageResources.length
|
|
652
|
+
) {
|
|
653
|
+
return null;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const target: StatusPageResource | undefined = statusPageResources[toIndex];
|
|
657
|
+
|
|
658
|
+
if (!target || target.order === undefined || target.order === null) {
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
return target.order;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/*
|
|
666
|
+
* The list as it will look once the move lands, so the row can be drawn where
|
|
667
|
+
* it was dropped rather than jumping back until the write returns.
|
|
668
|
+
*/
|
|
669
|
+
public static getResourcesInNewOrder(data: {
|
|
670
|
+
statusPageResources: Array<StatusPageResource>;
|
|
671
|
+
fromIndex: number;
|
|
672
|
+
toIndex: number;
|
|
673
|
+
}): Array<StatusPageResource> {
|
|
674
|
+
const { statusPageResources, fromIndex, toIndex } = data;
|
|
675
|
+
|
|
676
|
+
if (
|
|
677
|
+
fromIndex === toIndex ||
|
|
678
|
+
fromIndex < 0 ||
|
|
679
|
+
toIndex < 0 ||
|
|
680
|
+
fromIndex >= statusPageResources.length ||
|
|
681
|
+
toIndex >= statusPageResources.length
|
|
682
|
+
) {
|
|
683
|
+
return statusPageResources;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
const next: Array<StatusPageResource> = [...statusPageResources];
|
|
687
|
+
const [moved] = next.splice(fromIndex, 1);
|
|
688
|
+
|
|
689
|
+
if (!moved) {
|
|
690
|
+
return statusPageResources;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
next.splice(toIndex, 0, moved);
|
|
694
|
+
|
|
695
|
+
return next;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/* ------------------------------------------------------------------ */
|
|
699
|
+
/* Grid groups */
|
|
700
|
+
/* ------------------------------------------------------------------ */
|
|
701
|
+
|
|
702
|
+
/*
|
|
703
|
+
* The comma separated axis values a grid group is defined by, as a list.
|
|
704
|
+
*/
|
|
705
|
+
public static parseAxisValues(
|
|
706
|
+
raw?: string | null | undefined,
|
|
707
|
+
): Array<string> {
|
|
708
|
+
if (!raw) {
|
|
709
|
+
return [];
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
return raw
|
|
713
|
+
.split(",")
|
|
714
|
+
.map((value: string): string => {
|
|
715
|
+
return value.trim();
|
|
716
|
+
})
|
|
717
|
+
.filter((value: string): boolean => {
|
|
718
|
+
return value.length > 0;
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/*
|
|
723
|
+
* A NUL separator rather than a space or a dash: axis values are free text,
|
|
724
|
+
* so any separator an operator could type would let ("A B", "C") and
|
|
725
|
+
* ("A", "B C") collapse into the same cell.
|
|
726
|
+
*/
|
|
727
|
+
public static getGridCellKey(rowValue: string, columnValue: string): string {
|
|
728
|
+
return `${rowValue}\u0000${columnValue}`;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/*
|
|
732
|
+
* Which resources land in which cell of a grid group, and which land nowhere
|
|
733
|
+
* because their axis values are not among the group's own.
|
|
734
|
+
*
|
|
735
|
+
* The orphans matter: an axis value renamed on the group's own form strands
|
|
736
|
+
* every resource that referenced it, and a grid that silently drew fewer
|
|
737
|
+
* cells than it has resources would hide monitors an operator believes are
|
|
738
|
+
* published.
|
|
739
|
+
*/
|
|
740
|
+
public static buildGridModel(data: {
|
|
741
|
+
statusPageResources: Array<StatusPageResource>;
|
|
742
|
+
rowValues: Array<string>;
|
|
743
|
+
columnValues: Array<string>;
|
|
744
|
+
}): StatusPageResourceGridModel {
|
|
745
|
+
const resourcesByCellKey: Map<string, Array<StatusPageResource>> = new Map<
|
|
746
|
+
string,
|
|
747
|
+
Array<StatusPageResource>
|
|
748
|
+
>();
|
|
749
|
+
const orphanResources: Array<StatusPageResource> = [];
|
|
750
|
+
|
|
751
|
+
for (const resource of data.statusPageResources) {
|
|
752
|
+
const rowValue: string = resource.rowAxisValue || "";
|
|
753
|
+
const columnValue: string = resource.columnAxisValue || "";
|
|
754
|
+
|
|
755
|
+
if (
|
|
756
|
+
!rowValue ||
|
|
757
|
+
!columnValue ||
|
|
758
|
+
!data.rowValues.includes(rowValue) ||
|
|
759
|
+
!data.columnValues.includes(columnValue)
|
|
760
|
+
) {
|
|
761
|
+
orphanResources.push(resource);
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
const key: string = this.getGridCellKey(rowValue, columnValue);
|
|
766
|
+
const cell: Array<StatusPageResource> = resourcesByCellKey.get(key) || [];
|
|
767
|
+
|
|
768
|
+
cell.push(resource);
|
|
769
|
+
resourcesByCellKey.set(key, cell);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
return {
|
|
773
|
+
resourcesByCellKey: resourcesByCellKey,
|
|
774
|
+
orphanResources: orphanResources,
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/* ------------------------------------------------------------------ */
|
|
779
|
+
/* Labels */
|
|
780
|
+
/* ------------------------------------------------------------------ */
|
|
781
|
+
|
|
782
|
+
/*
|
|
783
|
+
* "12 resources", or "1 resource".
|
|
784
|
+
*/
|
|
785
|
+
public static getResourceCountLabel(data: { count: number }): string {
|
|
786
|
+
if (data.count === 1) {
|
|
787
|
+
return "1 resource";
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
return `${data.count.toLocaleString()} resources`;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/*
|
|
794
|
+
* What a navigator row's count badge says, which is not always the same
|
|
795
|
+
* number as the pane it opens.
|
|
796
|
+
*
|
|
797
|
+
* A group that holds nothing itself but has a hundred resources nested under
|
|
798
|
+
* it is not empty, and a bare "0" beside it would send an operator hunting
|
|
799
|
+
* through fifteen hundred groups for monitors that are right there. So the
|
|
800
|
+
* badge shows what the group holds, and the tooltip explains the subtree when
|
|
801
|
+
* the two differ.
|
|
802
|
+
*/
|
|
803
|
+
public static getNavigatorCountLabel(data: {
|
|
804
|
+
row: StatusPageResourceNavigatorRow;
|
|
805
|
+
countIndex: StatusPageResourceCountIndex;
|
|
806
|
+
}): string | null {
|
|
807
|
+
if (!data.countIndex.isComplete) {
|
|
808
|
+
return null;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
if (
|
|
812
|
+
data.row.ownResourceCount === 0 &&
|
|
813
|
+
data.row.subtreeResourceCount > data.row.ownResourceCount
|
|
814
|
+
) {
|
|
815
|
+
return `+${data.row.subtreeResourceCount.toLocaleString()}`;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
return data.row.ownResourceCount.toLocaleString();
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
public static getNavigatorCountTooltip(data: {
|
|
822
|
+
row: StatusPageResourceNavigatorRow;
|
|
823
|
+
countIndex: StatusPageResourceCountIndex;
|
|
824
|
+
}): string | undefined {
|
|
825
|
+
if (!data.countIndex.isComplete) {
|
|
826
|
+
return undefined;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
const own: string = `${data.row.ownResourceCount.toLocaleString()} ${
|
|
830
|
+
data.row.ownResourceCount === 1 ? "resource" : "resources"
|
|
831
|
+
} in this group`;
|
|
832
|
+
|
|
833
|
+
if (data.row.subtreeResourceCount === data.row.ownResourceCount) {
|
|
834
|
+
return own;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
return `${own} · ${data.row.subtreeResourceCount.toLocaleString()} including sub groups`;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
public static getSubGroupCountLabel(data: {
|
|
841
|
+
subGroupCount: number;
|
|
842
|
+
}): string | null {
|
|
843
|
+
if (data.subGroupCount <= 0) {
|
|
844
|
+
return null;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
if (data.subGroupCount === 1) {
|
|
848
|
+
return "1 sub group";
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
return `${data.subGroupCount.toLocaleString()} sub groups`;
|
|
852
|
+
}
|
|
853
|
+
}
|