@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
package/Server/Utils/Response.ts
CHANGED
|
@@ -21,9 +21,62 @@ import Dictionary from "../../Types/Dictionary";
|
|
|
21
21
|
import Exception from "../../Types/Exception/Exception";
|
|
22
22
|
import { JSONArray, JSONObject } from "../../Types/JSON";
|
|
23
23
|
import ListData from "../../Types/ListData";
|
|
24
|
+
import MimeType from "../../Types/File/MimeType";
|
|
24
25
|
import PositiveNumber from "../../Types/PositiveNumber";
|
|
25
26
|
import Route from "../../Types/API/Route";
|
|
26
27
|
import CaptureSpan from "./Telemetry/CaptureSpan";
|
|
28
|
+
import { IsBillingEnabled } from "../EnvironmentConfig";
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* Raster image types, which is to say the types that cannot carry script and
|
|
32
|
+
* are therefore safe both to echo back verbatim and to render in our own
|
|
33
|
+
* origin. An SVG is not here on purpose: it is a document, not a picture, and
|
|
34
|
+
* a PDF is not here either because it gets its own scripting engine.
|
|
35
|
+
*
|
|
36
|
+
* The list is deliberately wider than the MimeType enum. Until November 2025
|
|
37
|
+
* (62d74c1d84) the file picker stored the browser's own MIME string verbatim,
|
|
38
|
+
* so installs upgrading through this change hold rows with values that never
|
|
39
|
+
* appeared in the enum - "image/vnd.microsoft.icon" from a favicon upload,
|
|
40
|
+
* "image/jpg" from assorted tools. Collapsing those to octet-stream would stop
|
|
41
|
+
* every one of those avatars and logos from rendering, because nosniff means
|
|
42
|
+
* an <img> cannot recover from a type it was given wrongly.
|
|
43
|
+
*/
|
|
44
|
+
const SAFE_IMAGE_MIME_TYPES: Set<string> = new Set<string>([
|
|
45
|
+
MimeType.png,
|
|
46
|
+
// MimeType.jpg is the same string as MimeType.jpeg, so it is covered.
|
|
47
|
+
MimeType.jpeg,
|
|
48
|
+
MimeType.gif,
|
|
49
|
+
MimeType.webp,
|
|
50
|
+
MimeType.ico,
|
|
51
|
+
MimeType.bmp,
|
|
52
|
+
MimeType.tiff,
|
|
53
|
+
MimeType.avif,
|
|
54
|
+
MimeType.heic,
|
|
55
|
+
"image/jpg",
|
|
56
|
+
"image/pjpeg",
|
|
57
|
+
"image/vnd.microsoft.icon",
|
|
58
|
+
"image/x-ms-bmp",
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* `fileType` is a plain varchar filled in from the upload request body, so by
|
|
63
|
+
* the time a file is served back it holds whatever string the uploader chose -
|
|
64
|
+
* the MimeType enum is a compile-time type and is erased at runtime. Echoing
|
|
65
|
+
* that string back as Content-Type is what turns "upload an image" into "run
|
|
66
|
+
* script on the dashboard origin", because /api, /file and /dashboard are the
|
|
67
|
+
* same origin. Only types we actually recognise get echoed back.
|
|
68
|
+
*
|
|
69
|
+
* Note this read-side list is wider than the one FileService enforces on
|
|
70
|
+
* upload: new rows are held to the canonical enum, old rows only have to be
|
|
71
|
+
* servable.
|
|
72
|
+
*/
|
|
73
|
+
const ALLOWED_MIME_TYPES: Set<string> = new Set<string>([
|
|
74
|
+
...Object.values(MimeType),
|
|
75
|
+
...SAFE_IMAGE_MIME_TYPES,
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
// What an unrecognised fileType degrades to: opaque bytes, never a document.
|
|
79
|
+
const FALLBACK_MIME_TYPE: string = "application/octet-stream";
|
|
27
80
|
|
|
28
81
|
export default class Response {
|
|
29
82
|
@CaptureSpan()
|
|
@@ -66,21 +119,105 @@ export default class Response {
|
|
|
66
119
|
oneUptimeResponse.status(statusCode).send(body);
|
|
67
120
|
}
|
|
68
121
|
|
|
122
|
+
/*
|
|
123
|
+
* Reduce a stored fileType to something safe to hand back as Content-Type.
|
|
124
|
+
* Anything we do not recognise - a made-up string, "text/html", a row
|
|
125
|
+
* written before uploads were validated - becomes opaque bytes.
|
|
126
|
+
*/
|
|
127
|
+
public static getSafeFileType(fileType: string | undefined | null): string {
|
|
128
|
+
const normalizedFileType: string = (fileType || "").trim().toLowerCase();
|
|
129
|
+
|
|
130
|
+
if (ALLOWED_MIME_TYPES.has(normalizedFileType)) {
|
|
131
|
+
return normalizedFileType;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return FALLBACK_MIME_TYPE;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* The filename goes into a response header, so it gets the same treatment as
|
|
139
|
+
* the MIME string: no quotes, no CR/LF, nothing that could split the header.
|
|
140
|
+
* This is the ASCII fallback only - see getContentDisposition, which pairs it
|
|
141
|
+
* with an encoded copy so a non-Latin name is not reduced to underscores.
|
|
142
|
+
*/
|
|
143
|
+
public static getSafeFileName(name: string | undefined | null): string {
|
|
144
|
+
const safeFileName: string = (name || "")
|
|
145
|
+
.replace(/[^a-zA-Z0-9._-]/g, "_")
|
|
146
|
+
.slice(0, 100);
|
|
147
|
+
|
|
148
|
+
return safeFileName || "download";
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* RFC 6266: `filename` carries an ASCII-safe fallback for old clients and
|
|
153
|
+
* `filename*` carries the real name percent-encoded, so "月次レポート.pdf"
|
|
154
|
+
* downloads under its own name instead of as a row of underscores. Both are
|
|
155
|
+
* escaped, so neither can close the quoted string or inject a header.
|
|
156
|
+
*/
|
|
157
|
+
public static getContentDisposition(
|
|
158
|
+
disposition: "inline" | "attachment",
|
|
159
|
+
name: string | undefined | null,
|
|
160
|
+
): string {
|
|
161
|
+
const fileName: string = (name || "").trim().slice(0, 100) || "download";
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* encodeURIComponent leaves !'()* alone and RFC 5987's attr-char does not
|
|
165
|
+
* allow them - single quote especially, since it delimits the value.
|
|
166
|
+
*/
|
|
167
|
+
const encodedFileName: string = encodeURIComponent(fileName).replace(
|
|
168
|
+
/['()*!]/g,
|
|
169
|
+
(character: string): string => {
|
|
170
|
+
return `%${character.charCodeAt(0).toString(16).toUpperCase()}`;
|
|
171
|
+
},
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
return `${disposition}; filename="${Response.getSafeFileName(fileName)}"; filename*=UTF-8''${encodedFileName}`;
|
|
175
|
+
}
|
|
176
|
+
|
|
69
177
|
@CaptureSpan()
|
|
70
178
|
public static async sendFileResponse(
|
|
71
179
|
_req: ExpressRequest | ExpressRequest,
|
|
72
180
|
res: ExpressResponse,
|
|
73
181
|
file: FileModel,
|
|
74
182
|
): Promise<void> {
|
|
75
|
-
/** Create read stream */
|
|
76
|
-
|
|
77
183
|
const oneUptimeResponse: OneUptimeResponse = res as OneUptimeResponse;
|
|
78
184
|
|
|
79
|
-
|
|
80
|
-
|
|
185
|
+
const fileType: string = Response.getSafeFileType(file.fileType);
|
|
186
|
+
|
|
187
|
+
oneUptimeResponse.set("Content-Type", fileType);
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* Belt and braces for the types we do echo back. nosniff stops the browser
|
|
191
|
+
* from guessing its way to a different type; the CSP gives the response an
|
|
192
|
+
* opaque origin with no scripting even if it is opened as a top-level
|
|
193
|
+
* document, so a crafted file cannot reach dashboard cookies; and nothing
|
|
194
|
+
* we serve here is ever meant to be framed.
|
|
195
|
+
*/
|
|
196
|
+
oneUptimeResponse.set("X-Content-Type-Options", "nosniff");
|
|
197
|
+
oneUptimeResponse.set(
|
|
198
|
+
"Content-Security-Policy",
|
|
199
|
+
"sandbox; script-src 'none'; object-src 'none'; frame-ancestors 'none'",
|
|
200
|
+
);
|
|
201
|
+
oneUptimeResponse.set("X-Frame-Options", "DENY");
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
* Inline is reserved for raster images, which cannot execute anything.
|
|
205
|
+
* Everything else - SVG, PDF, office docs, whatever an older row happens
|
|
206
|
+
* to hold - downloads instead of rendering. This is deliberately not an
|
|
207
|
+
* SVG ban: <img> and <link rel="icon"> ignore Content-Disposition, so
|
|
208
|
+
* status page logos, favicons and avatars still render. The only
|
|
209
|
+
* behaviour that changes is a top-level navigation to the file URL, and
|
|
210
|
+
* that is exactly the navigation an XSS payload needs.
|
|
211
|
+
*/
|
|
212
|
+
oneUptimeResponse.set(
|
|
213
|
+
"Content-Disposition",
|
|
214
|
+
Response.getContentDisposition(
|
|
215
|
+
SAFE_IMAGE_MIME_TYPES.has(fileType) ? "inline" : "attachment",
|
|
216
|
+
file.name,
|
|
217
|
+
),
|
|
218
|
+
);
|
|
219
|
+
|
|
81
220
|
oneUptimeResponse.status(200);
|
|
82
|
-
/** Return response */
|
|
83
|
-
// readstream.pipe(res);
|
|
84
221
|
|
|
85
222
|
oneUptimeResponse.send(file.file);
|
|
86
223
|
}
|
|
@@ -94,7 +231,17 @@ export default class Response {
|
|
|
94
231
|
): void {
|
|
95
232
|
const oneUptimeResponse: OneUptimeResponse = res as OneUptimeResponse;
|
|
96
233
|
|
|
97
|
-
|
|
234
|
+
/*
|
|
235
|
+
* Analytics is opt-in per render, and off unless this is the hosted
|
|
236
|
+
* product. A self-hosted install has no reason to load Google Tag Manager
|
|
237
|
+
* from googletagmanager.com, and an air-gapped one cannot - it would just
|
|
238
|
+
* be another request left hanging. Same default the frontend index pages
|
|
239
|
+
* already use; passing the flag explicitly still wins.
|
|
240
|
+
*/
|
|
241
|
+
oneUptimeResponse.render(path, {
|
|
242
|
+
enableGoogleTagManager: IsBillingEnabled,
|
|
243
|
+
...vars,
|
|
244
|
+
});
|
|
98
245
|
}
|
|
99
246
|
|
|
100
247
|
@CaptureSpan()
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import URL from "../../Types/API/URL";
|
|
2
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
3
|
+
import dns from "dns";
|
|
4
|
+
import net from "net";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Guards outbound HTTP(S) requests whose target is (fully or partly)
|
|
8
|
+
* attacker-controlled — status page subscriber webhooks, project webhook
|
|
9
|
+
* notifications, etc. — against Server-Side Request Forgery. It rejects URLs
|
|
10
|
+
* that point at loopback, RFC-1918 private ranges, link-local (including the
|
|
11
|
+
* 169.254.169.254 cloud metadata endpoint), CGNAT, and IPv6 loopback /
|
|
12
|
+
* link-local / unique-local addresses, resolving DNS hostnames first so a
|
|
13
|
+
* public-looking name that maps to an internal address is still blocked.
|
|
14
|
+
*
|
|
15
|
+
* This is a best-effort, TOCTOU-susceptible check: a hostname can resolve to a
|
|
16
|
+
* different address between validation and the actual request (DNS rebinding).
|
|
17
|
+
* Callers should therefore ALSO disable redirect-following on the request so a
|
|
18
|
+
* validated public host cannot 3xx-redirect the server to an internal target.
|
|
19
|
+
*/
|
|
20
|
+
export default class SSRFProtection {
|
|
21
|
+
/*
|
|
22
|
+
* Returns the bare, lowercased host of a URL — no port, no brackets — or an
|
|
23
|
+
* empty string if it cannot be parsed. Host-pinning allowlists (Slack, Teams)
|
|
24
|
+
* must compare against THIS, never against the whole URL string: a substring
|
|
25
|
+
* check on the full URL is satisfied by an attacker-controlled path or query
|
|
26
|
+
* (`http://169.254.169.254/?x=office.com`) and pins nothing.
|
|
27
|
+
*/
|
|
28
|
+
public static getBareHostname(rawUrl: string | URL): string {
|
|
29
|
+
/*
|
|
30
|
+
* WHATWG, not URL.fromString. OneUptime's parser takes everything before
|
|
31
|
+
* the first "/" as the authority and never terminates at "?" or "#", so it
|
|
32
|
+
* reads "https://169.254.169.254#.office.com" as the host
|
|
33
|
+
* "169.254.169.254#.office.com" - which ends with ".office.com" and
|
|
34
|
+
* satisfied the allowlist, while axios re-parsed the same string per WHATWG
|
|
35
|
+
* and dialled 169.254.169.254. A pin is only worth anything if it parses
|
|
36
|
+
* the host the same way the HTTP client will.
|
|
37
|
+
*/
|
|
38
|
+
let parsed: globalThis.URL;
|
|
39
|
+
try {
|
|
40
|
+
parsed = new globalThis.URL(rawUrl.toString());
|
|
41
|
+
} catch {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return SSRFProtection.extractHost(parsed.hostname.toLowerCase());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* True when the URL's host is exactly one of `allowedDomains` or a subdomain
|
|
50
|
+
* of one, and the scheme is https. Suffix matching is anchored on a leading
|
|
51
|
+
* dot so `office.com.attacker.tld` and `evil-office.com` are both rejected.
|
|
52
|
+
*/
|
|
53
|
+
public static isUrlOnAllowedDomain(
|
|
54
|
+
rawUrl: string | URL,
|
|
55
|
+
allowedDomains: Array<string>,
|
|
56
|
+
): boolean {
|
|
57
|
+
let parsed: globalThis.URL;
|
|
58
|
+
try {
|
|
59
|
+
parsed = new globalThis.URL(rawUrl.toString());
|
|
60
|
+
} catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Scheme and host must come from the SAME parser, or they can disagree.
|
|
65
|
+
if (parsed.protocol.toLowerCase() !== "https:") {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const hostname: string = SSRFProtection.getBareHostname(rawUrl);
|
|
70
|
+
|
|
71
|
+
if (!hostname) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return allowedDomains.some((domain: string) => {
|
|
76
|
+
const allowed: string = domain.toLowerCase();
|
|
77
|
+
return hostname === allowed || hostname.endsWith(`.${allowed}`);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public static async validateWebhookTargetIsSafe(
|
|
82
|
+
rawUrl: string | URL,
|
|
83
|
+
): Promise<void> {
|
|
84
|
+
/*
|
|
85
|
+
* URL.fromString only knows http/https/ws/wss/mongodb/mailto and silently
|
|
86
|
+
* DEFAULTS anything else to https - "file:///etc/passwd" comes back as
|
|
87
|
+
* host "file", not as a file: URL - so the protocol check below never sees
|
|
88
|
+
* the scheme the caller actually wrote. Read it off the raw string first.
|
|
89
|
+
*
|
|
90
|
+
* The ":" must be followed by "/" or this would treat the host in a
|
|
91
|
+
* scheme-less "example.com:8080/hook" as a scheme and reject it.
|
|
92
|
+
*/
|
|
93
|
+
const schemeMatch: RegExpMatchArray | null = rawUrl
|
|
94
|
+
.toString()
|
|
95
|
+
.trim()
|
|
96
|
+
.match(/^([a-z][a-z0-9+.-]*):\//i);
|
|
97
|
+
|
|
98
|
+
if (
|
|
99
|
+
schemeMatch &&
|
|
100
|
+
schemeMatch[1] &&
|
|
101
|
+
!["http", "https"].includes(schemeMatch[1].toLowerCase())
|
|
102
|
+
) {
|
|
103
|
+
throw new BadDataException(
|
|
104
|
+
"Webhook URL must use http or https protocol.",
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
let parsed: URL;
|
|
109
|
+
try {
|
|
110
|
+
parsed = URL.fromString(rawUrl.toString());
|
|
111
|
+
} catch {
|
|
112
|
+
throw new BadDataException("Webhook URL is not a valid URL");
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const protocolValue: string = parsed.protocol.toString().toLowerCase();
|
|
116
|
+
if (protocolValue !== "http://" && protocolValue !== "https://") {
|
|
117
|
+
throw new BadDataException(
|
|
118
|
+
"Webhook URL must use http or https protocol.",
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const rawHost: string = parsed.hostname.hostname.toLowerCase();
|
|
123
|
+
|
|
124
|
+
if (!rawHost) {
|
|
125
|
+
throw new BadDataException("Webhook URL must include a host.");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* OneUptime's URL parser keeps the port glued to the host (e.g.
|
|
130
|
+
* "169.254.169.254:80"). Strip it before the checks below, otherwise a
|
|
131
|
+
* literal-with-port slips past the IPv4 blocklist and, because it contains
|
|
132
|
+
* a ":", is mistaken for an IP literal and skips DNS resolution entirely.
|
|
133
|
+
*/
|
|
134
|
+
const hostname: string = SSRFProtection.extractHost(rawHost);
|
|
135
|
+
|
|
136
|
+
if (!hostname) {
|
|
137
|
+
throw new BadDataException("Webhook URL must include a host.");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (SSRFProtection.isBlockedHostnameLiteral(hostname)) {
|
|
141
|
+
throw new BadDataException(
|
|
142
|
+
"Webhook URL points to a private, loopback, or link-local address and is not allowed.",
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (!SSRFProtection.isIpLiteral(hostname)) {
|
|
147
|
+
let resolved: Array<{ address: string }> = [];
|
|
148
|
+
try {
|
|
149
|
+
resolved = await dns.promises.lookup(hostname, { all: true });
|
|
150
|
+
} catch {
|
|
151
|
+
throw new BadDataException(
|
|
152
|
+
"Webhook URL hostname could not be resolved via DNS.",
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
for (const entry of resolved) {
|
|
157
|
+
if (
|
|
158
|
+
SSRFProtection.isBlockedHostnameLiteral(entry.address.toLowerCase())
|
|
159
|
+
) {
|
|
160
|
+
throw new BadDataException(
|
|
161
|
+
"Webhook URL resolves to a private, loopback, or link-local address and is not allowed.",
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* Extracts the bare host (IPv4, IPv6, or hostname) from a "host[:port]"
|
|
170
|
+
* string, handling bracketed IPv6 (`[::1]`, `[::1]:8080`) and unbracketed
|
|
171
|
+
* IPv6 literals (which contain multiple colons and carry no port).
|
|
172
|
+
*/
|
|
173
|
+
private static extractHost(hostWithPort: string): string {
|
|
174
|
+
const host: string = hostWithPort.trim();
|
|
175
|
+
|
|
176
|
+
if (host.startsWith("[")) {
|
|
177
|
+
const closingBracketIndex: number = host.indexOf("]");
|
|
178
|
+
if (closingBracketIndex !== -1) {
|
|
179
|
+
return host.slice(1, closingBracketIndex);
|
|
180
|
+
}
|
|
181
|
+
return host.replace(/^\[|\]$/g, "");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const colonCount: number = (host.match(/:/g) || []).length;
|
|
185
|
+
|
|
186
|
+
if (colonCount > 1) {
|
|
187
|
+
// Unbracketed IPv6 literal — colons are part of the address, not a port.
|
|
188
|
+
return host;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (colonCount === 1) {
|
|
192
|
+
// host:port — keep only the host part.
|
|
193
|
+
return host.split(":")[0] || "";
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return host;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* An IP literal needs no DNS lookup - but "looks like it has a colon" is not
|
|
201
|
+
* the same question, and getting it wrong is a bypass in both directions.
|
|
202
|
+
* net.isIP is the authority: it rejects "2852039166" and "0177.0.0.1"
|
|
203
|
+
* (which then go to DNS, where getaddrinfo decodes them and the resolved
|
|
204
|
+
* address gets checked) and accepts every real IPv6 spelling.
|
|
205
|
+
*/
|
|
206
|
+
private static isIpLiteral(hostname: string): boolean {
|
|
207
|
+
return net.isIP(SSRFProtection.stripZoneId(hostname)) !== 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private static stripZoneId(address: string): string {
|
|
211
|
+
const zoneIndex: number = address.indexOf("%");
|
|
212
|
+
return zoneIndex === -1 ? address : address.substring(0, zoneIndex);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* Expands an IPv6 address into its eight 16-bit groups, folding an embedded
|
|
217
|
+
* IPv4 tail ("::ffff:127.0.0.1") into two hex groups on the way, so that
|
|
218
|
+
* every spelling of one address produces one canonical answer. Returns null
|
|
219
|
+
* if the address is not parseable as IPv6.
|
|
220
|
+
*
|
|
221
|
+
* This exists because the checks below CANNOT be string prefix matches:
|
|
222
|
+
* "::1", "0:0:0:0:0:0:0:1" and "0000:...:0001" are the same host, and
|
|
223
|
+
* "::ffff:169.254.169.254" is the cloud metadata endpoint wearing a hat.
|
|
224
|
+
*/
|
|
225
|
+
private static expandIpv6(address: string): Array<number> | null {
|
|
226
|
+
let ip: string = SSRFProtection.stripZoneId(address.toLowerCase());
|
|
227
|
+
|
|
228
|
+
if (net.isIPv6(ip) === false) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Fold a dotted-quad tail into the two hex groups it stands for.
|
|
233
|
+
const lastColonIndex: number = ip.lastIndexOf(":");
|
|
234
|
+
const tail: string = ip.substring(lastColonIndex + 1);
|
|
235
|
+
if (tail.includes(".")) {
|
|
236
|
+
if (net.isIPv4(tail) === false) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const octets: Array<number> = tail.split(".").map((part: string) => {
|
|
240
|
+
return parseInt(part, 10);
|
|
241
|
+
});
|
|
242
|
+
const high: string = (
|
|
243
|
+
((octets[0] as number) << 8) |
|
|
244
|
+
(octets[1] as number)
|
|
245
|
+
).toString(16);
|
|
246
|
+
const low: string = (
|
|
247
|
+
((octets[2] as number) << 8) |
|
|
248
|
+
(octets[3] as number)
|
|
249
|
+
).toString(16);
|
|
250
|
+
ip = `${ip.substring(0, lastColonIndex)}:${high}:${low}`;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const halves: Array<string> = ip.split("::");
|
|
254
|
+
if (halves.length > 2) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const head: Array<string> =
|
|
259
|
+
halves[0] === undefined || halves[0] === "" ? [] : halves[0].split(":");
|
|
260
|
+
const rear: Array<string> =
|
|
261
|
+
halves.length === 2 && halves[1] !== undefined && halves[1] !== ""
|
|
262
|
+
? halves[1].split(":")
|
|
263
|
+
: [];
|
|
264
|
+
|
|
265
|
+
let groups: Array<string>;
|
|
266
|
+
if (halves.length === 2) {
|
|
267
|
+
const zeroFill: number = 8 - head.length - rear.length;
|
|
268
|
+
if (zeroFill < 0) {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
groups = [...head, ...new Array(zeroFill).fill("0"), ...rear];
|
|
272
|
+
} else {
|
|
273
|
+
groups = head;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (groups.length !== 8) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const parsed: Array<number> = groups.map((group: string) => {
|
|
281
|
+
return parseInt(group || "0", 16);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
if (
|
|
285
|
+
parsed.some((group: number) => {
|
|
286
|
+
return Number.isNaN(group) || group < 0 || group > 0xffff;
|
|
287
|
+
})
|
|
288
|
+
) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return parsed;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/*
|
|
296
|
+
* True when an IPv6 literal points somewhere the server must never be made
|
|
297
|
+
* to reach. Ranges, not spellings: loopback, unspecified, link-local
|
|
298
|
+
* (fe80::/10), unique-local (fc00::/7) and multicast (ff00::/8), plus the
|
|
299
|
+
* three ways IPv6 can carry an IPv4 destination - IPv4-mapped
|
|
300
|
+
* (::ffff:0:0/96), IPv4-compatible (::/96) and the NAT64 well-known prefix
|
|
301
|
+
* (64:ff9b::/96) - which are handed to the IPv4 blocklist.
|
|
302
|
+
*/
|
|
303
|
+
private static isBlockedIpv6(address: string): boolean {
|
|
304
|
+
const groups: Array<number> | null = SSRFProtection.expandIpv6(address);
|
|
305
|
+
|
|
306
|
+
if (!groups) {
|
|
307
|
+
// Not parseable as IPv6; the caller's other checks decide.
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const isZeroThrough: (endExclusive: number) => boolean = (
|
|
312
|
+
endExclusive: number,
|
|
313
|
+
): boolean => {
|
|
314
|
+
return groups.slice(0, endExclusive).every((group: number) => {
|
|
315
|
+
return group === 0;
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
const embeddedIpv4: () => string = (): string => {
|
|
320
|
+
const high: number = groups[6] as number;
|
|
321
|
+
const low: number = groups[7] as number;
|
|
322
|
+
return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// :: — unspecified. Connecting here lands on the local host.
|
|
326
|
+
if (isZeroThrough(8)) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ::1 — loopback.
|
|
331
|
+
if (isZeroThrough(7) && groups[7] === 1) {
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ::ffff:0:0/96 — IPv4-mapped.
|
|
336
|
+
if (isZeroThrough(5) && groups[5] === 0xffff) {
|
|
337
|
+
return SSRFProtection.isBlockedIpv4(embeddedIpv4());
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// 64:ff9b::/96 — NAT64 well-known prefix.
|
|
341
|
+
if (
|
|
342
|
+
groups[0] === 0x0064 &&
|
|
343
|
+
groups[1] === 0xff9b &&
|
|
344
|
+
groups[2] === 0 &&
|
|
345
|
+
groups[3] === 0 &&
|
|
346
|
+
groups[4] === 0 &&
|
|
347
|
+
groups[5] === 0
|
|
348
|
+
) {
|
|
349
|
+
return SSRFProtection.isBlockedIpv4(embeddedIpv4());
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// ::/96 — IPv4-compatible (deprecated, still routable by some stacks).
|
|
353
|
+
if (isZeroThrough(6)) {
|
|
354
|
+
return SSRFProtection.isBlockedIpv4(embeddedIpv4());
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const first: number = groups[0] as number;
|
|
358
|
+
|
|
359
|
+
// fe80::/10 — link-local.
|
|
360
|
+
if ((first & 0xffc0) === 0xfe80) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// fc00::/7 — unique-local.
|
|
365
|
+
if ((first & 0xfe00) === 0xfc00) {
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// fec0::/10 — site-local. Deprecated by RFC 3879, still routed on some networks.
|
|
370
|
+
if ((first & 0xffc0) === 0xfec0) {
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// ff00::/8 — multicast.
|
|
375
|
+
if ((first & 0xff00) === 0xff00) {
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
private static isBlockedIpv4(address: string): boolean {
|
|
383
|
+
const octets: Array<number> = address.split(".").map((part: string) => {
|
|
384
|
+
return Number(part);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
if (
|
|
388
|
+
octets.length !== 4 ||
|
|
389
|
+
octets.some((octet: number) => {
|
|
390
|
+
return Number.isNaN(octet) || octet < 0 || octet > 255;
|
|
391
|
+
})
|
|
392
|
+
) {
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const [first, second] = octets as [number, number, number, number];
|
|
397
|
+
|
|
398
|
+
if (first === 0) {
|
|
399
|
+
return true; // 0.0.0.0/8 — "this host".
|
|
400
|
+
}
|
|
401
|
+
if (first === 127) {
|
|
402
|
+
return true; // loopback
|
|
403
|
+
}
|
|
404
|
+
if (first === 10) {
|
|
405
|
+
return true; // RFC-1918
|
|
406
|
+
}
|
|
407
|
+
if (first === 172 && (second & 0xf0) === 16) {
|
|
408
|
+
return true; // RFC-1918 172.16/12
|
|
409
|
+
}
|
|
410
|
+
if (first === 192 && second === 168) {
|
|
411
|
+
return true; // RFC-1918
|
|
412
|
+
}
|
|
413
|
+
if (first === 169 && second === 254) {
|
|
414
|
+
return true; // link-local, incl. the 169.254.169.254 metadata endpoint
|
|
415
|
+
}
|
|
416
|
+
if (first === 100 && (second & 0xc0) === 64) {
|
|
417
|
+
return true; // CGNAT 100.64/10
|
|
418
|
+
}
|
|
419
|
+
if (first >= 224) {
|
|
420
|
+
return true; // multicast, reserved, and 255.255.255.255
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
private static isBlockedHostnameLiteral(hostname: string): boolean {
|
|
427
|
+
if (
|
|
428
|
+
hostname === "localhost" ||
|
|
429
|
+
hostname === "localhost." ||
|
|
430
|
+
hostname.endsWith(".localhost") ||
|
|
431
|
+
hostname === "metadata.google.internal"
|
|
432
|
+
) {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const address: string = SSRFProtection.stripZoneId(
|
|
437
|
+
hostname.replace(/^\[|\]$/g, ""),
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
if (net.isIPv4(address)) {
|
|
441
|
+
return SSRFProtection.isBlockedIpv4(address);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (net.isIPv6(address)) {
|
|
445
|
+
return SSRFProtection.isBlockedIpv6(address);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
@@ -34,6 +34,7 @@ import "./Process";
|
|
|
34
34
|
import Response from "./Response";
|
|
35
35
|
import SpanUtil from "./Telemetry/SpanUtil";
|
|
36
36
|
import TelemetryContext from "./Telemetry/TelemetryContext";
|
|
37
|
+
import mountVendorAssets from "./VendorAssets";
|
|
37
38
|
import { api } from "@opentelemetry/sdk-node";
|
|
38
39
|
import StatusCode from "../../Types/API/StatusCode";
|
|
39
40
|
import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
|
|
@@ -126,6 +127,14 @@ const setDefaultHeaders: RequestHandler = (
|
|
|
126
127
|
|
|
127
128
|
res.header("Access-Control-Expose-Headers", CORS_EXPOSED_HEADERS.join(", "));
|
|
128
129
|
|
|
130
|
+
/*
|
|
131
|
+
* Content sniffing turns "the server declared a boring type" into "the
|
|
132
|
+
* browser guessed an interesting one", which is how an upload becomes a
|
|
133
|
+
* document. nginx sets this on the static app locations but not on /api or
|
|
134
|
+
* /file, so set it here for everything the app itself serves.
|
|
135
|
+
*/
|
|
136
|
+
res.header("X-Content-Type-Options", "nosniff");
|
|
137
|
+
|
|
129
138
|
next();
|
|
130
139
|
};
|
|
131
140
|
|
|
@@ -303,6 +312,13 @@ const init: InitFunction = async (
|
|
|
303
312
|
statusOptions: data.statusOptions,
|
|
304
313
|
});
|
|
305
314
|
|
|
315
|
+
/*
|
|
316
|
+
* Ahead of the frontend static mounts and every catch-all below them, so a
|
|
317
|
+
* service that answers "/*" with its index page cannot swallow a request for
|
|
318
|
+
* a stylesheet.
|
|
319
|
+
*/
|
|
320
|
+
mountVendorAssets(app);
|
|
321
|
+
|
|
306
322
|
if (isFrontendApp) {
|
|
307
323
|
app.use(ExpressStatic("/usr/src/app/public"));
|
|
308
324
|
|