@oneuptime/common 12.0.6 → 12.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIInsight.ts +1 -1
- package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
- package/Models/DatabaseModels/DeletedProject.ts +595 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/Monitor.ts +111 -0
- package/Models/DatabaseModels/Project.ts +3 -3
- package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
- package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
- package/Models/DatabaseModels/WorkflowLog.ts +38 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
- package/Server/API/FileAPI.ts +15 -2
- package/Server/API/MicrosoftTeamsAPI.ts +6 -1
- package/Server/API/ProjectAPI.ts +214 -0
- package/Server/API/StatusPageAPI.ts +39 -6
- package/Server/API/UserAPI.ts +16 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
- package/Server/Services/AIAgentService.ts +20 -0
- package/Server/Services/DashboardDomainService.ts +73 -28
- package/Server/Services/DatabaseService.ts +1 -0
- package/Server/Services/DeletedProjectService.ts +138 -0
- package/Server/Services/FileService.ts +61 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
- package/Server/Services/IncidentPublicNoteService.ts +18 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +311 -0
- package/Server/Services/ProbeService.ts +20 -0
- package/Server/Services/ProjectService.ts +297 -1
- package/Server/Services/PushNotificationService.ts +71 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
- package/Server/Services/StatusPageAnnouncementService.ts +53 -0
- package/Server/Services/StatusPageDomainService.ts +73 -28
- package/Server/Services/TeamMemberService.ts +117 -12
- package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
- package/Server/Services/TelemetryEntityService.ts +114 -1
- package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
- package/Server/Services/UserWebhookService.ts +34 -109
- package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
- package/Server/Types/Database/DeleteById.ts +2 -0
- package/Server/Types/Database/DeleteOneBy.ts +6 -0
- package/Server/Types/Domain.ts +41 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
- package/Server/Types/Workflow/Components/API/Get.ts +2 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
- package/Server/Types/Workflow/Components/API/Post.ts +2 -1
- package/Server/Types/Workflow/Components/API/Put.ts +2 -1
- package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
- package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
- package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
- package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
- package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
- package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
- package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
- package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
- package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
- package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
- package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
- package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
- package/Server/Types/Workflow/TriggerCode.ts +12 -0
- package/Server/Types/Workflow/Workflow.ts +5 -0
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
- package/Server/Utils/DataSource/EgressGuard.ts +176 -16
- package/Server/Utils/DataSource/HttpFetch.ts +6 -45
- package/Server/Utils/Execute.ts +8 -0
- package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
- package/Server/Utils/LLM/LLMService.ts +57 -12
- package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
- package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
- package/Server/Utils/Monitor/MonitorResource.ts +36 -0
- package/Server/Utils/Response.ts +142 -6
- package/Server/Utils/SSRFProtection.ts +273 -60
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
- package/Server/Utils/VM/VMAPI.ts +56 -8
- package/Server/Utils/VM/VMRunner.ts +88 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
- package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
- package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
- package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
- package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
- package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
- package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
- package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
- package/Tests/Server/API/ProjectAPI.test.ts +299 -1
- package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
- package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
- package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
- package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
- package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
- package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
- package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
- package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
- package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
- package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
- package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
- package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
- package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
- package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
- package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
- package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
- package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
- package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
- package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
- package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
- package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
- package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
- package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
- package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
- package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
- package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
- package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
- package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
- package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
- package/Tests/Types/JSONFunctions.test.ts +252 -1
- package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
- package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
- package/Tests/Types/Workflow/Templates.test.ts +403 -0
- package/Tests/UI/Components/404.test.tsx +1 -1
- package/Tests/UI/Components/Alert.test.tsx +1 -1
- package/Tests/UI/Components/Badge.test.tsx +1 -1
- package/Tests/UI/Components/BasicForm.test.tsx +39 -10
- package/Tests/UI/Components/Button.test.tsx +1 -1
- package/Tests/UI/Components/Card.test.tsx +1 -1
- package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
- package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
- package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
- package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
- package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +1 -1
- package/Tests/UI/Components/FilePicker.test.tsx +1 -1
- package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
- package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
- package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
- package/Tests/UI/Components/HiddenText.test.tsx +1 -1
- package/Tests/UI/Components/Input.test.tsx +1 -1
- package/Tests/UI/Components/Loader.test.tsx +1 -1
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
- package/Tests/UI/Components/NavBar.test.tsx +1 -1
- package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
- package/Tests/UI/Components/Pagination.test.tsx +1 -1
- package/Tests/UI/Components/Pill.test.tsx +1 -1
- package/Tests/UI/Components/Probe.test.tsx +1 -1
- package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
- package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
- package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
- package/Tests/UI/Components/SideOver.test.tsx +500 -6
- package/Tests/UI/Components/Tabs.test.tsx +1 -1
- package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
- package/Tests/UI/Components/TextArea.test.tsx +1 -1
- package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
- package/Tests/UI/Components/Toast.test.tsx +1 -1
- package/Tests/UI/Components/Toggle.test.tsx +1 -1
- package/Tests/UI/Components/TopSection.test.tsx +1 -1
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
- package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
- package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
- package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
- package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
- package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
- package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
- package/Tests/Utils/Realtime.test.ts +78 -0
- package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
- package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
- package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
- package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
- package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
- package/Types/AI/FixPullRequestCiStatus.ts +1 -1
- package/Types/AI/FixVerificationStatus.ts +2 -2
- package/Types/API/Hostname.ts +92 -4
- package/Types/API/URL.ts +43 -25
- package/Types/Billing/BalanceAdjustmentType.ts +14 -0
- package/Types/Billing/ProjectBalanceType.ts +13 -0
- package/Types/Domain.ts +26 -0
- package/Types/File/MimeType.ts +11 -0
- package/Types/JSONFunctions.ts +15 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
- package/Types/SerializableObjectDictionary.ts +133 -39
- package/Types/Telemetry/EntitySource.ts +40 -0
- package/Types/Telemetry/EntityType.ts +27 -0
- package/Types/Telemetry/EntityTypeGroups.ts +65 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
- package/Types/Workflow/Component.ts +29 -0
- package/Types/Workflow/Components/API.ts +35 -0
- package/Types/Workflow/Components/BaseModel.ts +96 -28
- package/Types/Workflow/StepTrace.ts +181 -0
- package/Types/Workflow/TemplateSyntax.ts +499 -0
- package/Types/Workflow/Templates.ts +316 -0
- package/Typings/Index.d.ts +12 -0
- package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
- package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
- package/UI/Components/Dictionary/Dictionary.tsx +23 -6
- package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
- package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
- package/UI/Components/Forms/Types/Field.ts +7 -0
- package/UI/Components/Forms/Validation.ts +63 -1
- package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
- package/UI/Components/Input/Input.tsx +31 -3
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
- package/UI/Components/Modal/ConfirmModal.tsx +10 -5
- package/UI/Components/Modal/Modal.tsx +64 -51
- package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
- package/UI/Components/SideOver/SideOver.tsx +195 -68
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
- package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
- package/UI/Components/Workflow/Component.tsx +28 -26
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
- package/UI/Components/Workflow/GraphLint.ts +591 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
- package/UI/Components/Workflow/ModelSchema.ts +196 -0
- package/UI/Components/Workflow/RunForm.tsx +41 -7
- package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
- package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
- package/UI/Components/Workflow/Utils.ts +93 -1
- package/UI/Components/Workflow/Workflow.tsx +77 -4
- package/UI/Types/LayeredDismissal.ts +31 -0
- package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
- package/UI/Utils/PageScrollLock.ts +66 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
- package/Utils/Dashboard/VariableInterpolation.ts +19 -1
- package/Utils/LegacySerializedArray.ts +60 -0
- package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
- package/Utils/Telemetry/EntityKey.ts +66 -0
- package/Utils/Telemetry/SavedViewFilters.ts +88 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
- package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +3 -3
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/FileAPI.js +14 -2
- package/build/dist/Server/API/FileAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +157 -4
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +27 -3
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +16 -1
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +17 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +55 -18
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +1 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DeletedProjectService.js +124 -0
- package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
- package/build/dist/Server/Services/FileService.js +52 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +232 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +17 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +228 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +56 -0
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +97 -6
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +31 -87
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Domain.js +37 -0
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Execute.js +2 -2
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +112 -5
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +219 -53
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
- package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
- package/build/dist/Types/API/Hostname.js +73 -4
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/URL.js +42 -24
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
- package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
- package/build/dist/Types/Domain.js +22 -0
- package/build/dist/Types/Domain.js.map +1 -1
- package/build/dist/Types/File/MimeType.js +11 -0
- package/build/dist/Types/File/MimeType.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +14 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +133 -39
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +39 -0
- package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +27 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
- package/build/dist/Types/Workflow/Component.js +21 -0
- package/build/dist/Types/Workflow/Component.js.map +1 -1
- package/build/dist/Types/Workflow/Components/API.js +35 -0
- package/build/dist/Types/Workflow/Components/API.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/StepTrace.js +104 -0
- package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +218 -0
- package/build/dist/Types/Workflow/Templates.js.map +1 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +44 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +12 -4
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +55 -39
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Component.js +20 -19
- package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
- package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
- package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Utils.js +73 -1
- package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Types/LayeredDismissal.js +21 -0
- package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +52 -0
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
- package/build/dist/Utils/LegacySerializedArray.js +51 -0
- package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
- package/jest.config.json +3 -0
- package/package.json +1 -1
- package/tsconfig.json +3 -1
|
@@ -309,6 +309,20 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
|
|
|
309
309
|
|
|
310
310
|
// Check for errors in the response
|
|
311
311
|
if (res.errors && res.errors.length > 0) {
|
|
312
|
+
/*
|
|
313
|
+
* Record the failure before throwing. Test sends used to throw
|
|
314
|
+
* straight out of here, so a failed test left no trace in
|
|
315
|
+
* Notification Logs and support had no way to see what Microsoft
|
|
316
|
+
* or Slack actually said.
|
|
317
|
+
*/
|
|
318
|
+
await this.logTestSendFailures({
|
|
319
|
+
projectId: data.projectId,
|
|
320
|
+
workspaceType: res.workspaceType,
|
|
321
|
+
errors: res.errors,
|
|
322
|
+
message: messageSummary,
|
|
323
|
+
userId: data.testByUserId,
|
|
324
|
+
});
|
|
325
|
+
|
|
312
326
|
const errorMessages: Array<string> = res.errors.map(
|
|
313
327
|
(error: { channel: WorkspaceChannel; error: string }) => {
|
|
314
328
|
return `Channel ${error.channel.name}: ${error.error}`;
|
|
@@ -408,6 +422,20 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
|
|
|
408
422
|
|
|
409
423
|
// Check for errors in the response
|
|
410
424
|
if (res.errors && res.errors.length > 0) {
|
|
425
|
+
/*
|
|
426
|
+
* Record the failure before throwing. Test sends used to throw
|
|
427
|
+
* straight out of here, so a failed test left no trace in
|
|
428
|
+
* Notification Logs and support had no way to see what Microsoft
|
|
429
|
+
* or Slack actually said.
|
|
430
|
+
*/
|
|
431
|
+
await this.logTestSendFailures({
|
|
432
|
+
projectId: data.projectId,
|
|
433
|
+
workspaceType: res.workspaceType,
|
|
434
|
+
errors: res.errors,
|
|
435
|
+
message: messageSummary,
|
|
436
|
+
userId: data.testByUserId,
|
|
437
|
+
});
|
|
438
|
+
|
|
411
439
|
const errorMessages: Array<string> = res.errors.map(
|
|
412
440
|
(error: { channel: WorkspaceChannel; error: string }) => {
|
|
413
441
|
return `Channel ${error.channel.name}: ${error.error}`;
|
|
@@ -540,6 +568,47 @@ export class Service extends DatabaseService<WorkspaceNotificationRule> {
|
|
|
540
568
|
}
|
|
541
569
|
}
|
|
542
570
|
|
|
571
|
+
/*
|
|
572
|
+
* Persist per-destination failures from a test send so they show up in
|
|
573
|
+
* Settings > Notification Logs alongside real notification failures. Real
|
|
574
|
+
* sends already log; test sends threw before reaching any logging, which
|
|
575
|
+
* meant the one action an admin takes to diagnose a broken integration was
|
|
576
|
+
* also the only one that recorded nothing.
|
|
577
|
+
*
|
|
578
|
+
* Best-effort: a logging failure must never mask the underlying send error.
|
|
579
|
+
*/
|
|
580
|
+
@CaptureSpan()
|
|
581
|
+
private async logTestSendFailures(data: {
|
|
582
|
+
projectId: ObjectID;
|
|
583
|
+
workspaceType: WorkspaceType;
|
|
584
|
+
errors: Array<{ channel: WorkspaceChannel; error: string }>;
|
|
585
|
+
message: string;
|
|
586
|
+
userId: ObjectID;
|
|
587
|
+
}): Promise<void> {
|
|
588
|
+
for (const error of data.errors) {
|
|
589
|
+
try {
|
|
590
|
+
const log: WorkspaceNotificationLog = new WorkspaceNotificationLog();
|
|
591
|
+
log.projectId = data.projectId;
|
|
592
|
+
log.workspaceType = data.workspaceType;
|
|
593
|
+
log.channelId = error.channel.id;
|
|
594
|
+
log.channelName = error.channel.name;
|
|
595
|
+
log.message = data.message;
|
|
596
|
+
log.status = WorkspaceNotificationStatus.Error;
|
|
597
|
+
log.statusMessage = error.error;
|
|
598
|
+
log.userId = data.userId;
|
|
599
|
+
log.actionType = WorkspaceNotificationActionType.SendMessage;
|
|
600
|
+
|
|
601
|
+
await WorkspaceNotificationLogService.create({
|
|
602
|
+
data: log,
|
|
603
|
+
props: { isRoot: true },
|
|
604
|
+
});
|
|
605
|
+
} catch (err) {
|
|
606
|
+
logger.error("Could not write test-send failure to notification log:");
|
|
607
|
+
logger.error(err);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
543
612
|
@CaptureSpan()
|
|
544
613
|
public async archiveWorkspaceChannels(data: {
|
|
545
614
|
projectId: ObjectID;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import ObjectID from "../../Types/ObjectID";
|
|
2
|
-
import WorkspaceType
|
|
2
|
+
import WorkspaceType, {
|
|
3
|
+
getWorkspaceTypeDisplayName,
|
|
4
|
+
} from "../../Types/Workspace/WorkspaceType";
|
|
3
5
|
import DatabaseService from "./DatabaseService";
|
|
4
6
|
import Model, {
|
|
5
7
|
WorkspaceMiscData,
|
|
@@ -7,6 +9,7 @@ import Model, {
|
|
|
7
9
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
8
10
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
9
11
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
12
|
+
import logger from "../Utils/Logger";
|
|
10
13
|
|
|
11
14
|
export class Service extends DatabaseService<Model> {
|
|
12
15
|
public constructor() {
|
|
@@ -112,12 +115,45 @@ export class Service extends DatabaseService<Model> {
|
|
|
112
115
|
},
|
|
113
116
|
select: {
|
|
114
117
|
_id: true,
|
|
118
|
+
workspaceProjectId: true,
|
|
115
119
|
},
|
|
116
120
|
props: {
|
|
117
121
|
isRoot: true,
|
|
118
122
|
},
|
|
119
123
|
});
|
|
120
124
|
|
|
125
|
+
/*
|
|
126
|
+
* A project stores exactly one workspace (one Microsoft tenant / one Slack
|
|
127
|
+
* team). Re-running the connect flow from a DIFFERENT workspace used to
|
|
128
|
+
* silently repoint the project, which breaks every existing notification
|
|
129
|
+
* rule and orphans the bot conversations captured under the old workspace —
|
|
130
|
+
* with no error and nothing in the logs.
|
|
131
|
+
*
|
|
132
|
+
* Refuse instead, and tell the admin to disconnect first if the change is
|
|
133
|
+
* deliberate.
|
|
134
|
+
*/
|
|
135
|
+
if (
|
|
136
|
+
projectAuth &&
|
|
137
|
+
projectAuth.workspaceProjectId &&
|
|
138
|
+
projectAuth.workspaceProjectId !== data.workspaceProjectId
|
|
139
|
+
) {
|
|
140
|
+
logger.error(
|
|
141
|
+
`Refusing to repoint ${data.workspaceType} for project ${data.projectId.toString()} from workspace ${projectAuth.workspaceProjectId} to ${data.workspaceProjectId}.`,
|
|
142
|
+
{
|
|
143
|
+
projectId: data.projectId.toString(),
|
|
144
|
+
workspaceType: data.workspaceType,
|
|
145
|
+
},
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const workspaceName: string = getWorkspaceTypeDisplayName(
|
|
149
|
+
data.workspaceType,
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
throw new BadDataException(
|
|
153
|
+
`This OneUptime project is already connected to a different ${workspaceName} workspace. Disconnect the existing ${workspaceName} connection in Project Settings before connecting a new one.`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
121
157
|
if (!projectAuth) {
|
|
122
158
|
projectAuth = new Model();
|
|
123
159
|
|
|
@@ -5,5 +5,7 @@ import User from "../../../Models/DatabaseModels/User";
|
|
|
5
5
|
export default interface DeleteById {
|
|
6
6
|
id: ObjectID;
|
|
7
7
|
deletedByUser?: User;
|
|
8
|
+
// See DeleteOneBy.deletionReason - passed straight through to the hooks.
|
|
9
|
+
deletionReason?: string | undefined;
|
|
8
10
|
props: DatabaseCommonInteractionProps;
|
|
9
11
|
}
|
|
@@ -6,5 +6,11 @@ import User from "../../../Models/DatabaseModels/User";
|
|
|
6
6
|
export default interface DeleteOneBy<TBaseModel extends BaseModel> {
|
|
7
7
|
query: Query<TBaseModel>;
|
|
8
8
|
deletedByUser?: User | undefined;
|
|
9
|
+
/*
|
|
10
|
+
* Free-text reason the caller gave for the delete. Never persisted on the
|
|
11
|
+
* row being deleted (it is about to be gone) - it rides through to the
|
|
12
|
+
* delete hooks, which are the last place that can record it anywhere.
|
|
13
|
+
*/
|
|
14
|
+
deletionReason?: string | undefined;
|
|
9
15
|
props: DatabaseCommonInteractionProps;
|
|
10
16
|
}
|
package/Server/Types/Domain.ts
CHANGED
|
@@ -4,8 +4,49 @@ import { PromiseRejectErrorFunction } from "../../Types/FunctionTypes";
|
|
|
4
4
|
import dns from "dns";
|
|
5
5
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
6
6
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
|
+
import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
|
|
8
|
+
import HTTPResponse from "../../Types/API/HTTPResponse";
|
|
9
|
+
import { JSONObject } from "../../Types/JSON";
|
|
10
|
+
import URL from "../../Types/API/URL";
|
|
11
|
+
import API from "../../Utils/API";
|
|
12
|
+
import DataSourceEgressGuard from "../Utils/DataSource/EgressGuard";
|
|
7
13
|
|
|
8
14
|
export default class Domain extends DomainCommon {
|
|
15
|
+
/*
|
|
16
|
+
* GET a domain-verification URL built from a tenant-supplied domain.
|
|
17
|
+
*
|
|
18
|
+
* Both the status page and the dashboard build these URLs by interpolating
|
|
19
|
+
* a customer domain into a string, and the certificate cron re-fetches them
|
|
20
|
+
* unattended every 15 minutes — so the target has to be validated on every
|
|
21
|
+
* call, not just when the row was written. The address that was validated
|
|
22
|
+
* is pinned into the socket, and redirects are refused so a 3xx cannot
|
|
23
|
+
* bounce the request to a host that was never checked. (The callers try
|
|
24
|
+
* http first and https second, so the ordinary http→https redirect a
|
|
25
|
+
* customer proxy emits is still covered by the https attempt.)
|
|
26
|
+
*
|
|
27
|
+
* Private ranges stay reachable on self-hosted installs, where a status page
|
|
28
|
+
* domain legitimately resolves inside the corporate network.
|
|
29
|
+
*/
|
|
30
|
+
@CaptureSpan()
|
|
31
|
+
public static async getForDomainVerification(data: {
|
|
32
|
+
url: string;
|
|
33
|
+
targetLabel: string;
|
|
34
|
+
}): Promise<HTTPErrorResponse | HTTPResponse<JSONObject>> {
|
|
35
|
+
const { httpAgent, httpsAgent } =
|
|
36
|
+
await DataSourceEgressGuard.assertUrlAllowedAndPin(data.url, {
|
|
37
|
+
targetLabel: data.targetLabel,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
return API.get<JSONObject>({
|
|
41
|
+
url: URL.fromString(data.url),
|
|
42
|
+
options: {
|
|
43
|
+
doNotFollowRedirects: true,
|
|
44
|
+
httpAgent,
|
|
45
|
+
httpsAgent,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
9
50
|
@CaptureSpan()
|
|
10
51
|
public static getCnameRecords(data: { domain: string }): Promise<string[]> {
|
|
11
52
|
return new Promise(
|
|
@@ -37,7 +37,7 @@ export default class ApiDelete extends ComponentCode {
|
|
|
37
37
|
options: RunOptions,
|
|
38
38
|
): Promise<RunReturnType> {
|
|
39
39
|
const result: { args: JSONObject; successPort: Port; errorPort: Port } =
|
|
40
|
-
ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
40
|
+
await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
41
41
|
|
|
42
42
|
let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
|
|
43
43
|
|
|
@@ -46,6 +46,7 @@ export default class ApiDelete extends ComponentCode {
|
|
|
46
46
|
url: args["url"] as URL,
|
|
47
47
|
data: args["request-body"] as JSONObject,
|
|
48
48
|
headers: args["request-headers"] as Dictionary<string>,
|
|
49
|
+
options: ApiComponentUtils.requestOptions,
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
/*
|
|
@@ -37,7 +37,7 @@ export default class ApiGet extends ComponentCode {
|
|
|
37
37
|
options: RunOptions,
|
|
38
38
|
): Promise<RunReturnType> {
|
|
39
39
|
const result: { args: JSONObject; successPort: Port; errorPort: Port } =
|
|
40
|
-
ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
40
|
+
await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
41
41
|
|
|
42
42
|
let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
|
|
43
43
|
|
|
@@ -46,6 +46,7 @@ export default class ApiGet extends ComponentCode {
|
|
|
46
46
|
url: args["url"] as URL,
|
|
47
47
|
data: args["request-body"] as JSONObject,
|
|
48
48
|
headers: args["request-headers"] as Dictionary<string>,
|
|
49
|
+
options: ApiComponentUtils.requestOptions,
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
/*
|
|
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
37
37
|
options: RunOptions,
|
|
38
38
|
): Promise<RunReturnType> {
|
|
39
39
|
const result: { args: JSONObject; successPort: Port; errorPort: Port } =
|
|
40
|
-
ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
40
|
+
await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
41
41
|
|
|
42
42
|
let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
|
|
43
43
|
|
|
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
46
46
|
url: args["url"] as URL,
|
|
47
47
|
data: args["request-body"] as JSONObject,
|
|
48
48
|
headers: args["request-headers"] as Dictionary<string>,
|
|
49
|
+
options: ApiComponentUtils.requestOptions,
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
/*
|
|
@@ -38,7 +38,7 @@ export default class ApiPost extends ComponentCode {
|
|
|
38
38
|
options: RunOptions,
|
|
39
39
|
): Promise<RunReturnType> {
|
|
40
40
|
const result: { args: JSONObject; successPort: Port; errorPort: Port } =
|
|
41
|
-
ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
41
|
+
await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
42
42
|
|
|
43
43
|
let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
|
|
44
44
|
|
|
@@ -77,6 +77,7 @@ export default class ApiPost extends ComponentCode {
|
|
|
77
77
|
url: args["url"] as URL,
|
|
78
78
|
data: args["request-body"] as JSONObject,
|
|
79
79
|
headers: args["request-headers"] as Dictionary<string>,
|
|
80
|
+
options: ApiComponentUtils.requestOptions,
|
|
80
81
|
});
|
|
81
82
|
|
|
82
83
|
logger.debug("API Post Component is done.", workflowLogAttributes);
|
|
@@ -37,7 +37,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
37
37
|
options: RunOptions,
|
|
38
38
|
): Promise<RunReturnType> {
|
|
39
39
|
const result: { args: JSONObject; successPort: Port; errorPort: Port } =
|
|
40
|
-
ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
40
|
+
await ApiComponentUtils.sanitizeArgs(this.getMetadata(), args, options);
|
|
41
41
|
|
|
42
42
|
let apiResult: HTTPResponse<JSONObject> | HTTPErrorResponse | null = null;
|
|
43
43
|
|
|
@@ -46,6 +46,7 @@ export default class ApiPut extends ComponentCode {
|
|
|
46
46
|
url: args["url"] as URL,
|
|
47
47
|
data: args["request-body"] as JSONObject,
|
|
48
48
|
headers: args["request-headers"] as Dictionary<string>,
|
|
49
|
+
options: ApiComponentUtils.requestOptions,
|
|
49
50
|
});
|
|
50
51
|
|
|
51
52
|
/*
|
|
@@ -3,14 +3,27 @@ import HTTPErrorResponse from "../../../../../Types/API/HTTPErrorResponse";
|
|
|
3
3
|
import HTTPResponse from "../../../../../Types/API/HTTPResponse";
|
|
4
4
|
import URL from "../../../../../Types/API/URL";
|
|
5
5
|
import BadDataException from "../../../../../Types/Exception/BadDataException";
|
|
6
|
-
import
|
|
6
|
+
import Exception from "../../../../../Types/Exception/Exception";
|
|
7
|
+
import { JSONObject, JSONValue } from "../../../../../Types/JSON";
|
|
7
8
|
import JSONFunctions from "../../../../../Types/JSONFunctions";
|
|
8
9
|
import ComponentMetadata, {
|
|
9
10
|
Port,
|
|
10
11
|
} from "../../../../../Types/Workflow/Component";
|
|
12
|
+
import { RequestOptions } from "../../../../../Utils/API";
|
|
13
|
+
import SSRFProtection from "../../../../Utils/SSRFProtection";
|
|
11
14
|
import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
|
|
12
15
|
|
|
13
16
|
export class ApiComponentUtils {
|
|
17
|
+
/*
|
|
18
|
+
* Every API component sends its request with these. Redirects MUST stay off:
|
|
19
|
+
* sanitizeArgs validates the URL before the request is dispatched, and a
|
|
20
|
+
* validated public host that answers 302 -> http://169.254.169.254/ would
|
|
21
|
+
* otherwise walk the server straight past that check.
|
|
22
|
+
*/
|
|
23
|
+
public static readonly requestOptions: RequestOptions = {
|
|
24
|
+
doNotFollowRedirects: true,
|
|
25
|
+
};
|
|
26
|
+
|
|
14
27
|
@CaptureSpan()
|
|
15
28
|
public static getReturnValues(
|
|
16
29
|
response: HTTPResponse<JSONObject> | HTTPErrorResponse,
|
|
@@ -33,11 +46,11 @@ export class ApiComponentUtils {
|
|
|
33
46
|
}
|
|
34
47
|
|
|
35
48
|
@CaptureSpan()
|
|
36
|
-
public static sanitizeArgs(
|
|
49
|
+
public static async sanitizeArgs(
|
|
37
50
|
metadata: ComponentMetadata,
|
|
38
51
|
args: JSONObject,
|
|
39
52
|
options: RunOptions,
|
|
40
|
-
): { args: JSONObject; successPort: Port; errorPort: Port } {
|
|
53
|
+
): Promise<{ args: JSONObject; successPort: Port; errorPort: Port }> {
|
|
41
54
|
const successPort: Port | undefined = metadata.outPorts.find((p: Port) => {
|
|
42
55
|
return p.id === "success";
|
|
43
56
|
});
|
|
@@ -69,6 +82,49 @@ export class ApiComponentUtils {
|
|
|
69
82
|
);
|
|
70
83
|
}
|
|
71
84
|
|
|
85
|
+
/*
|
|
86
|
+
* Headers reach here from a key/value grid that can emit numbers and
|
|
87
|
+
* booleans, from a JSON document someone typed, or from a {{...}}
|
|
88
|
+
* substitution — and every consumer below blind-casts the result to
|
|
89
|
+
* Dictionary<string> before spreading it into the outgoing request. An
|
|
90
|
+
* array or a bare scalar spreads into per-index junk headers rather than
|
|
91
|
+
* failing, so check the shape and flatten the values to strings here.
|
|
92
|
+
*/
|
|
93
|
+
if (args["request-headers"]) {
|
|
94
|
+
const headers: JSONValue = args["request-headers"] as JSONValue;
|
|
95
|
+
|
|
96
|
+
if (
|
|
97
|
+
typeof headers !== "object" ||
|
|
98
|
+
headers === null ||
|
|
99
|
+
Array.isArray(headers)
|
|
100
|
+
) {
|
|
101
|
+
throw options.onError(
|
|
102
|
+
new BadDataException(
|
|
103
|
+
"Request headers must be a JSON object of header names and values.",
|
|
104
|
+
),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const stringifiedHeaders: JSONObject = {};
|
|
109
|
+
|
|
110
|
+
for (const headerName of Object.keys(headers as JSONObject)) {
|
|
111
|
+
const headerValue: JSONValue = (headers as JSONObject)[
|
|
112
|
+
headerName
|
|
113
|
+
] as JSONValue;
|
|
114
|
+
|
|
115
|
+
if (headerValue === null || headerValue === undefined) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
stringifiedHeaders[headerName] =
|
|
120
|
+
typeof headerValue === "object"
|
|
121
|
+
? JSON.stringify(headerValue)
|
|
122
|
+
: String(headerValue);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
args["request-headers"] = stringifiedHeaders;
|
|
126
|
+
}
|
|
127
|
+
|
|
72
128
|
if (!args["url"]) {
|
|
73
129
|
throw options.onError(new BadDataException("URL not found"));
|
|
74
130
|
}
|
|
@@ -77,6 +133,32 @@ export class ApiComponentUtils {
|
|
|
77
133
|
throw options.onError(new BadDataException("URL is not type of string"));
|
|
78
134
|
}
|
|
79
135
|
|
|
136
|
+
/*
|
|
137
|
+
* The URL is authored by whoever built the workflow - i.e. any member of
|
|
138
|
+
* any project - and the request goes out from the server, which sits
|
|
139
|
+
* inside the cluster and next to the cloud metadata endpoint. Without this
|
|
140
|
+
* check the API components are an authenticated request proxy into the
|
|
141
|
+
* private network: GET http://169.254.169.254/latest/meta-data/iam/... and
|
|
142
|
+
* the credentials come back in the component's "response-body" return
|
|
143
|
+
* value, in plain sight in the workflow log. Resolve and blocklist the
|
|
144
|
+
* target the same way outbound webhooks already do.
|
|
145
|
+
*
|
|
146
|
+
* Validate the RAW string, before URL.fromString - that parser defaults an
|
|
147
|
+
* unrecognized scheme to https, so "file:///etc/passwd" would reach the
|
|
148
|
+
* check already rewritten as host "file".
|
|
149
|
+
*/
|
|
150
|
+
try {
|
|
151
|
+
await SSRFProtection.validateWebhookTargetIsSafe(args["url"] as string);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
throw options.onError(
|
|
154
|
+
new BadDataException(
|
|
155
|
+
err instanceof Exception
|
|
156
|
+
? err.message
|
|
157
|
+
: "URL points to an address that is not allowed.",
|
|
158
|
+
),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
80
162
|
args["url"] = URL.fromString(args["url"] as string);
|
|
81
163
|
|
|
82
164
|
return { args, successPort, errorPort };
|
|
@@ -10,6 +10,7 @@ import ComponentMetadata, {
|
|
|
10
10
|
} from "../../../../../Types/Workflow/Component";
|
|
11
11
|
import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
|
|
12
12
|
import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
|
|
13
|
+
import { applyTenantColumn } from "./ModelArguments";
|
|
13
14
|
|
|
14
15
|
export default class CreateManyBaseModel<
|
|
15
16
|
TBaseModel extends BaseModel,
|
|
@@ -91,25 +92,30 @@ export default class CreateManyBaseModel<
|
|
|
91
92
|
|
|
92
93
|
const array: Array<TBaseModel> = [];
|
|
93
94
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
95
|
+
/*
|
|
96
|
+
* This loop used to sit inside an `if (getTenantColumn())` check that
|
|
97
|
+
* was only meant to guard the projectId stamping, so a model without a
|
|
98
|
+
* tenant column created nothing at all and still reported success.
|
|
99
|
+
*/
|
|
100
|
+
for (const item of args["json-array"]) {
|
|
101
|
+
const json: JSONObject = applyTenantColumn(
|
|
102
|
+
(item as JSONObject) || {},
|
|
103
|
+
this.modelService.getModel(),
|
|
104
|
+
options.projectId,
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
array.push(
|
|
108
|
+
(await this.modelService.create({
|
|
109
|
+
data: BaseModel.fromJSON<TBaseModel>(
|
|
110
|
+
json,
|
|
111
|
+
this.modelService.modelType,
|
|
112
|
+
) as TBaseModel,
|
|
113
|
+
props: {
|
|
114
|
+
isRoot: true,
|
|
115
|
+
tenantId: options.projectId,
|
|
116
|
+
},
|
|
117
|
+
})) as TBaseModel,
|
|
118
|
+
);
|
|
113
119
|
}
|
|
114
120
|
|
|
115
121
|
return {
|
|
@@ -12,6 +12,7 @@ import ComponentMetadata, {
|
|
|
12
12
|
} from "../../../../../Types/Workflow/Component";
|
|
13
13
|
import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
|
|
14
14
|
import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
|
|
15
|
+
import { applyTenantColumn } from "./ModelArguments";
|
|
15
16
|
|
|
16
17
|
export default class CreateOneBaseModel<
|
|
17
18
|
TBaseModel extends BaseModel,
|
|
@@ -90,11 +91,11 @@ export default class CreateOneBaseModel<
|
|
|
90
91
|
);
|
|
91
92
|
}
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
args["json"] = applyTenantColumn(
|
|
95
|
+
args["json"] as JSONObject,
|
|
96
|
+
this.modelService.getModel(),
|
|
97
|
+
options.projectId,
|
|
98
|
+
);
|
|
98
99
|
|
|
99
100
|
const model: TBaseModel = (await this.modelService.create({
|
|
100
101
|
data: BaseModel.fromJSON<TBaseModel>(
|
|
@@ -12,6 +12,8 @@ import ComponentMetadata, {
|
|
|
12
12
|
Port,
|
|
13
13
|
} from "../../../../../Types/Workflow/Component";
|
|
14
14
|
import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
|
|
15
|
+
import { normalizeModelKeys } from "./ModelArguments";
|
|
16
|
+
import logComponentError from "./LogComponentError";
|
|
15
17
|
|
|
16
18
|
export default class DeleteManyBaseModel<
|
|
17
19
|
TBaseModel extends BaseModel,
|
|
@@ -114,22 +116,26 @@ export default class DeleteManyBaseModel<
|
|
|
114
116
|
args["limit"] = LIMIT_PER_PROJECT;
|
|
115
117
|
}
|
|
116
118
|
|
|
119
|
+
const query: Query<TBaseModel> = JSONFunctions.deserialize(
|
|
120
|
+
normalizeModelKeys(
|
|
121
|
+
args["query"] as JSONObject,
|
|
122
|
+
this.modelService.getModel(),
|
|
123
|
+
),
|
|
124
|
+
) as Query<TBaseModel>;
|
|
125
|
+
|
|
126
|
+
/*
|
|
127
|
+
* The tenant column goes on the deserialized query, not on args["query"]
|
|
128
|
+
* - JSONFunctions.deserialize returns a new object, so anything written
|
|
129
|
+
* to args after it runs never reaches the database.
|
|
130
|
+
*/
|
|
117
131
|
if (this.modelService.getModel().getTenantColumn()) {
|
|
118
|
-
(
|
|
132
|
+
(query as JSONObject)[
|
|
119
133
|
this.modelService.getModel().getTenantColumn() as string
|
|
120
134
|
] = options.projectId;
|
|
121
135
|
}
|
|
122
136
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (query) {
|
|
126
|
-
query = JSONFunctions.deserialize(
|
|
127
|
-
args["query"] as JSONObject,
|
|
128
|
-
) as Query<TBaseModel>;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
await this.modelService.deleteBy({
|
|
132
|
-
query: query || {},
|
|
137
|
+
const itemsDeleted: number = await this.modelService.deleteBy({
|
|
138
|
+
query: query,
|
|
133
139
|
limit: new PositiveNumber(args["limit"] as number),
|
|
134
140
|
skip: new PositiveNumber(args["skip"] as number),
|
|
135
141
|
props: {
|
|
@@ -138,13 +144,25 @@ export default class DeleteManyBaseModel<
|
|
|
138
144
|
},
|
|
139
145
|
});
|
|
140
146
|
|
|
147
|
+
options.log(
|
|
148
|
+
`Deleted ${itemsDeleted} ${
|
|
149
|
+
this.modelService.getModel().singularName || "record"
|
|
150
|
+
}(s).`,
|
|
151
|
+
);
|
|
152
|
+
|
|
141
153
|
return {
|
|
142
|
-
returnValues: {
|
|
154
|
+
returnValues: {
|
|
155
|
+
"items-deleted": itemsDeleted,
|
|
156
|
+
},
|
|
143
157
|
executePort: successPort,
|
|
144
158
|
};
|
|
145
159
|
} catch (err: any) {
|
|
146
|
-
|
|
147
|
-
|
|
160
|
+
logComponentError({
|
|
161
|
+
error: err,
|
|
162
|
+
model: this.modelService?.getModel() || null,
|
|
163
|
+
log: options.log,
|
|
164
|
+
});
|
|
165
|
+
|
|
148
166
|
return {
|
|
149
167
|
returnValues: {},
|
|
150
168
|
executePort: errorPort,
|
|
@@ -11,6 +11,8 @@ import ComponentMetadata, {
|
|
|
11
11
|
} from "../../../../../Types/Workflow/Component";
|
|
12
12
|
import BaseModelComponents from "../../../../../Types/Workflow/Components/BaseModel";
|
|
13
13
|
import CaptureSpan from "../../../../Utils/Telemetry/CaptureSpan";
|
|
14
|
+
import { normalizeModelKeys } from "./ModelArguments";
|
|
15
|
+
import logComponentError from "./LogComponentError";
|
|
14
16
|
|
|
15
17
|
export default class DeleteOneBaseModel<
|
|
16
18
|
TBaseModel extends BaseModel,
|
|
@@ -89,35 +91,51 @@ export default class DeleteOneBaseModel<
|
|
|
89
91
|
);
|
|
90
92
|
}
|
|
91
93
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (query) {
|
|
95
|
-
query = JSONFunctions.deserialize(
|
|
94
|
+
const query: Query<TBaseModel> = JSONFunctions.deserialize(
|
|
95
|
+
normalizeModelKeys(
|
|
96
96
|
args["query"] as JSONObject,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
this.modelService.getModel(),
|
|
98
|
+
),
|
|
99
|
+
) as Query<TBaseModel>;
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* The tenant column goes on the deserialized query, not on args["query"]
|
|
103
|
+
* - JSONFunctions.deserialize returns a new object, so anything written
|
|
104
|
+
* to args after it runs never reaches the database.
|
|
105
|
+
*/
|
|
100
106
|
if (this.modelService.getModel().getTenantColumn()) {
|
|
101
|
-
(
|
|
107
|
+
(query as JSONObject)[
|
|
102
108
|
this.modelService.getModel().getTenantColumn() as string
|
|
103
109
|
] = options.projectId;
|
|
104
110
|
}
|
|
105
111
|
|
|
106
|
-
await this.modelService.deleteOneBy({
|
|
107
|
-
query:
|
|
112
|
+
const itemsDeleted: number = await this.modelService.deleteOneBy({
|
|
113
|
+
query: query,
|
|
108
114
|
props: {
|
|
109
115
|
isRoot: true,
|
|
110
116
|
tenantId: options.projectId,
|
|
111
117
|
},
|
|
112
118
|
});
|
|
113
119
|
|
|
120
|
+
options.log(
|
|
121
|
+
`Deleted ${itemsDeleted} ${
|
|
122
|
+
this.modelService.getModel().singularName || "record"
|
|
123
|
+
}(s).`,
|
|
124
|
+
);
|
|
125
|
+
|
|
114
126
|
return {
|
|
115
|
-
returnValues: {
|
|
127
|
+
returnValues: {
|
|
128
|
+
"items-deleted": itemsDeleted,
|
|
129
|
+
},
|
|
116
130
|
executePort: successPort,
|
|
117
131
|
};
|
|
118
132
|
} catch (err: any) {
|
|
119
|
-
|
|
120
|
-
|
|
133
|
+
logComponentError({
|
|
134
|
+
error: err,
|
|
135
|
+
model: this.modelService?.getModel() || null,
|
|
136
|
+
log: options.log,
|
|
137
|
+
});
|
|
138
|
+
|
|
121
139
|
return {
|
|
122
140
|
returnValues: {},
|
|
123
141
|
executePort: errorPort,
|