@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
|
@@ -30,9 +30,11 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
|
30
30
|
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
31
31
|
import ObjectID from "../../../../Types/ObjectID";
|
|
32
32
|
import WorkspaceProjectAuthTokenService from "../../../Services/WorkspaceProjectAuthTokenService";
|
|
33
|
+
import SSRFProtection from "../../SSRFProtection";
|
|
33
34
|
import WorkspaceProjectAuthToken, {
|
|
34
35
|
MicrosoftTeamsChat,
|
|
35
36
|
MicrosoftTeamsChatType,
|
|
37
|
+
MicrosoftTeamsInstalledTeam,
|
|
36
38
|
MicrosoftTeamsMiscData,
|
|
37
39
|
} from "../../../../Models/DatabaseModels/WorkspaceProjectAuthToken";
|
|
38
40
|
import Incident from "../../../../Models/DatabaseModels/Incident";
|
|
@@ -110,9 +112,42 @@ import { AIChatCitation } from "../../../../Types/AI/AIChatTypes";
|
|
|
110
112
|
// Microsoft Teams apps should always be single-tenant
|
|
111
113
|
const MICROSOFT_TEAMS_APP_TYPE: string = "SingleTenant";
|
|
112
114
|
|
|
115
|
+
/*
|
|
116
|
+
* Outcome of mapping a Microsoft tenant id to a OneUptime project.
|
|
117
|
+
*
|
|
118
|
+
* projectAuth is null both when nothing matched and when the tenant is
|
|
119
|
+
* connected to several projects — isAmbiguous distinguishes the two so callers
|
|
120
|
+
* can give the right remedy.
|
|
121
|
+
*/
|
|
122
|
+
export interface MicrosoftTeamsTenantResolution {
|
|
123
|
+
projectAuth: WorkspaceProjectAuthToken | null;
|
|
124
|
+
isAmbiguous: boolean;
|
|
125
|
+
candidateProjectIds: Array<ObjectID>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* Microsoft's wording when the Bot Framework refuses a proactive post because
|
|
130
|
+
* the app is not a member of the target conversation. Matched case-insensitively
|
|
131
|
+
* so we can replace it with something the admin can act on.
|
|
132
|
+
*/
|
|
133
|
+
const MICROSOFT_TEAMS_ROSTER_ERROR_FRAGMENTS: Array<string> = [
|
|
134
|
+
"not part of the conversation roster",
|
|
135
|
+
"bot is not part of the conversation",
|
|
136
|
+
];
|
|
137
|
+
|
|
113
138
|
// Maximum number of pages to fetch when paginating teams
|
|
114
139
|
const MICROSOFT_TEAMS_MAX_PAGES: number = 500;
|
|
115
140
|
|
|
141
|
+
/*
|
|
142
|
+
* Hosts that may receive a Teams incoming webhook. Connector webhooks are
|
|
143
|
+
* issued on outlook.office.com / outlook.office365.com, and per-tenant ones on
|
|
144
|
+
* <tenant>.webhook.office.com — all covered by these two registrable domains.
|
|
145
|
+
*/
|
|
146
|
+
export const MICROSOFT_TEAMS_WEBHOOK_DOMAINS: Array<string> = [
|
|
147
|
+
"office.com",
|
|
148
|
+
"office365.com",
|
|
149
|
+
];
|
|
150
|
+
|
|
116
151
|
export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
117
152
|
private static cachedAdapter: CloudAdapter | null = null;
|
|
118
153
|
private static readonly WELCOME_CARD_STATE_KEY: string =
|
|
@@ -693,6 +728,17 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
693
728
|
logger.debug("Sending message to Teams channel via incoming webhook:");
|
|
694
729
|
logger.debug(data);
|
|
695
730
|
|
|
731
|
+
/*
|
|
732
|
+
* Enforced at the sink, not only at the callers: this URL reaches here from
|
|
733
|
+
* workflow arguments and from status page subscribers, and a caller that
|
|
734
|
+
* forgets the pin is an SSRF from the API server.
|
|
735
|
+
*/
|
|
736
|
+
if (!MicrosoftTeamsUtil.isValidMicrosoftTeamsIncomingWebhookUrl(data.url)) {
|
|
737
|
+
throw new BadDataException(
|
|
738
|
+
`Microsoft Teams Webhook URL must be an https URL on ${MICROSOFT_TEAMS_WEBHOOK_DOMAINS.join(" or ")}.`,
|
|
739
|
+
);
|
|
740
|
+
}
|
|
741
|
+
|
|
696
742
|
// Build a structured MessageCard from markdown for better rendering in Teams
|
|
697
743
|
const payload: JSONObject = this.buildMessageCardFromMarkdown(data.text);
|
|
698
744
|
|
|
@@ -700,6 +746,13 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
700
746
|
await API.post({
|
|
701
747
|
url: data.url,
|
|
702
748
|
data: payload,
|
|
749
|
+
options: {
|
|
750
|
+
/*
|
|
751
|
+
* The host is pinned to Microsoft, but do not let a redirect from it
|
|
752
|
+
* bounce this request to an internal address.
|
|
753
|
+
*/
|
|
754
|
+
doNotFollowRedirects: true,
|
|
755
|
+
},
|
|
703
756
|
});
|
|
704
757
|
|
|
705
758
|
if (!apiResult) {
|
|
@@ -730,11 +783,16 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
730
783
|
public static isValidMicrosoftTeamsIncomingWebhookUrl(
|
|
731
784
|
incomingWebhookUrl: URL,
|
|
732
785
|
): boolean {
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
786
|
+
/*
|
|
787
|
+
* Pin on the URL's HOST, not on a substring of the whole URL. Subscribers
|
|
788
|
+
* (including unauthenticated ones on a public status page) supply this
|
|
789
|
+
* value and the server POSTs to it, so a substring check was satisfied by
|
|
790
|
+
* an attacker-controlled path or query — `http://169.254.169.254/?x=office.com`
|
|
791
|
+
* passed and turned this into an SSRF into the cloud metadata endpoint.
|
|
792
|
+
*/
|
|
793
|
+
return SSRFProtection.isUrlOnAllowedDomain(
|
|
794
|
+
incomingWebhookUrl,
|
|
795
|
+
MICROSOFT_TEAMS_WEBHOOK_DOMAINS,
|
|
738
796
|
);
|
|
739
797
|
}
|
|
740
798
|
|
|
@@ -1060,6 +1118,7 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1060
1118
|
name: displayName,
|
|
1061
1119
|
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1062
1120
|
teamId: data.teamId,
|
|
1121
|
+
membershipType: channelData["membershipType"] as string | undefined,
|
|
1063
1122
|
};
|
|
1064
1123
|
logger.debug(`Channel match found: ${JSON.stringify(foundChannel)}`);
|
|
1065
1124
|
return foundChannel;
|
|
@@ -1130,6 +1189,17 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1130
1189
|
`Channel names: ${JSON.stringify(data.workspaceMessagePayload.channelNames)}`,
|
|
1131
1190
|
);
|
|
1132
1191
|
|
|
1192
|
+
/*
|
|
1193
|
+
* Declared before destination resolution so that a destination we cannot
|
|
1194
|
+
* even resolve is reported as an error. Silently skipping it made a
|
|
1195
|
+
* typo'd or deleted channel look like a successful send.
|
|
1196
|
+
*/
|
|
1197
|
+
const workspaceMessageResponse: WorkspaceSendMessageResponse = {
|
|
1198
|
+
threads: [],
|
|
1199
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1200
|
+
errors: [],
|
|
1201
|
+
};
|
|
1202
|
+
|
|
1133
1203
|
// Resolve channel names
|
|
1134
1204
|
for (const channelName of data.workspaceMessagePayload.channelNames) {
|
|
1135
1205
|
logger.debug(`Attempting to resolve channel name: ${channelName}`);
|
|
@@ -1155,6 +1225,15 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1155
1225
|
workspaceChannelsToPostTo.push(channel);
|
|
1156
1226
|
} else {
|
|
1157
1227
|
logger.warn(`Channel not found: ${channelName}`);
|
|
1228
|
+
workspaceMessageResponse.errors!.push({
|
|
1229
|
+
channel: {
|
|
1230
|
+
id: "",
|
|
1231
|
+
name: channelName,
|
|
1232
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1233
|
+
teamId: data.workspaceMessagePayload.teamId,
|
|
1234
|
+
},
|
|
1235
|
+
error: `Channel "${channelName}" was not found in this Microsoft Teams team. It may have been renamed or deleted.`,
|
|
1236
|
+
});
|
|
1158
1237
|
}
|
|
1159
1238
|
}
|
|
1160
1239
|
|
|
@@ -1192,6 +1271,15 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1192
1271
|
},
|
|
1193
1272
|
);
|
|
1194
1273
|
logger.error(err);
|
|
1274
|
+
workspaceMessageResponse.errors!.push({
|
|
1275
|
+
channel: {
|
|
1276
|
+
id: channelId,
|
|
1277
|
+
name: channelId,
|
|
1278
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1279
|
+
teamId: data.workspaceMessagePayload.teamId,
|
|
1280
|
+
},
|
|
1281
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1282
|
+
});
|
|
1195
1283
|
}
|
|
1196
1284
|
}
|
|
1197
1285
|
|
|
@@ -1201,12 +1289,6 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1201
1289
|
);
|
|
1202
1290
|
logger.debug(`Channels: ${JSON.stringify(workspaceChannelsToPostTo)}`);
|
|
1203
1291
|
|
|
1204
|
-
const workspaceMessageResponse: WorkspaceSendMessageResponse = {
|
|
1205
|
-
threads: [],
|
|
1206
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1207
|
-
errors: [],
|
|
1208
|
-
};
|
|
1209
|
-
|
|
1210
1292
|
for (const channel of workspaceChannelsToPostTo) {
|
|
1211
1293
|
try {
|
|
1212
1294
|
logger.debug(
|
|
@@ -1396,6 +1478,43 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1396
1478
|
|
|
1397
1479
|
logger.debug(`Using bot ID: ${miscData.botId}`);
|
|
1398
1480
|
|
|
1481
|
+
/*
|
|
1482
|
+
* Bots cannot post to shared channels at all, so fail with the reason
|
|
1483
|
+
* rather than letting Microsoft reject the send with a generic error.
|
|
1484
|
+
*/
|
|
1485
|
+
if (data.workspaceChannel.membershipType === "shared") {
|
|
1486
|
+
throw new BadDataException(
|
|
1487
|
+
`"${data.workspaceChannel.name}" is a shared channel, and Microsoft Teams does not allow bots to post in shared channels. Please pick a standard or private channel instead.`,
|
|
1488
|
+
);
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
/*
|
|
1492
|
+
* Preflight: refuse before calling the Bot Framework when we know the
|
|
1493
|
+
* app was never installed into this team. Channels are discovered with
|
|
1494
|
+
* tenant-wide Graph application permissions, which see every team
|
|
1495
|
+
* regardless of installation — so reaching this point proves nothing
|
|
1496
|
+
* about whether we can actually post.
|
|
1497
|
+
*
|
|
1498
|
+
* installedTeams is only populated from install events, so an empty map
|
|
1499
|
+
* means "we have not observed any installs" (for example on a workspace
|
|
1500
|
+
* connected before this shipped), not "nothing is installed". Only
|
|
1501
|
+
* enforce once we have at least one record, and let the Bot Framework
|
|
1502
|
+
* error be translated below otherwise.
|
|
1503
|
+
*/
|
|
1504
|
+
const installedTeams: Record<string, MicrosoftTeamsInstalledTeam> =
|
|
1505
|
+
miscData.installedTeams || {};
|
|
1506
|
+
const installedTeam: MicrosoftTeamsInstalledTeam | undefined =
|
|
1507
|
+
installedTeams[data.teamId];
|
|
1508
|
+
|
|
1509
|
+
if (Object.keys(installedTeams).length > 0 && !installedTeam) {
|
|
1510
|
+
throw new BadDataException(
|
|
1511
|
+
this.getBotNotInTeamMessage({
|
|
1512
|
+
channelName: data.workspaceChannel.name,
|
|
1513
|
+
membershipType: data.workspaceChannel.membershipType,
|
|
1514
|
+
}),
|
|
1515
|
+
);
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1399
1518
|
// Get Bot Framework adapter
|
|
1400
1519
|
const adapter: CloudAdapter = this.getBotAdapter();
|
|
1401
1520
|
|
|
@@ -1413,7 +1532,13 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1413
1532
|
tenantId: tenantId,
|
|
1414
1533
|
},
|
|
1415
1534
|
channelId: "msteams",
|
|
1416
|
-
|
|
1535
|
+
/*
|
|
1536
|
+
* Fallback is the commercial-cloud global endpoint; the serviceUrl
|
|
1537
|
+
* captured from the install event is preferred (required for GCC/DoD),
|
|
1538
|
+
* matching what sendAdaptiveCardToChat already does.
|
|
1539
|
+
*/
|
|
1540
|
+
serviceUrl:
|
|
1541
|
+
installedTeam?.serviceUrl || "https://smba.trafficmanager.net/teams/",
|
|
1417
1542
|
};
|
|
1418
1543
|
|
|
1419
1544
|
logger.debug(
|
|
@@ -1460,10 +1585,59 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1460
1585
|
teamId: data.teamId,
|
|
1461
1586
|
});
|
|
1462
1587
|
logger.error(error);
|
|
1588
|
+
|
|
1589
|
+
/*
|
|
1590
|
+
* Microsoft's roster rejection is meaningless to an admin ("The bot is
|
|
1591
|
+
* not part of the conversation roster"). Replace it with the action that
|
|
1592
|
+
* actually fixes it.
|
|
1593
|
+
*/
|
|
1594
|
+
if (this.isBotNotInConversationRosterError(error)) {
|
|
1595
|
+
throw new BadDataException(
|
|
1596
|
+
this.getBotNotInTeamMessage({
|
|
1597
|
+
channelName: data.workspaceChannel.name,
|
|
1598
|
+
membershipType: data.workspaceChannel.membershipType,
|
|
1599
|
+
}),
|
|
1600
|
+
);
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1463
1603
|
throw error;
|
|
1464
1604
|
}
|
|
1465
1605
|
}
|
|
1466
1606
|
|
|
1607
|
+
/*
|
|
1608
|
+
* True when an error is Microsoft's "bot is not in this conversation"
|
|
1609
|
+
* rejection from a proactive Bot Framework send.
|
|
1610
|
+
*/
|
|
1611
|
+
public static isBotNotInConversationRosterError(error: unknown): boolean {
|
|
1612
|
+
const message: string = (
|
|
1613
|
+
error instanceof Error ? error.message : String(error || "")
|
|
1614
|
+
).toLowerCase();
|
|
1615
|
+
|
|
1616
|
+
if (!message) {
|
|
1617
|
+
return false;
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
return MICROSOFT_TEAMS_ROSTER_ERROR_FRAGMENTS.some((fragment: string) => {
|
|
1621
|
+
return message.includes(fragment);
|
|
1622
|
+
});
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
/*
|
|
1626
|
+
* Actionable replacement for the roster error. Private channels need the app
|
|
1627
|
+
* installed into the channel itself; a parent-team install does not cover
|
|
1628
|
+
* them, so the two cases get different instructions.
|
|
1629
|
+
*/
|
|
1630
|
+
public static getBotNotInTeamMessage(data: {
|
|
1631
|
+
channelName: string;
|
|
1632
|
+
membershipType?: string | undefined;
|
|
1633
|
+
}): string {
|
|
1634
|
+
if (data.membershipType === "private") {
|
|
1635
|
+
return `The OneUptime app is not installed in the private channel "${data.channelName}". In Microsoft Teams, open the channel, click the "..." menu, then Manage channel > Apps > Add an app, and add OneUptime. Installing OneUptime in the parent team does not cover private channels.`;
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
return `The OneUptime app is not installed in the Microsoft Teams team that owns "${data.channelName}". In Microsoft Teams, click the "..." next to the team name, then Manage team > Apps > More apps, and add OneUptime. Installing OneUptime for yourself or in a chat is not the same as adding it to the team.`;
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1467
1641
|
/*
|
|
1468
1642
|
* Sends an adaptive card to a Teams group chat or personal (1:1) chat via a
|
|
1469
1643
|
* proactive Bot Framework message. The OneUptime app must have been added to
|
|
@@ -1677,6 +1851,7 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1677
1851
|
name: channelData["displayName"] as string,
|
|
1678
1852
|
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
1679
1853
|
teamId: data.teamId,
|
|
1854
|
+
membershipType: channelData["membershipType"] as string | undefined,
|
|
1680
1855
|
};
|
|
1681
1856
|
|
|
1682
1857
|
logger.debug(`Channel info retrieved: ${JSON.stringify(channel)}`);
|
|
@@ -1891,10 +2066,27 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
1891
2066
|
const channelsDict: Dictionary<WorkspaceChannel> = {};
|
|
1892
2067
|
|
|
1893
2068
|
for (const channelData of channelsArray) {
|
|
2069
|
+
const membershipType: string | undefined = channelData[
|
|
2070
|
+
"membershipType"
|
|
2071
|
+
] as string | undefined;
|
|
2072
|
+
|
|
2073
|
+
/*
|
|
2074
|
+
* Microsoft Teams does not support bots in shared channels, so offering
|
|
2075
|
+
* one as a notification destination can only ever produce a failed send.
|
|
2076
|
+
*/
|
|
2077
|
+
if (membershipType === "shared") {
|
|
2078
|
+
logger.debug(
|
|
2079
|
+
`Skipping shared channel ${channelData["displayName"]} — Teams does not support bots in shared channels.`,
|
|
2080
|
+
);
|
|
2081
|
+
continue;
|
|
2082
|
+
}
|
|
2083
|
+
|
|
1894
2084
|
const channel: WorkspaceChannel = {
|
|
1895
2085
|
id: channelData["id"] as string,
|
|
1896
2086
|
name: channelData["displayName"] as string,
|
|
1897
2087
|
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
2088
|
+
teamId: data.teamId,
|
|
2089
|
+
membershipType: membershipType,
|
|
1898
2090
|
};
|
|
1899
2091
|
channelsDict[channel.id] = channel;
|
|
1900
2092
|
}
|
|
@@ -2151,6 +2343,19 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2151
2343
|
});
|
|
2152
2344
|
}
|
|
2153
2345
|
|
|
2346
|
+
/*
|
|
2347
|
+
* Same backfill for team installs. Teams the app was added to before we
|
|
2348
|
+
* started recording installs fire no new install event, so an @mention in
|
|
2349
|
+
* any channel of that team is the recovery path that makes proactive
|
|
2350
|
+
* channel notifications work again.
|
|
2351
|
+
*/
|
|
2352
|
+
if (messageConversationType === "channel") {
|
|
2353
|
+
await this.captureTeamFromBotActivity({
|
|
2354
|
+
activity: data.activity,
|
|
2355
|
+
turnContext: data.turnContext,
|
|
2356
|
+
});
|
|
2357
|
+
}
|
|
2358
|
+
|
|
2154
2359
|
// If this is actually an Adaptive Card submit wrapped as a message, route to invoke handler
|
|
2155
2360
|
if (
|
|
2156
2361
|
(possibleActionValue["action"] as string) ||
|
|
@@ -2199,32 +2404,22 @@ export default class MicrosoftTeamsUtil extends WorkspaceBase {
|
|
|
2199
2404
|
}
|
|
2200
2405
|
|
|
2201
2406
|
// Get project auth by tenant ID
|
|
2202
|
-
const
|
|
2203
|
-
await
|
|
2204
|
-
query: {
|
|
2205
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
2206
|
-
workspaceProjectId: tenantId,
|
|
2207
|
-
},
|
|
2208
|
-
select: {
|
|
2209
|
-
projectId: true,
|
|
2210
|
-
workspaceProjectId: true,
|
|
2211
|
-
},
|
|
2212
|
-
props: {
|
|
2213
|
-
isRoot: true,
|
|
2214
|
-
},
|
|
2215
|
-
});
|
|
2216
|
-
|
|
2217
|
-
if (!projectAuth || !projectAuth.projectId) {
|
|
2218
|
-
logger.error("Project auth not found for tenant ID: " + tenantId, {
|
|
2407
|
+
const tenantResolution: MicrosoftTeamsTenantResolution =
|
|
2408
|
+
await this.resolveProjectByTenantId({
|
|
2219
2409
|
tenantId: tenantId,
|
|
2220
2410
|
});
|
|
2411
|
+
|
|
2412
|
+
if (
|
|
2413
|
+
!tenantResolution.projectAuth ||
|
|
2414
|
+
!tenantResolution.projectAuth.projectId
|
|
2415
|
+
) {
|
|
2221
2416
|
await data.turnContext.sendActivity(
|
|
2222
|
-
|
|
2417
|
+
this.getTenantResolutionFailureMessage(tenantResolution),
|
|
2223
2418
|
);
|
|
2224
2419
|
return;
|
|
2225
2420
|
}
|
|
2226
2421
|
|
|
2227
|
-
const projectId: ObjectID = projectAuth.projectId;
|
|
2422
|
+
const projectId: ObjectID = tenantResolution.projectAuth.projectId;
|
|
2228
2423
|
logger.debug(
|
|
2229
2424
|
`Found project ID: ${projectId.toString()} for tenant ID: ${tenantId}`,
|
|
2230
2425
|
);
|
|
@@ -3263,34 +3458,22 @@ All monitoring checks are passing normally.`;
|
|
|
3263
3458
|
return;
|
|
3264
3459
|
}
|
|
3265
3460
|
|
|
3266
|
-
const
|
|
3267
|
-
await
|
|
3268
|
-
|
|
3269
|
-
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
3270
|
-
workspaceProjectId: tenantId,
|
|
3271
|
-
},
|
|
3272
|
-
select: {
|
|
3273
|
-
projectId: true,
|
|
3274
|
-
authToken: true,
|
|
3275
|
-
workspaceProjectId: true,
|
|
3276
|
-
},
|
|
3277
|
-
props: { isRoot: true },
|
|
3461
|
+
const tenantResolution: MicrosoftTeamsTenantResolution =
|
|
3462
|
+
await this.resolveProjectByTenantId({
|
|
3463
|
+
tenantId: tenantId,
|
|
3278
3464
|
});
|
|
3279
3465
|
|
|
3280
|
-
if (
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
tenantId: tenantId,
|
|
3285
|
-
},
|
|
3286
|
-
);
|
|
3466
|
+
if (
|
|
3467
|
+
!tenantResolution.projectAuth ||
|
|
3468
|
+
!tenantResolution.projectAuth.projectId
|
|
3469
|
+
) {
|
|
3287
3470
|
await data.turnContext.sendActivity(
|
|
3288
|
-
|
|
3471
|
+
this.getTenantResolutionFailureMessage(tenantResolution),
|
|
3289
3472
|
);
|
|
3290
3473
|
return;
|
|
3291
3474
|
}
|
|
3292
3475
|
|
|
3293
|
-
const projectId: ObjectID = projectAuth.projectId;
|
|
3476
|
+
const projectId: ObjectID = tenantResolution.projectAuth.projectId;
|
|
3294
3477
|
const fromObj: JSONObject = ((data.activity["from"] as JSONObject) ||
|
|
3295
3478
|
{}) as JSONObject;
|
|
3296
3479
|
const teamsUserId: string | undefined =
|
|
@@ -3479,6 +3662,10 @@ All monitoring checks are passing normally.`;
|
|
|
3479
3662
|
activity: data.activity,
|
|
3480
3663
|
turnContext: data.turnContext,
|
|
3481
3664
|
});
|
|
3665
|
+
await this.captureTeamFromBotActivity({
|
|
3666
|
+
activity: data.activity,
|
|
3667
|
+
turnContext: data.turnContext,
|
|
3668
|
+
});
|
|
3482
3669
|
await this.sendWelcomeAdaptiveCard(data.turnContext);
|
|
3483
3670
|
}
|
|
3484
3671
|
|
|
@@ -3487,6 +3674,9 @@ All monitoring checks are passing normally.`;
|
|
|
3487
3674
|
await this.removeChatFromBotActivity({
|
|
3488
3675
|
activity: data.activity,
|
|
3489
3676
|
});
|
|
3677
|
+
await this.removeTeamFromBotActivity({
|
|
3678
|
+
activity: data.activity,
|
|
3679
|
+
});
|
|
3490
3680
|
}
|
|
3491
3681
|
}
|
|
3492
3682
|
|
|
@@ -3516,14 +3706,140 @@ All monitoring checks are passing normally.`;
|
|
|
3516
3706
|
activity: data.activity,
|
|
3517
3707
|
turnContext: data.turnContext,
|
|
3518
3708
|
});
|
|
3709
|
+
await this.captureTeamFromBotActivity({
|
|
3710
|
+
activity: data.activity,
|
|
3711
|
+
turnContext: data.turnContext,
|
|
3712
|
+
});
|
|
3519
3713
|
} else if (action === "remove" || action === "remove-upgrade") {
|
|
3520
3714
|
logger.debug("OneUptime bot was uninstalled");
|
|
3521
3715
|
await this.removeChatFromBotActivity({
|
|
3522
3716
|
activity: data.activity,
|
|
3523
3717
|
});
|
|
3718
|
+
await this.removeTeamFromBotActivity({
|
|
3719
|
+
activity: data.activity,
|
|
3720
|
+
});
|
|
3524
3721
|
}
|
|
3525
3722
|
}
|
|
3526
3723
|
|
|
3724
|
+
/*
|
|
3725
|
+
* Resolve the OneUptime project that owns a Microsoft tenant.
|
|
3726
|
+
*
|
|
3727
|
+
* Bot activities carry a tenant id and nothing else, so the tenant is the
|
|
3728
|
+
* only key we can resolve a project by. A tenant may legitimately be
|
|
3729
|
+
* connected to more than one OneUptime project (saveChatToProjectAuthTokens
|
|
3730
|
+
* fans out for exactly that reason), and when that happens the tenant alone
|
|
3731
|
+
* does NOT identify a project.
|
|
3732
|
+
*
|
|
3733
|
+
* Previously this was a bare findOneBy, which silently returned whichever
|
|
3734
|
+
* row sorted first and served that project's incidents, alerts and AI
|
|
3735
|
+
* assistant answers to anyone in the tenant — including users with no access
|
|
3736
|
+
* to it. The bot's message path performs no per-user authorization, so
|
|
3737
|
+
* picking arbitrarily is a cross-project disclosure. Refuse instead.
|
|
3738
|
+
*/
|
|
3739
|
+
@CaptureSpan()
|
|
3740
|
+
public static async resolveProjectByTenantId(data: {
|
|
3741
|
+
tenantId: string;
|
|
3742
|
+
}): Promise<MicrosoftTeamsTenantResolution> {
|
|
3743
|
+
const projectAuths: Array<WorkspaceProjectAuthToken> =
|
|
3744
|
+
await WorkspaceProjectAuthTokenService.findBy({
|
|
3745
|
+
query: {
|
|
3746
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
3747
|
+
workspaceProjectId: data.tenantId,
|
|
3748
|
+
},
|
|
3749
|
+
select: {
|
|
3750
|
+
projectId: true,
|
|
3751
|
+
authToken: true,
|
|
3752
|
+
workspaceProjectId: true,
|
|
3753
|
+
miscData: true,
|
|
3754
|
+
},
|
|
3755
|
+
limit: LIMIT_MAX,
|
|
3756
|
+
skip: 0,
|
|
3757
|
+
props: {
|
|
3758
|
+
isRoot: true,
|
|
3759
|
+
},
|
|
3760
|
+
});
|
|
3761
|
+
|
|
3762
|
+
/*
|
|
3763
|
+
* Ambiguity is about distinct PROJECTS, not rows. Two rows pointing at the
|
|
3764
|
+
* same project are a data-integrity wart, not a question we cannot answer,
|
|
3765
|
+
* so collapse them rather than refusing to serve that tenant forever.
|
|
3766
|
+
*/
|
|
3767
|
+
const seenProjectIds: Set<string> = new Set<string>();
|
|
3768
|
+
const usableProjectAuths: Array<WorkspaceProjectAuthToken> = [];
|
|
3769
|
+
|
|
3770
|
+
for (const projectAuth of projectAuths) {
|
|
3771
|
+
if (!projectAuth.projectId) {
|
|
3772
|
+
continue;
|
|
3773
|
+
}
|
|
3774
|
+
|
|
3775
|
+
const projectIdString: string = projectAuth.projectId.toString();
|
|
3776
|
+
|
|
3777
|
+
if (seenProjectIds.has(projectIdString)) {
|
|
3778
|
+
continue;
|
|
3779
|
+
}
|
|
3780
|
+
|
|
3781
|
+
seenProjectIds.add(projectIdString);
|
|
3782
|
+
usableProjectAuths.push(projectAuth);
|
|
3783
|
+
}
|
|
3784
|
+
|
|
3785
|
+
if (usableProjectAuths.length === 0) {
|
|
3786
|
+
logger.error("Project auth not found for tenant ID: " + data.tenantId, {
|
|
3787
|
+
tenantId: data.tenantId,
|
|
3788
|
+
});
|
|
3789
|
+
return {
|
|
3790
|
+
projectAuth: null,
|
|
3791
|
+
isAmbiguous: false,
|
|
3792
|
+
candidateProjectIds: [],
|
|
3793
|
+
};
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
if (usableProjectAuths.length > 1) {
|
|
3797
|
+
const candidateProjectIds: Array<ObjectID> = usableProjectAuths.map(
|
|
3798
|
+
(projectAuth: WorkspaceProjectAuthToken) => {
|
|
3799
|
+
return projectAuth.projectId!;
|
|
3800
|
+
},
|
|
3801
|
+
);
|
|
3802
|
+
|
|
3803
|
+
logger.error(
|
|
3804
|
+
`Microsoft tenant ${data.tenantId} is connected to ${usableProjectAuths.length} OneUptime projects. Refusing to guess which one this bot activity belongs to.`,
|
|
3805
|
+
{
|
|
3806
|
+
tenantId: data.tenantId,
|
|
3807
|
+
projectIds: candidateProjectIds
|
|
3808
|
+
.map((projectId: ObjectID) => {
|
|
3809
|
+
return projectId.toString();
|
|
3810
|
+
})
|
|
3811
|
+
.join(", "),
|
|
3812
|
+
},
|
|
3813
|
+
);
|
|
3814
|
+
|
|
3815
|
+
return {
|
|
3816
|
+
projectAuth: null,
|
|
3817
|
+
isAmbiguous: true,
|
|
3818
|
+
candidateProjectIds: candidateProjectIds,
|
|
3819
|
+
};
|
|
3820
|
+
}
|
|
3821
|
+
|
|
3822
|
+
return {
|
|
3823
|
+
projectAuth: usableProjectAuths[0]!,
|
|
3824
|
+
isAmbiguous: false,
|
|
3825
|
+
candidateProjectIds: [usableProjectAuths[0]!.projectId!],
|
|
3826
|
+
};
|
|
3827
|
+
}
|
|
3828
|
+
|
|
3829
|
+
/*
|
|
3830
|
+
* User-facing text for a failed tenant resolution. The two cases need
|
|
3831
|
+
* different remedies, so they must not share a message.
|
|
3832
|
+
*/
|
|
3833
|
+
public static getTenantResolutionFailureMessage(
|
|
3834
|
+
resolution: MicrosoftTeamsTenantResolution,
|
|
3835
|
+
): string {
|
|
3836
|
+
if (resolution.isAmbiguous) {
|
|
3837
|
+
return "This Microsoft 365 organization is connected to more than one OneUptime project, so I can't tell which one you mean. Please ask your OneUptime admin to disconnect Microsoft Teams from all but one project.";
|
|
3838
|
+
}
|
|
3839
|
+
|
|
3840
|
+
return "Sorry, I couldn't find your project configuration. This usually means the Microsoft 365 organization you're messaging me from isn't the one connected to OneUptime. Please ask your OneUptime admin to check the Microsoft Teams integration in Project Settings.";
|
|
3841
|
+
}
|
|
3842
|
+
|
|
3527
3843
|
/*
|
|
3528
3844
|
* Chats (group chats and personal 1:1 chats) cannot be listed with the
|
|
3529
3845
|
* app-only Graph token, so the only way OneUptime learns about them is by
|
|
@@ -3918,6 +4234,214 @@ All monitoring checks are passing normally.`;
|
|
|
3918
4234
|
);
|
|
3919
4235
|
}
|
|
3920
4236
|
|
|
4237
|
+
/*
|
|
4238
|
+
* Record that the OneUptime app was installed into a team.
|
|
4239
|
+
*
|
|
4240
|
+
* Team installs arrive as conversationUpdate / installationUpdate activities
|
|
4241
|
+
* whose conversation is a channel. captureChatFromBotActivity drops those
|
|
4242
|
+
* (channels are not chats), so before this existed we threw away the only
|
|
4243
|
+
* signal that tells us a proactive channel post will be accepted.
|
|
4244
|
+
*/
|
|
4245
|
+
@CaptureSpan()
|
|
4246
|
+
public static async captureTeamFromBotActivity(data: {
|
|
4247
|
+
activity: JSONObject;
|
|
4248
|
+
turnContext: TurnContext;
|
|
4249
|
+
}): Promise<void> {
|
|
4250
|
+
try {
|
|
4251
|
+
const channelData: JSONObject =
|
|
4252
|
+
(data.activity["channelData"] as JSONObject) || {};
|
|
4253
|
+
|
|
4254
|
+
const team: JSONObject | undefined = channelData["team"] as
|
|
4255
|
+
| JSONObject
|
|
4256
|
+
| undefined;
|
|
4257
|
+
|
|
4258
|
+
const teamId: string = (team?.["id"] as string) || "";
|
|
4259
|
+
|
|
4260
|
+
if (!teamId) {
|
|
4261
|
+
// Not a team-scoped activity (personal or group chat). Nothing to do.
|
|
4262
|
+
return;
|
|
4263
|
+
}
|
|
4264
|
+
|
|
4265
|
+
const tenantId: string =
|
|
4266
|
+
((channelData["tenant"] as JSONObject)?.["id"] as string) || "";
|
|
4267
|
+
|
|
4268
|
+
if (!tenantId) {
|
|
4269
|
+
logger.debug("No tenant id found on team activity. Skipping.");
|
|
4270
|
+
return;
|
|
4271
|
+
}
|
|
4272
|
+
|
|
4273
|
+
const installedTeam: MicrosoftTeamsInstalledTeam = {
|
|
4274
|
+
id: teamId,
|
|
4275
|
+
name: (team?.["name"] as string) || undefined,
|
|
4276
|
+
serviceUrl:
|
|
4277
|
+
(data.activity["serviceUrl"] as string) ||
|
|
4278
|
+
data.turnContext.activity.serviceUrl ||
|
|
4279
|
+
undefined,
|
|
4280
|
+
addedAt: OneUptimeDate.getCurrentDate().toISOString(),
|
|
4281
|
+
};
|
|
4282
|
+
|
|
4283
|
+
await this.saveTeamToProjectAuthTokens({
|
|
4284
|
+
tenantId: tenantId,
|
|
4285
|
+
team: installedTeam,
|
|
4286
|
+
});
|
|
4287
|
+
|
|
4288
|
+
logger.debug(
|
|
4289
|
+
`Captured Microsoft Teams team install ${teamId} for tenant ${tenantId}`,
|
|
4290
|
+
);
|
|
4291
|
+
} catch (err) {
|
|
4292
|
+
logger.error("Error capturing Microsoft Teams team from bot activity:");
|
|
4293
|
+
logger.error(err);
|
|
4294
|
+
}
|
|
4295
|
+
}
|
|
4296
|
+
|
|
4297
|
+
@CaptureSpan()
|
|
4298
|
+
public static async removeTeamFromBotActivity(data: {
|
|
4299
|
+
activity: JSONObject;
|
|
4300
|
+
}): Promise<void> {
|
|
4301
|
+
try {
|
|
4302
|
+
const channelData: JSONObject =
|
|
4303
|
+
(data.activity["channelData"] as JSONObject) || {};
|
|
4304
|
+
|
|
4305
|
+
const teamId: string =
|
|
4306
|
+
((channelData["team"] as JSONObject)?.["id"] as string) || "";
|
|
4307
|
+
const tenantId: string =
|
|
4308
|
+
((channelData["tenant"] as JSONObject)?.["id"] as string) || "";
|
|
4309
|
+
|
|
4310
|
+
if (!teamId || !tenantId) {
|
|
4311
|
+
return;
|
|
4312
|
+
}
|
|
4313
|
+
|
|
4314
|
+
await this.removeTeamFromProjectAuthTokens({
|
|
4315
|
+
tenantId: tenantId,
|
|
4316
|
+
teamId: teamId,
|
|
4317
|
+
});
|
|
4318
|
+
|
|
4319
|
+
logger.debug(
|
|
4320
|
+
`Removed Microsoft Teams team install ${teamId} for tenant ${tenantId}`,
|
|
4321
|
+
);
|
|
4322
|
+
} catch (err) {
|
|
4323
|
+
logger.error("Error removing Microsoft Teams team from bot activity:");
|
|
4324
|
+
logger.error(err);
|
|
4325
|
+
}
|
|
4326
|
+
}
|
|
4327
|
+
|
|
4328
|
+
@CaptureSpan()
|
|
4329
|
+
public static async saveTeamToProjectAuthTokens(data: {
|
|
4330
|
+
tenantId: string;
|
|
4331
|
+
team: MicrosoftTeamsInstalledTeam;
|
|
4332
|
+
}): Promise<void> {
|
|
4333
|
+
/*
|
|
4334
|
+
* Same fan-out reasoning as saveChatToProjectAuthTokens: the install event
|
|
4335
|
+
* does not say which project it belongs to, so record it on every project
|
|
4336
|
+
* connected to this tenant.
|
|
4337
|
+
*/
|
|
4338
|
+
const projectAuths: Array<WorkspaceProjectAuthToken> =
|
|
4339
|
+
await WorkspaceProjectAuthTokenService.findBy({
|
|
4340
|
+
query: {
|
|
4341
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
4342
|
+
workspaceProjectId: data.tenantId,
|
|
4343
|
+
},
|
|
4344
|
+
select: {
|
|
4345
|
+
_id: true,
|
|
4346
|
+
miscData: true,
|
|
4347
|
+
},
|
|
4348
|
+
limit: LIMIT_MAX,
|
|
4349
|
+
skip: 0,
|
|
4350
|
+
props: {
|
|
4351
|
+
isRoot: true,
|
|
4352
|
+
},
|
|
4353
|
+
});
|
|
4354
|
+
|
|
4355
|
+
for (const projectAuth of projectAuths) {
|
|
4356
|
+
const miscData: MicrosoftTeamsMiscData = {
|
|
4357
|
+
...((projectAuth.miscData as MicrosoftTeamsMiscData) || {}),
|
|
4358
|
+
} as MicrosoftTeamsMiscData;
|
|
4359
|
+
|
|
4360
|
+
miscData.installedTeams = {
|
|
4361
|
+
...(miscData.installedTeams || {}),
|
|
4362
|
+
[data.team.id]: data.team,
|
|
4363
|
+
};
|
|
4364
|
+
|
|
4365
|
+
await WorkspaceProjectAuthTokenService.updateOneById({
|
|
4366
|
+
id: projectAuth.id!,
|
|
4367
|
+
data: {
|
|
4368
|
+
miscData: miscData,
|
|
4369
|
+
},
|
|
4370
|
+
props: {
|
|
4371
|
+
isRoot: true,
|
|
4372
|
+
},
|
|
4373
|
+
});
|
|
4374
|
+
}
|
|
4375
|
+
}
|
|
4376
|
+
|
|
4377
|
+
@CaptureSpan()
|
|
4378
|
+
public static async removeTeamFromProjectAuthTokens(data: {
|
|
4379
|
+
tenantId: string;
|
|
4380
|
+
teamId: string;
|
|
4381
|
+
}): Promise<void> {
|
|
4382
|
+
const projectAuths: Array<WorkspaceProjectAuthToken> =
|
|
4383
|
+
await WorkspaceProjectAuthTokenService.findBy({
|
|
4384
|
+
query: {
|
|
4385
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
4386
|
+
workspaceProjectId: data.tenantId,
|
|
4387
|
+
},
|
|
4388
|
+
select: {
|
|
4389
|
+
_id: true,
|
|
4390
|
+
miscData: true,
|
|
4391
|
+
},
|
|
4392
|
+
limit: LIMIT_MAX,
|
|
4393
|
+
skip: 0,
|
|
4394
|
+
props: {
|
|
4395
|
+
isRoot: true,
|
|
4396
|
+
},
|
|
4397
|
+
});
|
|
4398
|
+
|
|
4399
|
+
for (const projectAuth of projectAuths) {
|
|
4400
|
+
const miscData: MicrosoftTeamsMiscData = {
|
|
4401
|
+
...((projectAuth.miscData as MicrosoftTeamsMiscData) || {}),
|
|
4402
|
+
} as MicrosoftTeamsMiscData;
|
|
4403
|
+
|
|
4404
|
+
if (!miscData.installedTeams || !miscData.installedTeams[data.teamId]) {
|
|
4405
|
+
continue;
|
|
4406
|
+
}
|
|
4407
|
+
|
|
4408
|
+
const installedTeams: Record<string, MicrosoftTeamsInstalledTeam> = {
|
|
4409
|
+
...miscData.installedTeams,
|
|
4410
|
+
};
|
|
4411
|
+
delete installedTeams[data.teamId];
|
|
4412
|
+
miscData.installedTeams = installedTeams;
|
|
4413
|
+
|
|
4414
|
+
await WorkspaceProjectAuthTokenService.updateOneById({
|
|
4415
|
+
id: projectAuth.id!,
|
|
4416
|
+
data: {
|
|
4417
|
+
miscData: miscData,
|
|
4418
|
+
},
|
|
4419
|
+
props: {
|
|
4420
|
+
isRoot: true,
|
|
4421
|
+
},
|
|
4422
|
+
});
|
|
4423
|
+
}
|
|
4424
|
+
}
|
|
4425
|
+
|
|
4426
|
+
@CaptureSpan()
|
|
4427
|
+
public static async getInstalledTeamsForProject(data: {
|
|
4428
|
+
projectId: ObjectID;
|
|
4429
|
+
}): Promise<Record<string, MicrosoftTeamsInstalledTeam>> {
|
|
4430
|
+
const projectAuth: WorkspaceProjectAuthToken | null =
|
|
4431
|
+
await WorkspaceProjectAuthTokenService.getProjectAuth({
|
|
4432
|
+
projectId: data.projectId,
|
|
4433
|
+
workspaceType: WorkspaceType.MicrosoftTeams,
|
|
4434
|
+
});
|
|
4435
|
+
|
|
4436
|
+
if (!projectAuth || !projectAuth.miscData) {
|
|
4437
|
+
return {};
|
|
4438
|
+
}
|
|
4439
|
+
|
|
4440
|
+
return (
|
|
4441
|
+
(projectAuth.miscData as MicrosoftTeamsMiscData).installedTeams || {}
|
|
4442
|
+
);
|
|
4443
|
+
}
|
|
4444
|
+
|
|
3921
4445
|
/**
|
|
3922
4446
|
* Process Bot Framework activity using the botbuilder SDK adapter.processActivity
|
|
3923
4447
|
* This replaces the manual JWT validation and activity handling with proper SDK methods
|
|
@@ -4352,7 +4876,12 @@ All monitoring checks are passing normally.`;
|
|
|
4352
4876
|
id: t["id"] as string,
|
|
4353
4877
|
name: (t["displayName"] as string) || "Unnamed Team",
|
|
4354
4878
|
};
|
|
4355
|
-
|
|
4879
|
+
/*
|
|
4880
|
+
* Keyed by id, not display name — Teams allows duplicate team
|
|
4881
|
+
* names, and keying by name silently collapsed them so only the
|
|
4882
|
+
* last one of each name was selectable.
|
|
4883
|
+
*/
|
|
4884
|
+
acc[team.id] = team;
|
|
4356
4885
|
return acc;
|
|
4357
4886
|
},
|
|
4358
4887
|
{} as Record<string, { id: string; name: string }>,
|